iCloudDrive - 我无法使用一个包标识符

时间:2018-03-02 16:16:56

标签: ios swift xcode icloud icloud-drive

我正在尝试创建应用程序文件夹并将示例file.txt上传到 iCloud Drive

我正在使用下一个代码:

@objc func testUploading() {

    let iCloudDocumentsURL = FileManager.default.url(forUbiquityContainerIdentifier: nil)?.appendingPathComponent("Documents")

    //is iCloud working?
    if  iCloudDocumentsURL != nil {
        //Create the Directory if it doesn't exist
        if (!FileManager.default.fileExists(atPath: iCloudDocumentsURL!.path, isDirectory: nil)) {
            //This gets skipped after initial run saying directory exists, but still don't see it on iCloud
            do {
                try FileManager.default.createDirectory(at: iCloudDocumentsURL!, withIntermediateDirectories: true, attributes: nil)
            } catch {
                print("\(error.localizedDescription)")
            }
        }
    } else {
        print("iCloud is NOT working!")
        return
    }

    //Set up directories
    let localDocumentsURL = FileManager.default.urls(for: FileManager.SearchPathDirectory.documentDirectory, in: .userDomainMask).last! as NSURL

    //Add txt file to my local folder
    let myTextString = NSString(string: "HELLO WORLD")
    let myLocalFile = localDocumentsURL.appendingPathComponent("examplefile.txt")
    do {
        try myTextString.write(to: myLocalFile!, atomically: true, encoding: String.Encoding.utf8.rawValue)
    } catch {
        print("\(error.localizedDescription)")
    }

    //If file exists on iCloud remove it
    var isDir:ObjCBool = false
    if (FileManager.default.fileExists(atPath: iCloudDocumentsURL!.path, isDirectory: &isDir)) {
        do {
            try FileManager.default.removeItem(at: iCloudDocumentsURL!)
        } catch {
            print("\(error.localizedDescription)")
        }
    }

    //copy from my local to iCloud
    do {
        try FileManager.default.copyItem(at: localDocumentsURL as URL, to: iCloudDocumentsURL!)
    } catch {
        print("\(error.localizedDescription)")
    }

}

我在项目中有两个目标,每个目标针对不同的环境,DevelopmentProduction,所以当选择development environment时,我的应用程序中的前一个代码运行良好,应用程序可以在iCloud Drive上添加app文件夹,运行并编译得很好..但是当我更改为production environment时,应用程序也可以编译并运行良好,但无法在 {{上添加应用程序文件夹1}}。

接下来,我展示了每个环境的功能:

  

第一张照片是 功能 标签上的制作和第二次开发:

enter image description here

两个目标之间的独特区别在于设置iCloud-Drive的方式,对于我选择的Capabilities目标复选框 指定自定义容器 因为Production不允许在XCode上选择 使用默认容器 ,所以选择 使用默认容器< / EM>

  

Development environment上选中 使用默认容器 复选框时,会出现下一个错误:

enter image description here

我认为这种差异是因为这个应用程序已经使用了4年,而且我不记得究竟是什么,我创建了一个自定义Production,这个应用程序使用相同名称的应用程序iCloud Container但小写。 Apple 不允许从Bundle Identifier删除任何容器,如果可以,则错误将得到解决。

  • 以下标识符是我认为导致错误的数据

      

    捆绑标识符 - com.reverse_domain .ControlHoras

         

    iCloud容器ID - com.reverse_domain .controlhoras

    iCloud

出于这个原因,**The last path (Bold) the identifiers is the real case..不允许XCode上的选择选项&gt; Capabilities&gt; iCLoud&gt; Containers,我想我无法在Use default container的{​​{1}}中创建应用程序文件夹。由于除了设置 Capablilities 的方式之外,相同的代码具有相同的代码,因此一个工作正常而另一个不工作。

既然你在上下文中,我可以问我的问题:

  • 有人可以向我解释为什么Apple让我添加一个可以产生这种冲突的iCloud容器吗?
  • 有谁知道解决它的方法?
  • 是否有人知道是否可以使用带有 指定自定义容器 的iCloud Drive(在我的情况下,我无法在iCloud Drive上添加文件夹)?

我很沮丧,花了很多时间在这上面,我已经尝试了一切,我不知道该怎么办..

提前致谢!!

更新

我忘记了,这些是production environment个文件:

制作

iCloud-Drive

开发

Entitlements

  

这是iCloud Drive文件夹中仅出现<dict> <key>com.apple.developer.icloud-container-identifiers</key> <array> <string>iCloud.es.reverse_domain.controlhoras</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.es.reverse_domain.controlhoras</string> </array> <key>com.apple.developer.ubiquity-kvstore-identifier</key> <string>$(TeamIdentifierPrefix)$(CFBundleIdentifier)</string>

的方面

enter image description here

  

重要提示:我在该问题中使用<dict> <key>com.apple.developer.icloud-container-identifiers</key> <array> <string>iCloud.$(CFBundleIdentifier)</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.$(CFBundleIdentifier)</string> </array> <key>com.apple.developer.ubiquity-kvstore-identifier</key> <string>$(TeamIdentifierPrefix)$(CFBundleIdentifier)</string> 我的ID保持匿名,其余标识符为原件。

更新2

前几天我尝试使用CloudKit,在开始使用iCloud Drive之前在云端存储数据但是接下来的一段时间开发iCloudKit的新功能它停止工作,因此我开始开发iCloud Drive的这项功能。

我找到了Apple的官方帖子:

  

如果通知'shouldSendContentAvailable属性为true且同时您的应用已强制退出,则CloudKit通知将不会传递到您的应用。在iOS上,用户可以通过双击主页按钮并将其从多任务UI中轻扫来强制退出应用程序。

因为我使用development app进行部署,所以苹果禁止mi reverse_domain的可能性是什么?

如果有人有或有类似问题,请告诉我。

0 个答案:

没有答案