第三方登錄現在已經成爲了主流的登錄方式,爲了給自家用戶帶來更好的跨平臺與跨設備體驗,
蘋果在今年的 WWDC2019 推出了屬於自己的第三方登錄服務 —— Sign in with Apple( iOS 13 及以上可用 )
官方介紹:
https://developer.apple.com/cn/news/?id=09122019b
https://developer.apple.com/cn/sign-in-with-apple/get-started/
接入參考(客戶端):
https://mp.weixin.qq.com/s/FYLmFnuaq4DIEyvhgsE_zA
https://blog.csdn.net/n603482184/article/details/101444924
接入參考(服務端):
https://blog.csdn.net/wpf199402076118/article/details/99677412
https://mp.weixin.qq.com/s/xkxCnKqA0u-guEYcYCkcOg
難度指數:★☆☆☆☆
開發及運行環境: macOS 10.14.4 / Xcode 11 / iOS 13
開啓蘋果登錄
- 在蘋果開發者後臺爲應用開啓蘋果登錄功能,具體參考上面的“接入參考(服務端)”
- 在項目工程中添加該功能
代碼接入測試
GFAppleLoginManager.h
#import <Foundation/Foundation.h>
typedef void (^GFAppleLoginSuccessBlock)(NSString * userId, NSString * authCode, NSString * identityToken);
typedef void (^GFAppleLoginFailureBlock)(NSError * error);
@interface GFAppleLoginManager : NSObject
@property (nonatomic, assign, readonly) BOOL enable;
+ (instancetype)sharedManager;
- (void)login:(GFAppleLoginSuccessBlock)successBlock error:(GFAppleLoginFailureBlock)failureBlock;
@end
GFAppleLoginManager.m
#import "GFAppleLoginManager.h"
#import <AuthenticationServices/AuthenticationServices.h>
API_AVAILABLE(ios(13.0))
@interface GFAppleLoginManager() <ASAuthorizationControllerDelegate>
@property (nonatomic, retain) ASAuthorizationController * authorizationController;
@property (nonatomic, copy) GFAppleLoginSuccessBlock successBlock;
@property (nonatomic, copy) GFAppleLoginFailureBlock failureBlock;
@end
@implementation GFAppleLoginManager
- (BOOL)enable {
return !!NSClassFromString(@"ASAuthorizationController");
}
+ (instancetype)sharedManager {
static id instance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[self alloc] init];
});
return instance;
}
- (void)login:(GFAppleLoginSuccessBlock)successBlock error:(GFAppleLoginFailureBlock)failureBlock {
if (self.enable) {
self.successBlock = successBlock;
self.failureBlock = failureBlock;
[self.authorizationController performRequests];
}
}
#pragma mark - ASAuthorizationControllerDelegate
- (void)authorizationController:(ASAuthorizationController *)controller
didCompleteWithAuthorization:(ASAuthorization *)authorization API_AVAILABLE(ios(13.0)) {
if ([authorization.credential isKindOfClass:[ASAuthorizationAppleIDCredential class]]) {
ASAuthorizationAppleIDCredential * credential = authorization.credential;
NSString * user = credential.user;
NSString * authorizationCode = [[NSString alloc] initWithData:credential.authorizationCode encoding:NSUTF8StringEncoding];
NSString * identityToken = [[NSString alloc] initWithData:credential.identityToken encoding:NSUTF8StringEncoding];
if (self.successBlock) {
self.successBlock(user, authorizationCode, identityToken);
}
}
}
- (void)authorizationController:(ASAuthorizationController *)controller
didCompleteWithError:(NSError *)error API_AVAILABLE(ios(13.0)) {
if (self.failureBlock) {
self.failureBlock(error); // error.code => ASAuthorizationError
}
}
- (ASAuthorizationController *)authorizationController API_AVAILABLE(ios(13.0)) {
if (_authorizationController == nil) {
ASAuthorizationAppleIDProvider * provider = [[ASAuthorizationAppleIDProvider alloc] init];
ASAuthorizationAppleIDRequest * request = [provider createRequest];
request.requestedScopes = @[ASAuthorizationScopeFullName, ASAuthorizationScopeEmail];
_authorizationController = [[ASAuthorizationController alloc] initWithAuthorizationRequests:@[request]];
_authorizationController.delegate = self;
}
return _authorizationController;
}
@end
測試代碼
#import "GFAppleLoginManager.h"
#import <AuthenticationServices/AuthenticationServices.h>
if (@available(iOS 13.0, *)) {
ASAuthorizationAppleIDButton *button = [ASAuthorizationAppleIDButton buttonWithType:ASAuthorizationAppleIDButtonTypeSignIn style:ASAuthorizationAppleIDButtonStyleWhite];
button.bounds = CGRectMake(0, 0, 60, 60);
button.cornerRadius = 30.0f;
[button addTarget:self action:@selector(signInWithApple) forControlEvents:UIControlEventTouchUpInside];
button.center = self.view.center;
[self.view addSubview:button];
}
- (void)signInWithApple {
if ([GFAppleLoginManager sharedManager].enable) {
[[GFAppleLoginManager sharedManager] login:^(NSString *userId, NSString *authCode, NSString *identityToken) {
NSLog(@"userId: %@", userId);
NSLog(@"authCode: %@", authCode);
NSLog(@"identityToken: %@", identityToken);
} error:^(NSError *error) {
NSLog(@"error: %@", error);
}];
}
}
蘋果登錄按鈕設計
可以使用蘋果提供的自帶按鈕,也可以自定義:
https://developer.apple.com/design/human-interface-guidelines/sign-in-with-apple/overview/
http://www.sohu.com/a/343050110_115785
用戶需要做什麼
用戶在通過 Apple 登錄時,需要先在“設置”中開啓雙重認證,否則會登錄失敗
當前文章所在位置:https://blog.csdn.net/MerryGOOT 《iOS 開發》文章目錄