iOS 13 苹果登录实践 Sign In with Apple

iOS 13 苹果登录实践 Sign In with Apple

本文仅讲最简单的实现苹果登录的方法,更多的功能请查阅文档,感谢

简介:

iOS 13 推出的一项更隐私、方便、统一的登录方式,开发者可以拿到一个唯一的id、用户的icloud id名字、邮箱(根据用户选择得到真的还是假的邮箱)等字段。

个人理解:在国内必须绑定手机号的情况下,苹果登录其实与微信登录、微博登录是类似的,帐号主体仍然是手机号,其他登录方式要绑定到主体,使用了第三方登录之后,只是方便了以后登录

效果如图:

详见「知乎」最新版本登录页面。

代码之外的配置:

1、升级 macOS 10.14.6 或以上,Xcode 11,一台 iOS 13 的设备(模拟器不行)

2、登录苹果开发者网站,更新mobileprovision文件,勾选 Sign In with Apple 能力

3、Xcode 里选中自己的 target,然后勾选第二个顶部tab(Signing & Capabilities),该区域左上角 +Capability 添加 Sign In with Apple

代码实现(使用 AuthenticationServices 框架):

登录按钮,用来调起登录界面(没有特殊功能,只是一个系统提供的 Button,后面详细说一下这个按钮)

// 系统提供的按钮,分为 Sign In with Apple / Continue with Apple
ASAuthorizationAppleIDButton *signInButton = [[ASAuthorizationAppleIDButton alloc] init];
[self.view addSubview:signInButton];
// size 要求后面讨论
signInButton.frame = CGRectMake(100, 100, 140, 40);
// 添加响应方法
[signInButton addTarget:self action:@selector(signInButtonClicked:) forControlEvents:UIControlEventTouchUpInside];

配置登录界面

    // 创建一个 provider
	ASAuthorizationAppleIDProvider *appleIDProvider = [[ASAuthorizationAppleIDProvider alloc] init];
	// 通过 provider 创建一个 request
    ASAuthorizationAppleIDRequest *appleIDRequest = [appleIDProvider createRequest];
	// 后续登录使用的一种方式,后面单独讨论
//    ASAuthorizationPasswordProvider *passwordProvider = [ASAuthorizationPasswordProvider new];
//    ASAuthorizationPasswordRequest *passwordRequest = [passwordProvider createRequest];
	// 要获取的内容
	appleIDRequest.requestedScopes = @[ASAuthorizationScopeFullName, ASAuthorizationScopeEmail];
    // 系统提供的 Controller,必须使用,需要传入 requests 数组
    ASAuthorizationController *authController = [[ASAuthorizationController alloc] initWithAuthorizationRequests:@[appleIDRequest/*, passwordRequest*/]];
	// 设置代理,接收登录成功/失败的回调
    authController.delegate = self;
	// 页面跳转相关的,通过一个代理方法传入一个 window
    authController.presentationContextProvider = self;
	// Controller 初始化期间,开始授权流程
    [authController performRequests];
代理回调方法:
#pragma mark ------ ASAuthorizationControllerDelegate ------
- (void)authorizationController:(ASAuthorizationController *)controller didCompleteWithError:(NSError *)error {
    // 登录失败
    NSLog(@"auth failed!, error:%@, code:%ld, description:%@", error, (long)error.code, error.description);
}

- (void)authorizationController:(ASAuthorizationController *)controller didCompleteWithAuthorization:(ASAuthorization *)authorization {
    // 登录成功
    NSLog(@"auth success!, %@", authorization.credential);
    if ([authorization.credential isKindOfClass:[ASAuthorizationAppleIDCredential class]]) {
        ASAuthorizationAppleIDCredential *credential = (ASAuthorizationAppleIDCredential *)authorization.credential;
        credential.user;
        credential.email;
        credential.fullName;
        credential.identityToken;
        credential.user;
        credential.authorizationCode;
        // 还有其他的属性
    }
}

#pragma mark ------ ASAuthorizationControllerPresentationContextProviding ------
- (ASPresentationAnchor)presentationAnchorForAuthorizationController:(ASAuthorizationController *)controller {
    // 返回一个 window,present 登录界面需要用到
    return [UIApplication sharedApplication].delegate.window;
}

几个注意的点:

1、后端需要拿到 identityToken、user、authorizationCode 与苹果的服务器验证,需要客户端与后端配合

2、299刀的企业证书无法使用苹果登录,如果你们app有企业证书打包,需要兼容,修改yourApp.entitlements

3、关于苹果登录按钮是否可以自定义?答案是肯定的,可以自己写 UIButton,不一定要用ASAuthorizationAppleIDButton

你可能感兴趣的:(ios开发,iOS,13,苹果登录,iOS,SignInWithApple)