ios - 通过脚本在 Xcode 项目上启用 iCloud

我正在尝试为 iOS 项目的持续build设置构建服务器。 由于我需要经常重新创建 Xcode 项目(它是统一构建的),iCloud 将被重置为 OFF。

我可以通过脚本复制授权文件(使用 iCloud key ),但我仍然需要单击实际的复选框来打开 iCloud。

我设法手动更改了 XC 项目,但它不是很安全,因为 XC 项目结构可能会发生变化。

您知道更好的方法吗? 干杯!

最佳答案

显然 TO 解决了这个问题,但由于似乎有更多人对此感兴趣,这里有一个可能的解决方案。

您可以编写一个脚本来编辑您的 xcodeproj 文件中的 project.pbxproj(例如,可以使用 finder 中的“显示包内容”选项进行查看)。

在此文件中有一个项目设置部分,称为 PBXProject 部分。在那里,您可以为目标添加功能。您可能需要编写自定义解析逻辑,因为此文件是在 XCode config format 中编写的。 ,没有像 XML 或 JSON 这样流行的东西。

您要更新的部分如下所示:

/* Begin PBXProject section */
        EB1DDE9C1A3334EC00D778DE /* Project object */ = {
            isa = PBXProject;
            attributes = {
                LastSwiftUpdateCheck = 0700;
                LastUpgradeCheck = 0610;
                /* ...more settings */                        
                TargetAttributes = {
                    EB1DDEA31A3334EC00D778DE = {/* this is one target */
                        CreatedOnToolsVersion = 6.1.1;
                        DevelopmentTeam = 37QAPDY2PR;
                        /* ...more settings */                        
                    };
                    EB9F6CE11A8812550038355B = {/* another possible target */
                        CreatedOnToolsVersion = 6.2;
                        DevelopmentTeam = 37QAPDY2PR;
                        /* ...more settings */                        
                     };

                };
            };
            /* ...more settings */                        

        };
/* End PBXProject section */

您想将 iCloud 功能添加到目标。这看起来像这样:

SystemCapabilities = {
    com.apple.iCloud = {
    enabled = 1;
    };
};

假设您想将 iCloud 功能添加到目标 EB1DDEA31A3334EC00D778DE,那么 TargetAttributes 条目将如下所示:

TargetAttributes = {
    EB1DDEA31A3334EC00D778DE = {/* this is one target */
        CreatedOnToolsVersion = 6.1.1;
        DevelopmentTeam = 37QAPDY2PR;
        SystemCapabilities = {
            com.apple.iCloud = {
                enabled = 1;
            };
        };
    };
    EB9F6CE11A8812550038355B = {/* another possible target */
        CreatedOnToolsVersion = 6.2;
        DevelopmentTeam = 37QAPDY2PR;
        /* ...more settings */
    };
};

现在你需要确定一些事情才能做到这一点:

1.识别部分

我会让脚本查找字符串“Begin PBXProject section”,然后查找“TargetAttributes”,这两个字符串在文件中都是唯一的。从理论上讲,“TargetAttributes”应该足够了,但更好的是安全......并记住向脚本添加适当的日志记录并验证结果,因为这些字符串在未来的 XCode 版本中很容易更改(不过,我已经看到它们没有改变,有一段时间已经)。

2。确定目标

此文件中有多个部分,您可以在其中看到与名称关联的目标的 id。我只是自己查找并在脚本中对其进行硬编码,因为除非您重新创建目标,否则此 ID 不会更改。如果您真的需要它,您还可以自动执行此操作...通过查找目标的名称及其与 id 关联的格式。应该还有其他配置文件出现此关联(在此文件中,名称仅显示为注释)。

3.处理目标已经有 SystemCapabilities 条目,并且已经有 iCloud 条目的情况。

如果您的目标具有其他功能,则此条目可能已经存在。此外,如果您已经启用了 iCloud,或者您曾经启用和禁用了 iCloud,则该条目也将存在(值为 0)。这必须在脚本中处理(如果项目文件是新的,那么最新的应该不是问题)。

除此之外,您可能还必须添加对权利文件的引用。您必须将其添加到相应目标的构建配置中。为此:

4.查找构建配置 ID

您的目标可能有多个构建配置,例如调试和发布。您必须找到要为其添加对权利文件的引用的构建配置的 ID。为此,有一个名为 XCConfigurationList 的部分(查找/* Begin XCConfigurationList section */)。在那里寻找我们在 1. 中得到的目标 id,然后找到您需要的配置的配置 id。

5.在 XCBuildConfiguration 部分中查找构建配置 ID

转到/* Begin XCBuildConfiguration 部分 */并查找在 5. 中找到的 id,然后将路径添加到它的 buildSettings。例如:

例如你有这样的东西

EB9F6CF33A861055BB38355B /* Debug */ = {
    isa = XCBuildConfiguration;
    baseConfigurationReference = B82B36921BDRI3622B0EC99 /* Pods-mytargetname.debug.xcconfig */;
    buildSettings = {
        /* build settings... */
        CODE_SIGN_ENTITLEMENTS = mytargetname/myentitlements.entitlements; /* <-- add this */
    };
    name = Debug;
};

请注意,XCode 应该“知道”权利文件(就像您的项目文件的其余部分一样)。

https://stackoverflow.com/questions/25011644/

相关文章:

visual-studio - 为什么用 Visual Studio 构建驱动程序是 "Bad"?

java - 切换到 Java 7 时构建时间显着增加

javascript - 如何使用 npm 脚本将 typescript 编译成 javascrip

build - 为什么 Gradle 不在编译/运行时类路径中包含传递依赖项?

xcode - 如何在 xcode 持续集成中自动删除旧构建的文件?

java - 在 Play 上使用 Clover 执行代码覆盖!使用 Ant 的框架应用程序

list - 如何以编程方式列出执行 MSBuild 时定义的所有属性?

git - 您是否应该将已编译的 Assets checkin Git?

javascript - 减少 React/MERN Stack Bundle 的大小 - 主要是删

iphone - 什么是 "Couldn' t 打开共享功能内存 GSCapabilities (没