介绍

在打包 Xcode 工程时,会根据当前 SDK 的需要,修改 Info.plist ,增加删除或更新属性。

但是不同的 SDK 需要修改的属性不同,因此最好的方法是将修改的属性单独放在自己的文件中,使用代码进行合并。

这里的关键是只修改自己需要的属性,而且需要正确地更新已有属性。

环境

  • Python 3.7.4
  • Xcode 11

实现

  • Python 本身提供了 plistlib 库,可以非常方便地操作 plist 文件。
  • Python 3.5 及以上的版本提供了快速合并字典功能,可以正确地使用新字典中的字段更新旧字典中的已有字段。

下面的代码实现了将 custom_path 指向的 plist 文件与 Xcode 工程内的 Info.plist 文件合并。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import json
import plistlib

def update_info_plist(custom_path, xcode_project_path):
    if not os.path.exists(custom_path):
        print(f'plist file {custom_path} did not exist')
        return

    info_plist_path = os.path.join(xcode_project_path, 'Info.plist')
    with open(info_plist_path, 'rb') as fp:
        base = plistlib.load(fp)

    with open(custom_path, 'rb') as fp:
        custom = plistlib.load(fp)

    # 使用 Python 3.5 及以上版本语法将自定义内容更新到原有的 Info.plist 中
    merged = {**base, **custom}

    with open(info_plist_path, 'wb') as fp:
        plistlib.dump(merged, fp)

    print('Custom Info.plist content')
    print(json.dumps(custom, indent=4))

参考资料