如何使用 PListBuddy 将条目从一个文件复制到另一个文件?

问题描述 投票:0回答:1

我一直是 StackOverflow 的长期查看者,总是在必要时找到我的解决方案,但经过一周的专注研究后,我发现了一个没有解决方案的问题。

我想做的是扩展这个人的研究: http://mrox.net/blog/2008/11/16/adding-debug-only-preferences-in-iphone-applications/

我希望调试菜单显示为主 Plist 文件的一部分,而不是子窗格。

到目前为止,大约 95% 的 Plist 类型都可以解决小问题。简而言之,我基本上是迭代“调试”Plist,然后将它们描绘到目标 Plist 上。

现在,由于某种原因,多个值将无法以这种形式工作,因为标题/值似乎没有正确设置(不知道为什么 - 下面添加的代码供仔细阅读)。

我发现可行的一个解决方案是使用 PlistBuddy 的 COPY 命令并复制条目,但这仅限于同一个文件,这不是我需要的。

所以,总结一下: 我想使用 PlistBuddy 通过 XCode 构建脚本,使用 Bash/Shell 将条目从 Plist 文件 A 复制到 Plist 文件 B。

代码如上:(获取添加条目的代码)

# 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`

添加新条目的代码:

# 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}
${PLISTBUDDY} -c "Add PreferenceSpecifiers:$DEST_INDEX:Values array $preferenceValues" ${DEST_PLIST}
${PLISTBUDDY} -c "Add PreferenceSpecifiers:$DEST_INDEX:Titles array $preferenceTitles" ${DEST_PLIST}

如果您对 PlistBuddy 未记录的功能有任何了解,请提供帮助。手册页非常薄,示例也很丰富。

我要感谢您阅读本文并伸出您的智慧来帮助我解决颈部的主要疼痛。

编辑: 经过更多调查后,除了数组之外,条目已成功填充。有关详细信息,请参阅下面的代码/输出。

这是生成以下数据的代码片段:

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 "#########"

这里提供的数据证明正在传输正确的字段

#########
[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 { }
#########

编辑#2: 我发现我可以通过分解数组并添加单个元素来正确添加数组:

${PLISTBUDDY} -c "Add PreferenceSpecifiers:$DEST_INDEX:Titles array" ${DEST_PLIST}

${PLISTBUDDY} -c "Add PreferenceSpecifiers:$DEST_INDEX:Titles:0 string 'TITLE_1'" ${DEST_PLIST}
${PLISTBUDDY} -c "Add PreferenceSpecifiers:$DEST_INDEX:Titles:1 string 'TITLE_2'" ${DEST_PLIST}
etc...

我仍然希望有更好的解决方案。

ios xcode bash shell plist
1个回答
0
投票

以下是将数组从一个 plist 复制到另一个 plist 所需执行的操作:

# Print the array to a temporary file.
/usr/libexec/PlistBuddy -x -c "Print arrayKey" source.plist > temporary.plist

# Add an entry for this array in the destination file. You can use any key.
/usr/libexec/PlistBuddy -c "Add newArrayKey array" destination.plist

# Merge the temporary file (generated in the first step) into the destination file
/usr/libexec/PlistBuddy -c "Merge temporary.plist newArrayKey" destination.plist

# (Optional) Delete temporary file
rm temporary.plist
© www.soinside.com 2019 - 2024. All rights reserved.