3

我只想第一次将所有电话联系人导入应用程序并保存在服务器上。

第二次只想将新的、修改的和删除的联系人导入应用程序,并与保存在服务器上的联系人同步,这应该根据联系人的创建/修改日期来完成。

从 iOS 9 开始,Apple 将不允许使用 Contacts Framework 获取创建/修改日期

我怎样才能用更好的方法实现?

4

3 回答 3

1

您应该为更改联系人列表通知添加观察者,如下所示:

    NotificationCenter.default.addObserver(self,selector: #selector(self.addressBookDidChange(_:)), name: NSNotification.Name.CNContactStoreDidChange,object: nil)

进而

@objc func addressBookDidChange(_ notification: Notification){
    print(notification.object as Any, notification.userInfo as Any)
    //remove observer so far to prevent double method calling when making operations with contacts
    NotificationCenter.default.removeObserver(self, name: NSNotification.Name.CNContactStoreDidChange, object: nil)

    //processing


    //at some point return observer
    NotificationCenter.default.addObserver(self,selector: #selector(ContactsListVC.addressBookDidChange(_:)), name: NSNotification.Name.CNContactStoreDidChange,object: nil)



}
于 2018-01-20T06:01:01.687 回答
0

您可以将联系人标识符和导入日期保存在 SQLite 等本地存储中。当您收到联系人更新通知时,您可以发送相应更新联系人的保存日期,并使用收到的通知时间戳(日期)在 SQLite 中更新日期。

于 2018-01-20T06:28:57.650 回答
0

有一个未记录的 API CNContactStore-enumeratorForChangeHistoryFetchRequest:error:

我尝试使用以下代码测试此方法:

-(void)testChangeHistoryRequest {
    CNContactStore *store = [[CNContactStore alloc] init];
    [self requestContactsPermissions:store completion:^(BOOL granted) {
        if (!granted)
            return;
        NSData *storeToken = [store currentHistoryToken];
        NSLog(@"testChangeHistoryRequest: store token st start - %@", storeToken);
        NSError *error;
        CNChangeHistoryFetchRequest *req = [[CNChangeHistoryFetchRequest alloc] init];
        [req setAdditionalContactKeyDescriptors:@[CNContactGivenNameKey, CNContactFamilyNameKey]];
        [req setMutableObjects:YES];
        [req setShouldUnifyResults:YES];
        [req setStartingToken:storeToken];
        CNFetchResult<NSEnumerator<CNChangeHistoryEvent*>*>* res = [store enumeratorForChangeHistoryFetchRequest:req error:&error];
        if (res && res.value) {
            NSData *token = [res currentHistoryToken];
            NSLog(@"token - %@", token);
            for (CNChangeHistoryEvent *e in res.value)
                NSLog(@"%@ - %@", [e class], e);
            NSLog(@"token at end - %@", token);
        }
    }];
}

我得到的是store.currentHistoryToken永远不会改变的——它以价值开始和结束nil。同样在迭代过程中,res.currentHistoryToken总是nil.

我还尝试[req setStartingToken:storeToken];使用任意数据进行初始化,但这没有改变(甚至没有失败)。

我的猜测是这个枚举没有完全实现。

于 2019-11-28T12:33:51.430 回答