iPhoneアドレス帳APIから「Me」カードを取得する方法はありますか?
-
08-07-2019 - |
質問
だから私はこれに困惑しています。
Mac OS Xには、「Me」を取得する簡単な方法があります。組み込みのアドレス帳APIからのカード(Mac /アカウントの所有者)。
iPhoneの所有者に属する連絡先(存在する場合)を見つける方法を見つけた人はいますか?
解決
文書化されていないユーザーのデフォルトを使用できます:
[[NSUserDefaults standardUserDefaults] objectForKey:@"SBFormattedPhoneNumber"];
次に、その電話番号のカードをアドレス帳で検索します。
ユーザーのデフォルトは文書化されていないため、Appleはいつでも変更する可能性があり、App Storeにアクセスできない場合があることに注意してください。
別のアプローチとしては、もっと脆弱ですが、デバイス名を確認する方法があります。ユーザーがデフォルトの「ユーザー名のiPhone」から変更していない場合は、そして彼らはiPhoneとして本名を使用しているので、そこからユーザー名を取得することができます。繰り返しになりますが、決して最善の解決策ではありませんが、他に試すことができます。
この質問に対する一般に受け入れられている回答は、この機能についてAppleにレーダーを提出し、ユーザーにカードの選択を促すことです。
他のヒント
iPhone SDK 2.2.1以前には、このようなAPIはありません。次の場所にリクエストを提出してください: http://bugreport.apple.com
編集:[廃止された回答]
" me"を取得するためのAPIはありません。 「私」がないためカードカード。 iPhoneの連絡先アプリには、カードを「私」としてマークする方法がなく、APIにはこれが反映されています。
これに対する部分的な解決策を思いつきました
次のようにデバイス名を取得できます
NSString *ownerName = [[UIDevice currentDevice] name];
英語では、デバイスはもともと「Joe Blogg's 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」のような名前に変更していない場合にのみ機能しますが、出発点は
まあ...それはあなたに一致するアイテムの配列を提供します:)その配列と複数の接触がある場合、あなたはポットラッキーを使用し、最初のものと一緒に行くか、複数のカードを通して仕事をして、あなたが何を取るかそれぞれから必要です。
これは部分的な解決策であると言いましたが、すべてのユーザーケースで機能するわけではありませんが、多くのユーザーで機能し、多少の摩擦が軽減される場合があります