3

我想构建一个基于 iCloud 的应用程序,它可以在 Apple 平台、iOS 和 Mac 上运行。该应用程序将使用 iOS 上的 UIDocument 和 Mac 上的 NSDocument 来建立基于文档的同步模型 - 在 iOS 上创建的文档将在 Mac 上可用,反之亦然。

我面临的特殊问题是我想要两个应用程序上的相同 iCloud 容器。XCode 根据 App ID 为应用程序创建一个默认容器,这在两个应用程序上必须不同,因为这似乎是 Apple 的要求 - 即使它们位于不同的平台上,也没有两个应用程序可以具有相同的应用程序 ID。

所以我单独留下了默认创建的容器,并在 Mac 应用程序和 iOS 应用程序上添加了另一个容器。该应用程序似乎运行良好,我可以在两个应用程序中的正确位置创建一个新文件包,但我遇到了 2 个问题:

  1. 容器未正确显示在 iCloud 设置管理屏幕中。在 XCode 的权利部分,我将容器命名为com.mycompany.myapp.mycontainer两个应用程序中的名称。在 iOS 的设置屏幕(设置 -> 常规 -> 使用 -> 管理存储 -> 显示全部)中,我的应用程序被列为“mycontainer”,而不是我预期的应用程序的实际名称。是否可以在应用程序的 Info.plist 中提供名称和图标以使其正确列出?

  2. 我的 NSMetadataQuery 无法正常工作。我使用 Empty Application 模板制作了 iOS 应用程序,因此 Info.plist 没有使用 CFBundleDocumentTypes 键正确设置,但我发现并修复了它。为了在 iOS 应用程序中触发我的 NSMetadataQuery,我正在使用:

    [self.queryCloud setPredicate:[NSPredicate predicateWithFormat:@"%K like '*.myextension*'",NSMetadataItemFSNameKey]];

    搜索范围设置如下:

    [self.queryCloud setSearchScopes:[NSArray arrayWithObjects:NSMetadataQueryUbiquitousDocumentsScope, NSMetadataQueryUbiquitousDataScope, nil]];

我在建立容器的 URL 后运行查询,我得到了开始和完成收集通知,但从来没有来自NSMetadataQuery. 除非我继续创建一个新文档。如果我创建文档,那么我会收到更新通知,但仅在该会话中。下次我启动应用程序时,相同的设置不会给我任何更新通知NSMetadataQuery

我究竟做错了什么?任何关于创建面向 Mac 和 iOS 的 iCloud 文档应用程序的文章的指针将不胜感激!建议,想法是最受欢迎的。

4

1 回答 1

6

我不知道你的 NSMetadataQuery 问题,但添加一个共享的 iCloud 容器很容易,只要你明白了:

  1. 选择一个应用 ID 作为您的共享云容器。无论是 iOS 还是 Mac OS X,您都需要发布此应用程序,并且必须先获得 Apple 审核团队* 的批准,然后您的 iCloud 容器才可用于任何其他应用程序。例如

     com.company.myawesomeapp
    
  2. 请注意,您不能在您的应用 ID ( com.company.myawesomeapp .cloudcontainer ) 之后使用容器名称,只需使用您的 appID!

  3. 选择第二个应用 ID(并不重要),然后创建您的第二个应用。打开 Xcode 并在 Capabilites Pane 中启用 iCloud。然后在“iCloud Container Identifiers”下,添加您的第一个(已发布并批准!)应用程序的标识符

     com.company.myawesomeapp
    

而已!只有这一点,这就是底线:

为了使用容器,应用程序必须可用并获得批准。在批准之前,没有其他应用程序可以访问您的容器,因为从技术上讲,它仅在您的应用程序获得批准后才存在。实际上,它不必在 AppStore 中可用,只需要获得批准(可以在开发者持有的版本上)。

如果您的应用已发布并获得批准,您只能使用(共享)iCloud 容器。

于 2014-03-05T14:52:12.467 回答