【问题标题】:How to detect if the user has iCloud enabled for my app?如何检测用户是否为我的应用启用了 iCloud?
【发布时间】:2013-02-11 12:58:19
【问题描述】:

我开发了一个支持 iCloud 的 iPhone 应用程序,但我面临的问题是,即使用户为我的应用程序关闭 iCloud 备份,它也会在 iCloud 上备份并反映我的其他设备上的更改,所以我想知道我怎样才能知道我的应用程序是否启用了 iCloud。

它专门用于 App 而不是设备,如果设备启用了 iCloud 但我的应用程序已关闭,则它不应进行任何备份。

【问题讨论】:

    标签: iphone ios ipad ios6 icloud


    【解决方案1】:

    请使用它来检查您的 iCloud 的状态是否已启用。

    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    NSURL *iCloudURL = [fileManager URLForUbiquityContainerIdentifier:nil]; 
    NSLog(@"%@", [iCloudURL absoluteString]); 
    
    if(iCloudURL){ 
    NSUbiquitousKeyValueStore *iCloudStore = [NSUbiquitousKeyValueStore defaultStore]; 
    [iCloudStore setString:@"Success" forKey:@"iCloudStatus"]; 
    [iCloudStore synchronize]; // For Synchronizing with iCloud Server 
    NSLog(@"iCloud status : %@", [iCloudStore stringForKey:@"iCloudStatus"]); 
    }
    

    这会告诉你它是开/关:)

    【讨论】:

    • 无论App是否关闭备份,它总是返回Success。
    • 关于 'URLForUbiquityContainerIdentifier:' 方法,Apple 更新了他们的文档:“重要提示:不要从应用程序的主线程调用此方法。因为此方法可能需要大量时间来设置启动 iCloud 并返回请求的 URL,您应该始终从辅助线程调用它。要确定 iCloud 是否可用,尤其是在启动时,请改为调用 ubiquityIdentityToken 方法。"
    • Apple 已将其文档更新为:“重要提示:不要从应用程序的主线程调用此方法。因为此方法可能需要大量时间来设置 iCloud 并返回请求的 URL ,您应该始终从辅助线程调用它。要确定 iCloud 是否可用,尤其是在启动时,请检查 NSURLRelationship 属性的值。"
    • 请注意,如果您使用的是键/值存储,此方法无济于事。我已启用所有内容并使用键/值存储进行工作,但此 iCloudURL 返回 nil。
    【解决方案2】:

    如果您使用的是键值对而不是文档存储,我建议您改用它。

    id iCloudToken = [[NSFileManager defaultManager] ubiquityIdentityToken];
    if ( iCloudToken != nil) {
    // User has enabled icloud in your app...
    } else {
    // Icloud is not enabled for your app...
    }
    

    现在我推荐上述方法的原因是,在新的 Xcode 编译器中,您现在可以决定是否要使用文档存储。如果您选择仅使用键值存储,则 NSFileManager 检查将失败,因为您不会在权利中定义容器标识符。但是,如果用户允许您的应用运行,则 ubiquityIdentityToken 将始终存在,这意味着如果用户允许您的应用访问 iCloud,它将始终触发 true 或 false。

    【讨论】:

    • 我发现检查令牌的有效性适用于尚未更新到 iCloud Drive 的帐户。但该令牌似乎对于已升级到 iCloud Drive 的帐户始终有效——即使用户在 iCloud Drive 设置中禁用了您的应用。
    • 是的,但禁用 iCloud 驱动器中的应用程序与删除应用程序对 iCloud 的访问权限不同。您可以将应用配置为可以访问 iCloud,但会阻止其 iCloud 容器在 iCloud Drive 中显示。
    • 即使在为我的应用程序关闭 iCloud Drive 之后,从这里返回的令牌也没有改变。我不认为这可以用来检测当前状态。
    猜你喜欢
    • 1970-01-01
    • 2012-07-15
    • 2011-11-05
    • 1970-01-01
    • 1970-01-01
    • 2012-06-15
    • 1970-01-01
    • 2020-10-20
    相关资源
    最近更新 更多