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