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