我在使用 ABAddressBook 库的 iOS 应用程序中看到非常奇怪的行为。想知道是否有人可以让我深入了解后台发生的事情,或者我是否有我看不到的逻辑错误。
长话短说,我正在制作一个 VOIP 应用程序,它在很大程度上依赖于导入用户的联系人。我保留了这些也与推送通知结合使用的在线备份。
由于在手机上修改了它们,我需要向服务器发送更新请求以保持它们的准确性。问题是许多用户设备经常随机向服务器发送非常大的联系人 block 。一天会有 50 多个联系人,5 分钟后又是 10 个,然后一个月后才更新一个联系人。我问过几个 friend 的用户,他们不记得一夜之间修改了一半的地址簿。
我的代码非常简单,每次需要向服务器发送更新时,我都会存储一个 NSDate,例如添加、修改或删除。我知道有一个回调会在地址簿更新时触发,但这需要始终在内存中保留对地址簿的引用。我已经做了一些测试,如果应用程序崩溃或用户终止了应用程序,我会丢失所有更新。鉴于其后台运行的 VOIP 应用程序,我觉得人们可能会在某个场合杀死它以节省电池或其他任何东西。因此,出于这个原因,我遍历所有联系人,根据我记录的最后一个 NSDate 检查 kABPersonModificationDateProperty 属性。如果修改后的版本较新,我将开始更新,就像这样。
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 部手机上进行调试,并且所有的行为都符合我的预期。我真的在这里画了一个空白,服务器对我不满意,所以我们将不胜感激。
最佳答案
当 iphone 与 iCloud/CardDav/Gmail/Exchange 帐户同步联系人时,联系人也可能在后台更新。
请注意,它也可能在您的应用程序运行时发生,因此您应该订阅地址簿更新。
关于ios - iOS kABPersonModificationDateProperty 的奇怪行为,似乎一直在更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16715032/