【问题标题】:Enable iCloud on a Xcode project via script通过脚本在 Xcode 项目上启用 iCloud
【发布时间】:2014-09-20 14:36:32
【问题描述】:

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

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

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

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

【问题讨论】:

  • 这有什么好运气吗?我的自动构建中的 IAP 也有同样的问题。
  • 我前段时间解决了这个问题。您仍然对解决方案感兴趣吗?几乎你必须编辑项目文件来修复一些 xml 字段。
  • @Chiodo 我很想听听您的解决方案。
  • @Chiodo 哦,伙计,不要那样取笑然后消失!

标签: ios xcode build continuous-integration icloud


【解决方案1】:

显然 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 应该“知道”权利文件(就像您的项目文件的其余部分一样)。

【讨论】:

  • 非常感谢!期待尝试一下。要添加权利文件,我只需将其作为引用文件添加到正确的目标,对吗?没什么特别的?
  • 这是目标中称为“代码签名权利”的构建设置。但是你想自动化它吗?虽然可以在 pbxproj 文件中编辑它,但它非常麻烦,也许可以使用 xcodebuild 传递它?
  • 很遗憾,使用 Unity 的基于云的构建服务,我无法访问构建过程。它给了我一个 xcode 项目,然后我可以对其进行调整,然后传回给它构建。让我们看看我能走多远。
  • @tenpn 如果答案有帮助,请不要忘记奖励赏金;)谢谢
  • @OhadM 无保修等。gist.github.com/tenpn/29e5c508cb26ce7ef99510c3cbb7e50a 是针对统一游戏引擎的,所以使用他们的 xcode 处理工具。而且我已经两年没有运行它了,所以谁知道它是否仍然有效。
猜你喜欢
  • 2014-11-12
  • 2012-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-14
  • 1970-01-01
相关资源
最近更新 更多