如何在不使用Xcode的情况下将iCloud Documents功能添加到我的应用程序中?

时间:2017-05-12 09:14:09

标签: ios xcode icloud marmalade marmalade-edk

我的应用程序崩溃了"应用程序初始化文档选择器缺少iCloud权利"当执行以下两行中的任何一行时:

UIDocumentPickerViewController* documentPicker =
  [[UIDocumentPickerViewController alloc]
    initWithDocumentTypes:@[@"public.data"]
                   inMode:UIDocumentPickerModeImport];

UIDocumentMenuViewController *documentMenu =
  [[UIDocumentMenuViewController alloc]
    initWithDocumentTypes:@[@"public.data"]
                   inMode:UIDocumentPickerModeImport];

Document Picker Programming Guide表示"在您的应用程序可以使用文档选择器之前,您必须在Xcode中打开iCloud Documents功能。"

但是,我的应用程序不是使用Xcode构建的:它是使用第三方工具(跨平台工具包,Marmalade)构建的,所以我不能这样做。

仍然可以手动打开此应用程序的iCloud Documents功能 - iCloud中的切换只是自动执行该过程 - 但我尝试这样做并没有修复崩溃。

到目前为止我尝试了什么

Xcode显示打开iCloud时执行的步骤:

  1. 添加" iCloud"享有应用ID的权利
  2. 添加" iCloud容器"享有应用ID的权利
  3. 添加" iCloud"享有权利文件的权利
  4. 链接CloudKit.framework
  5. 我还找到了Apple的Entitlements Troubleshooting技术说明,其中介绍了可以检查以下步骤是否已正确执行的步骤。

    我已在我的应用ID上启用了iCloud:

    Screenshot of App ID showing iCloud is enabled

    我不确定是否有必要使用文档选择器的简单导入和导出操作,但我还设置了一个ID为iCloud.com.[company].[app]的iCloud容器。

    我已经生成了一个更新的配置文件,其中包含iCloud权利:

    Screenshot of Provisioning Profile showing iCloud Service is enabled

    我使用以下命令检查了下载的配置文件:

    security cms -D -i /path/to/iOSTeamProfile.mobileprovision
    

    它包括以下条目:

    <key>com.apple.developer.icloud-services</key>
    <string>*</string>
    <key>com.apple.developer.icloud-container-environment</key>
    <array>
      <string>Development</string>
      <string>Production</string>
    </array>
    <key>com.apple.developer.icloud-container-identifiers</key>
    <array>
      <string>iCloud.com.[company].[app]</string>
    </array>
    <key>com.apple.developer.icloud-container-development-container-identifiers</key>
    <array>
      <string>iCloud.com.[company].[app]</string>
    </array>
    <key>com.apple.developer.ubiquity-container-identifiers</key>
    <array>
      <string>iCloud.com.[company].[app]</string>
    </array>
    

    Marmalade使用此配置文件生成应用程序的权利文件。

    我使用以下命令检查了生成的权利:

    codesign -d --ent :- [App.app]
    

    其中给出了以下输出:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
      <key>application-identifier</key>
      <string>[team-id].com.[company].[app]</string>
      <key>aps-environment</key>
      <string>development</string>
      <key>com.apple.developer.icloud-container-development-container-identifiers</key>
      <array>
        <string>iCloud.com.[company].[app]</string>
      </array>
      <key>com.apple.developer.icloud-container-environment</key>
      <array>
        <string>Development</string>
        <string>Production</string>
      </array>
      <key>com.apple.developer.icloud-container-identifiers</key>
      <array>
        <string>iCloud.com.[company].[app]</string>
      </array>
      <key>com.apple.developer.icloud-services</key>
      <string>*</string>
      <key>com.apple.developer.team-identifier</key>
      <string>[team-id]</string>
      <key>com.apple.developer.ubiquity-container-identifiers</key>
      <array>
        <string>iCloud.com.[company].[app]</string>
      </array>
      <key>com.apple.developer.ubiquity-kvstore-identifier</key>
      <string>[team-id].*</string>
      <key>get-task-allow</key>
      <true/>
      <key>keychain-access-groups</key>
      <array>
        <string>[team-id].com.[company].[app]</string>
      </array>
    </dict>
    </plist>
    

    但是,无论何时调用函数,应用程序仍然会崩溃。

    我还找到了this old guide to setting up iCloud in Marmalade apps。大多数步骤似乎不再是必要/可能的,但我按照建议将application-identifier键添加到我的Info.plist。

    我还需要做些什么才能将iCloud Documents功能添加到我的应用程序中?

1 个答案:

答案 0 :(得分:0)

通过从配置文件中复制“权利”.xcent,Marmalade会在签署应用时生成dict权利文件。

问题是由与undocumented键关联的值引起的:

<key>com.apple.developer.icloud-services</key>
<string>*</string>

在配置文件中,这似乎有效,但在登录应用时无效。使用以下内容替换生成的.xcent file中的这些元素,然后重新签名应用程序修复了问题:

<key>com.apple.developer.icloud-services</key>
<array>
  <string>CloudDocuments</string>
</array>

(N.B。如果您还使用CloudKit,则还需要向CloudKit添加string array。)

在实践中,我们通过编辑Marmalade的sign_app.py脚本来修复此问题,以使用预先准备好的.xcent文件(从我们使用Xcode构建的正常运行应用的DerivedData目录中复制)签署应用时:

在档案/Applications/Marmalade.app/Contents/s3e/deploy/plugins/iphone编辑第557行:

cmd += ['--entitlements', xcentfile.name]

...将xcentfile.name替换为预先准备好的.xcent文件的路径。