Sign In With Apple (OC、RN)

2019-11-27  本文已影响0人  上玄月_lxl

目录
一、集成
二、配置
三、RN调用(附带原生文件)
四、注意事项
五、demo链接
六、我参考大佬的链接

一、集成

集成需要以下几个步骤


51809190.png

1、登录苹果开发者网站,开启功能Sign in With Apple。(不打开不影响测试)


51905367.png

2、xcode 中开启sign in with Apple功能。


开启signInWithApple功能

二、配置

1、创建登录按钮(原生可以直接使用系统提供的ASAuthorizationAppleIDButton)


52141870.png

按钮代码如下(设置成圆形暂无法确定是否可以过审):

// Sign In With Apple Button
        ASAuthorizationAppleIDButton *appleIDBtn = [ASAuthorizationAppleIDButton buttonWithType:ASAuthorizationAppleIDButtonTypeDefault style:ASAuthorizationAppleIDButtonStyleWhite];
        appleIDBtn.frame = CGRectMake(30, 100, self.view.bounds.size.width - 60, 40);
//            appleIDBtn.cornerRadius = 20.f;
        [appleIDBtn addTarget:self action:@selector(handleAuthorizationAppleIDButtonPress) forControlEvents:UIControlEventTouchUpInside];
样式可根据界面调整:
typedef NS_ENUM(NSInteger, ASAuthorizationAppleIDButtonType) {
    ASAuthorizationAppleIDButtonTypeSignIn,
    ASAuthorizationAppleIDButtonTypeContinue,

    ASAuthorizationAppleIDButtonTypeSignUp API_AVAILABLE(ios(13.2), macos(10.15.1), tvos(13.1)) API_UNAVAILABLE(watchos),

    ASAuthorizationAppleIDButtonTypeDefault = ASAuthorizationAppleIDButtonTypeSignIn,
} NS_SWIFT_NAME(ASAuthorizationAppleIDButton.ButtonType) API_AVAILABLE(ios(13.0), macos(10.15), tvos(13.0)) API_UNAVAILABLE(watchos);


typedef NS_ENUM(NSInteger, ASAuthorizationAppleIDButtonStyle) {
    ASAuthorizationAppleIDButtonStyleWhite,
    ASAuthorizationAppleIDButtonStyleWhiteOutline,
    ASAuthorizationAppleIDButtonStyleBlack,
} NS_SWIFT_NAME(ASAuthorizationAppleIDButton.Style) API_AVAILABLE(ios(13.0), macos(10.15), tvos(13.0)) API_UNAVAILABLE(watchos);

2、发起授权登录请求

// 处理授权
- (void)handleAuthorizationAppleIDButtonPress{
    if (@available(iOS 13.0, *)) {
        // 基于用户的Apple ID授权用户,生成用户授权请求的一种机制
        ASAuthorizationAppleIDProvider *appleIDProvider = [[ASAuthorizationAppleIDProvider alloc] init];
        // 创建新的AppleID 授权请求
        ASAuthorizationAppleIDRequest *appleIDRequest = [appleIDProvider createRequest];
        // 在用户授权期间请求的联系信息
        appleIDRequest.requestedScopes = @[ASAuthorizationScopeFullName, ASAuthorizationScopeEmail];
        // 由ASAuthorizationAppleIDProvider创建的授权请求 管理授权请求的控制器
        ASAuthorizationController *authorizationController = [[ASAuthorizationController alloc] initWithAuthorizationRequests:@[appleIDRequest]];
        // 设置授权控制器通知授权请求的成功与失败的代理
        authorizationController.delegate = self;
        // 设置提供 展示上下文的代理,在这个上下文中 系统可以展示授权界面给用户
        authorizationController.presentationContextProvider = self;
        // 在控制器初始化期间启动授权流
        [authorizationController performRequests];
    }
}

3、设置上下文代理


// 告诉代理应该在哪个window 展示内容给用户
- (ASPresentationAnchor)presentationAnchorForAuthorizationController:(ASAuthorizationController *)controller{
    // 返回window
    return self.view.window;
}

4、授权回调处理


#pragma mark delegate
//@optional 授权成功地回调
- (void)authorizationController:(ASAuthorizationController *)controller didCompleteWithAuthorization:(ASAuthorization *)authorization{
    NSLog(@"授权完成:::%@", authorization.credential);
    NSLog(@"%s", __FUNCTION__);
    NSLog(@"%@", controller);
    NSLog(@"%@", authorization);
    
//    NSMutableString *mStr = [NSMutableString string];
    if ([authorization.credential isKindOfClass:[ASAuthorizationAppleIDCredential class]]) {
        ASAuthorizationAppleIDCredential *credential = authorization.credential;
        NSString *state = credential.state;
        NSString *userID = credential.user;
        NSPersonNameComponents *fullName = credential.fullName;
        NSString *email = credential.email;
        NSString *authorizationCode = [[NSString alloc] initWithData:credential.authorizationCode encoding:NSUTF8StringEncoding]; // refresh token
        NSString *identityToken = [[NSString alloc] initWithData:credential.identityToken encoding:NSUTF8StringEncoding]; // access token
        ASUserDetectionStatus realUserStatus = credential.realUserStatus;
        // TODO 网络返回 传递 identityToken 等需要的信息
        // fullName 包含fullName.familyName 和 fullName.givenName
    }else if ([authorization.credential isKindOfClass:[ASPasswordCredential class]]){
        // 使用现有密码凭证,暂不考虑。
        // TODO 网络返回
        
    }else{
        // 授权信息均不符
        
    }
}

// 授权失败的回调
- (void)authorizationController:(ASAuthorizationController *)controller didCompleteWithError:(NSError *)error{
    // Handle error.
    NSLog(@"Handle error:%@", error);
    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;
    }
    // TODO 提示用户请求失败
}

三、RN调用(附带原生文件)

请先完成本文的第一步配置工作。

github链接

1、根据路径下载原生文件,并放入Xcode 中。

2、RN调用:
1)、判断是否是ios13以上版本


NativeModules.NativeSignAppleModule.isIOSThirteen((getData) =>{
    console.log('ios返回值',getData);
    if (parseInt(getData.code) === 0){
    }
    else {
    }
})

2)、点击按钮获取原生返回值


// code 为0就是返回成功,使用data 接收返回内容。-1是返回失败,error_msg接收失败说明。

NativeModules.NativeSignAppleModule.signApple((getData) =>{
    console.log('返回值',getData);
})

四、注意事项

1、xcode配置Sign In With Apple功能

2、xcode 记得登录账号,否则会出现登录成功但是返回结果却进入不到成功回调的情况。

五、demo链接

github 原生Demo地址

1、RN可以直接使用的文件在demo的SignInWithApple_OC/iosModule/NativeSignAppleModule路径下。

2、demo为OC的demo,oc使用可以用LXLSecondViewController 文件。(demo请登录自己苹果账号)

3、文档没有考虑退出登录苹果账户通知APP的情况,如果有业务需要可以参考文末的大佬链接,里面有说退出登录的情况。

六、我参考大佬的链接

大佬的链接

大佬的链接

祝大家上架成功!

上一篇 下一篇

猜你喜欢

热点阅读