Info.plist zur Laufzeit verändern

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

  • Info.plist zur Laufzeit verändern

    Hallo.

    Ich will die LSUIElement property direkt von der App aus in die Info.plist schreiben, allerdings scheint die Datei solange das Programm lauft keinen write access zu haben.

    Führt irgend ein weg an einem script oder helper programm herum um das direkt zu bewerkstelligen?
    Oder mach ich einfach nur was falsch.

    Lg

    Quellcode

    1. - (void)applicationWillTerminate:(NSNotification *)aNotification
    2. {
    3. NSMutableDictionary *plist = [[[NSBundle mainBundle] infoDictionary] mutableCopy];
    4. NSString *path = [NSString stringWithFormat:@"%@/Info.plist", [[NSBundle mainBundle] bundlePath]];
    5. if([[NSUserDefaults standardUserDefaults] boolForKey:FMShowInDock])
    6. [plist setValue:[NSNumber numberWithBool:NO] forKey:@"LSUIElement"];
    7. else
    8. [plist setValue:[NSNumber numberWithBool:YES] forKey:@"LSUIElement"];
    9. NSData *plistData = [NSPropertyListSerialization dataFromPropertyList:plist format:NSPropertyListXMLFormat_v1_0 errorDescription:nil];
    10. if(![plistData writeToFile:path atomically:YES]);
    11. NSLog(@"Error writing plist");
    12. [plist release];
    13. [NSTask launchedTaskWithLaunchPath:@"/usr/bin/touch" arguments:[NSArray arrayWithObject:[[NSBundle mainBundle] bundlePath]]];
    14. }
    Alles anzeigen
    enum { NSNoInterfaceStyle = 0, // Default value for window's interfaceStyle
  • RE: Info.plist zur Laufzeit verändern

    Original von fatal
    Ich will die LSUIElement property direkt von der App aus in die Info.plist schreiben, allerdings scheint die Datei solange das Programm lauft keinen write access zu haben.

    Du kannst Dir grundsätzlich nicht sicher sein, dass Schreibrechte ins App-Bundle bestehen. Der ausführende Nutzer kann zum Beispiel keine Adminrechte besitzen und startet das Programm aus dem „Programme” Ordner. -> Keine Schreibrechte. Oder das Programm wird von einem Schreibgeschützen Medium, Diskimage gestartet. -> Keine Schreibrechte.

    Michael
  • bin zwar noch nicht ganz so weit in sachen cocoa, aber lass mir dir sagen, dass das nichts wird - zumindest dann nicht, wenn du es wie apple es sich wünschst lösen möchtest. ich habe mich jetzt einige tage mit diesem thema herumgeschlagen und wenn du das, was du da willst, wirklich willst, dann kommst nicht darum herum dir 'irgendwie' die nötigen rechte zu verschaffen, die datei anzupassen. mein weg des cocoa-lernens hat mich hier inzwischen die folgenden dinge gelehrt:

    1.) 'fummel' nie am inhalten des bundles nach auslieferung herum! soll 'man' nicht. kann u.u. z.b. prüfsummen, zum zwecke des prüfens auf authentizität des bundles, verändern. aber auch sonst, und wenn man nichts dergleichen hat oder kennt das hier prüfen würde, soll das wohl eine "heilige apple-dev-regeln' brechen. heh, und ich als 'einsteiger' lerne ja gerade viele davon.

    2.) das mit dem LSUIElement lässt sich im zweifel auch anders lösen. ich habe es allerdings nach wie vor nicht geschafft (und versuche mich inzwischen sogar mit hilfe von carbon daran), das ganze wie 'quicksilver' zu lösen. hier zeigen durchaus einige menüpunkte menüs - auch ohne icon im dock. egal was ich bisher probierte, ich bekomme die menüs nicht hergezaubert. eine app ohne dock icon heißt für meine applikation eben: keine menüs.

    ein beispiel wie 'man' es wohl macht: setze das LSUIElement initial (sprich, bei auslieferung bereits) auf den einen wert, auf den du es setzen möchtest (ohne dock icon, aber mit icon im menu bar) und zaubere programmatisch anfangs (wenn der benutzer es denn anders wünscht; per user-defaults-dictionary z.b.) einen eben anderen zustand her, so z.b. mit dock icon, aber eben ohne das menü icon.

    3.) <klugscheißerModeOn>gibt ne menge menge threads zu dem thema bei guugle</off>

    würde mir aber auch wünschen, das apple hier mal etwas nachbessert. es gibt methoden für jeden (sorry) scheiß, aber hier wird gespart ;)
  • 1.
    3.) <klugscheißerModeOn>gibt ne menge menge threads zu dem thema bei guugle</off>


    ja aber da steht nur mist drin. sonst tät ich hier nicht fragen.

    2.
    bin zwar noch nicht ganz so weit in sachen cocoa, aber lass mir dir sagen, dass das nichts wird - zumindest dann nicht, wenn du es wie apple es sich wünschst lösen möchtest


    In CoverSutra lässt sich der dock-lose modus auch in den prefs setzen... Soviel zu dem "unmöglich"
    Hab allerdings keine Helper App oder Script im CoverSutra resource ordner gefunden, deswegen liegt die Vermutung nahe dass das auch so geht.
    enum { NSNoInterfaceStyle = 0, // Default value for window's interfaceStyle
  • Was ich mir denke dass funktionieren könnte ist standardmässig die LSUIElement auf 1 zu lassen und beim launch die eigenen user prefs zu checken wo drinsteht ob es eine background app ist oder nicht.

    Falls nicht kann man ja einfach mit der kProcessTransformToForegroundApplication Property das ganze ändern denke ich.

    Nur ein gedanke... noch nicht probiert.
    enum { NSNoInterfaceStyle = 0, // Default value for window's interfaceStyle
  • Yep... works like a charm!

    1. LSUIElement standardmässig auf 1 setzen in der Info.plist

    2. Beim starten checken ob in den NSUserDefaults drinsteht ob es in dock-mode ist.

    3. Wenn ja dann

    Quellcode

    1. ProcessSerialNumber psn = { 0, kCurrentProcess };
    2. OSStatus status = TransformProcessType(&psn, kProcessTransformToForegroundApplication);
    Und man muss nichtmal in der Info.plist rumgatschen....
    enum { NSNoInterfaceStyle = 0, // Default value for window's interfaceStyle
  • Wofür steht das "k"?

    Original von fatal

    Quellcode

    1. ProcessSerialNumber psn = { 0, kCurrentProcess };
    2. OSStatus status = TransformProcessType(&psn, kProcessTransformToForegroundApplication);


    Ist ein wenig OffTopic, aber weiß jemand zufällig wofür das "k" bei

    Quellcode

    1. kCurrentProcess
    2. kProcessTransformToForegroundApplication
    steht?

    Das ist mir schon so manchesmal in der Dokumentation untergekommen und hat bei mir Ratlosig"k"eit hinterlassen.

    Vermutung 1: "k" steht für "Key"
    Vermutung 2: "k" steht für "Carbon" (aber "c" wollte/durfte Apple aus bestimmten Gründen nicht nehmen)
    Hoecker-Plot - eine neue Auswertungsmethode für Digitalproofs - http://www.hoecker-plot.de