Ios 如何使用PlistBuddy添加设置而不覆盖现有设置?

Ios 如何使用PlistBuddy添加设置而不覆盖现有设置?,ios,plist,settings.bundle,Ios,Plist,Settings.bundle,我正在尝试编写一个脚本,在构建期间将设置添加到设置应用程序,而不覆盖现有设置(如果存在)。以下是我的脚本片段: PLISTBUDDY="/usr/libexec/PlistBuddy" SETTINGSBUNDLEPATH="$CODESIGNING_FOLDER_PATH/Settings.bundle/Root.plist" { $PLISTBUDDY -c "Add :PreferenceSpecifiers:0:Type string 'PSGroupSpecifier'" "$SET

我正在尝试编写一个脚本,在构建期间将设置添加到设置应用程序,而不覆盖现有设置(如果存在)。以下是我的脚本片段:

PLISTBUDDY="/usr/libexec/PlistBuddy"
SETTINGSBUNDLEPATH="$CODESIGNING_FOLDER_PATH/Settings.bundle/Root.plist"

{
$PLISTBUDDY -c "Add :PreferenceSpecifiers:0:Type string 'PSGroupSpecifier'" "$SETTINGSBUNDLEPATH"
$PLISTBUDDY -c "Add :PreferenceSpecifiers:0:Title string 'Version Information'" "$SETTINGSBUNDLEPATH"
} || {
$PLISTBUDDY -c "Set :PreferenceSpecifiers:0:Type 'PSGroupSpecifier'" "$SETTINGSBUNDLEPATH"
$PLISTBUDDY -c "Set :PreferenceSpecifiers:0:Title 'Version Information'" "$SETTINGSBUNDLEPATH"
}

{
$PLISTBUDDY -c "Add :PreferenceSpecifiers:1:Type string 'PSTitleValueSpecifier'" "$SETTINGSBUNDLEPATH"
$PLISTBUDDY -c "Add :PreferenceSpecifiers:1:Title string 'Version:'" "$SETTINGSBUNDLEPATH"
$PLISTBUDDY -c "Add :PreferenceSpecifiers:1:Key string 'appVersion'" "$SETTINGSBUNDLEPATH"
$PLISTBUDDY -c "Add :PreferenceSpecifiers:1:DefaultValue string '$APPVERSION'" "$SETTINGSBUNDLEPATH"
} || {
$PLISTBUDDY -c "Set :PreferenceSpecifiers:1:Type 'PSTitleValueSpecifier'" "$SETTINGSBUNDLEPATH"
$PLISTBUDDY -c "Set :PreferenceSpecifiers:1:Title 'Version:'" "$SETTINGSBUNDLEPATH"
$PLISTBUDDY -c "Set :PreferenceSpecifiers:1:Key 'appVersion'" "$SETTINGSBUNDLEPATH"
$PLISTBUDDY -c "Set :PreferenceSpecifiers:1:DefaultValue '$APPVERSION'" "$SETTINGSBUNDLEPATH"
}
但我不想覆盖任何现有设置如何将这些设置添加到首选项说明符的末尾?

我已经阅读了,并且我尝试过使用Merge,但没有成功

$PLISTBUDDY -c "Merge ${PROJECT_DIR}/Settings1.bundle/Root.plist" "$SETTINGSBUNDLEPATH"

编辑:在代码中添加了“try-catch”,这可以修复两次运行脚本时的问题。

这首先统计所有字典首选项说明符,如中所示。然后,它将在字典上循环并检查组是否已经存在,因此当您第二次构建应用程序时,脚本将不会再次添加行。如果找不到组,它将在最后一个索引之后添加行。有一件事我不确定,那就是为什么count不是一个数字,以及如何正确地修复它(当前的代码是有效的)


请稍候,
$CODESIGNING\u FOLDER\u PATH
将包含一些与生成计算机相关的文件夹,并且您正在将该文件夹名称构建到应用程序中?警铃响了…这不好吗?在那里写起来似乎容易多了,因为我只想根据构建配置添加某些设置。我想我搞错了。您正在该文件夹中设置
.plist
,以便将其包含在应用程序中,这是完全合理的。对不起,弄错了。
PLISTBUDDY="/usr/libexec/PlistBuddy"
SETTINGSBUNDLEPATH="$CODESIGNING_FOLDER_PATH/Settings.bundle/Root.plist"

count=`${PLISTBUDDY} -c "Print PreferenceSpecifiers:" ${SETTINGSBUNDLEPATH} | grep "Dict"|wc -l`
let count++
let count--

FOUND=false
for index in `seq 0 $count`
do
    val=`${PLISTBUDDY} -c "Print PreferenceSpecifiers:${index}:Key" ${SETTINGSBUNDLEPATH}`
    if [ "$val" == "versionInfo" ]; then
        FOUND=true
        break
    fi
done

if [ "$FOUND" == false ]; then
    $PLISTBUDDY -c "Add :PreferenceSpecifiers:$count:Type string 'PSGroupSpecifier'" "$SETTINGSBUNDLEPATH"
    $PLISTBUDDY -c "Add :PreferenceSpecifiers:$count:Title string 'Version Information'" "$SETTINGSBUNDLEPATH"
    $PLISTBUDDY -c "Add :PreferenceSpecifiers:$count:Key string 'versionInfo'" "$SETTINGSBUNDLEPATH"

    let count++
    $PLISTBUDDY -c "Add :PreferenceSpecifiers:$count:Type string 'PSTitleValueSpecifier'" "$SETTINGSBUNDLEPATH"
    $PLISTBUDDY -c "Add :PreferenceSpecifiers:$count:Title string 'Version:'" "$SETTINGSBUNDLEPATH"
    $PLISTBUDDY -c "Add :PreferenceSpecifiers:$count:Key string 'appVersion'" "$SETTINGSBUNDLEPATH"
    $PLISTBUDDY -c "Add :PreferenceSpecifiers:$count:DefaultValue string '$APPVERSION'" "$SETTINGSBUNDLEPATH"
fi