应用集成第三方登录,iOS 13之后必须集成苹果登录,否则审核会被拒的。较为常用的第三方登录是微信和QQ,微信不提供网页登录授权,所以用户手机没有安装微信最好是不展示微信登录入口,QQ是提供网页授权登录的,所以提供的第三方登录入口QQ可以不加判断直接展示。苹果登录只在iOS 13以后才可以使用,所以系统版本小于13的也不能展示苹果入口。
微信和QQ不多说,直接在开发平台注册应用,拿到APPID和APP secret去调用微信和QQ的SDK,处理对应的回调,在Xcode设置URL Schemes和白名单。
苹果登录开发流程:
一、登录按钮
苹果提供了一个ASAuthorizationAppleIDButton类,使用它来创建苹果登录按钮,这个类就像UIButton一样使用。
if (@available(iOS 13.0, *)) {
ASAuthorizationAppleIDButton *appleLoginBtn = [[ASAuthorizationAppleIDButton alloc] initWithAuthorizationButtonType:ASAuthorizationAppleIDButtonTypeSignIn authorizationButtonStyle:ASAuthorizationAppleIDButtonStyleBlack];
appleLoginBtn.frame = CGRectMake(0, 0, 50, 50);
appleLoginBtn.layer.cornerRadius = 5;
appleLoginBtn.layer.masksToBounds = YES;
[appleLoginBtn addTarget:self action:@selector(appleLogin) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:appleLoginBtn];
} else {
// Fallback on earlier versions
}
以上方法绘制出的按钮是个白苹果黑背景的圆形logo。
苹果提供的这个登录按钮有三个外观:白色,带有黑色轮廓线的白色和黑色。根据自己的需求来定。
二、授权请求
点击按钮发起苹果登录请求:
- (void)appleLogin {
if (@available(iOS 13.0, *)) {
ASAuthorizationAppleIDProvider *appleIDProvider = [[ASAuthorizationAppleIDProvider alloc] init];
ASAuthorizationAppleIDRequest *appleIDRequest = [appleIDProvider createRequest];
// 用户授权请求的联系信息
appleIDRequest.requestedScopes = @[ASAuthorizationScopeFullName, ASAuthorizationScopeEmail];
ASAuthorizationController *authorizationController = [[ASAuthorizationController alloc] initWithAuthorizationRequests:@[appleIDRequest]];
// 设置授权控制器通知授权请求的成功与失败的代理
authorizationController.delegate = self;
// 设置提供 展示上下文的代理,在这个上下文中 系统可以展示授权界面给用户
authorizationController.presentationContextProvider = self;
// 在控制器初始化期间启动授权流
[authorizationController performRequests];
} else {
NSLog(@"该系统版本不可用Apple登录");
}
}
用户发起授权请求后,系统就会弹出用户登录验证的页面。用户可以选择共享电子邮箱或者隐藏邮件地址。
三、授权回调处理
接下来处理授权成功和失败的回调:
授权成功走的代理方法
- (void)authorizationController:(ASAuthorizationController *)controller didCompleteWithAuthorization:(ASAuthorization *)authorization API_AVAILABLE(ios(13.0)){
if ([authorization.credential isKindOfClass:[ASAuthorizationAppleIDCredential class]]) {
// 用户登录使用ASAuthorizationAppleIDCredential
ASAuthorizationAppleIDCredential *appleIDCredential = authorization.credential;
NSString *user = appleIDCredential.user;
// 使用过授权的,可能获取不到以下三个参数
NSString *familyName = appleIDCredential.fullName.familyName;
NSString *givenName = appleIDCredential.fullName.givenName;
NSString *email = appleIDCredential.email;
} else if ([authorization.credential isKindOfClass:[ASPasswordCredential class]]) {
// 用户登录使用现有的密码凭证(iCloud记录的)
ASPasswordCredential *passwordCredential = authorization.credential;
// 密码凭证对象的用户标识 用户的唯一标识
NSString *user = passwordCredential.user;
// 密码凭证对象的密码
NSString *password = passwordCredential.password;
} else {
NSLog(@"授权信息均不符");
}
}
授权成功我们可以拿到用户的 user、email、fullName、authorizationCode、identityToken 以及 realUserStatus 等信息。user是苹果用户唯一标识符,该值在同一个开发者账号下的所有 App 下是一样的。在用户共享邮箱情况下可以拿到email。拿到这些值就可以请求自己的服务器进行登录。
登录失败的代理方法如下:
- (void)authorizationController:(ASAuthorizationController *)controller didCompleteWithError:(NSError *)error API_AVAILABLE(ios(13.0)) {
NSString *errorMsg = nil;
switch (error.code) {
case ASAuthorizationErrorCanceled:
errorMsg = @"用户取消了授权请求";
break;
case ASAuthorizationErrorFailed:
errorMsg = @"授权请求失败";
break;
case ASAuthorizationErrorInvalidResponse:
errorMsg = @"授权请求响应无效";
break;
case ASAuthorizationErrorNotHandled:
errorMsg = @"未能处理授权请求";
break;
case ASAuthorizationErrorUnknown:
errorMsg = @"授权请求失败未知原因";
break;
default:
break;
}
NSLog(@"%@", errorMsg);
}