Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   Eindeutige Mac ID / Globale Konfiguration (https://www.delphipraxis.net/176623-eindeutige-mac-id-globale-konfiguration.html)

greenmile 17. Sep 2013 17:28

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?

Phoenix 17. Sep 2013 17:49

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: https://developer.apple.com/library/...03/_index.html

greenmile 17. Sep 2013 18:48

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.

Union 17. Sep 2013 21:28

AW: Eindeutige Mac ID / Globale Konfiguration
 
So geht es:
Delphi-Quellcode:
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);
evtl. musst Du die Funktion noch deklarieren:
Delphi-Quellcode:
uses Macapi.cocoatypes, Macapi.foundation, Macapi.CoreFoundation;

function NSSearchPathForDirectoriesInDomains(directory: NSSearchPathDirectory; domainMask: NSSearchPathDomainMask; expandTilde: Boolean): PNSArray; cdecl; external libFoundation name _PU + 'NSSearchPathForDirectoriesInDomains';
Rückgabe dann z.b.: '/Users/greenmile/Library/Application Support'

Phoenix 18. Sep 2013 06:13

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.

Union 18. Sep 2013 07:32

AW: Eindeutige Mac ID / Globale Konfiguration
 
Zitat:

Zitat von Phoenix (Beitrag 1228878)
Seltsam.. ich gehe tatsächlich immer nur mit "~" rein, und lande auch immer im korrekten Verzeichnis. Da brauch ich keine wilden Pfade zusammenzubauen.

NSSearchPathForDirectoriesInDomains gibt aber auch den korrekten Pfad zurück, wenn er noch nicht existieren sollte. Und das ExpandTilde Flag existiert ja.

jaenicke 18. Sep 2013 07:44

AW: Eindeutige Mac ID / Globale Konfiguration
 
Zitat:

Zitat von greenmile (Beitrag 1228838)
Ansonsten bliebe nur "nur frei" oder "nur kaufen", nichts zwischendrin.

Das ist nicht richtig. Viel sinnvoller wäre der Weg, der z.B. unter Android gegangen wird. Ein Paket, das nur zum Testen ist, also eben einen Nag-Screen enthält oder dem Funktionen fehlen, und ein Paket mit der vollen Anwendung.

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.

greenmile 18. Sep 2013 08:20

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.

greenmile 18. Sep 2013 09:04

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"?

Union 18. Sep 2013 09:23

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:
const
  NSUserDomainMask = 1;
  NSApplicationSupportDirectory = 14;
  libFoundation = '/System/Library/Frameworks/Foundation.framework/Foundation';

type
  NSSearchPathDirectory = NSUInteger;
  PNSArray = Pointer;
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:
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;

greenmile 18. Sep 2013 09:50

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