ABAddressBook ライブラリを使用している iOS アプリで、非常に奇妙な動作が見られます。バックグラウンドで何が起こっているかについて誰かが私に洞察を与えることができるかどうか、または私が見ることができない論理エラーがあるかどうか疑問に思っています。
簡単に言えば、ユーザーの連絡先のインポートに大きく依存する VOIP アプリを作成しています。プッシュ通知と組み合わせて使用されるこれらのオンライン バックアップを保持しています。
それらは電話で変更されるため、サーバーに更新要求を送信して正確に保つ必要があります。問題は、多くのユーザー デバイスが、ランダムな間隔で非常に大きなブロックの連絡先をサーバーに頻繁に送信していることです。ある日、連絡先が 50 件以上になり、5 分後にはさらに 10 件になり、1 件が更新されるまでに 1 か月かかります。友人である数人のユーザーに尋ねましたが、アドレス帳の半分を一晩で変更したことを思い出せません。
私のコードは非常に単純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 台の電話でデバッグを試みましたが、すべて期待どおりに動作しました。ここで本当に空白を描いていますが、サーバーは私に満足していないので、助けていただければ幸いです。