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

Chi*_*odo 12 xcode continuous-integration build ios icloud

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

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

我设法手动更改了XC项目,但由于XC项目结构可能发生变化,因此不太安全.

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

Ixx*_*Ixx 6

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

您可以创建一个脚本来编辑xcodeproj文件中的project.pbxproj(可以在finder中查看例如"show package contents"选项).

在这个文件中有一个名为PBXProject部分的项目设置部分.在那里,您可以添加目标的功能.您可能需要编写自定义解析逻辑,因为此文件是以XCode配置格式编写的,没有像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 */
Run Code Online (Sandbox Code Playgroud)

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

SystemCapabilities = {
    com.apple.iCloud = {
    enabled = 1;
    };
};
Run Code Online (Sandbox Code Playgroud)

因此,假设您要将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 */
    };
};
Run Code Online (Sandbox Code Playgroud)

现在,您需要确定一些事项才能执行此操作:

1.确定该部分

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

2.确定目标

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

3.处理已存在目标的SystemCapabilities条目的情况,以及已存在iCloud条目.

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

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

4.找到构建配置ID

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

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

转到/*开始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;
};
Run Code Online (Sandbox Code Playgroud)

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