Werte von Info.plist innerhalb von Programmen verwenden

Atelis

Akerö
Registriert
01.03.07
Beiträge
1.835
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?
 

MacApple

Schöner von Bath
Registriert
05.01.04
Beiträge
3.652
Mit der Cocoa Klasse NSBundle kann man sich die Info.plist gleich als NSDictionary geben lassen.

MacApple
 

MacApple

Schöner von Bath
Registriert
05.01.04
Beiträge
3.652
Ja, das ist das Richtige. Das Problem ist allerdings folgendes:
Zitat aus der Apple Dokumentation:
The Cocoa-Java API is deprecated in Mac OS X version 10.4 and later.
Die Cocca-Java Bridge ist ein Auslaufmodell.

MacApple
 

below

Purpurroter Cousinot
Registriert
08.10.06
Beiträge
2.858
Und Du kannst Sie natürlich relativ zu Deinem Executable finden, sie liegt einfach in dem Verzeichnis darüber:

../Info.plist

Alex
 

Atelis

Akerö
Registriert
01.03.07
Beiträge
1.835
... 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! :)
 

Rastafari

deaktivierter Benutzer
Registriert
10.03.05
Beiträge
18.150
Sorry, aber wie meinst du das?
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.)
 
  • Like
Reaktionen: Atelis

Atelis

Akerö
Registriert
01.03.07
Beiträge
1.835
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...
 

Rastafari

deaktivierter Benutzer
Registriert
10.03.05
Beiträge
18.150
Ich brauche ja eigentlich nur einen relativen Pfad zu der plist innerhalb des Programmpaketes. Der Rest ist ja nur noch Tipp-Arbeit...
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.
 

Amin Negm-Awad

Süsser Pfaffenapfel
Registriert
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.