2012-02-09 65 views
3

當我在模擬器上運行它的代碼片段時出現問題,我得到了組的id,但是當我在設備上運行它時,id被設置爲-1。但錯誤消息保持爲空。ABGroupCreate不能與Exchange一起工作

-(NSNumber *)addGroupeToAddressbookWithName:(NSString *)name{ 
    ABAddressBookRef addressBook = ABAddressBookCreate(); 
    CFErrorRef error = NULL; 
    ABRecordRef group = ABGroupCreate(); 
    ABRecordSetValue(group, kABGroupNameProperty,(__bridge CFStringRef)name, &error); 
    ABAddressBookAddRecord(addressBook, group, &error); 
    ABAddressBookSave(addressBook,&error); 
    NSNumber *gId = [NSNumber numberWithInt:ABRecordGetRecordID(group)]; 

    CFRelease(group); 
    return gId; 
} 

我找不出什麼區別,以及如何使它在真實設備上工作。

編輯:發現它工作,如果我刪除手機上的交換同步,但仍然希望它能夠在手機上交換帳戶時工作。因此,沒有真正解決問題

編輯/應答

發現,這是因爲匯率不知道羣,保存它需要使用正確的源一組,另見:Obtaining Specific ABSource from ABAddressBook in iOS 4+

新代碼:

-(NSNumber *)addGroupeToAddressbookWithName:(NSString *)name{ 
    ABAddressBookRef addressBook = ABAddressBookCreate(); 
    CFErrorRef error = NULL; 
    CFArrayRef sources = ABAddressBookCopyArrayOfAllSources(addressBook); 
    CFIndex sourceCount = CFArrayGetCount(sources); 
    NSNumber *gId = nil; 
    for (CFIndex i = 0 ; i < sourceCount; i++) { 
     ABRecordRef currentSource = CFArrayGetValueAtIndex(sources, i); 
     CFTypeRef sourceType = ABRecordCopyValue(currentSource, kABSourceTypeProperty); 

     BOOL isMatch = kABSourceTypeLocal == [(__bridge NSNumber *)sourceType intValue]; 
     CFRelease(sourceType); 

     if (isMatch) { 
      ABRecordRef group = ABGroupCreateInSource(currentSource);//ABGroupCreate(); 
      ABRecordSetValue(group, kABGroupNameProperty,(__bridge CFStringRef)name, &error); 
      ABAddressBookAddRecord(addressBook, group, &error); 
      ABAddressBookSave(addressBook,&error); 
      gId = [NSNumber numberWithInt:ABRecordGetRecordID(group)]; 
      CFRelease(group); 
      CFRelease(currentSource); 
      break; 
     } 
    } 

    CFRelease(sources); 
    return gId; 
} 

回答

4

發現,這是因爲匯率不知道有關組,保存它需要使用正確的源一組,另見:Obtaining Specific ABSource from ABAddressBook in iOS 4+

新代碼:

-(NSNumber *)addGroupeToAddressbookWithName:(NSString *)name{ 
    ABAddressBookRef addressBook = ABAddressBookCreate(); 
    CFErrorRef error = NULL; 
    CFArrayRef sources = ABAddressBookCopyArrayOfAllSources(addressBook); 
    CFIndex sourceCount = CFArrayGetCount(sources); 
    NSNumber *gId = nil; 
    for (CFIndex i = 0 ; i < sourceCount; i++) { 
     ABRecordRef currentSource = CFArrayGetValueAtIndex(sources, i); 
     CFTypeRef sourceType = ABRecordCopyValue(currentSource, kABSourceTypeProperty); 

     BOOL isMatch = kABSourceTypeLocal == [(__bridge NSNumber *)sourceType intValue]; 
     CFRelease(sourceType); 

     if (isMatch) { 
      ABRecordRef group = ABGroupCreateInSource(currentSource);//ABGroupCreate(); 
      ABRecordSetValue(group, kABGroupNameProperty,(__bridge CFStringRef)name, &error); 
      ABAddressBookAddRecord(addressBook, group, &error); 
      ABAddressBookSave(addressBook,&error); 
      gId = [NSNumber numberWithInt:ABRecordGetRecordID(group)]; 
      CFRelease(group); 
      CFRelease(currentSource); 
      break; 
     } 
    } 

    CFRelease(sources); 
    return gId; 
}