4

我在使用 ABAddressBook 库的 iOS 应用程序中看到了非常奇怪的行为。想知道是否有人可以让我深入了解背景中发生的事情,或者我是否有一个我看不到的逻辑错误。

长话短说,我正在制作一个严重依赖于导入用户联系人的 VOIP 应用程序。我保留了这些也与推送通知一起使用的在线备份。

由于它们在手机上被修改,我需要向服务器发送更新请求以保持它们的准确性。问题是许多用户设备经常以随机的间隔向服务器发送大量联系人的垃圾邮件。一天会是 50+ 个联系人,5 分钟后又是 10 个,然后一个月后会更新一个。我问过几个朋友的用户,他们不记得一夜之间修改了一半的地址簿。

我的代码非常简单,NSDate每次需要向服务器发送更新时,我都会存储一个,例如添加、修改或删除。我知道有一个回调会在地址簿更新时触发,但这需要始终在内存中保留对地址簿的引用。我做了一些测试,如果应用程序崩溃或用户终止应用程序,我会丢失任何更新。鉴于它是一个后台运行的 VOIP 应用程序,我觉得人们可能会在某个场合杀死它以节省电池或其他任何东西。因此,出于这个原因,我遍历所有联系人,对照我记录kABPersonModificationDateProperty的最后一个检查该属性。NSDate如果修改后的版本更新,我会开始更新,就像这样。

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setTimeStyle:NSDateFormatterMediumStyle];
[dateFormatter setDateStyle:NSDateFormatterMediumStyle];

NSDate *lastChecked = [dateFormatter dateFromString:[PListData readStringFromFile:@"lastContactsArchive"]];


CFDateRef modifyDate = ABRecordCopyValue(ref, kABPersonModificationDateProperty);
...
...
else if ([(__bridge NSDate*)modifyDate compare:lastChecked]==NSOrderedDescending) // if modified after last check, create new contact and update
{
   ...
}

有什么我遗漏的吗,修改日期是否仅在更改姓名/电话号码/电子邮件等时更新?例如,当 iCloud 同步时它们是否被修改?如果他们打电话给对方,计数器会更新吗?等等

我已经尝试在 3 部手机上进行调试,并且所有的行为都符合我的预期。我真的在这里画了一个空白,服务器对我不满意,所以任何帮助都将不胜感激。

4

1 回答 1

2

当 iphone 与 iCloud / CardDav / Gmail / Exchange 帐户同步联系人时,联系人也可能在后台更新。

请注意,它也可能在您的应用程序运行时发生,因此您应该订阅地址簿更新。

于 2013-05-23T13:38:19.463 回答