![]() |
Eindeutige Mac ID / Globale Konfiguration
Hallo,
ich stolpere gerade über einige Probleme bei der Mac Entwicklung. Gibt es hier die Möglichkeit, eine eindeutige ID des Mac's zu erzeugen/auszulesen? Unter Windows nutze ich hierfür eine API vom Protector (ASProtect), den gibt es aber unter Mac nicht. Dann habe ich das Problem, dass meine Software bisher Test-vor-Kauf ist/war. Wenn ich nun jedoch die Anzahl Starts in die Programm-eigene INI schreibe, dann ist diese INI ja weg, wenn jemand das Package löscht. Lädt der Users also das Programm neu, kann er wieder von vorne testen. Gibt es eine Möglichkeit, global (also systemweit) einen Wert zu schreiben, der nicht so einfach zu finden ist? Unter Windows brauche ich den Wert theoretisch ja nur in CLASSES_ROOT zu verstecken, aber wie geht das wohl unter MacOS? Ja ich weiß, es ist Sinn und Zweck dass ich ein Programm einfach in den Papierkorb ziehe und alles ist weg, aber genau das will und muss ich irgendwie umgehen. Ansonsten bliebe nur "nur frei" oder "nur kaufen", nichts zwischendrin. Zu guter letzt Frage ich mich, wie ich das (Windows-) Icon ohne externe Tools in dieses ICN Format bekomme. Wenn ich das Icon in den Projektoptionen wähle, also die ICO Datei, dann wird die nicht automatisch in ICN konvertiert. Derzeit mache ich das über ein Zusatztool, aber kann Delphi das eigentlich von Haus aus? |
AW: Eindeutige Mac ID / Globale Konfiguration
Üblicherweise können Anwendungen im Ordner "~/Library/Application Support" (~ steht hierbei für das User-Profil-Verzeichnis, also /Users/{Username}) Anwendungs-Spezifische Daten ablegen.
Du kannst dort z.B. einen Order ".appName" anlegen. Der Punkt vor dem Dateinamen ist auf Unixoiden Systemen wie OS X sozusagen das 'Hidden' Attribut für Dateien. Also könntest Du eben in ~/Library/Application Support/.appName eine Datei mit den nötigen Informationen hinlegen. Das ist für 95% der Mac-User ausreichend sicher versteckt. Und die anderen 5% würden mit an Sicherheit grenzender Wahrscheinlichkeit auch alle andere Methoden mit Leichtigkeit herausfinden und umgehen können. Ausser natürlich, Deine Anwendung zielt insbesondere auf technisch sehr visierte Anwender ab. Was die eindeutige Identifizierung eines Mac's angeht, so kannst Du die Seriennummer auslesen. Siehe diese Technical Note dazu: ![]() |
AW: Eindeutige Mac ID / Globale Konfiguration
Vielen Dank für die Info. Gibt es eine Variable oder eine Funktion zu diesem "Application Support" Verzeichnis? Ich kenne ja den Usernamen nicht. Ich meine so etwas wie %userprofile% unter Windows.
|
AW: Eindeutige Mac ID / Globale Konfiguration
So geht es:
Delphi-Quellcode:
evtl. musst Du die Funktion noch deklarieren:
const
NSUserDomainMask = 1; NSApplicationSupportDirectory = 14; var PathList : NSArray; begin Pathlist := TNSArray.Wrap(NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, True)); if PathList.count > 0 then result := UTF8ToString(TNSString.Wrap(PathList.objectAtIndex(0)).UTF8String);
Delphi-Quellcode:
Rückgabe dann z.b.: '/Users/greenmile/Library/Application Support'
uses Macapi.cocoatypes, Macapi.foundation, Macapi.CoreFoundation;
function NSSearchPathForDirectoriesInDomains(directory: NSSearchPathDirectory; domainMask: NSSearchPathDomainMask; expandTilde: Boolean): PNSArray; cdecl; external libFoundation name _PU + 'NSSearchPathForDirectoriesInDomains'; |
AW: Eindeutige Mac ID / Globale Konfiguration
Seltsam.. ich gehe tatsächlich immer nur mit "~" rein, und lande auch immer im korrekten Verzeichnis. Da brauch ich keine wilden Pfade zusammenzubauen.
|
AW: Eindeutige Mac ID / Globale Konfiguration
Zitat:
|
AW: Eindeutige Mac ID / Globale Konfiguration
Zitat:
Auf diese Weise ist deine Anwendung auch nicht knackbar, da schlicht in der Testversion (z.B. auch ganz ohne Zeitlimit, wenn sie genug eingeschränkt ist) die Funktionen der Vollversion gar nicht drin sind. Schützen musst du dann "nur" noch die Vollversion vor unberechtigter Nutzung, aber die Nutzungsdauer oder ähnliches (was sich ohnehin relativ einfach umgehen lässt) wäre dann vollkommen egal. |
AW: Eindeutige Mac ID / Globale Konfiguration
Da hast Du teilweise recht, aber eine globale Konfiguration brauche ich sowieso. Wenn z.B. ein Key eingegeben werden muss, dann muss der ja auch global gespeichert werden. Spätestens bei einem Update wird der User das alte Package wegwerfen, das neue installieren und müsste seinen Key neu eingeben. Doof.
|
AW: Eindeutige Mac ID / Globale Konfiguration
Hmmm, also "PNSArray" und "libFoundation" sind nur in iOSapi.Foundation declariert und die kann ich nicht verwenden (MacOS <> iOS). PNSArray ist ein Pointer, ok, aber "libFoundation"?
|
AW: Eindeutige Mac ID / Globale Konfiguration
Ja, da haben sie ein Ei gelegt und es nur in iOS reingenommen. Ist aber gleich. Mit folgenden Deklarationen müsste es gehen:
Delphi-Quellcode:
Oder Du verwendest gleich den NSFileManager. Der Unterscheid ist, dass der nur existierende Pfade zurückgibt, während NSSearchPathForDirectoriesInDomains immer den entsprechenden Pfad liefert, auch wenn er nicht exstiert (Wie bei Windows mit den CSIDL). Es kommt aber bei beiden Varianten der richtige string zurück:
const
NSUserDomainMask = 1; NSApplicationSupportDirectory = 14; libFoundation = '/System/Library/Frameworks/Foundation.framework/Foundation'; type NSSearchPathDirectory = NSUInteger; PNSArray = Pointer;
Delphi-Quellcode:
var
FileMan : NSFileManager; URL : NSUrl; Error : NSError; begin FileMan := TNSFileManager.Create; URL := FileMan.URLForDirectory(NSApplicationSupportDirectory, NSUserDomainMask, nil, False, @Error); if not Assigned(Error) then result := URL.path.UTF8String; |
AW: Eindeutige Mac ID / Globale Konfiguration
Super, das funktioniert 1a, vielen Dank!!
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:21 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz