iOS 苹果登录及第三方登录

作者: 走在长长地路上 | 来源:发表于2020-08-26 14:36 被阅读0次

应用集成第三方登录,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);
}

参考:https://www.jianshu.com/p/e1284bd8c72a

相关文章

网友评论

    本文标题:iOS 苹果登录及第三方登录

    本文链接:https://www.haomeiwen.com/subject/wjixsktx.html