网上常见的方案是使用CoreTelephony的私有API
extern NSString*CTSettingCopyMyPhoneNumber();
@implementation
+(NSString *)myNumber{
return CTSettingCopyMyPhoneNumber();
}
不过这方案并没有什么卵用,私有API是不会通过苹果的AppStore审核的。
后来发现爱奇艺和bilibili的App都是可以获取到用户手机号的,还可以一键登录。
查了一下,发现原来是运营商提供的功能,运营商提供SDK,可以让开发者获取到当前手机使用的手机卡号,直接使用这个号码进行登录,这就是号码一键登录。
三大运营商的开放平台:
移动 - 互联网能力开放平台(http://dev.10086.cn)
电信 - 天翼账号开放平台(https://id.189.cn)
联通 - WO+ 开放平台(http://open.wo.com.cn)
授权流程大致如下:
(1)SDK初始化
调用 SDK 的初始化方法,传入项目在平台上的 AppKey 和 AppSecret。
(2)唤起授权页
调用 SDK 唤起授权接口。SDK 会先向运营商发起获取手机号掩码的请求,请求成功后跳转到授权页。授权页会显示手机号掩码以及运营商协议给用户确认。
(3)同意授权并登录
用户同意相关协议,点击授权页面的登录按钮,SDK 会请求本次取号的 token,请求成功后将 token 返回给客户端。
(4)取号
将获取到的 token 发送到我们自己的服务器,由服务器携带 token 调用运营商一键登录的接口,调用成功就返回手机号码了。服务器用手机号进行登录或注册操作,返回操作结果给客户端,完成一键登录。
如果没有插电话卡,或者在关闭移动蜂窝网络的情况下,是无法完成认证的,这时需要兼容传统的登录方式,允许用户在认证失败的情况下手动输入手机号登录。
三大运营商都有自己的SDK,如果要兼容三大运营商,就需要分别接入三个SDK,也可以接入整合了三大运营商认证能力的第三方SDK:
阿里云(https://help.aliyun.com/product/75010.html)
极光(https://www.jiguang.cn/identify)
网易(https://dun.163.com/product/phone-verification)
百度(https://cloud.baidu.com/doc/PNVS/index.html)
创蓝闪验(http://shanyan.253.com/document)
mob秒验(https://www.mob.com/wiki/list)