web-dev-qa-db-ja.com

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

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

322
Vadim

否定的な評価を得る危険性があるので、私は2009年11月5日の時点で最高ランクの解決策(現在最初の回答)が最新のSDK契約に違反していることを提案したいと思います。これがAppleからの返事です。

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

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

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

305
Dylan

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

あなたが方法を見つけた場合、それは前にすべての方法で起こったように、それは将来無効にされます。

135
Andrew Grant

更新:機能は、iOS 4以降でAppleによって削除されたようです。


先ほどの答えを詳しく説明すると、次のようになります。

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

:これは、iPhoneのiTunes起動中に入力された「電話番号」を取得するもので、nullまたは不正な値になることがあります。これは_ _ではない SIMカードから読み取ったものです。

少なくともそれは2.1にあります。 NSUserDefaultsには他にもいくつかの興味深いキーがありますが、それも長続きしません。 (これはUIWebViewを使う私のアプリの中です)

WebKitJavaScriptCanOpenWindowsAutomatically
NSInterfaceStyle
TVOutStatus
WebKitDeveloperExtrasEnabledPreferenceKey

等々。

他の人が何をしているとしても、何をするのかわからない。

84
Robert Sanders

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

extern NSString* CTSettingCopyMyPhoneNumber();


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

return phone;
}

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

25
Igor

次のコードを使用しているかどうかはすでにわかっているので、アプリは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.

お役に立てれば!

22
Andres Garcia

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

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

そのアイデアは、アプリケーションに固有のインストールコードを使用して、プログラムでSMSメッセージをサーバーに送信させることです。その後、アプリは同じサーバーに照会して、この一意のアプリインストールコードを使用して、デバイスからSMSメッセージを最近受信したかどうかを確認できます。持っていれば、それはそれを送った電話番号を読むことができます。これが デモビデオ です。ご覧のとおり、それは魅力のように機能します。

これはセットアップがそれほど簡単ではありませんが、チュートリアルで提供されているサンプルコードを使用して無料のAWS層で無料で数時間で構成できます ここ

11
davidgyoung

それをするための公式の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で動作します。

前述のように creker oniOS 7 with JBそれを動作させるにはエンタイトルメントを使用する必要があります。

あなたがここで見つけることができる資格でそれをする方法: iOS 7:プライベートAPIを介して自分の番号を取得する方法?

2
0x8BADF00D

あなたの電話番号を取得するには、plistファイルを読むことができます。それは非脱獄iデバイスでは動作しません。

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でも機能します。

1

AppStoreはアプリケーションコンテナの外側に到達しているため、それを拒否します。

アプリはバンドルに自己完結型でなければならず、指定されたコンテナエリア外のデータを読み書きすることはできません。

セクション2.5.2: https://developer.Apple.com/app-store/review/guidelines/#software-requirements

0
thedazed