2011-01-13 5 views

答えて

9

iOS 4+は、ABAddressBookから特定のABSourceを選択できるようにする新しいAPIを提供します。これは、いくつかの操作として有用である可能性があります。 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

+0

コピーした値を解放するのはどうですか?私は見ない何らかの理由でこれは不要ですか? –

+0

Martin - 良いキャッチ。漏れは今修正する必要があります。 – xyzzycoder

1

Xyzzycoder-

あなたのソリューションは、localSourceがすでに存在する場合にうまく動作しますが、1が存在しない場合は、単にNULLを返します。

たとえば、localSourceのABRecordRefを作成する方法はありますか?私は私の連絡先を非同期ソースに保存できる必要があります。

乾杯

+0

ピーター、どのような状況ではローカルソースはありませんか? – xyzzycoder

+0

こんにちは。たとえば、連絡先アプリケーションの[グループ]ページに表示されているローカルアドレス帳はありません(通常、「自分のパソコンに「すべて」、「自分のPCにすべて」」または「Macですべて」と表示されます)どちらも、あなたが提案した方法を使ってハンドルを取得することはできません。私のテストでは、ユーザーが自分のデバイスに格納されている連絡先がExchangeには保存されていない場合(たとえば、Exchangeをセットアップする前に入力していて、マージしないことを選択した場合) 。乾杯、 –

+0

ピーター、それは面白いです。私は(明らかに間違って)ローカルアドレス帳は常にデバイス上に存在すると仮定していたと思います。ローカルソースをプログラムで作成していない場合は、それが存在しない場合もあります。 – xyzzycoder

2

本当にしたいExchangeはデフォルトのソースレコードを編集するが、独自のものを作成する必要がいけない、と何最も素晴らしいのですがアドレス帳意志であり、これを使用して作成グループのように自分自身のsource.Justを作成する方法を知っていますそれらを自動的にリンクします。

+0

ジャッキー、ローカルソースを作成する方法を知っていると言っていますか? – xyzzycoder

+1

私はwish.Actually ABSourceCreate();である私自身のソースを作成することができるプライベートAPIを発見しました。それはクラッシュせず、Lo​​g.Iの "ABStore"タイプとして印刷されるABRecordRefを返すそれは私が希望するABSourceタイプだと思う。私はkABSourceNameProperty、kABSourceTypePropertyを設定し、それをaddressBook.Butに追加するためにABAddressAddRecord()私はプロセスで何かを見逃したように最後に失敗しました.Appleは、次のアップデートでもう少し詳細をリリースするでしょう:誰でも知っています:) –

+1

アドレス帳はまだ私に黒い魔法のように感じます。 – xyzzycoder

1

コードにエラーがあります。つまり、メソッド:ABRecordGetRecordTypeがABSourceの一部ではないため、常に2が返されます。

人物レコードのkABPersonType グループレコードのkABGroupType。 ソースレコードのkABSourceType。

正しいタイプを理解するには、ABRecordCopyValue(source、kABSourceTypeProperty)を代わりに使用してください。 :)私のiPhoneでlocalSourceの有無にかかわらず優れた動作をします。

幸運を祈る!

+0

既存のlocalSourceなしでは動作しません – hinderberg

+0

@hinderberg - あなたが提案しているものを組み込むようにコードを修正できますか?または、ローカルソースがまだ存在しない場合は、このアプローチは機能しないと言っていますか? – xyzzycoder

+0

私は、この方法は、ローカルソースが存在しない場合は機能しないと言っています。現在この問題についてAppleからの回答を待っています! – hinderberg

関連する問題