如何在不使用 Xcode 的情况下将 iCloud 文档功能添加到我的应用程序?
How can I add iCloud Documents capabilities to my application without using Xcode?
当执行以下两行之一时,我的应用程序崩溃并显示 "Application initializing document picker is missing the iCloud entitlement":
UIDocumentPickerViewController* documentPicker =
[[UIDocumentPickerViewController alloc]
initWithDocumentTypes:@[@"public.data"]
inMode:UIDocumentPickerModeImport];
UIDocumentMenuViewController *documentMenu =
[[UIDocumentMenuViewController alloc]
initWithDocumentTypes:@[@"public.data"]
inMode:UIDocumentPickerModeImport];
Document Picker Programming Guide 表示 "Before your app can use the document picker, you must turn on the iCloud Documents capabilities in Xcode."
但是,我的应用程序不是使用 Xcode 构建的:它是使用第三方工具(跨平台工具包,Marmalade)构建的,所以我不能这样做。
应该仍然可以手动打开此应用程序的 iCloud 文档功能 - iCloud 中的开关只是自动执行该过程 -⟩但我这样做的尝试并没有解决崩溃问题。
到目前为止我尝试了什么
Xcode 显示打开 iCloud 时执行的步骤:
- 将 "iCloud" 授权添加到您的 App ID
- 将 "iCloud containers" 权利添加到您的 App ID
- 将 "iCloud" 权利添加到您的权利文件
- Link CloudKit.framework
我还找到了 Apple 的 Entitlements Troubleshooting TechNote,其中描述了可以用来检查是否正确执行了以下步骤的步骤。
我在我的 App ID 上启用了 iCloud:
我不确定这是否是使用文档选择器的简单导入和导出操作所必需的,但我还设置了一个 ID 为 iCloud.com.[company].[app]
.
的 iCloud 容器
我已经生成了包含 iCloud 授权的更新配置文件:
我使用以下命令检查了下载的配置文件:
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。大多数步骤似乎不再是 necessary/possible,但我按照建议将 application-identifier
键添加到我的 Info.plist.
我还需要做什么才能将 iCloud 文档功能添加到我的应用程序中?
Marmalade 通过复制配置文件中的 "Entitlements" dict
生成签署应用程序时使用的 .xcent
授权文件。
问题是由与 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,你还需要在[=18=中加上一个CloudKit
string
].)
实际上,我们通过编辑 Marmalade 的 sign_app.py
脚本来使用预先准备好的 .xcent
文件(从我们构建的正常运行的应用程序的 DerivedData
目录复制过来)来解决这个问题Xcode) 签署应用时:
在文件 /Applications/Marmalade.app/Contents/s3e/deploy/plugins/iphone
中编辑第 557 行:
cmd += ['--entitlements', xcentfile.name]
...将 xcentfile.name
替换为预先准备好的 .xcent
文件的路径。
当执行以下两行之一时,我的应用程序崩溃并显示 "Application initializing document picker is missing the iCloud entitlement":
UIDocumentPickerViewController* documentPicker =
[[UIDocumentPickerViewController alloc]
initWithDocumentTypes:@[@"public.data"]
inMode:UIDocumentPickerModeImport];
UIDocumentMenuViewController *documentMenu =
[[UIDocumentMenuViewController alloc]
initWithDocumentTypes:@[@"public.data"]
inMode:UIDocumentPickerModeImport];
Document Picker Programming Guide 表示 "Before your app can use the document picker, you must turn on the iCloud Documents capabilities in Xcode."
但是,我的应用程序不是使用 Xcode 构建的:它是使用第三方工具(跨平台工具包,Marmalade)构建的,所以我不能这样做。
应该仍然可以手动打开此应用程序的 iCloud 文档功能 - iCloud 中的开关只是自动执行该过程 -⟩但我这样做的尝试并没有解决崩溃问题。
到目前为止我尝试了什么
Xcode 显示打开 iCloud 时执行的步骤:
- 将 "iCloud" 授权添加到您的 App ID
- 将 "iCloud containers" 权利添加到您的 App ID
- 将 "iCloud" 权利添加到您的权利文件
- Link CloudKit.framework
我还找到了 Apple 的 Entitlements Troubleshooting TechNote,其中描述了可以用来检查是否正确执行了以下步骤的步骤。
我在我的 App ID 上启用了 iCloud:
我不确定这是否是使用文档选择器的简单导入和导出操作所必需的,但我还设置了一个 ID 为 iCloud.com.[company].[app]
.
我已经生成了包含 iCloud 授权的更新配置文件:
我使用以下命令检查了下载的配置文件:
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。大多数步骤似乎不再是 necessary/possible,但我按照建议将 application-identifier
键添加到我的 Info.plist.
我还需要做什么才能将 iCloud 文档功能添加到我的应用程序中?
Marmalade 通过复制配置文件中的 "Entitlements" dict
生成签署应用程序时使用的 .xcent
授权文件。
问题是由与 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,你还需要在[=18=中加上一个CloudKit
string
].)
实际上,我们通过编辑 Marmalade 的 sign_app.py
脚本来使用预先准备好的 .xcent
文件(从我们构建的正常运行的应用程序的 DerivedData
目录复制过来)来解决这个问题Xcode) 签署应用时:
在文件 /Applications/Marmalade.app/Contents/s3e/deploy/plugins/iphone
中编辑第 557 行:
cmd += ['--entitlements', xcentfile.name]
...将 xcentfile.name
替换为预先准备好的 .xcent
文件的路径。