2011-01-13 10 views

回答

9

iOS 4+提供了新的API,允許從ABAddressBook中選擇特定的ABSource。這可能是有用的,因爲一些操作,例如創建ABGroup,在某些來源(即Exchange)中不受支持。

「並非所有源類型都支持組,更顯眼的是,Exchange不知道任何關於組的信息。」 - http://flavors.me/volonbolon#1a5/tumblr

附加是利用新API獲取可用於調用ABGroupCreateInSource()的特定類型的源的函數。

#define CFRELEASE_AND_NIL(x) CFRelease(x); x=nil; 
ABRecordRef sourceWithType (ABSourceType mySourceType) 
{ 
    ABAddressBookRef addressBook = ABAddressBookCreate(); 
    CFArrayRef sources = ABAddressBookCopyArrayOfAllSources(addressBook); 
    CFIndex sourceCount = CFArrayGetCount(sources); 
    ABRecordRef resultSource = NULL; 
    for (CFIndex i = 0 ; i < sourceCount; i++) { 
     ABRecordRef currentSource = CFArrayGetValueAtIndex(sources, i); 
     CFTypeRef sourceType = ABRecordCopyValue(currentSource, kABSourceTypeProperty); 

     BOOL isMatch = mySourceType == [(NSNumber *)sourceType intValue]; 
     CFRELEASE_AND_NIL(sourceType); 

     if (isMatch) { 
      resultSource = currentSource; 
      break; 
     } 
    } 

    CFRELEASE_AND_NIL(addressBook);  
    CFRELEASE_AND_NIL(sources); 

    return resultSource; 
} 

ABRecordRef localSource() 
{ 
    return sourceWithType(kABSourceTypeLocal); 
} 

ABRecordRef exchangeSource() 
{ 
    return sourceWithType(kABSourceTypeExchange); 
} 

ABRecordRef mobileMeSource() 
{ 
    return sourceWithType(kABSourceTypeMobileMe); 
} 
+4

讀者請注意,並非所有設備都有本地源(請參閱下面的註釋),因此您需要能夠處理所請求源不存在的情況。它也似乎不可能以編程方式創建本地源。 – xyzzycoder 2011-02-17 09:45:16

+0

如何釋放複製的值?這是不必要的,因爲我不明白? – 2011-03-14 10:31:57

+0

馬丁 - 好。現在應該修復泄漏。 – xyzzycoder 2011-03-30 02:14:51

1

Xyzzycoder-

您的解決方案工作得很好,如果已經有一個localSource,但如果沒有一個只是返回NULL。

有沒有辦法來爲localSource創建一個ABRecordRef?我需要能夠將我的聯繫人存儲到非同步源。

乾杯

+0

彼得,在什麼情況下不會有本地的來源? – xyzzycoder 2011-01-20 00:01:40

2

真的想知道如何創建自己的source.Just象小組交流創建與你不需要編輯默認源記錄,但創造自己的一個,什麼是最奇妙的是,地址簿會將它們自動鏈接在一起

1

代碼有錯誤,這就是爲什麼它總是返回兩個,因爲方法:ABRecordGetRecordType不是ABSource的一部分。它僅包括:

kABPersonType用於人員記錄 kABGroupType用於組記錄。 源記錄的kABSourceType。

要找出您必須使用的正確類型:ABRecordCopyValue(source,kABSourceTypeProperty)來代替! :)在我的iPhone上使用或不使用localSource時效果極佳。

祝你好運!