-writeToFile:autmatically failt auf einigen(!) Benutzeraccounts

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • -writeToFile:autmatically failt auf einigen(!) Benutzeraccounts

    Ich habe hier ein NSDictionary, welches bei Beendigung des Programmes gespeichert werden soll.
    Das klappt auch gut, solange ich das Programm auf dem Benutzer-Account verwende, auf dem ich auch programmiere (-writeToFile:automatically gibt ja nen BOOL zurück, der einem den Erfolg anzeigt).
    Wenn ich aber das gleiche(!) Programm auf einem anderen Benutzer-Account öffne, failt die -writeToFile:autmatically immer und das merkt man natürlich dann auch dadran, dass das Programm mal wieder die Nutzereinstellungen nicht gespeichert hat.
    In das Dictionary kommen nur NSNumbers und NSStrings. Also daran, dass das Dictionary prinzipiell nicht zu einer Plist gemacht werden kann, sollte es nicht liegen (zumal das Speichern auf meinem Haupt-Benutzer-Account ja auch klappt).
    Weiß einer, wo der Fehler liegen könnte?
  • Hast du etwa den Pfad explizit angegeben? Dann hat nur der Benutzer die Rechte, auf die der Pfad verweist. Du musst dir den Pfad auf den Benutzerverzeichnis selbst hollen, etwa mit NSHomeDirectory().
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Quellcode

    1. - (void)awakeFromNib
    2. {
    3. NSString *path = [NSString stringWithFormat:@"%@/Library/Preferences/com.meineFirma.meineApp.plist",NSHomeDirectory()];
    4. if (![[NSFileManager defaultManager] fileExistsAtPath:path])
    5. {
    6. NSLog(@"create new plist");
    7. path = [[NSBundle mainBundle] pathForResource:@"DefaultAppData" ofType:@"plist"];
    8. }
    9. myPlist = [NSDictionary dictionaryWithContentsOfFile:path];
    10. }
    11. -(void)changeSomething
    12. {
    13. [myPlist setValue:[NSNumber numberWithBool:NO]] forKey:@"aKey"];
    14. }
    15. -(void)applicationWillTerminate:(NSNotification*)notification
    16. {
    17. NSString *path = [NSString stringWithFormat:@"%@/Library/Preferences/com.meineFirma.meineApp.plist",NSHomeDirectory()];
    18. [myPlist writeToFile:path atomically:YES];
    19. }
    Alles anzeigen


    Habe mir aber auf Anraten von mattik NSUserDefaults angeguckt. Wenn du noch nichts umgesetzt hast, dann mach das mit NSUserDefaults, das scheint das gleiche zu machen, nur dass es noch ein bisschen weniger Code ist und halt der von Apple vorgesehene Weg ist (Bin mal gespannt, ob Apple an meiner selbstgebastelten Lösung wieder was zu meckern hat).
  • Ich habe was zu meckern.

    Ich weiß nicht genau, was Benutzereinstellungen sind. Hat man etwa einen Nutzer, der andere Nutzer verwaltet? Dann sind das normale Daten, die in das Dokument, bei non-DBA in ~Library/Applications/ gehören.

    Wenn du das wirklich so meinst, wie das System, dann gehört das gar nicht in deine Hände, sondern ini die Hände des Systems. Passwörter werden in der Keychain behandelt, anderweitige Einstellungen gehören – nicht nach Benutzern sortiert! – in die User-Defaults. Das System kann die nämlich selbst zuordnen. (Und einer Netzwerkdomäne und einem Rechner usw.) Ich glaube nicht, dass es gefällt, wenn du neben dem Nutzersystem des OS noch ein zweites installierst.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Also ich meinte mit Benutzereinstellungen so ganz normale Einstellungen, die ein Benutzer treffen kann. Nutzer A will, dass die App in nem grünen Fenster läuft. Nutzer B will, dass die App in nem gelben Fenster läuft. Ich wollte das "Benutzer" nur unterstreichen, weil das ja Einstellungen sind, die für jeden Benutzer seperat gespeichert werden müssen. Kann das aus deinem Letzten Absatz nicht genau rauslesen, meinst du Apple meckert jetzt?
  • Descartes schrieb:

    Also ich meinte mit Benutzereinstellungen so ganz normale Einstellungen, die ein Benutzer treffen kann. Nutzer A will, dass die App in nem grünen Fenster läuft. Nutzer B will, dass die App in nem gelben Fenster läuft. Ich wollte das "Benutzer" nur unterstreichen, weil das ja Einstellungen sind, die für jeden Benutzer seperat gespeichert werden müssen. Kann das aus deinem Letzten Absatz nicht genau rauslesen, meinst du Apple meckert jetzt?

    Du sapeichest einfach die Einstellung unter ihrem Namen ohne Berüksichtigung des Nutzers. Das sucht dir das System heraus.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Descartes schrieb:

    Btw. eigentlich müssen so ziemlich alle Einstellungen für jeden Nutzer seperat gespeichert werden^^ Bin wohl ein bisschen geschädigt vom iPhone (darum wollte ich die Daten auch innerhalb des App-Ordners speichern).

    @Claus: Was möchtest du damit jetzt sagen?

    Das iPhone ist prinzipiell ein persönlicher Gegenstand. Da stellt sch das Problem gar nicht bis anders.

    Ein Mac ist prinzipiell ein Gegenstand, der von unterschiedlichen Nutzern benutzt wir. Um die Zuordnung kümmert sich das System.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Descartes schrieb:

    Habe mir aber auf Anraten von mattik NSUserDefaults angeguckt. Wenn du noch nichts umgesetzt hast, dann mach das mit NSUserDefaults, das scheint das gleiche zu machen, nur dass es noch ein bisschen weniger Code ist und halt der von Apple vorgesehene Weg ist (Bin mal gespannt, ob Apple an meiner selbstgebastelten Lösung wieder was zu meckern hat).


    Ja. NSUserDefaults sind definitiv der richtige Weg. Kommt Dir auch entgegen.
    Toller Beitrag. :thumbup:
  • Recht habt ihr ja alle mit NSUserDefaults, aber man muss sowas doch auch "per Hand" können?!
    Was macht man denn, wenn die Daten jetzt in ner sqlite-Datenbank wären?

    PS: auch ich habe jetzt alles auf NSUserDefaults umgestellt. Allerdings finde ich dieses "Kann dir egal sein, macht das System!" etwas unbefriedigend. Es muss doch irgend einen gescheiten festen Ort geben, an dem eine App seine Sachen ablegen darf (Wie schon gesagt, nicht alle Daten lassen sich in plists fassen)? Ist ~/Library/Preferences nun also der richtige Ort für sowas? Zumidnest oberflächich betrachtet passiert fast genau das gleiche, egal ob mit NSUserDefaults oder "manuell" (wie ich das hier gerde als Code gepostet habe). Ich habe nachher halt immer in diesem ~/Library/Preferences Ordner eine plist mit genau dem Namen, den ich ja schon vorher verwendet habe.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von Descartes ()

  • Klar gibt's solch einen Ort. In ~/Library/Application Support kann Deine App sich einen Ordner anlegen und alles mögliche reintun. Oder in /Library/Application Support. Oder analog Library/Caches für temporäre Daten. Davon gibt's so einige. Schau' Dir mal NSPathUtilities.h an, da gibt es eine Funktion NSSearchPathForDirectoriesInDomains(...) und enums NSSearchPathDirectory sowie NSSearchPathDomainMask. Mit ihrer Hilfe kommst Du an alle möglichen interessanten Pfade. Ach ja, keiner zwingt Dich, NSUserDefaults zu verwenden - es ist einfach ein sehr durchdachter Mechanismus, der in der überwältigenden Mehrheit der Fälle einfach und robust funktioniert und darüber hinaus zukunftssicher ist. Das System dahinter wirkt auf den ersten Blick etwas restriktiv, ist es aber nicht. Und es sorgt für eine ordentliche, konsistente und übersichtliche Dateistruktur (was in meinen Augen eine der ganz großen Stärken von OSX ist). Man darf alles selbst machen, ob es dadurch besser wird, ist allerdings eine andere Frage.
    Multigrad - 360°-Produktfotografie für den Mac