2013-03-22 3 views
6

Diese Frage ist eine Sub-Frage/Alternativer Weg zu nähern, was ich über diese Frage zu tun, ich versuche: How can I use PListBuddy to copy an entry from one file to another?Wie kann ich ein Array mit PlistBuddy zu einem Plist hinzufügen?

Ich möchte einen Eintrag von Plist Datei A bis Plist Datei B mit PlistBuddy durch eine XCode kopieren Build-Skript mit Bash/Shell. Dadurch kann ich die "Copy" -Funktion von PlistBuddy nicht verwenden. Ich muss jeden einzelnen Eintrag mit allen seinen Elementen kopieren, da Sie keine Wörterbücher hinzufügen/einstellen können, sondern über "Einträge" mit PlistBuddy interagieren müssen.

Was ich versuche zu tun, ist Plist-Datei A und Speichern seiner Titel/Werte-Arrays für ein "PSMultiValueSpecifier" -Element. Ich bin in der Lage, die Elemente in den Arrays zu greifen und sie auf dem Bildschirm zu drucken, aber wenn ich sie in die Ziel-Plist-Datei B hinzufüge, sind die Arrays noch leer.

Code: (Code Schnappen Sie den Eintrag Hinzufügen)

# Configure the Entry 
${PLISTBUDDY} -c "Add PreferenceSpecifiers:$DEST_INDEX dict" ${DEST_PLIST} 
${PLISTBUDDY} -c "Add PreferenceSpecifiers:$DEST_INDEX:Type string 'PSMultiValueSpecifier'" ${DEST_PLIST} 

# Retrieve the Additional Field Value 
preferenceTitle=`$PLISTBUDDY -c "Print PreferenceSpecifiers:$SOURCE_INDEX:Title" $SOURCE_PLIST 2>&1` 
preferenceKey=`$PLISTBUDDY -c "Print PreferenceSpecifiers:$SOURCE_INDEX:Key" $SOURCE_PLIST 2>&1` 
preferenceDefaultValue=`$PLISTBUDDY -c "Print PreferenceSpecifiers:$SOURCE_INDEX:DefaultValue" $SOURCE_PLIST 2>&1` 
preferenceValues=`$PLISTBUDDY -c "Print PreferenceSpecifiers:$SOURCE_INDEX:Values" $SOURCE_PLIST 2>&1` 
preferenceTitles=`$PLISTBUDDY -c "Print PreferenceSpecifiers:$SOURCE_INDEX:Titles" $SOURCE_PLIST 2>&1` 

-Code den neuen Eintrag hinzufügen:

# Set the Additional Field Values 
${PLISTBUDDY} -c "Add PreferenceSpecifiers:$DEST_INDEX:Title string $preferenceTitle" ${DEST_PLIST} 
${PLISTBUDDY} -c "Add PreferenceSpecifiers:$DEST_INDEX:Key string $preferenceKey" ${DEST_PLIST} 
${PLISTBUDDY} -c "Add PreferenceSpecifiers:$DEST_INDEX:DefaultValue integer $preferenceDefaultValue" ${DEST_PLIST} 
####BORKEN#### 
${PLISTBUDDY} -c "Add PreferenceSpecifiers:$DEST_INDEX:Values array $preferenceValues" ${DEST_PLIST} 
${PLISTBUDDY} -c "Add PreferenceSpecifiers:$DEST_INDEX:Titles array $preferenceTitles" ${DEST_PLIST} 
####BORKEN#### 

Hier ist ein Code-Snippet ist, das die folgenden Daten erzeugt:

echo "#########" 
echo "[$THIS] adding $preference: $preferenceDict" 
echo "#########" 
echo "Source: "`$PLISTBUDDY -c "Print PreferenceSpecifiers:$SOURCE_INDEX:Values" $SOURCE_PLIST` 
echo "Source: "`$PLISTBUDDY -c "Print PreferenceSpecifiers:$SOURCE_INDEX:Titles" $SOURCE_PLIST` 
echo "#########" 
echo "Destination: "`$PLISTBUDDY -c "Print PreferenceSpecifiers:$DEST_INDEX:Values" $DEST_PLIST` 
echo "Destination: "`$PLISTBUDDY -c "Print PreferenceSpecifiers:$DEST_INDEX:Titles" $DEST_PLIST` 
echo "#########" 

Hier sind die Daten, die beweisen, dass die richtigen Felder transportiert werden

######### 
[addDebugSettingsMenu.bash] adding : Dict { 
    Titles = Array { 
     Meters 
     Feet 
    } 
    DefaultValue = 1 
    Values = Array { 
     1 
     2 
    } 
    Key = UserPreferences_UnitsKey 
    Type = PSMultiValueSpecifier 
    Title = Units 
} 
######### 
Source: Array {  1  2 } 
Source: Array {  Meters  Feet } 
######### 
Destination: Array { } 
Destination: Array { } 
######### 

Bitte helfen Sie, wenn Sie irgendwelche Kenntnisse über undokumentierte Funktionen von PlistBuddy haben. Die MAN-Seiten sind super dünn und Beispiele sind weit und breit.

Ich möchte Ihnen für das Lesen dieses und für das Verleihen Ihres Gehirns danken, um mir zu helfen, diesen Hauptschmerz in meinem Hals zu lösen.

+0

Vielleicht gibt es einen besseren Weg, aber ich habe dieses Problem gelöst, indem ich die Elemente im Quell-Array gezählt habe und sie dann einzeln kopiert habe. $ {PLISTBUDDY} -c "PreferenceSpecifiers hinzufügen: $ DEST_INDEX: Titel Array" $ {} DEST_PLIST $ {PLISTBUDDY} -c "Add PreferenceSpecifiers: $ DEST_INDEX: Titel: 0 string 'TITLE_1'" $ {} DEST_PLIST $ {PLISTBUDDY} -c "Add PreferenceSpecifiers: $ DEST_INDEX: Titel: 1 String 'TITLE_2'" $ {DEST_PLIST} etc ... Ich kann dies nicht als Antwort bis 8 Stunden oder 10 Reputation, so werde ich kommentieren es für jetzt. – jhthorp

Antwort

2

Vielleicht gibt es einen besseren Weg, aber ich habe dieses Problem gelöst, indem ich die Elemente im Quell-Array gezählt habe und sie dann einzeln kopiert habe.

+0

Haben Sie in PlistBuddy den Befehl [Import] (http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man8/PlistBuddy.8.html) angeschaut? Es hört sich ähnlich an, fügt aber die gesamte Zieldatei unter dem Eintrag ein. – Richard

+0

Ja, ich habe mir den Import-Befehl angesehen.Es scheint den Zieleintrag zu überschreiben. Was ich brauchte, war den Zieleintrag anhängen/ändern. Im Wesentlichen habe ich den Inhalt eines Plists in eine Teilmenge des Inhalts eines anderen Plist eingefügt, um eine hybride Plist-Datei zu erstellen. Dies wird alles durch Kompilierzeit-Build-Skripte für verbesserte Debugging-Einstellungen usw. erreicht. – jhthorp

0

Es kann Ihr Problem beheben, aber es ist nicht der richtige Weg, in größeren Zusammenführungsskripts zu implementieren. Überprüfen Sie meine Ans unten.

0

Für etwas einfaches wie ein Array von Strings, hier ist Code, der eine beliebige Anzahl von Arrays kombinieren wird. In diesem Beispiel wird das UIAppFonts-Array verwendet, das in iOS-Info-Plisten verwendet wird.

TMP_NAME=`basename $0` 
TMP_DIR=`mktemp -d ${PROJECT_TEMP_DIR}/${TMP_NAME}.XXXXXX` || exit 1 
FONTS_PLIST="${TMP_DIR}/Fonts.plist" 

/usr/libexec/PlistBuddy -c "Add UIAppFonts array" "${FONTS_PLIST}" 

# Iterate through each array, adding to the array entry in the temporary plist 
index=0 
for arg; do 
    status=0 
    inner_index=0 
    while [ ${status} -eq 0 ]; do 
    set +e 
    # No easy way to get array length, so keep going until we go out of bounds 
    entry=`/usr/libexec/PlistBuddy -c "Print UIAppFonts:${inner_index}" "${arg}" 2> /dev/null` 
    status=${?} 
    set -e 
    if [ ${status} -eq 0 ]; then 
     /usr/libexec/PlistBuddy -c "Add UIAppFonts:${index} string ${entry}" "${FONTS_PLIST}" 
     index=`expr ${index} + 1` 
     inner_index=`expr ${inner_index} + 1` 
    fi 
    done 
done 
Verwandte Themen