题
有没有办法通过iPhone SDK的标准API获取自己的电话号码?
解决方案
冒着获得负面分数的风险,我想建议截至2009年11月5日,排名最高的解决方案(目前是第一个响应)违反了最新的SDK协议。我们的申请被拒绝使用它。以下是Apple的回复:
"出于安全原因,iPhone OS将应用程序(包括其首选项和数据)限制在文件系统中的唯一位置。此限制是称为应用程序“沙箱”的安全功能的一部分。沙箱是一组细粒度的控件,限制了应用程序对文件,首选项,网络资源,硬件等的访问。“
点击 设备的电话号码在应用程序的容器中不可用。您需要将应用程序修改为仅在目录容器中读取,然后将二进制文件重新提交到iTunes Connect,以便重新考虑App Store的应用程序。
这真是令人失望,因为我们想让用户不必输入他们自己的电话号码。
其他提示
不,没有合法可靠的方法来做到这一点。
如果找到方法,将来会被禁用,因为之前的每种方法都会发生这种情况。
更新功能
为了扩展早期的答案,这样的事情对我来说是这样的:
NSString *num = [[NSUserDefaults standardUserDefaults] stringForKey:@"SBFormattedPhoneNumber"];
注意:这会检索“电话号码”。这是在iPhone的iTunes激活期间输入的,可以为null或值不正确。从SIM卡读取 NOT 。
至少2.1中的情况。 NSUserDefaults中还有一些其他有趣的键可能也不会持久。 (这是在我的应用程序中使用UIWebView)
WebKitJavaScriptCanOpenWindowsAutomatically
NSInterfaceStyle
TVOutStatus
WebKitDeveloperExtrasEnabledPreferenceKey
等等。
不确定其他人做了什么。
使用私有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-是-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.
希望这有帮助!
您不能单独使用iOS API来捕获电话号码(即使在具有私有API的私有应用程序中),因为从iOS 11开始,所有已知的执行此操作的方法都已经过修补和阻止。即使找到了新的漏洞, Apple明确表示他们将拒绝来自应用程序商店的任何应用程序,以使用私有API来执行此操作。有关详细信息,请参阅@ Dylan的答案。
但是,有一种合法的方式来捕获电话号码而无需任何用户数据输入。这类似于Snapchat,但更容易,因为它不需要用户输入他们自己的电话号码。
我们的想法是让应用程序以编程方式将SMS消息发送到具有应用程序唯一安装代码的服务器。然后,应用程序可以查询同一服务器,以查看它是否最近从具有此唯一应用程序安装代码的设备收到了SMS消息。如果有,它可以读取发送它的电话号码。这是一个显示该过程的演示视频。正如你所看到的,它就像一个魅力!
这不是很容易设置,但是在免费的AWS层上免费配置几个小时,并且教程中提供了示例代码这里。
没有官方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。
正如 iOS 7上的 creker 所述使用JB ,您需要使用权利才能使其正常运行。
如何使用您可以在此处找到的权利来执行此操作: 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。
AppStore将拒绝它,因为它已到达应用程序容器之外。
应用应在其捆绑包中自包含,并且不得在指定的容器区域外读取或写入数据
第2.5.2节: https://developer.apple.com/app-store/review /准则/#软件要求
由于某些安全原因,您无法获取自己的电话号码,但可以提取您的电话号码。将其保存到您的联系人列表中,然后您可以通过编程方式获取您的号码。