目录
一、集成
二、配置
三、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调用(附带原生文件)
请先完成本文的第一步配置工作。
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链接
1、RN可以直接使用的文件在demo的SignInWithApple_OC/iosModule/NativeSignAppleModule路径下。
2、demo为OC的demo,oc使用可以用LXLSecondViewController 文件。(demo请登录自己苹果账号)
3、文档没有考虑退出登录苹果账户通知APP的情况,如果有业务需要可以参考文末的大佬链接,里面有说退出登录的情况。
六、我参考大佬的链接
祝大家上架成功!











网友评论