1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

Werte von Info.plist innerhalb von Programmen verwenden

Dieses Thema im Forum "OS X-Developer" wurde erstellt von Atelis, 19.01.08.

  1. Atelis

    Atelis Akerö

    Dabei seit:
    01.03.07
    Beiträge:
    1.831
    Hi!
    Ich arbeite jetzt schon einige Zeit mit Eclipse an einem Java-Programm. Die aktuelle Version trage ich immer per Hand in die Info.plist ein und erzeuge hinterher ein Programm mit XCode. Nun möchte ich die Version innerhalb des Programmes auslesen, da ich mit der Versionsnummer arbeiten muss.

    1. Ich weiß, wo die Info.plist eines Programmes liegt, nur wie komme ich da dran?
    2. Ich habe schon jeden Winkel des Internets durchsucht, doch nirgendo kann ich auch nur einen Hinweis finden: gibt es eine elegantere Möglichkeit, als die Datei komplett einzulesen?
     
  2. MacApple

    MacApple Lord Grosvenor

    Dabei seit:
    05.01.04
    Beiträge:
    3.470
    Mit der Cocoa Klasse NSBundle kann man sich die Info.plist gleich als NSDictionary geben lassen.

    MacApple
     
  3. Atelis

    Atelis Akerö

    Dabei seit:
    01.03.07
    Beiträge:
    1.831
  4. MacApple

    MacApple Lord Grosvenor

    Dabei seit:
    05.01.04
    Beiträge:
    3.470
    Ja, das ist das Richtige. Das Problem ist allerdings folgendes:
    Zitat aus der Apple Dokumentation:
    Die Cocca-Java Bridge ist ein Auslaufmodell.

    MacApple
     
  5. below

    below Kalterer Böhmer

    Dabei seit:
    08.10.06
    Beiträge:
    2.865
    Und Du kannst Sie natürlich relativ zu Deinem Executable finden, sie liegt einfach in dem Verzeichnis darüber:

    ../Info.plist

    Alex
     
  6. Atelis

    Atelis Akerö

    Dabei seit:
    01.03.07
    Beiträge:
    1.831
    ... Bleibt mir also keine andere Möglichkeit, als die Datei komplett auszulesen? Gut, hatte zwar mit einer komfortableren Methode gerechnet, aber dann muss ich das so machen...

    Danke! :)
     
  7. Rastafari

    Rastafari Golden Noble

    Dabei seit:
    10.03.05
    Beiträge:
    17.896
    Hach, wäre das fein wenn man sich ein Shellscript borgen könnte, dann könnte man auf das fix und fettige "defaults" zurückgreifen. :)
     
  8. Atelis

    Atelis Akerö

    Dabei seit:
    01.03.07
    Beiträge:
    1.831
    Sorry, aber wie meinst du das?
     
  9. Rastafari

    Rastafari Golden Noble

    Dabei seit:
    10.03.05
    Beiträge:
    17.896
    Ich nehme mal an du bekommst es gebacken, ein Shellkommando abzusetzen bzw von einem solchen den Output entgegenzunehmen. (Bitte frag mich jetzt nicht nach Details, ich HASSE Java.)

    "defaults" ist das BSD-Kommandozeilenwerkzeug zum lesen und schreiben aller Arten von *.plist Dateien. Sowohl von Preferences als auch beliebige andere plist's, deren Ablageort man kennt.
    Code:
    man defaults
    Beispiele
    (man beachte bei direkt angesprochenen plists das ausgelassene plist-Suffix):

    Code:
    defaults read "/Applications/MyApp.app/Contents/Info" "CFBundleGetInfoString";
    [COLOR="Sienna"]0.9[/COLOR]
    defaults write "/Applications/MyApp.app/Contents/Info" "CFBundleGetInfoString" "1.0";
    defaults read "/Applications/MyApp.app/Contents/Info" "CFBundleGetInfoString";
    [COLOR="Sienna"]1.0[/COLOR]
    
    [COLOR="Olive"]# Preferences in der Benutzer-Domäne bearbeiten:[/COLOR]
    defaults read "org.mysite.myapp" "HurzMode";
    [COLOR="Sienna"]0[/COLOR]
    defaults write "org.mysite.myapp" "HurzMode" -boolean YES;
    defaults read "org.mysite.myapp" "HurzMode";
    [COLOR="Sienna"]1[/COLOR]
    
    Komplexe Strukturen von Dictionaries, Arrays und tieferen Verschachtelungen davon lassen sich mit verschiedenen Notationen darstellen - eine davon ist die Möglichkeit, direkt mit XML-Quelltext zu arbeiten, die andere sind Klammerausdrücke im Shell-Stil. Plists dabei gleich komplett neu zu erstellen ist auch kein Problem. (Single Quoting rettet Leben):
    Code:
    [COLOR="Olive"]# plist erstellen[/COLOR]
    defaults write "./my_plist" \
    ' { "a_dictionary" = { "an_array" = ( { "a_nested_dict_item" = value; '\
    ' "more_nested_dict_stuff" = foo; }, <4abfcd60 5643aca0 >, '\
    ' "45.88", "a_string", "more_strings", "another value" ); }; '\
    ' "any_key" = "type-o-matic"; "any_other_key" = "blah blah"; } ' ;
    
    [COLOR="Olive"]# komplett auslesen[/COLOR]
    defaults read "./my_plist" ;
    [COLOR="Sienna"]{
        "a_dictionary" = {
            "an_array" = (
                {"a_nested_dict_item" = value; "more_nested_dict_stuff" = foo; }, 
                <4abfcd60 5643aca0 >, 
                "45.88", 
                "a_string", 
                "more_strings", 
                "another value"
            ); 
        }; 
        "any_key" = "type-o-matic"; 
        "any_other_key" = "blah blah"; 
    } [/COLOR] 
    
    [COLOR="Olive"]# bestimmten Key abfragen[/COLOR]
    defaults read "./my_plist" "any_key" ;
    [COLOR="Sienna"]type-o-matic [/COLOR] 
    defaults read "./my_plist" "any_other_key" ;
    [COLOR="Sienna"]blah blah [/COLOR] 
    
    [COLOR="Olive"]# diese plist sieht im XML-Quelltext natürlich so aus:[/COLOR]
    cat "./my_plist.plist" ;
    [COLOR="Sienna"]<?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
    	<key>a_dictionary</key>
    	<dict>
    		<key>an_array</key>
    		<array>
    			<dict>
    				<key>a_nested_dict_item</key>
    				<string>value</string>
    				<key>more_nested_dict_stuff</key>
    				<string>foo</string>
    			</dict>
    			<data>
    			Sr/NYFZDrKA=
    			</data>
    			<string>45.88</string>
    			<string>a_string</string>
    			<string>more_strings</string>
    			<string>another value</string>
    		</array>
    	</dict>
    	<key>any_key</key>
    	<string>type-o-matic</string>
    	<key>any_other_key</key>
    	<string>blah blah</string>
    </dict>
    </plist>
    [/COLOR]
    
    
    [COLOR="Olive"]# Das erstellen (oder auch ändern)
    # geht aber auch im XML-Stil, das Ergebnis
    # ist identisch. Im Krisenfall der totalen Quoting-Manie
    # hilft ein Dump aus dem "Property List Editor" Wunder.[/COLOR]
    defaults write "./another_plist" \
    '<dict><key>a_dictionary</key><dict><key>an_array</key><array>'\
    '<dict><key>a_nested_dict_item</key><string>value</string>'\
    '<key>more_nested_dict_stuff</key><string>foo</string></dict>'\
    '<data>Sr/NYFZDrKA=</data><string>45.88</string>'\
    '<string>a_string</string><string>more_strings</string>'\
    '<string>another value</string></array></dict>'\
    '<key>erster_string</key><string>irgendwas</string>'\
    '<key>zweiter_string</key><string>lies mich</string></dict>' ;
    
    defaults read "./another_plist" ;
    [COLOR="Sienna"]{
        "a_dictionary" = {
            "an_array" = (
                {"a_nested_dict_item" = value; "more_nested_dict_stuff" = foo; }, 
                <4abfcd60 5643aca0 >, 
                "45.88", 
                "a_string", 
                "more_strings", 
                "another value"
            ); 
        }; 
        "erster_string" = "irgendwas"; 
        "zweiter_String" = "lies mich"; 
    } [/COLOR] 
     
    [COLOR="Olive"]# bestimmten Key abfragen...[/COLOR]
    defaults read "./another_plist" "erster_string" ;
    [COLOR="Sienna"]irgendwas [/COLOR] 
    defaults read "./another_plist" "zweiter_string" ;
    [COLOR="Sienna"]lies mich [/COLOR] 
    
    [COLOR="Olive"]# ...und ändern:[/COLOR]
    defaults write "./another_plist" "zweiter_string" "neuer Wert";
    defaults read "./another_plist" "zweiter_string" ;
    [COLOR="Sienna"]neuer Wert [/COLOR] 
    
    
    Na, lässt sichs damit auch ohne "NSpiffpaffpuff" leben?
    Simpel, aber trotzdem befriedigend kompliziert. :)

    PS
    Wozu das gut sein soll wenn man auch selber XML-Texte parsen kann?
    Schon mal was von >binären< plists gehört?
    Standardformat seit Tiger!
    (Umwandeln "XML <-> Binär" mit "plutil", wenns Not tut.)
     
    Atelis gefällt das.
  10. Atelis

    Atelis Akerö

    Dabei seit:
    01.03.07
    Beiträge:
    1.831
    Wahnsinn!! :-D DANKE!! :-* ;)
    Ich brauche ja eigentlich nur einen relativen Pfad zu der plist innerhalb des Programmpaketes. Der Rest ist ja nur noch Tipp-Arbeit...
     
  11. Rastafari

    Rastafari Golden Noble

    Dabei seit:
    10.03.05
    Beiträge:
    17.896
    Jo. Aber vergiss eines nicht:
    Mit der Plattformunabhängigkeit deines Java-Projektes ist es spätestens zu diesem Zeitpunkt vorbei.
    "defaults" gibt es nur in OS X.
     
  12. Amin Negm-Awad

    Amin Negm-Awad Süsser Pfaffenapfel

    Dabei seit:
    01.03.07
    Beiträge:
    665
    Ich glaube, hier werden mal wieder Defaults und plists verwechselt. Defaults sind eine Anwendung von plists. Und Defaults werden seit .4 standardmäßig in binären plists gespeichert. Der plist-Persistent-Standard ist seit .0 und bis .5 XML. Defaults halten sich gerade nicht an den plist-Standard.
     

Diese Seite empfehlen