有什么方法可以通过iPhone SDK中的标准API获取自己的电话号码?
有什么方法可以通过iPhone SDK中的标准API获取自己的电话号码?
Answers:
冒着被打分的风险,我想建议排名最高的解决方案(当前为第一个响应)违反了截至2009年11月5日的最新SDK协议。我们的应用程序因使用它而被拒绝。这是苹果公司的回应:
“出于安全考虑,iPhone OS将应用程序(包括其首选项和数据)限制为文件系统中的唯一位置。此限制是称为应用程序“沙箱”的安全功能的一部分。沙箱是一组优良的功能,细粒度的控件限制了应用程序对文件,首选项,网络资源,硬件等的访问。”
该设备的电话号码在您应用程序的容器中不可用。您将需要修改您的应用程序以使其只能在目录容器中读取,然后将二进制文件重新提交给iTunes Connect,以便将应用程序重新考虑用于App Store。
真令人失望,因为我们想让用户不必输入自己的电话号码。
不,没有合法可靠的方法可以做到这一点。
如果您找到了一种方法,那么将来它将被禁用,因为以前的每种方法都曾经发生过这种情况。
更新:此功能似乎已被Apple在iOS 4或周围删除
只是为了扩展先前的答案,类似这样的事情对我来说是这样的:
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包含到您的项目中。
众所周知,如果您使用以下代码行,则您的应用将被苹果拒绝
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 API来捕获电话号码(即使是在具有私有API的私有应用程序中),因为自iOS 11起,所有已知方法都已修补和阻止了该方法。即使发现了新的漏洞利用,苹果公司也取得了成功。明确表示他们将拒绝使用私有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]);
我不知道苹果是否允许这样做,但是它可以在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