以编程方式在iOS中获取自己的电话号码

Vad*_*dim 327 iphone phone-number ios

有没有办法通过iPhone SDK的标准API获取自己的电话号码?

Dyl*_*lan 312

有可能获得负面评分,我想建议排名最高的解决方案(目前是第一个响应)违反了截至2009年11月5日的最新SDK协议.我们的应用程序被拒绝使用它.以下是Apple的回复:

"出于安全原因,iPhone OS将应用程序(包括其首选项和数据)限制在文件系统中的唯一位置.此限制是安全功能的一部分,称为应用程序的"沙箱".沙箱是一组很好的 - 粒度控制限制应用程序访问文件,首选项,网络资源,硬件等."

设备的电话号码在应用程序的容器中不可用.您需要将应用程序修改为仅在目录容器中读取,然后将二进制文件重新提交到iTunes Connect,以便重新考虑App Store的应用程序.

这真是令人失望,因为我们想让用户不必输入他们自己的电话号码.

  • Snapchat如何做到这一点? (80认同)
  • 我从未找到任何关于此的文档,但很乐意看到它.这是Apple对我不透明的领域之一.我没有尝试提交申请. (3认同)

And*_*ant 138

不,没有合法可靠的方法来做到这一点.

如果你找到了一种方法,它将来会被禁用,因为之前的每种方法都会发生这种情况.

  • 您看到Apple拒绝基于权限访问用户电话号码的最佳理由是什么?Apple已允许基于权限的访问联系人,照片,位置以及用户的摄像头和麦克风.为什么不是电话号码?必须有充分的理由,但目前尚不清楚.这是不幸的,因为禁止访问会导致开发人员花费大量时间和金钱来验证用户的电话号码. (4认同)
  • 请参阅Nik Burn的回答:http://stackoverflow.com/a/8415162/292166 - 有(某种)方法可以做到这一点! (2认同)

Rob*_*ers 86

更新: Apple在iOS 4上或附近似乎已删除了该功能


只是为了扩展早期的答案,这样的事情对我来说:

NSString *num = [[NSUserDefaults standardUserDefaults] stringForKey:@"SBFormattedPhoneNumber"];
Run Code Online (Sandbox Code Playgroud)

注意:这将检索在iPhone的iTunes激活期间输入的"电话号码",可以为空或值不正确.它不是从SIM卡读取的.

至少2.1中的情况.NSUserDefaults中还有一些其他有趣的键可能也不会持久.(这是在我的应用程序中使用UIWebView)

WebKitJavaScriptCanOpenWindowsAutomatically
NSInterfaceStyle
TVOutStatus
WebKitDeveloperExtrasEnabledPreferenceKey
Run Code Online (Sandbox Code Playgroud)

等等.

不确定其他人做了什么,如果有的话.

  • 不要这样做.通过键盘或联系选择器询问用户号码.您应该尽可能向用户收集任何信息.它可能不是最方便的,但保存号码很容易,所以你只需要一次. (10认同)
  • 让应用程序被拒绝的解决方案不是解决方案. (3认同)

Igo*_*gor 27

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

extern NSString* CTSettingCopyMyPhoneNumber();


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

return phone;
}
Run Code Online (Sandbox Code Playgroud)

还包括CoreTelephony.framework到您的项目.


小智 22

由于您可能已经准备好了解您是否使用以下代码行,因此Apple会拒绝您的应用

NSString *num = [[NSUserDefaults standardUserDefaults] stringForKey:@"SBFormattedPhoneNumber"];
Run Code Online (Sandbox Code Playgroud)

这是一个参考

http://ayeapi.blogspot.com/2009/12/sbformatphonenumber-is-lie.html

您可以使用以下信息

NSString *phoneName = [[UIDevice currentDevice] name];

NSString *phoneUniqueIdentifier = [[UIDevice currentDevice] uniqueIdentifier];
Run Code Online (Sandbox Code Playgroud)

等等

@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.
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!

  • 在iOS 7中不推荐使用MAC地址.请改用"[UIDevice identifierForVendor]". (15认同)
  • 在iOS5中也不推荐使用uniqueIdentifier.请改用MAC地址. (9认同)

dav*_*ung 15

您无法单独使用iOS API来捕获电话号码(即使在具有私有API的私有应用程序中),因为从iOS 11开始,所有已知的执行此操作的方法都已被修补和阻止.即使找到了新的漏洞利用,Apple也做了明确表示他们将拒绝来自应用商店的任何应用,以使用私有API来执行此操作.有关详细信息,请参阅@ Dylan的答案.

但是,有一种合法的方法来捕获电话号码而无需任何用户数据输入.这类似于Snapchat,但更容易,因为它不需要用户输入他们自己的电话号码.

我们的想法是让应用程序以编程方式将SMS消息发送到具有应用程序唯一安装代码的服务器.然后,应用程序可以查询同一服务器,以查看它是否最近从具有此唯一应用程序安装代码的设备收到了SMS消息.如果有,它可以读取发送它的电话号码.这是一个显示该过程的演示视频.正如你所看到的,它就像一个魅力!

这不是很容易设置,但是在免费的AWS层上免费配置几个小时,并在此处提供示例代码.

  • 我将其用于企业应用程序,因此我没有将其发送以供审核。但由于用户可以通过他们看到的对话框控制发送短信,我怀疑苹果或谷歌是否会遇到问题,只要你透露你正在发送短信来验证他们的电话号码。 (2认同)