【问题标题】:FInd Out if User Switched off Document and Data From iCloud Account找出用户是否从 iCloud 帐户关闭了文档和数据
【发布时间】:2013-05-25 16:43:48
【问题描述】:

再次卡在 iCloud 中 :(。我正在使用 Core Data + iCloud,在我的应用程序中,我想知道用户是否从他的帐户中关闭了文档和数据。 谢谢

【问题讨论】:

    标签: iphone ios ipad core-data icloud


    【解决方案1】:

    没有用于检测此更改的内置支持,仅用于检测用户是否已注销。一种常见的方法是将标记文件写入 iCloud,与 Core Data 分开,然后监视该文件以查看它是否消失。细节各不相同,但通常是这样的:

    1. 使用NSFileManager iCloud 调用写入文件,并将文件名存储在用户默认值中。使用该帐户的每个设备都有不同的文件,因此在文件名中包含 UUID 是个好主意。你只写这个文件,你永远不会改变它。

    2. 使用NSFilePresenterNSMetadataQuery 来获得有关该文件更改的通知——例如,如果它消失了。

    如果文件消失,请立即采取措施卸载整个 Core Data 堆栈,包括每个托管对象,因为它们不再有持久性存储来备份它们。

    Black Pixel's version of the Core Data "Recipes" demo app 中有一个示例实现。您可能需要对其进行调整以使其在您的代码中正常工作。

    【讨论】:

    • 是的,我已经做了这件事,但我的问题是文档和数据设置为关闭。任何解决方法
    • 使用标记文件用户关闭文档和数据的解决方法。
    • NSMetadataQuery 是邪恶的。它需要一个运行循环并且必须在主线程上完成它的工作。使用同步的哨兵文件无法检测帐户更改(或删除所有按钮),因为另一个对等方可以自愿删除它。该文件需要在 .nosync 中。
    【解决方案2】:

    有两种情况:

    1. 应用未运行,或在帐户状态更改时处于后台。

    这里的解决方案是使用 NSUserDefaults(或应用程序本地的一些其他存储)存储/比较身份令牌。每次应用完成启动或返回前台时,从 NSFileManager 获取身份令牌并将其与缓存值进行比较。

    id token = [[NSFileManager defaultManager] ubiquityIdentityToken];
    
    1. 帐户更改时应用正在运行。

    这需要一个文件展示者在容器内“做某事”。最好的解决方案是使用同步的文件。

    实施 -accommodatePresentedItemDeletionWithCompletionHandler: 生成一个线程(dispatch_async 效果很好)并进行清理工作。

    【讨论】:

    • ubiquityIdentityToken 是 IOS6 功能。我的应用也支持IOS5
    • 对于 iOS 5,您只能调用 -[NSFileManager URLForUbiquitousContainerIdentifier:] 来发现设备上是否有活动帐户。这可能需要很长时间。
    猜你喜欢
    • 1970-01-01
    • 2013-12-15
    • 2014-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-09
    • 2017-05-26
    相关资源
    最近更新 更多