【问题标题】:Unable to implement iCloud Drive/Files support whilst keeping existing iCloud documents. $(TeamIdentifierPrefix)无法在保留现有 iCloud 文档的同时实现 iCloud Drive/Files 支持。 $(团队标识符前缀)
【发布时间】:2018-04-19 22:57:54
【问题描述】:

正如标题所示,我想在现有应用程序上实现 iCloud Drive 支持,其中 ubiquity 容器以旧样式 $(TeamIdentifierPrefix) 为前缀。对于我的一生,我无法让它发挥作用。

最初我尝试了 Apple 自己的步骤,详情如下:https://developer.apple.com/library/content/documentation/General/Conceptual/iCloudDesignGuide/Chapters/DesigningForDocumentsIniCloud.html#//apple_ref/doc/uid/TP40012094-CH2-SW20

不幸的是,这不起作用。 (我记得每次构建都会增加捆绑版本)

按照这篇文章中提供的步骤:iCloud Drive Folder,我能够让我的应用程序出现在 iCloud Drive 中,但是我现有的文档无法访问,因为它们位于例如X123F4563T8.com.example.app 而不是新创建的 iCloud.com.example.app。

我尝试了无数种不同标识符配置的变体,试图让 iCloud Drive 指向旧的 ubiquity 容器,但无济于事。

我的权利文件如下所示(使用我的应用自己的标识符):

<key>com.apple.developer.icloud-container-identifiers</key>
<array>
    <string>iCloud.com.example.AppName</string>
</array>
<key>com.apple.developer.icloud-services</key>
<array>
    <string>CloudDocuments</string>
</array>
<key>com.apple.developer.ubiquity-container-identifiers</key>
<array>
    <string>iCloud.com.example.AppName</string>
</array>
<key>keychain-access-groups</key>
<array>
    <string>$(AppIdentifierPrefix)com.example.AppName</string>
</array>

第一个键似乎决定了使用哪个通用目录。​​

之前设置为:

<key>com.apple.developer.icloud-container-identifiers</key>
<array>
    <string>$(TeamIdentifierPrefix)com.example.AppName</string>
</array>

我缩小了搜索范围,发现这是此键的值似乎是决定是否使用(旧式)iCloud 文档的因素

 $(TeamIdentifierPrefix)com.example.AppName

或 iCloud 云盘,

 iCloud.com.example.AppName

为了完整起见,我的 Info.plist 中包含以下内容:

<key>iCloud.com.example.AppName</key>
<dict>
    <key>NSUbiquitousContainerIsDocumentScopePublic</key>
    <true/>
    <key>NSUbiquitousContainerName</key>
    <string>App Name For Drive</string>
    <key>NSUbiquitousContainerSupportedFolderLevels</key>
    <string>Any</string>
</dict>

我也没有忽略:

<key>com.apple.developer.ubiquity-container-identifiers</key>
<array>
    <string>iCloud.com.example.AppName</string>
</array>

但是,this 的值似乎对结果没有影响。

【问题讨论】:

    标签: ios icloud icloud-drive


    【解决方案1】:

    为了让它工作,我的 Info.plist 中添加了以下条目:

    <key>NSUbiquitousContainers</key>
    <dict>
        <key>iCloud.com.Example.AppName</key>
        <dict>
            <key>NSUbiquitousContainerIsDocumentScopePublic</key>
            <true/>
            <key>NSUbiquitousContainerName</key>
            <string>Example App Name</string>
            <key>NSUbiquitousContainerSupportedFolderLevels</key>
            <string>Any</string>
        </dict>
    </dict>
    

    我的 AppName.entitlements 文件包含其中:

    <key>com.apple.developer.icloud-container-identifiers</key>
    <array>
        <string>$(TeamIdentifierPrefix)com.example.AppName</string>
        <string>iCloud.com.example.AppName</string>
    </array>
    <key>com.apple.developer.icloud-services</key>
    <array>
        <string>CloudDocuments</string>
    </array>
    <key>com.apple.developer.ubiquity-container-identifiers</key>
    <array>
        <string>$(TeamIdentifierPrefix)com.example.AppName</string>
    </array>
    

    现在我们都设置了访问这两个容器的能力,我将我希望能够访问的 2 个 iCloud 通用地址(旧式 iCloud 文档和更新的 iCloud Drive)添加到我的 Info.plist:

    <key>UbiquitousContainers</key>
    <array>
        <string>$(TeamIdentifierPrefix)com.example.AppName</string>
        <string>iCloud.com.example.AppName</string>
    </array>
    

    然后我将以下内容添加到常量文件中以便于访问:

    struct UbiquityContainers {
        private static let ubiquityContainers : [String] = Bundle.main.object(forInfoDictionaryKey: "UbiquitousContainers") as! [String]
        static var iCloudDocuments : String {
            get {
                return ubiquityContainers[0]
            }
        }
        static var iCloudDrive : String {
            get {
                return ubiquityContainers[1]
            }
        }
    }
    

    我选择允许用户通过 TabBar 在两个容器之间切换。旧的 iCloud Documents 目录包含来自我的应用程序的旧版本的文档,这些文档需要在打开之前转换为新的文档格式,因此在我的情况下,每个文件版本都有单独的视图是有意义的。

    var ubiquityContainer : String = UbiquityContainers.iCloudDrive
    func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {
        if(self.documentsInCloud) {
            if(item == self.iCloudDriveTabBarItem) {
                self.ubiquityContainer = UbiquityContainers.iCloudDrive
            } else if(item == self.iCloudDocumentsTabBarItem) {
                self.ubiquityContainer = UbiquityContainers.iCloudDocuments
            }
            self.startCloudQuery()
        }
    }
    

    我希望这对将来可能由于卵泡散落在地面上而缺乏卵泡的人有所帮助。 :)

    【讨论】:

      猜你喜欢
      • 2016-02-16
      • 2015-02-18
      • 1970-01-01
      • 2016-02-01
      • 1970-01-01
      • 2014-11-22
      • 1970-01-01
      • 2014-03-05
      • 2018-02-01
      相关资源
      最近更新 更多