nslocationwheninuseusagedescription - info.plist xcode
¿Cómo puedo usar PlistBuddy para acceder a un elemento de Preferencias especificado por su propiedad? (2)
En este momento estoy usando este código.
/usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:1:DefaultValue $productVersion" "Test/Settings.bundle/Root.plist"
en la parte del script de la fase de compilación para colocar la versión del producto en un campo de solo lectura de la configuración de la aplicación. Ese campo tiene la posición 1 (comenzando desde 0) de la matriz de preferencias.
Estoy preguntando si es posible usar algo más robusto que uno para acceder a ese campo, ya que la posición puede ser cambiada accidentalmente por mí o por otros desarrolladores.
¿Puedo acceder a ese elemento especificando su identificador independientemente de su posición?
Para explicar mejor mis necesidades, escribí un ejemplo. Necesito poner algo como 1.2.345
en el nodo de la string
del segundo dict
de la array
es decir, necesito cambiar de 0.0.0
a 1.2.345
. ¿Es posible acceder a dict
node sin indicar que es el segundo en la matriz? Estoy pidiendo que se use algo similar a una expresión xpath en PlistBuddy (si existe).
<?xml version="1.0" encoding="UTF-8"?>
<dict>
<key>PreferenceSpecifiers</key>
<array>
<dict>
<key>Title</key>
<string>Application info</string>
<key>Type</key>
<string>PSGroupSpecifier</string>
</dict>
<dict>
<key>DefaultValue</key>
<string>0.0.0</string>
<key>Key</key>
<string>version</string>
<key>Title</key>
<string>Version</string>
<key>Type</key>
<string>PSTitleValueSpecifier</string>
</dict>
<dict>
<key>DefaultValue</key>
<string>0</string>
<key>Key</key>
<string>build</string>
<key>Title</key>
<string>Build</string>
<key>Type</key>
<string>PSTitleValueSpecifier</string>
</dict>
...
Una pequeña mejora en la respuesta del geowar. Obtenga la versión del producto de Info.plist.
#!/bin/tcsh
set infoPlist="Info.plist"
set version=`/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" ${infoPlist}`
set bundleVersion=`/usr/libexec/PlistBuddy -c "Print CFBundleVersion" ${infoPlist}`
set productVersion=$version.$bundleVersion
# echo "the product version is ${productVersion}."
set settingsPlist="Settings.bundle/Root.plist"
set settingsCnt=`/usr/libexec/PlistBuddy -c "Print PreferenceSpecifiers:" ${settingsPlist} | grep "Dict"|wc -l`
# echo "the count is: $settingsCnt."
set settingsCnt=`expr "$settingsCnt" ''-'' ''1''`
foreach idx (`seq 0 $settingsCnt`)
# echo "the index is: $idx."
set val=`/usr/libexec/PlistBuddy -c "Print PreferenceSpecifiers:${idx}:Key" ${settingsPlist}`
# echo "the value of PreferenceSpecifiers:${idx}:Title: is ${val}."
if ( "$val" == "version" ) then
echo "the index of the entry whose ''Key'' is ''version'' is $idx."
# now set it
/usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:${idx}:DefaultValue $productVersion" ${settingsPlist}
# just to be sure that it worked
set ver=`/usr/libexec/PlistBuddy -c "Print PreferenceSpecifiers:${idx}:DefaultValue" ${settingsPlist}`
echo ''PreferenceSpecifiers:$idx:DefaultValue set to: '' $ver
endif
end
#!/bin/tcsh
set productVersion="1.2.345"
set theFile="~/Desktop/PlistBuddy/Root.plist"
set cnt=`/usr/libexec/PlistBuddy -c "Print PreferenceSpecifiers:" ${theFile} | grep "Dict"|wc -l`
# echo "the count is: $cnt."
set cnt=`expr "$cnt" ''-'' ''1''`
foreach idx (`seq 0 $cnt`)
# echo "the index is: $idx."
set val=`/usr/libexec/PlistBuddy -c "Print PreferenceSpecifiers:${idx}:Title" ${theFile}`
# echo "the value of PreferenceSpecifiers:${idx}:Title: is ${val}."
if ( "$val" == "Version" ) then
echo "the index of the entry whose ''Title'' is ''Version'' is $idx."
# now set it
/usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:${idx}:DefaultValue $productVersion" ${theFile}
# just to be sure that it worked
set ver=`/usr/libexec/PlistBuddy -c "Print PreferenceSpecifiers:${idx}:DefaultValue" ${theFile}`
echo ''PreferenceSpecifiers:$idx:DefaultValue set to: '' $ver
endif
end