如何检测用户是否在我的应用中启用了iCloud?

8

我开发了一个支持iCloud的iPhone应用程序,但是我遇到的问题是,即使用户关闭了我的应用程序的iCloud备份,它仍然会在iCloud上备份并在我的其他设备上反映更改。因此,我想知道如何判断我的应用程序是否启用了iCloud。

这是针对应用程序而不是设备的,如果设备已启用iCloud但我的应用程序被关闭,则不应进行任何备份。

2个回答

9
如果您使用的是键值对而不是文档存储,则建议使用此选项。
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设置中禁用了您的应用程序。 - derekvanvliet
1
是的,但在iCloud驱动器中禁用应用程序并不等同于删除应用程序对iCloud的访问权限。您可以配置应用程序访问iCloud,但防止其iCloud容器在iCloud Drive中可见。 - Duncan Groenewald
即使在我的应用关闭iCloud Drive后,从中返回的令牌仍然没有改变。我不认为这可以用来检测当前状态。 - RealCasually

2
请使用此功能检查您的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"]); 
}

这将告诉您它是开启还是关闭 :)

无论应用程序是否关闭备份,它始终返回“成功”。 - Eager Beaver
2
关于 'URLForUbiquityContainerIdentifier:' 方法,苹果已经更新了他们的文档:“重要提示:不要从您的应用程序主线程调用此方法。因为此方法可能需要相当长的时间来设置iCloud并返回所请求的URL,您应该始终从辅助线程调用它。要确定iCloud是否可用,特别是在启动时,请改为调用ubiquityIdentityToken方法。” - David Carney
2
苹果公司已经更新了他们的文档,指出:“重要提示:不要从您的应用程序主线程调用此方法。因为此方法可能需要相当长的时间来设置iCloud并返回所请求的URL,您应该始终从辅助线程中调用它。特别是在启动时,要确定iCloud是否可用,请检查NSURLRelationship属性的值。” - derekvanvliet
请注意,如果您正在使用键/值存储,则此方法无法帮助。我已经启用并使用键/值存储使一切正常,但是iCloudURL返回nil。 - RealCasually

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