sign in with Apple,使用Apple授权登录

本文介绍了在iOS13+环境下,如何使用Xcode11.4集成Apple登录功能,包括接入原理、客户端编码示例、服务端验证以及审核注意事项。强调Apple登录的强制性、版本适配、错误处理和UI规范,同时提醒开发者在审核时避免二次绑定操作以符合Apple的政策要求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

软件环境:Xcode 11.4、iOS13+
创建时间:2020年 03月15号
更新时间:2021年 03月02号

这篇文章都说了什么

  1. 使用Apple登录的注意事项
  2. 接入原理概览
  3. 客户端编码
  4. 审核规范

1、背景

霸王条款规定,app如果使用了三方登录(如微信登录)则必须接入Apple登录,否则无法过审。所以我们的app大多都需要开发通过Apple来登录的系列功能。

2、可能影响范围

iOS APP、用户系统

3、注意事项

  1. 不支持企业账号,如果你打的是企业包,现在还不能使用Apple登录功能。如果你的包同时设置了企业和公司两种类型,那也只能暂时把企业包配置去掉,否则Xcode报错
  2. iOS 13开始支持,注意版本判断,隐藏按钮

4、概览和配置

先看一下数据的整体交互过程

客户端开发之前,在 Xcode中配置服务。Signing & Capabilities选项下添加sign in with Apple,Xcode会自动配置需要的信息到entitlements文件内。这个文件包含推送配置、universal link等,所以如果配置完成的话里面也会多一条sign in with Apple 的信息。具体如下图

4、客户端编码

// MARK: apple login  -----------------------
    private func appleLogin() {
        if #available(iOS 13.0, *) {
            
            let appleIDProvider = ASAuthorizationAppleIDProvider()
            let appleIDRequest = appleIDProvider.createRequest()
            appleIDRequest.requestedScopes = [.fullName, .email]
            
            // 由ASAuthorizationAppleIDProvider创建的授权请求 管理授权请求的控制器
            let authorizationController = ASAuthorizationController(authorizationRequests: [appleIDRequest])
            
            // 设置授权控制器通知授权请求的成功与失败的代理
            authorizationController.delegate = self
            // 设置提供 展示上下文的代理,在这个上下文中 系统可以展示授权界面给用户
            authorizationController.presentationContextProvider = self
            // 在控制器初始化期间启动授权流
            authorizationController.performRequests()
        } else {
            HToast.show("当前系统版本不支持设置Apple登录")
        }
    }
    
    /// 接口 调用
    private func getAppleLoginCode(user: String, identity: String) {
        // 参数
        var param = [String: String]()
        param["sub"] = user
        param["token"] = identity
        param["aud"] = APP_BUNDLE_ID // bundle id
        
    }
    
    @available(iOS 13.0, *)
    func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) {
        if authorization.credential is ASAuthorizationAppleIDCredential {
            let userInfo = authorization.credential as? ASAuthorizationAppleIDCredential
            let identityToken = userInfo?.identityToken
            
            let user = userInfo?.user ?? ""
            
            // 服务器验证需要使用的参数
            var identityTokenStr = ""
            if let identityToken = identityToken {
                identityTokenStr = String(data: identityToken, encoding: .utf8) ?? ""
            }
            getAppleLoginCode(user: user, identity: identityTokenStr)
        } else {
            HToast.show("授权失败")
        }
    }
    
    @available(iOS 13.0, *)
    func authorizationController(controller: ASAuthorizationController, didCompleteWithError error: Error) {
        var errorMsg = "授权失败"
        switch (error as NSError).code {
        case ASAuthorizationError.Code.canceled.rawValue:
            errorMsg = "授权已取消"
            break
        case ASAuthorizationError.Code.notHandled.rawValue:
            errorMsg = "授权已取消"
            break
        default:
            break
        }
        HToast.show(errorMsg)
    }
    
    @available(iOS 13.0, *)
    func presentationAnchor(for controller: ASAuthorizationController) -> ASPresentationAnchor {
        let list = UIApplication.shared.windows
        return list[list.count - 1]
    }

服务端编码参考:Sign in with Apple(苹果授权登陆)服务端验证 - 简书

6、审核规范

  1. 非特殊情况,Apple登录之后,不得要求用户进行二次绑定(如手机号)。这个很关键,即使你的用户系统必须绑定,你也不要理所当然的去做,要注意解释清楚,并长期备注在审核信息下面。每次迭代分配的审核员都是不一样的,他们都不了解你的业务特点,所以要解释明白,避免延误上线。如果你的产品是c端的产品,那最好能直接用,如果你的产品是b端的,建议允许用户进入系统,但是未绑定认证账号之前,一些功能不允许使用。(开始吐槽)这里中小公司不要参考大厂的做法(他们都强制绑定的,我也强制),一旦进行博弈,有可能进入延迟队列,能审核几周甚至一个月。没有点实力,苹果只安排审核员通过邮件和你沟通,催审是很困难的。
  2. Apple登录的按钮是有规范的,不要让设计同学过度发挥,一般都是黑白色调,或者直接使用系统提供的按钮类进行初始化

官方文档:Apple Developer Documentation

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值