【问题标题】:URLForUbiquityContainerIdentifier returns nil even if configured correctly即使配置正确,URLForUbiquityContainerIdentifier 也会返回 nil
【发布时间】:2012-01-20 06:37:54
【问题描述】:

我遇到了问题,即使用户在设置中正确设置了所有内容,URLForUbiquityContainerIdentifier 在某些情况下也会返回 nil。我的代码:

dispatch_async(someQueue, ^{

    if (![[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil]) {
        ErrLog(@"iCloud container not available.");
        return;
    }

    dispatch_async(dispatch_get_main_queue(), ^{
       [...]
    });

});

有人遇到过同样的问题吗?我将 nil 设置为应该根据 Apple 文档工作的容器标识符,但我对此不再那么确信了。此代码也适用于大多数用户,但不知何故不适用于所有人。

【问题讨论】:

  • 一位用户刚刚报告说它在安装 iOS 5.1 beta 2 后可以正常工作。
  • 遇到同样的问题,该方法总是返回 nil
  • 我现在正在设置正确的容器标识符。这没有效果。一些用户仍然有这个问题。
  • 需要开启设备上的iCloud Drive:stackoverflow.com/questions/25898771/…
  • 如果您使用的是旧的 ubiquity 容器,则无需打开 iCloud 驱动器,只需打开文档和设置(请参阅下面的 ios8 评论)

标签: iphone objective-c ios icloud


【解决方案1】:

检查您是否已在您的权利中启用 iCloud 容器。启用权利时,默认情况下不会添加容器。点击 Target/Summary/Entitlements 中的“+”号添加您的 appId。

【讨论】:

  • 尽管 xCode 说它已将 iCloud 权利添加到我的权利文件中,但实际上并没有,我不得不手动添加它。当我手动添加它时,URLForUbiquityContainerIdentifier 工作并返回一个非零 URL,但 Xcode 在 Capabilities 选项卡中抱怨提供修复“问题”。如果您要求它解决问题,它会删除您刚刚从权利中添加的条目。它看起来像一个buff。我正在使用 Xcode 6 beta 5。
【解决方案2】:

装有 iOS7 的 iPad mini。我刚刚经历过 URLForUbiquityContainerIdentifier 突然开始返回 nil。我尝试重新启动设备,但没有帮助。

在“设置”应用程序的“iCloud”菜单下。我注意到“文档和数据”设置为关闭。

解决方案是将“文档和数据”更改为“开启”。

【讨论】:

    【解决方案3】:

    如果有人在使用 iOS8 Beta 时遇到同样的问题,那么在 Xcode 6 中生成权利的方式似乎存在错误。我一直在努力解决这个问题,直到在 Apple Developer 中看到这篇文章论坛:https://devforums.apple.com/thread/229509?

    本质上,Xcode 会生成一个名为 com.apple.developer.icloud-container-identifiers 的密钥,而它应该是 com.apple.developer.ubiquity-container-identifiersubiquity,而不是 icloud)。它也可能将值设置为iCloud.$(CFBundleIdentifier),而它应该是$(TeamIdentifierPrefix).$(CFBundleIdentifier)

    当然,这可能会在下一个 Beta 版中得到解决,但对于像我这样困惑的人,我希望这会有所帮助。

    【讨论】:

    • 您为我节省了数小时的研究时间。谢谢!
    • 是的,这在 Xcode 5 到 6 中是不同的。但它确实适用于 Xcode 6 的更改(至少,在它的设备上)我认为不同之处在于支持 CloudKit,有一个打开在 Xcode 5 和 Xcode 6 方法之间进行选择的供应门户。
    • 我必须打开默认容器,编译它(将 icloud 键添加到权利中),然后切换回自定义容器并添加 $(TeamIdentifierPrefix)$(CFBundleIdentifier)
    • 注意 - 它仍然在 xcode 6 中显示“修复问题”,但一切正常......我非常喜欢苹果 icloud。我猜使用 ubiquity 可以正常工作的旧代码不在他们的测试套件中
    • 我做了这个答案中提到的所有事情,现在我可以生成一个存档,但是当我尝试在设备上运行它时,我得到了The entitlements specified in your application’s Code Signing Entitlements file do not match those specified in your provisioning profile. (0xE8008016) 错误。该应用程序也在模拟器中运行,并且在模拟器上应用程序可以访问旧的 iCloud 数据(对应于以 TeamID 开头的容器)。我错过了什么?
    【解决方案4】:

    我会在一个需要将 $(TEAMID) 更改为个人资料 ID 的应用上查看您的 entitlement.plist 配置文件中 dns 之前的数字和字母 - 这是一些适用于 UIManagedDocument 的代码

    /// test iCloud Access
    - (void)initializeiCloudAccess {
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            if ([[NSFileManager defaultManager]
                 URLForUbiquityContainerIdentifier:nil] != nil)
                NSLog(@"iCloud is available\n");
            else
                NSLog(@"This Application requires iCloud, but it is not available.\n");
        });
    }
    
    - (NSURL *)iCloudURL
    {
    
        return [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil];
    }
    
    - (NSURL *)iCloudDocumentsURL
    {
    
        return [[self iCloudURL] URLByAppendingPathComponent:@"Documents"];
    }
    
    - (NSURL *)iCloudCoreDataLogFilesURL
    {
    
        return [[self iCloudURL] URLByAppendingPathComponent:@"CoreDataLogs"];
    }
    

    【讨论】:

      【解决方案5】:

      URLForUbiquityContainerIdentifier alway return nil

      NSURL *ubiquityURL = [fileManager URLForUbiquityContainerIdentifier:nil]; if (ubiquityURL == nil)
      
      • 由 xcode4.5 构建的应用程序
      • 应用已启用 icloud
      • ios 已登录 icloud 帐号

      ubiquityURL在debug中是正常的,但是ubiquityURL在分发到appstore后总是nil。

      【讨论】:

      • 我填了。请不要使用“xcode4.5 gm 或 xocde4.5 + icloud sdk”来 sumbit app 。我用的是xocde4.5.1 + icloud sdk,现在可以了 这个问题已经验证解决,可以关闭了。
      • 我填了。请不要使用“xcode4.5 gm 或 xocde4.5 + icloud sdk”来 sumbit app 。我用的是xocde4.5.1 + icloud sdk,现在可以了 这个问题已经验证解决,可以关闭了。
      【解决方案6】:

      今天我又遇到了这个问题。

      这一次是因为我的配置文件无效。

      在开发者网站上,我必须生成一个新的配置文件。然后在 Xcode5 中重新加载配置文件。现在URLForUbiquityContainerIdentifier 再次返回有效的网址。

      【讨论】:

        【解决方案7】:

        如果您仍然遇到问题,请确保您在设备上运行,因为模拟器不会总是返回有效值。 我在我的应用程序上尝试了你的代码,但我没有得到零

        【讨论】:

          【解决方案8】:

          在 iPhone 的设置中启用“iCloud Drive”

          【讨论】:

            猜你喜欢
            • 2015-03-05
            • 2013-06-16
            • 1970-01-01
            • 2016-05-28
            • 1970-01-01
            • 2017-05-08
            • 2020-07-24
            • 1970-01-01
            相关资源
            最近更新 更多