没有[[UIDevice] uniqueIdentifier]安全地实现三路和四路设备同步?

时间:2011-11-03 11:32:18

标签: iphone objective-c ios cocoa-touch

切换到自定义生成的设备UUID正变成一场真正的噩梦!我希望有人之前遇到过这种情况,并且可能知道处理它的方法。

假设用户的应用程序的数据集为500,000(小),那么简单地复制设备的整个数据库并合并它们是不可行的。用户将此应用程序安装在:

  1. iPhone,
  2. 的MacBook
  3. Android平板电脑。
  4. 当连接到同一物理网络时,每个设备可以看到对方并可以启动同步。  实现三路数据同步(不依赖于中央服务器或互联网连接)。

    1. 每个设备都会保留一个时间戳记更改列表。
    2. 每台设备都知道上次与其他两台设备同步的时间。
    3. 当设备看到另一台设备时,它会发送自上次与该设备通话后所有已知的更改。
    4. 如果发现了新设备,则只需发送所有输入的数据即可。
    5. 如果用户备份他们的iphone或ipad,并将其恢复到另一个iphone或ipad上,问题就出现了。在这种情况下,我们最终得到的用户在本地网络上有两个具有相同UUID的设备。更新最终(随机)转到一个或其他相同标识的设备。

      我知道我们现在可以继续使用设备唯一标识符了,但我担心一旦它消失就会发生!

2 个答案:

答案 0 :(得分: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。

答案 1 :(得分:2)

您可以将生成的设备UDID存储在Caches目录中的文件中,在该文件中不会备份它。将备份还原到新设备时,将存在数据库,但不会有UDID文件。在这种情况下,创建一个新的UDID;其他实例会将此视为一个新实例,并可以推送最近的任何更改。您可能希望更改逻辑,以便其他实例将查询新UDID上的时间戳,而不是假设新实例完全为空。

在iOS 5.0之前,系统不会自动删除您的UDID文件。但是在iOS 5.0中,您需要忍受在低磁盘空间情况下可能会被清除的事实。如果发生这种情况,只需按照恢复到新设备时的相同步骤操作:创建新的UDID;其他实例会将此视为一个新实例并推送最近的更改。

正如Floix所说,iOS 5.0.1中有一种新机制(尚未发布),它允许您指定该文件既不应备份也不应该被清除。