AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Cross-Platform-Entwicklung Eindeutige Mac ID / Globale Konfiguration
Thema durchsuchen
Ansicht
Themen-Optionen

Eindeutige Mac ID / Globale Konfiguration

Ein Thema von greenmile · begonnen am 17. Sep 2013 · letzter Beitrag vom 18. Sep 2013
Antwort Antwort
Seite 1 von 2  1 2      
greenmile

Registriert seit: 17. Apr 2003
1.107 Beiträge
 
Delphi 10.3 Rio
 
#1

Eindeutige Mac ID / Globale Konfiguration

  Alt 17. Sep 2013, 18:28
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?

Geändert von greenmile (17. Sep 2013 um 18:31 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.640 Beiträge
 
#2

AW: Eindeutige Mac ID / Globale Konfiguration

  Alt 17. Sep 2013, 18:49
Ü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
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
greenmile

Registriert seit: 17. Apr 2003
1.107 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Eindeutige Mac ID / Globale Konfiguration

  Alt 17. Sep 2013, 19:48
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.
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#4

AW: Eindeutige Mac ID / Globale Konfiguration

  Alt 17. Sep 2013, 22:28
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'
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.640 Beiträge
 
#5

AW: Eindeutige Mac ID / Globale Konfiguration

  Alt 18. Sep 2013, 07:13
Seltsam.. ich gehe tatsächlich immer nur mit "~" rein, und lande auch immer im korrekten Verzeichnis. Da brauch ich keine wilden Pfade zusammenzubauen.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#6

AW: Eindeutige Mac ID / Globale Konfiguration

  Alt 18. Sep 2013, 08:32
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.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.588 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Eindeutige Mac ID / Globale Konfiguration

  Alt 18. Sep 2013, 08:44
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
greenmile

Registriert seit: 17. Apr 2003
1.107 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: Eindeutige Mac ID / Globale Konfiguration

  Alt 18. Sep 2013, 09:20
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.
  Mit Zitat antworten Zitat
greenmile

Registriert seit: 17. Apr 2003
1.107 Beiträge
 
Delphi 10.3 Rio
 
#9

AW: Eindeutige Mac ID / Globale Konfiguration

  Alt 18. Sep 2013, 10:04
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"?
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#10

AW: Eindeutige Mac ID / Globale Konfiguration

  Alt 18. Sep 2013, 10:23
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;
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:47 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz