iOSでプログラム的に自分の電話番号を取得する


330

iPhone SDKから標準APIで自分の電話番号を取得する方法はありますか?


プライベートAPIのhow-does-squares-cardcase-app-do-thisを使用しないソリューションを検索する他のユーザーに役立つ場合があります-デバイス名を使用してユーザー名をキャプチャし、必要に応じて電話番号またはその他の詳細をキャプチャします
Nik Burns

davidgyoungは実用的なソリューションを提供しています。埋められます(賛成票が必要です)。
P i

それはこのようにXcodeで今可能ですstackoverflow.com/a/54004224/536214
aqavi_paracha

回答:


318

ネガティブなマークを取得するリスクがあるので、最高ランクのソリューション(現在は最初の応答)が2009年11月5日の最新のSDK契約に違反していることをお勧めします。このアプリケーションの使用は拒否されました。Appleからの返答は次のとおりです。

「セキュリティ上の理由から、iPhone OSはアプリケーション(その設定とデータを含む)をファイルシステム内の一意の場所に制限します。この制限は、アプリケーションの「サンドボックス」と呼ばれるセキュリティ機能の一部です。サンドボックスは、ファイル、設定、ネットワークリソース、ハードウェアなどへのアプリケーションのアクセスを制限するきめ細かな制御。」

デバイスの電話番号は、アプリケーションのコンテナー内では使用できません。アプリケーションをApp Storeで再検討するためには、ディレクトリコンテナー内のみを読み取るようにアプリケーションを修正し、バイナリをiTunes Connectに再送信する必要があります。

ユーザーが自分の電話番号を入力する手間を省きたかったので、これは本当の失望でした。


83
Snapchatはそれをどのように行うのですか?
rgbrgb 2013

1
@Dylan:アプリが拒否されたのはいつですか?ドキュメントへの役立つリンクを提供してください。しかし、私はあなたの答えに感謝します。
Abhishek Bedi

1
これが言及されている場所でapple.developerのドキュメントリンクを取得できますか?
ガネーシュAB-Android

3
私はこれに関するドキュメントを見つけたことがありませんが、それを見てみたいです。これは、私にとってAppleが不透明なままだった分野の1つです。これ以来、私は申請書を提出しようとしませんでした。
ディラン

1
@rgbrgb私はSnapchatを使用していません。とても神秘的な彼らの経験について説明していただけますか?
William Entriken 2017年

138

いいえ、これを行うための法的で信頼できる方法はありません。

方法が見つかった場合、以前はすべてのメソッドで発生していたので、将来的には無効になります。


2
Nik Burnの回答を参照してください:stackoverflow.com/a/8415162/292166-これを行うには(一種の)方法があります!
JosephH 2013年

4
Appleがユーザーの電話番号へのアクセス許可ベースのアクセスを許可しないのを目にした最も良い理由は何ですか?Appleはすでに、連絡先、写真、場所、およびユーザーのカメラとマイクへのアクセス許可ベースのアクセスを許可しています。なぜ電話番号ではないのですか?正当な理由があるはずですが、すぐにはわかりません。アクセスを禁止すると、開発者はユーザーの電話番号を確認する他の方法に多くの時間とお金を費やすため、残念です。
Crashalot 2016年

86

更新:機能がAppleによってiOS 4またはその周辺で削除されたようです


以前の答えを拡張するために、このようなことは私のためにそれをします:

NSString *num = [[NSUserDefaults standardUserDefaults] stringForKey:@"SBFormattedPhoneNumber"];

:これは、iPhoneのiTunesアクティベーション中に入力された「電話番号」を取得するため、nullまたは不正な値になる可能性があります。それはいませ SIMカードから読み取りました。

少なくとも2.1ではそうです。NSUserDefaultsには他にも興味深いキーが2つあります。(これは、UIWebViewを使用する私のアプリにあります)

WebKitJavaScriptCanOpenWindowsAutomatically
NSInterfaceStyle
TVOutStatus
WebKitDeveloperExtrasEnabledPreferenceKey

等々。

他の人が何をしているのかわからない。


1
この能力の背後にあるセキュリティ上の懸念についてのいくつかの最近のプレスが行われています:theregister.co.uk/2009/09/30/iphone_security
JeffH

10
しないでください。キーパッドまたは連絡先選択ツールを使用して、ユーザーに番号を尋ねます。収集する情報は、できるだけユーザーに明示する必要があります。それは最も便利ではないかもしれませんが、番号を保存することは非常に簡単なので、一度だけそれを要求する必要があります。
David Kanarek、

3
アプリを拒否するソリューションはソリューションではありません。
averydev '27 / 10/27

27

Private APIを使用すると、次の方法でユーザーの電話番号を取得できます。

extern NSString* CTSettingCopyMyPhoneNumber();


+(NSString *) phoneNumber {
NSString *phone = CTSettingCopyMyPhoneNumber();

return phone;
}

CoreTelephony.frameworkもプロジェクトに含めます。


このフォーラムで他の回答を読んだ後、それは不可能だと思っていましたが、あなたは完璧な仕事をしました
Mehul Thakkar

1
iOS 7では、それはエンタイトルメントstackoverflow.com/questions/19504478/…
creker

私がこれを試してみると、電話は
無効です

22

次のコード行を使用するかどうかはご存知でしょうが、アプリはAppleによって拒否されます

NSString *num = [[NSUserDefaults standardUserDefaults] stringForKey:@"SBFormattedPhoneNumber"];

こちらが参考です

http://ayeapi.blogspot.com/2009/12/sbformatphonenumber-is-lie.html

代わりに次の情報を使用できます

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

NSString *phoneUniqueIdentifier = [[UIDevice currentDevice] uniqueIdentifier];

等々

@property(nonatomic,readonly,retain) NSString    *name;              // e.g. "My iPhone"
@property(nonatomic,readonly,retain) NSString    *model;             // e.g. @"iPhone", @"iPod Touch"
@property(nonatomic,readonly,retain) NSString    *localizedModel;    // localized version of model
@property(nonatomic,readonly,retain) NSString    *systemName;        // e.g. @"iPhone OS"
@property(nonatomic,readonly,retain) NSString    *systemVersion;     // e.g. @"2.0"
@property(nonatomic,readonly) UIDeviceOrientation orientation;       // return current device orientation
@property(nonatomic,readonly,retain) NSString    *uniqueIdentifier;  // a string unique to each device based on various hardware info.

お役に立てれば!


9
uniqueIdentifierはiOS5でも非推奨です。代わりにMACアドレスを使用してください。
ラプター

15
MACアドレスはiOS 7で廃止されました[UIDevice identifierForVendor]。代わりに使用してください。
jab

17

iOS 11の時点でこれを行うすべての既知の方法にパッチが適用され、ブロックされているため、iOS APIを単独で使用して電話番号をキャプチャすることはできません(プライベートAPIを使用したプライベートアプリでも)。プライベートAPIを使用してこれを行うためにアプリストアからアプリを拒否することを明確にします。詳細については、@ Dylanの回答を参照してください。

ただし、ユーザーデータを入力せずに電話番号を取得する法的な方法があります。これはSnapchatの機能と似ていますが、ユーザーが自分の電話番号を入力する必要がないので簡単です。

アイデアは、アプリに、アプリの一意のインストールコードを含むSMSメッセージをサーバーに送信させることです。次に、アプリは同じサーバーにクエリを実行して、この固有のアプリインストールコードを持つデバイスからSMSメッセージを最近受信したかどうかを確認できます。持っている場合は、送信元の電話番号を読み取ることができます。これはプロセスを示すデモビデオです。ご覧のとおり、それは魅力のように機能します!

これは設定が簡単ではありませんが、こちらのチュートリアル提供されているサンプルコードを使用して、無料のAWS階層で数時間で無料で設定できます。


ごめんなさい。動画が誤って非公開になりました。現在公開されています。
davidgyoung 2018年

これは素晴らしい方法ですが、少なくとも基本的な実装の詳細をカバーするために、回答を充実させていただけませんか?電話番号を知らずにiOSデバイスからSMSを送信するにはどうすればよいですか?送信者の電話番号にアクセスできるSMS受信サーバーをどのように設定しますか?どのようなツールが関係していますか?互換性?
Motti Shneor

@MottiShneor、あなたは答えにチュートリアルのリンクを見ましたか?これには、このソリューションの設定に関する完全なチュートリアルと、Githubリポジトリ内の実際のサンプルアプリコードがあります。
davidgyoung

2

電話番号を取得するには、plistファイルを読み取ることができます。ジェイルブレイクされていないiDeviceでは機能しません。

NSString *commcenter = @"/private/var/wireless/Library/Preferences/com.apple.commcenter.plist";
    NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:commcenter];
    NSString *PhoneNumber = [dict valueForKey:@"PhoneNumber"];
    NSLog([NSString stringWithFormat:@"Phone number: %@",PhoneNumber]);

Appleがこれを許可しているかどうかはわかりませんが、iPhoneで動作します。


Appleはジェイルブレイクした携帯電話の保証を無効にし、アプリはすべてのユーザーにユビキタス機能を持たせる必要があります。
Cosmtar

2

それを行う公式のAPIはありません。プライベートAPIを使用すると、次のメソッドを使用できます。

-(NSString*) getMyNumber {
    NSLog(@"Open CoreTelephony");
    void *lib = dlopen("/Symbols/System/Library/Framework/CoreTelephony.framework/CoreTelephony",RTLD_LAZY);
    NSLog(@"Get CTSettingCopyMyPhoneNumber from CoreTelephony");
    NSString* (*pCTSettingCopyMyPhoneNumber)() = dlsym(lib, "CTSettingCopyMyPhoneNumber");
    NSLog(@"Get CTSettingCopyMyPhoneNumber from CoreTelephony");

    if (pCTSettingCopyMyPhoneNumber == nil) {
        NSLog(@"pCTSettingCopyMyPhoneNumber is nil");
        return nil;
    }
    NSString* ownPhoneNumber = pCTSettingCopyMyPhoneNumber();
    dlclose(lib);
    return ownPhoneNumber;
}

JBと特別な署名なしでiOS 6で動作します。

JB備えiOS 7のcrekerについて述べたように、それを機能させるには資格を使用する必要があります。

ここで見つけることができる資格でそれを行う方法: iOS 7:プライベートAPI経由で自分の番号を取得する方法?


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.