2009-05-07 14 views
19

だから私はこの1つに困っています。iPhoneアドレス帳APIから「Me」カードを取得する方法はありますか?

Mac OS Xでは、内蔵のアドレス帳APIから「Me」カード(Mac /アカウントの所有者)を簡単に取得できます。

誰かがiPhoneの所有者に属する連絡先(存在する場合)を見つける方法を見つけましたか?

+1

をしませ軽減見つけるかもしれないすべてのユーザーの場合は動作しませんにもかかわらずます。http ://twitter.com/wilshipley/status/1369679612 –

+0

Macで私のカードをどのように描くことができますか? – Johnykutty

+0

@Johnykuttyマーベリックスで、あなたのカードを選択し、次に**カード>このマイカードを作る**メニューアイテムを使用します。 – bneely

答えて

7

あなたは文書化されていないユーザーのデフォルトを使用することができます:

[[NSUserDefaults standardUserDefaults] objectForKey:@"SBFormattedPhoneNumber"]; 

をして、その電話番号とカードのアドレス帳を検索する時にそれのための要求を提出してください。

ユーザーデフォルトが文書化されていないため、いつでもAppleが変更される可能性があり、App Storeにアクセスできない可能性があることに注意してください。

もう1つのアプローチは、はるかに脆弱ですが、デバイス名を調べることです。ユーザーがデフォルトの「ユーザー名のiPhone」から変更しておらず、実際の名前をiPhoneとして使用している場合は、そのユーザー名を取得できます。繰り返しますが、決して最良の解決策ではありませんが、それはあなたに何か他のことを試してもらえません。

この質問に対する一般的に受け入れられる回答は、この機能のためにAppleにレーダーを提出し、ユーザーにカードを選択させることです。

+0

これを行うために店舗からアプリが拒否されました。とにかくそれは信頼できません - ユーザーが別の携帯電話キャリアから自分の電話番号を移植した場合、この呼び出しはほとんど間違った結果を返します。 –

+0

助けてくれてありがとう。この質問を投稿した後、私はSBFormattedPhoneNumberのアプローチについて考えます。それは簡単に "安全な"将来の証明方法で実装することができますが、アップルがさまざまな理由でこれを落胆させるかもしれないように聞こえます。また、トム、頭をアップしてくれてありがとう。 – amattn

+0

これは値を返しません – Brian

4

iPhone SDK 2.2.1以前にはこのようなAPIはありません。 http://bugreport.apple.com

+0

これは3.1 SDKでもまだ当てはまりますか? –

+0

はい、私はそうだと信じています –

+0

これは4.2で改善されましたか? – adib

4

編集:[廃止された解答]

ない「私」のカードが存在しないので、「私」のカードを取得するためのAPIはありません。 iPhoneの連絡先アプリにはカードが「私」であるとマークする方法はなく、APIにはこれが反映されています。

+0

これは正確には当てはまりません。もちろん、連絡先アプリにはこれができませんが、設定>メール、連絡先、カレンダー>自分の情報で自分の「私」カードを設定できます。 – LucasTizma

+0

@ルーカス・ティズマ:上記の答えは、あなたがそれに反応する約3年前に書かれたものです。当時は正解でしたが、もちろん物事は変わります。 –

+0

ああ、私はあなたがそれに答えた日に気付かなかった。それについて申し訳ありません! – LucasTizma

0

私は、デバイスが最初に呼び出された英語で

NSString *ownerName = [[UIDevice currentDevice] name]; 

を次のようにデバイス名を取得することができ、この

への部分的な解決策を思い付いた、例えば、「ジョーBloggのiPhoneの

あなたは、その名前を取ることができ

NSRange t = [ownerName rangeOfString:@"’s"]; 
    if (t.location != NSNotFound) { 
     ownerName = [ownerName substringToIndex:t.location]; 
    } 

名抜け出すと、連絡先を検索する

CNContactStore * contactStore = [CNContactStore new];もちろん、他の言語

NSPredicate *usersNamePredicate = [CNContact predicateForContactsMatchingName:usersName]; 

    NSArray * keysToFetch = @[[CNContactFormatter descriptorForRequiredKeysForStyle:CNContactFormatterStyleFullName],CNContactPhoneNumbersKey,CNContactEmailAddressesKey,CNContactSocialProfilesKey, ]; 

NSArray * matchingContacts = [contactStore unifiedContactsMatchingPredicate:usersNamePredicate keysToFetch:keysToFetch error:nil]; 

デバイス名文字列が異なる例えば'iPhone Von Johann Schmidt'のように、他の言語でも解析を行う必要があります。ユーザーがiTunesのデバイス名を "Joes phone"のように変更していない場合にのみ機能しますが、起動ポイントは

まあ...それはあなたに一致するアイテムの配列を与える:)その配列と複数の連絡先がある場合、あなたはちょうど鍋の運を使用し、最初のものと一緒に行くか、複数のカードを介して動作し、必要なものを取るそれぞれから。

私はその部分的な解決策を言っていたし、それはあなたがそれを@wilshipleyによると、ユーザーの多くのために働き、どうやら少し摩擦