如何在没有[[UIDevice] uniqueIdentifier]的情况下安全地实现三路和四路设备同步?

3
切换到自定义生成的设备UUID似乎成为了一场噩梦!我希望有人之前遇到过这种情况并且知道如何处理。
假设用户有一个包含50万(小型)记录的数据集的应用程序,不能简单地复制整个设备的数据库并合并它们。用户在以下设备上安装了该应用程序:
1. iPhone 2. MacBook 3. Android平板电脑
当连接到同一物理网络时,每个设备都可以看到彼此并可以启动同步。为了实现三方数据同步(不依赖于中央服务器或互联网连接),需要执行以下操作:
1. 每个设备保留一个时间戳更改列表。 2. 每个设备知道它最后一次与另外两个设备同步的时间。 3. 当一个设备看到另一个设备时,它会发送自上次与该设备通话以来所有已知的更改。 4. 如果发现新设备,则没有问题,只需发送所有输入的数据。
问题出现在如果用户备份他们的iPhone或iPad,并将其恢复到另一个iPhone或iPad上。在这种情况下,我们得到了一个在本地网络上具有相同UUID的两个设备的用户。更新最终会随机地发送到其中一个或两个被识别为相同的设备。
我知道我们现在可以继续使用设备的唯一标识符,但我担心一旦它消失会发生什么!
2个回答

2
在应用程序启动时,您需要在应用程序文档文件夹中搜索名为udid.txt的文件。如果没有找到该文件,则创建它并生成您的自定义UDID,然后将其保存到此文件中。使用以下函数向此文件添加标志,以将其排除在备份和同步例程之外。
#include <sys/xattr.h>
- (void) AddSkipBackupAttributeToFile: (NSURL*) url
{
  u_int8_t b = 1;
  setxattr([[url path] fileSystemRepresentation], "com.apple.MobileBackup", &b, 1, 0, 0);
}

这个解决方案的问题在于用户可能会使用iPhoneExplorer或类似工具来更改UDID。尝试加密或隐藏文件以防止他这样做。
注意:仅适用于iOS 5.0.1以上版本。

2
您可以将生成的设备UDID存储在Caches目录中的文件中,这样它就不会被备份。当备份恢复到新设备上时,数据库将存在,但没有UDID文件。在这种情况下,创建一个新的UDID;其他实例将把它视为新实例,并可以推送任何最近的更改。您可能需要更改逻辑,以便其他实例将查询新UDID上的时间戳,而不是假设新实例完全为空。
在iOS 5.0之前,系统不会自动删除您的UDID文件。然而,在iOS 5.0中,您需要忍受它可能在低磁盘空间情况下被清除的事实。如果发生这种情况,只需按照恢复到新设备时的相同过程:创建一个新的UDID;其他实例将把它视为新实例,并推送最近的更改。
正如Floix所说,iOS 5.0.1中有一种新机制(尚未发布),可以让您指定该文件既不备份也不清除。

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