iPhone SDKから標準APIで自分の電話番号を取得する方法はありますか?
9 に答える
マイナス評価になる可能性はありますが、2009 年 11 月 5 日の時点で最高ランクのソリューション (現在は最初の回答) が最新の SDK 契約に違反していると提案したいと思います。Apple からの回答は次のとおりです。
「セキュリティ上の理由から、iPhone OS はアプリケーション (設定とデータを含む) をファイル システム内の一意の場所に制限します。この制限は、アプリケーションの「サンドボックス」として知られるセキュリティ機能の一部です。ファイル、設定、ネットワーク リソース、ハードウェアなどへのアプリケーションのアクセスを制限する粒度の高い制御。」
デバイスの電話番号は、アプリケーションのコンテナ内では利用できません。アプリケーションを App Store で再検討するには、ディレクトリ コンテナ内で読み取り専用になるようにアプリケーションを修正し、バイナリを iTunes Connect に再送信する必要があります。
ユーザーが自分の電話番号を入力する手間を省きたかったので、これは本当に残念でした。
いいえ、これを行う合法的で信頼できる方法はありません。
以前のすべての方法で発生したように、方法が見つかった場合、将来的には無効になります。
更新:この機能は、iOS 4 またはその周辺で Apple によって削除されたようです
以前の回答を拡張するだけで、次のようなことができます:
NSString *num = [[NSUserDefaults standardUserDefaults] stringForKey:@"SBFormattedPhoneNumber"];
注: これにより、iPhone の iTunes アクティベーション中に入力された「電話番号」が取得され、null または正しくない値になる可能性があります。SIMカードからは読み取られません。
少なくとも 2.1 ではそうです。NSUserDefaults には、持続しない可能性のある興味深いキーが他にもいくつかあります。(これは、UIWebView を使用する私のアプリにあります)
WebKitJavaScriptCanOpenWindowsAutomatically
NSInterfaceStyle
TVOutStatus
WebKitDeveloperExtrasEnabledPreferenceKey
等々。
どちらかといえば、他の人が何をしているのかわかりません。
プライベート API を使用すると、次の方法でユーザーの電話番号を取得できます。
extern NSString* CTSettingCopyMyPhoneNumber();
+(NSString *) phoneNumber {
NSString *phone = CTSettingCopyMyPhoneNumber();
return phone;
}
CoreTelephony.framework もプロジェクトに含めます。
As you probably all ready know if you use the following line of code, your app will be rejected by Apple
NSString *num = [[NSUserDefaults standardUserDefaults] stringForKey:@"SBFormattedPhoneNumber"];
here is a reference
http://ayeapi.blogspot.com/2009/12/sbformatphonenumber-is-lie.html
you can use the following information instead
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.
お役に立てれば!
それを行うための公式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 を介して自分の番号を取得する方法?
電話番号を取得するには、plist ファイルを読み取ることができます。ジェイルブレイクされていない iDevices では動作しません:
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 では動作します。