CNContactStore executeSaveRequest失败(CNErrorDomain错误2。)

时间:2015-10-09 08:10:46

标签: ios cncontact

我正在尝试删除应用程序的URL冗余。如果单个联系人有多个URL,这种方法很有效。但是,如果存在链接的联系人,通常保存操作将失败并显示消息 "操作无法完成。 (CNErrorDomain错误2。)"

有任何建议如何解决这个问题?它不适用于统一联系吗?如果在单个非统一项目上单独删除URL,是否有办法从统一项目中获取?

以下是代码的摘录:

CNSaveRequest *saveRequest = [[CNSaveRequest alloc] init];

NSArray* keys = @[CNContactUrlAddressesKey];
NSPredicate *predicate = [CNContact predicateForContactsWithIdentifiers:identifiers];
NSError *error;
NSArray <CNContact *> *contacts = [_contactStore unifiedContactsMatchingPredicate:predicate keysToFetch:keys error:&error];

for (CNContact *contact in contacts) {
 // here we'll collect non-ambigous URLs
  NSMutableArray<CNLabeledValue<NSString *> *> *copyOfURLs = [NSMutableArray array];
 // just a marker for the moment if a URL with specific prefix was already found
  NSString *baseURL = nil;
  for (CNLabeledValue<NSString *> *labeledValue in contact.urlAddresses) {
    NSString *url = labeledValue.value;
    if ([url hasPrefix:APP_IDENTITY_URL_SCHEME]) {
       if (baseURL == nil)
         baseURL = url;
       else
         continue;
     }
     [copyOfURLs addObject:labeledValue];
  }
  CNMutableContact *updatedContact = [contact mutableCopy];
  updatedContact.urlAddresses = copyOfURLs;
  [saveRequest updateContact:updatedContact];
}
NSError *saveError;
if (![_contactStore executeSaveRequest:saveRequest error:&saveError]) {
  NSLog(@"Saving error: %@", saveError.localizedDescription);
}

1 个答案:

答案 0 :(得分:0)

我知道现在回答这个问题为时已晚,但是我遇到了同样的问题,即CNContactStore executeSaveRequest失败,并出现了(CNErrorDomain错误2。),并且遇到了这个未解决的问题。我解决了同样的问题,我用零字节数组设置了imageData。

我找到了此问题的根本原因。如果上面的数组没有任何值,即0元素数组,则此行会引起问题。

updatedContact.urlAddresses = copyOfURLs;

如果copyOfURLs中没有任何元素,甚至不要使用空的(0个元素)数组设置updatedContact.urlAddresses。

在行上方替换为

if ([copyOfURLs length] > 0) {
  updatedContact.urlAddresses = copyOfURLs;
}