软件环境:Xcode 11.4、iOS13+
创建时间:2020年 03月15号
更新时间:2021年 03月02号
这篇文章都说了什么
- 使用Apple登录的注意事项
- 接入原理概览
- 客户端编码
- 审核规范
1、背景
霸王条款规定,app如果使用了三方登录(如微信登录)则必须接入Apple登录,否则无法过审。所以我们的app大多都需要开发通过Apple来登录的系列功能。
2、可能影响范围
iOS APP、用户系统
3、注意事项
- 不支持企业账号,如果你打的是企业包,现在还不能使用Apple登录功能。如果你的包同时设置了企业和公司两种类型,那也只能暂时把企业包配置去掉,否则Xcode报错
- 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、审核规范
- 非特殊情况,Apple登录之后,不得要求用户进行二次绑定(如手机号)。这个很关键,即使你的用户系统必须绑定,你也不要理所当然的去做,要注意解释清楚,并长期备注在审核信息下面。每次迭代分配的审核员都是不一样的,他们都不了解你的业务特点,所以要解释明白,避免延误上线。如果你的产品是c端的产品,那最好能直接用,如果你的产品是b端的,建议允许用户进入系统,但是未绑定认证账号之前,一些功能不允许使用。(开始吐槽)这里中小公司不要参考大厂的做法(他们都强制绑定的,我也强制),一旦进行博弈,有可能进入延迟队列,能审核几周甚至一个月。没有点实力,苹果只安排审核员通过邮件和你沟通,催审是很困难的。
- Apple登录的按钮是有规范的,不要让设计同学过度发挥,一般都是黑白色调,或者直接使用系统提供的按钮类进行初始化