如何使用 PlistBuddy 将多个条目添加到 plist 字典

Posted

技术标签:

【中文标题】如何使用 PlistBuddy 将多个条目添加到 plist 字典【英文标题】:How to add multiple entries to a plist dictionary with PlistBuddy 【发布时间】:2016-03-02 20:18:52 【问题描述】:

在我的 Info.plist 文件中,我想在 shell 上修改一个 Plist 文件,如下所示:

<plist version="1.0">
<dict>
    <key>CFBundleURLTypes</key>
    <array>
        <dict>
            <key>CFBundleURLName</key>
            <string>urlname-1</string>
        </dict>
    </array>
</dict>
</plist>

现在我想使用 PlistBuddy 使它看起来像这样,将 CFBundleURLSchemes 键添加到字符串数组值(或所有其他值):

<plist version="1.0">
<dict>
    <key>CFBundleURLTypes</key>
    <array>
        <dict>
            <key>CFBundleURLName</key>
            <string>urlname-1</string>
            <key>CFBundleURLSchemes</key>
            <array>
                <string>urlscheme-1</string>
            </array>
        </dict>
    </array>
</dict>
</plist>

如何使用 PlistBuddy 实现这一目标?

假设CFBundleURLTypes 的数组值为空: 通过执行/usr/libexec/PlistBuddy -c "Add :CFBundleURLTypes:0:CFBundleURLName string 'urlname-1'" Info.plist,我可以将字典添加到数组中,包括它的第一个键/值对:

<plist version="1.0">
<dict>
    <key>CFBundleURLTypes</key>
    <array>
        <dict>
            <key>CFBundleURLName</key>
            <string>urlname-1</string>
        </dict>
    </array>
</dict>
</plist>

但我不知道如何将第二个键,例如 CFBundleURLSchemes 与字符串数组值放入同一个字典中。

谁能给我指点? PlistBuddy 是否可以做到这一点?

【问题讨论】:

【参考方案1】:

不确定这是否是您期望的命令...

/usr/libexec/PlistBuddy -c "clear dict" -c "add :CFBundleURLTypes array" -c "add :CFBundleURLTypes:0 dict" -c "add :CFBundleURLTypes:0:CFBundleURLName string 'urlname-1'" -c "add :CFBundleURLTypes:0:CFBundleURLSchemes array" -c "add :CFBundleURLTypes:0:CFBundleURLSchemes:0 string urlscheme-1"  Info.plist

【讨论】:

【参考方案2】:

可以添加,PlistBuddy 很棘手,但是一旦你得到,这将非常容易,你可以使用 plistbuddy 像下面这样添加......

下面添加一个字典并设置键值对,听说"$10"是plist的路径

/usr/libexec/PlistBuddy -c "Add :CFBundleURLTypes:0:CFBundleURLName string urlname-1" "$10"
/usr/libexec/PlistBuddy -c "Add :CFBundleURLTypes:0:CFBundleURLSchemes array" "$10"
/usr/libexec/PlistBuddy -c "Add :CFBundleURLTypes:0:CFBundleURLSchemes:0 string aSchemeName" "$10"

如果您想再添加一本字典,请再做一次

/usr/libexec/PlistBuddy -c "Add :CFBundleURLTypes:1:CFBundleTypeRole string Viewer" "$10"
/usr/libexec/PlistBuddy -c "Add :CFBundleURLTypes:1:CFBundleURLName string url_type_1" "$10"
/usr/libexec/PlistBuddy -c "Add :CFBundleURLTypes:1:CFBundleURLSchemes array" "$10"
/usr/libexec/PlistBuddy -c "Add :CFBundleURLTypes:1:CFBundleURLSchemes: string scheme_2" "$10"

最后 plist 如下所示

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleURLName</key>
        <string>urlname-1</string>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>aSchemeName</string>
        </array>
    </dict>
    <dict>
        <key>CFBundleTypeRole</key>
        <string>Viewer</string>
        <key>CFBundleURLName</key>
        <string>url_type_1</string>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>scheme_2</string>
        </array>
    </dict>

你会得到more details here

【讨论】:

【参考方案3】:

除非另有证明,否则我认为我无法通过 plistbuddy 实现我想要的。

我最终使用defaults write 来修改我的 plist,并且它有效:

defaults write ~/Path/To/Info.plist CFBundleURLTypes -array-add '<dict><key>CFBundleURLName</key><string>urlname-1</string><key>CFBundleURLSchemes</key><array><string>urlscheme-1</string></array></dict>'

【讨论】:

以上是关于如何使用 PlistBuddy 将多个条目添加到 plist 字典的主要内容,如果未能解决你的问题,请参考以下文章

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

Windows 上的 PlistBuddy

使用 jinja2 时如何将新条目添加到字典对象中?

Maven - 如何将任意类路径条目添加到 jar?

如何使用 Dbcontext 添加条目

我将默认命令迁移到 PlistBuddy,它输出完全相同的 plist,但无法正常工作