在iOS中通过编程获得自己的电话号码

有没有办法从iPhone SDK的标准api获得自己的电话号码?

229451 次浏览

不,没有合法可靠的方法来做这件事。

如果您找到了一种方法,它将在未来被禁用,就像之前的每个方法一样。

更新:功能似乎已经被苹果在iOS 4或前后删除


为了扩展之前的答案,我想说的是:

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

请注意:检索在iPhone的iTunes激活期间输入的“电话号码”,可以为null或错误的值。它是从SIM卡读取的

至少在2.1中是这样的。在NSUserDefaults中还有其他一些有趣的键,它们可能也不会持续。(这是我的应用程序,它使用UIWebView)

WebKitJavaScriptCanOpenWindowsAutomatically
NSInterfaceStyle
TVOutStatus
WebKitDeveloperExtrasEnabledPreferenceKey

等等。

不知道其他人做了什么,如果有的话。

冒着被扣分的风险,我想建议排名最高的解决方案(目前是第一个响应)违反了2009年11月5日的最新SDK协议。我们的申请因为使用它而被拒绝了。以下是苹果公司的回应:

出于安全原因,iPhone OS将应用程序(包括其首选项和数据)限制在文件系统中的唯一位置。这个限制是被称为应用程序“沙箱”的安全特性的一部分。沙盒是一组细粒度的控件,用于限制应用程序对文件、首选项、网络资源、硬件等的访问。“

该设备的电话号码在应用程序的容器中不可用。你需要修改你的应用,使其只能读取你的目录容器,并重新提交你的二进制文件到iTunes Connect,这样你的应用才能被App Store重新考虑

这确实令人失望,因为我们想让用户不必输入自己的电话号码。

你可能已经知道,如果你使用下面这行代码,你的应用程序将会被苹果拒绝

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.

希望这能有所帮助!

使用私有API,您可以通过以下方式获取用户电话号码:

extern NSString* CTSettingCopyMyPhoneNumber();




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


return phone;
}

也可以将coretphony .framework包含到你的项目中。

要得到你的电话号码,你可以读取一个plist文件。它将不能在非越狱设备上工作:

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]);

我不知道苹果是否允许这样做,但它适用于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获得自己的号码? < / p >

你不能单独使用iOS api来捕获电话号码(即使是在带有私有api的私有应用程序中),因为所有已知的方法都已在iOS 11中被修补和阻止。即使发现了新的漏洞,苹果已经明确表示,他们将拒绝应用商店中任何使用私有api进行攻击的应用程序。详见@Dylan的回答。

然而,有一种合法的方法可以在不输入任何用户数据的情况下获取电话号码。这与Snapchat的功能类似,但更简单,因为它不需要用户输入自己的电话号码。

这个想法是让应用程序以编程的方式向服务器发送一条短信,使用应用程序的唯一安装代码。然后,应用程序可以查询同一台服务器,以查看它最近是否收到了来自具有此唯一应用程序安装代码的设备的SMS消息。如果有,它可以读取发送它的电话号码。下面是一个演示视频,它显示了这个进程。正如你所看到的,它就像一个咒语!

这不是超级容易设置,但它可以在几个小时内免费配置在一个免费的AWS层,使用教程在这里中提供的示例代码。

AppStore会拒绝它,因为它超出了应用容器。

应用程序应该在它们的包中是自包含的,并且不能读取或写入指定容器区域之外的数据

第2.5.2节: https://developer.apple.com/app-store/review/guidelines/#software-requirements < / p >