蘋果登錄 Sign in with Apple

第三方登錄現在已經成爲了主流的登錄方式,爲了給自家用戶帶來更好的跨平臺與跨設備體驗,
蘋果在今年的 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



開啓蘋果登錄

  1. 在蘋果開發者後臺爲應用開啓蘋果登錄功能,具體參考上面的“接入參考(服務端)”

image.png

  1. 在項目工程中添加該功能

image.png

代碼接入測試

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 登錄時,需要先在“設置”中開啓雙重認證,否則會登錄失敗

image.png


當前文章所在位置:https://blog.csdn.net/MerryGOOT 《iOS 開發》文章目錄



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章