Mac和iOS应用之间的常见iCloud容器?

3
我想开发一个基于iCloud的应用程序,可以在苹果平台iOS和Mac上运行。该应用程序将使用iOS上的UIDocument和Mac上的NSDocument,具有文档同步模型 - 在iOS上创建的文档将在Mac上可用,反之亦然。
我面临的特定问题是,我希望两个应用程序使用相同的iCloud容器。XCode为应用程序创建了一个默认容器,该容器基于App ID,但必须在两个应用程序上具有不同的App ID,因为这似乎是苹果的要求 - 即使它们位于不同的平台上,也不能有两个应用程序具有相同的App ID。
因此,我保留了默认创建的容器,并在Mac应用程序和iOS应用程序中添加了另一个容器。应用程序“似乎”工作正常,我可以在正确的位置在两个应用程序中创建新的文件包,但我遇到了两个问题:
1. 容器在iCloud设置管理屏幕上未正确显示。在XCode的权限部分中,我在两个应用程序中将容器命名为`com.mycompany.myapp.mycontainer`。在iOS的设置屏幕中(设置->通用->存储空间->显示全部),我的应用程序列为“mycontainer”,而不是我预期的应用程序实际名称。是否可以在应用程序的Info.plist中提供名称和图标以使其正确列出?
2. 我的NSMetadataQuery未正常工作。我使用空应用程序模板创建了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文档应用程序的文章的指针!欢迎提供建议和想法。

我对这个问题非常感兴趣。在苹果开发者论坛上,关于这个话题的讨论非常激烈,因此,我不认为很容易指出你所做的单个问题会引起什么问题。我建议你阅读这里的讨论:https://devforums.apple.com/community/mac/pre/icloud。 - ICL1901
你不需要创建两个容器。在两个应用程序中使用同一个容器名称即可。 - user523234
@DavidDelMonte 我阅读了讨论,并在 DevForums 上发布了我的问题,让我们看看那里是否有人有答案。 - Dhiraj Gupta
@user523234 你是说我应该删除默认的 XCode 创建的容器授权,只留下我自己的通用授权吗?我想我已经尝试过了,让我再试一次确认一下。 - Dhiraj Gupta
1个回答

7
我不知道你的NSMetadataQuery问题,但只要你理解了这个陷阱,添加共享的iCloud容器就很容易。
  1. Pick one app ID that will be your shared cloud container. Doesn't matter if iOS or Mac OS X, you need to publish this app and it must be approved from the Apple Review Team* before your iCloud container will be available to any other app. e.g.

     com.company.myawesomeapp
    
  2. Note that you must not use a container name after your app ID (com.company.myawesomeapp.cloudcontainer), just use your appID!

  3. Pick a second app ID (doesn't really matter), and create your second app. Open up Xcode and enable iCloud in the Capabilites Pane. Then under "iCloud Container Identifiers", add the identifier of your first (published and approved!) app

     com.company.myawesomeapp
    

就是这样!

为了使用容器,必须先有可用且经过批准的应用程序。在获得批准之前,没有其他应用程序可以访问您的容器,因为从技术上讲,只有在您的应用程序获得批准后它才存在。实际上,它不一定要在AppStore上可用,只需经过批准(可以是开发人员版本)。

只有在应用程序发布并获得批准后,才能使用(共享的)iCloud 容器。


我想知道这里的“approved”是否也意味着已经获得了TestFlight外部测试人员的批准,因为我相信通过外部测试运行的应用程序可以访问与通过App Store运行的同一应用程序完全相同的iCloud容器。 - Eugene
我还有两个捆绑标识吗? - davidev
据我所知,每个应用程序只能有一个唯一的捆绑标识符。这涉及到iCloud容器ID和信息,它只在应用程序获得批准后才能使用。 - auco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接