本文为您介绍了iOS客户端如何接入短信验证码功能。

前提条件

  • 确保您的终端设备已经开启了移动数据网络。
  • 确保您已开通了号码认证服务,并成功创建了对应的短信验证码方案且短信签名、模板均已与该方案绑定,详情请参见短信认证使用流程
  • 应用须在iOS 9.0版本及以上平台上运行。

搭建开发环境

  1. 登录号码认证产品控制台,在控制台右侧API&SDK标签,单击立即使用,进入API&SDK页面,根据页面提示下载并解压iOS SDK(含Demo工程)。
  2. 下载并安装Xcode 11
  3. 添加主库。添加主库的两种方法如下:
    • 选择并单击Xcode 11中Targets > Build Phases > Link Binary With Libraries,添加主库YTXMonitor.frameworkSmsAuthSDK.framework,并将其Status设置为Required添加主库1
    • 选择并单击Xcode 11中Targets > General > Frameworks, Libraries, and Embedded ContentSmsAuthSDK.frameworkYTXMonitor.framework两个依赖库都属于静态库,将Embed设置为Do Not Embed添加主库2

SDK方法说明

  • 主类SmsVerifyCodeManager
    • 获取实例
      /**
       *  初始化SDK实例
       *  @param  sceneCode方案号,必传字段
       *  @return SDK操作实例
       */
      - (instancetype)initWithSceneCode:(NSString *)sceneCode;
    • 获取SDK版本号
      /**
       *  获取SDK版本号
       *  @return SDK版本号
       */
      - (NSString *)getVersion;
    • 设置SmsTokens更新代理对象(id<SmsTokenUpadterDelegate>
      /**
       *  设置Token更新代理对象
       *  @param  tokenUpdateDelegate Token更新代理对象,注:SDK内部对该对象是弱引用,需要外部来维护其生命
       */
      - (void)setTokenUpdateDelegate:(id<SmsTokenUpadterDelegate>)tokenUpdateDelegate;
    • 发送短信验证码
      /**
       *  发送短信验证码
       *  @param  timeout接口超时时间(单位:s)
       *  @param  countryCode国际电话区号,目前仅作为保留字段,当前版本只支持86(即中国大陆的电话号码)
       *  @param  phoneNumber手机号
       *  @param  complete接口调用结果回调
       */
      - (void)sendVerifyCodeWithTimeout:(NSTimeInterval)timeout
                            countryCode:(int)countryCode
                            phoneNumber:(NSString *)phoneNumber
                               complete:(void(^)(SmsSendCodeResult *result))complete;
    • 清空本地SmsTokens缓存
      /**
       *  清空本地SmsTokens缓存
       */
      - (void)clearTokenCache;
  • 实体类SmsTokens
    /// stsToken
    @property (nonatomic, copy) NSString *stsToken;
    /// bizToken
    @property (nonatomic, copy) NSString *bizToken;
    /// Token过期时间(单位:ms)
    @property (nonatomic, assign) long long expiredTimeMills;
    /// 临时accessKeyId
    @property (nonatomic, copy) NSString *accessKeyId;
    /// 临时accessKeySecret
    @property (nonatomic, copy)SmsSendCodeResult NSString *accessKeySecret;
  • 实体类SmsSendCodeResult
    /// 请求对应的requestId,记录下来方便后面问题的全链路排查
    @property (nonatomic, copy) NSString *requestId;
    /// 请求返回的code,具体请参见SmsReturnCode.h
    @property (nonatomic, copy) NSString *code;
    /// 请求返回的msg
    @property (nonatomic, copy) NSString *msg;
    /// 发送验证码请求返回的Token
    @property (nonatomic, copy) NSString *smsVerifyToken;
    /// 接口请求失败返回的详细内容
    @property (nonatomic, strong) NSDictionary *failedResponseData;
  • SmsTokens更新代理
    SDK发送短信验证码时需要用到BizToken、StsToken(包含AccessKey信息)两个Token。调用方法详情请参见GetSmsAuthTokens
    @protocol SmsTokenUpadterDelegate <NSObject>
    @required
    /**
     *  返回最新的SmsTokens对象
     */
    - (SmsTokens *)updateTokenWithVerifyCodeManager:(SmsVerifyCodeManager *)verifyCodeManager;
    @end
    SDK在检测到本地缓存中没有有效SmsTokens(不存在或者已过期)时,则会调用updateTokenWithVerifyCodeManager方法,开发者需要实现该代理方法,并且获取到Token后,封装成SmsTokens返回给SDK。
    重要 使用该方法时需要发送网络请求获取相关参数,同时也会同步返回结果。在此过程中需要使用信号量做同步且属于私有线程,不会卡顿主线程,请放心同步。具体可以参见Demo工程。

SDK返回码

处理错误码时,建议您直接参见SmsReturnCode.h文件中的常量字符进行比对处理,不建议直接使用数值。
返回码返回码描述原因/解决方法
600000成功。无。
600001网络不可用。无可用的网络连接,建议您切换网络。
600002手机号非法。手机号格式错误或无效的手机号。
600003Token获取失败。StsToken或者BizToken获取失败、为空,建议您检查相应字段。
600010请求超时。具体需要根据日志和环境信息排查,请联系阿里云客服进行排查。
600011鉴权失败。StsToken鉴权失败或者其信息与BizToken不对应(账号关系),可检查账号信息、方案信息、包名、签名等。
600012BizToken错误。BizToken错误,建议重新申请。
600013StsToken错误。StsToken错误,建议重新申请StsToken。
600014StsToken过期。StsToken过期,建议重新申请StsToken。
600015BizToken过期。BizToken已过期,建议重新申请。
600016验证码发送频次超出限制。同一个号码每分钟、每小时或每日发送频次超过限制。具体限制次数,请登录号码认证产品控制台,单击通用设置查看详情。
600050未知异常。请联系阿里云客服进行排查。