iPhone SDKから標準APIで自分の電話番号を取得する方法はありますか?
iPhone SDKから標準APIで自分の電話番号を取得する方法はありますか?
回答:
ネガティブなマークを取得するリスクがあるので、最高ランクのソリューション(現在は最初の応答)が2009年11月5日の最新のSDK契約に違反していることをお勧めします。このアプリケーションの使用は拒否されました。Appleからの返答は次のとおりです。
「セキュリティ上の理由から、iPhone OSはアプリケーション(その設定とデータを含む)をファイルシステム内の一意の場所に制限します。この制限は、アプリケーションの「サンドボックス」と呼ばれるセキュリティ機能の一部です。サンドボックスは、ファイル、設定、ネットワークリソース、ハードウェアなどへのアプリケーションのアクセスを制限するきめ細かな制御。」
デバイスの電話番号は、アプリケーションのコンテナー内では使用できません。アプリケーションをApp Storeで再検討するためには、ディレクトリコンテナー内のみを読み取るようにアプリケーションを修正し、バイナリをiTunes Connectに再送信する必要があります。
ユーザーが自分の電話番号を入力する手間を省きたかったので、これは本当の失望でした。
いいえ、これを行うための法的で信頼できる方法はありません。
方法が見つかった場合、以前はすべてのメソッドで発生していたので、将来的には無効になります。
更新:機能がAppleによってiOS 4またはその周辺で削除されたようです
以前の答えを拡張するために、このようなことは私のためにそれをします:
NSString *num = [[NSUserDefaults standardUserDefaults] stringForKey:@"SBFormattedPhoneNumber"];
注:これは、iPhoneのiTunesアクティベーション中に入力された「電話番号」を取得するため、nullまたは不正な値になる可能性があります。それはいませ SIMカードから読み取りました。
少なくとも2.1ではそうです。NSUserDefaultsには他にも興味深いキーが2つあります。(これは、UIWebViewを使用する私のアプリにあります)
WebKitJavaScriptCanOpenWindowsAutomatically
NSInterfaceStyle
TVOutStatus
WebKitDeveloperExtrasEnabledPreferenceKey
等々。
他の人が何をしているのかわからない。
Private APIを使用すると、次の方法でユーザーの電話番号を取得できます。
extern NSString* CTSettingCopyMyPhoneNumber();
+(NSString *) phoneNumber {
NSString *phone = CTSettingCopyMyPhoneNumber();
return phone;
}
CoreTelephony.frameworkもプロジェクトに含めます。
次のコード行を使用するかどうかはご存知でしょうが、アプリは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.
お役に立てれば!
[UIDevice identifierForVendor]
。代わりに使用してください。
iOS 11の時点でこれを行うすべての既知の方法にパッチが適用され、ブロックされているため、iOS APIを単独で使用して電話番号をキャプチャすることはできません(プライベートAPIを使用したプライベートアプリでも)。プライベートAPIを使用してこれを行うためにアプリストアからアプリを拒否することを明確にします。詳細については、@ Dylanの回答を参照してください。
ただし、ユーザーデータを入力せずに電話番号を取得する法的な方法があります。これはSnapchatの機能と似ていますが、ユーザーが自分の電話番号を入力する必要がないので簡単です。
アイデアは、アプリに、アプリの一意のインストールコードを含むSMSメッセージをサーバーに送信させることです。次に、アプリは同じサーバーにクエリを実行して、この固有のアプリインストールコードを持つデバイスからSMSメッセージを最近受信したかどうかを確認できます。持っている場合は、送信元の電話番号を読み取ることができます。これはプロセスを示すデモビデオです。ご覧のとおり、それは魅力のように機能します!
これは設定が簡単ではありませんが、こちらのチュートリアルで提供されているサンプルコードを使用して、無料のAWS階層で数時間で無料で設定できます。
電話番号を取得するには、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で動作します。
それを行う公式の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経由で自分の番号を取得する方法?
AppStoreは、アプリケーションコンテナーの外部に到達するため、拒否します。
アプリはバンドルに自己完結している必要があり、指定されたコンテナー領域の外でデータを読み書きすることはできません
セクション2.5.2:https : //developer.apple.com/app-store/review/guidelines/#software-requirements