由于項目中集成了Facebook生音,Google,instagram等第三方登錄晌杰,所以審核出現(xiàn)了4.8提示, 必須要支持Apple登錄筷弦,所以記錄一下對接流程肋演。
-
先了解下:
官方文檔網(wǎng)站:https://developer.apple.com/cn/sign-in-with-apple/get-started/
準則
使用第三方或社交登錄服務來設置或驗證用戶 app 內(nèi)主要帳戶的 app 必須同時提供“通過 Apple 登錄”作為等效登錄方式。在您規(guī)劃和設計 app 或網(wǎng)站以整合“通過 Apple 登錄”時烂琴,請確保遵循以下準則爹殊。另外,Human Interface Guidelines 包含了可供下載的居左對齊监右、居中對齊和僅徽標按鈕边灭。自 2020 年 6 月 30 起异希,app 更新必須遵循這些準則健盒。
通過Apple登錄, 設置賬戶并使用您的app称簿,所有賬戶都通過雙重認證受到保護扣癣, 具有極高的安全性, Apple不會跟蹤用戶在您的app或網(wǎng)站中的活動憨降。
Xcode 11
要測試您的 app父虑,請使用最新的 Xcode 11,并將您的設備更新至 iOS 13授药、iPadOS士嚎、macOS Catalina 和 Apple tvOS 13呜魄。要測試您的網(wǎng)站,您需要將它與一個支持“通過 Apple 登錄”且在 App Store 中提供的 app 組合在一起莱衩。
App
使用 AuthenticationServices 框架讓用戶可以設置帳戶并登錄您的原生 iOS爵嗅、macOS、Apple tvOS 和 watchOS app笨蚁。
-
接入集成:
- 登錄蘋果開發(fā)者中心后臺睹晒, 找到對應的
Identifiers
, 勾選Sign In with Apple
, 保存后重新編輯下Profiles
文件:
- 打開Xcode項目,
TARGETS
->Signing & Capabilites
, 添加Sign In with Apple
配置:
-
TARGETS
->General
->Frameworks, Libraries, and Embedded Content
, 添加AuthenticationServices.framework
, Apple ID登錄流程也是基于這個框架來實現(xiàn):
-
代碼集成:
導入
#import <AuthenticationServices/AuthenticationServices.h>
繼承
ASAuthorizationAppleIDButton
創(chuàng)建一個登錄按鈕括细,按鈕默認大小是(130伪很,30)
創(chuàng)建時有兩個類型設置:ASAuthorizationAppleIDButtonType(按鈕的文字是singin 還是 continue) 和 ASAuthorizationAppleIDButtonStyle(按鈕的外形是否有邊框/是否背景為黑色)
Apple登錄只在iOS13及以上有效, 所以可加上iOS13.0 的判斷:
if (@available(iOS 13.0, *)) {
ASAuthorizationAppleIDButton *appleBtn = [[ASAuthorizationAppleIDButton alloc] initWithAuthorizationButtonType:ASAuthorizationAppleIDButtonTypeSignIn authorizationButtonStyle:ASAuthorizationAppleIDButtonStyleWhiteOutline];
[appleBtn addTarget:self action:@selector(signInWithApple) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:appleBtn];
[appleBtn mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerX.mas_equalTo(self.view);
make.top.mas_equalTo(self.bottomView.mas_bottom).mas_offset(Handle(7));
}];
}
這里有個小知識,若需要按鈕是圓形的奋单, 只需要設置按鈕的appleBtn.cornerRadius锉试, 按鈕最小的size 是CGSizeMake(30,30), 所以最小的cornerRadius = 15
- 登錄方法實現(xiàn):
- (void)signInWithApple{
if (@available(iOS 13.0, *)) {
ASAuthorizationAppleIDProvider *appleIDProvider = [[ASAuthorizationAppleIDProvider alloc] init];
ASAuthorizationAppleIDRequest *request = appleIDProvider.createRequest;
request.requestedScopes = @[ASAuthorizationScopeFullName, ASAuthorizationScopeEmail];
ASAuthorizationController *vc = [[ASAuthorizationController alloc] initWithAuthorizationRequests:@[request]];
vc.delegate = self;
vc.presentationContextProvider = self;
[vc performRequests];
}
}
這里是基于Apple ID授權(quán)用戶,先生成用戶授權(quán)請求機制ASAuthorizationAppleIDProvider
览濒, 再創(chuàng)建一個ASAuthorizationAppleIDRequest
键痛,創(chuàng)建一個請求控制器ASAuthorizationController
,并設置授權(quán)請求的代理匾七, 設置展示上下文的代理絮短,最后啟動授權(quán)流程。
- 上下文代理實現(xiàn):
// ASAuthorizationControllerPresentationContextProviding 顯示在哪個視圖上面
- (ASPresentationAnchor)presentationAnchorForAuthorizationController:(ASAuthorizationController *)controller API_AVAILABLE(ios(13.0))
{
return self.view.window;
}
- 授權(quán)代理實現(xiàn):
// ASAuthorizationControllerDelegate 授權(quán)回調(diào)
- (void)authorizationController:(ASAuthorizationController *)controller didCompleteWithAuthorization:(ASAuthorization *)authorization API_AVAILABLE(ios(13.0))
{
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;
NSLog(@"state: %@", state);
NSLog(@"userID: %@", userID);
NSLog(@"fullName: %@", fullName);
NSLog(@"email: %@", email);
NSLog(@"authorizationCode: %@", authorizationCode);
NSLog(@"identityToken: %@", identityToken);
NSLog(@"realUserStatus: %@", @(realUserStatus));
// 拿到對應數(shù)據(jù)后昨忆, 跟自己的服務器后臺進行交互丁频, 把數(shù)據(jù)傳給后臺進行登錄驗證
}
}
- (void)authorizationController:(ASAuthorizationController *)controller didCompleteWithError:(NSError *)error API_AVAILABLE(ios(13.0))
{
NSString *errorMsg = nil;
switch (error.code) {
case ASAuthorizationErrorCanceled:
errorMsg = @"用戶取消了授權(quán)請求";
break;
case ASAuthorizationErrorFailed:
errorMsg = @"授權(quán)請求失敗";
break;
case ASAuthorizationErrorInvalidResponse:
errorMsg = @"授權(quán)請求響應無效";
break;
case ASAuthorizationErrorNotHandled:
errorMsg = @"未能處理授權(quán)請求";
break;
case ASAuthorizationErrorUnknown:
errorMsg = @"授權(quán)請求失敗未知原因";
break;
}
NSLog(@"%@", errorMsg);
}
關(guān)于服務器后臺如何進行賬號驗證, 可查看這篇文章:從登錄到服務器驗證
到這里邑贴, 基本已經(jīng)實現(xiàn)了蘋果登錄功能席里, 關(guān)于更多的監(jiān)聽Apple登錄退出等, 我這個項目并沒有做處理拢驾,具體可添加實現(xiàn) ASAuthorizationAppleIDProviderCredentialRevokedNotification
這個通知奖磁。
參考文檔:http://www.reibang.com/p/efb02bc8935a
如果對你有幫助, 可轉(zhuǎn)發(fā)擴散繁疤!
更新提示:
新一次提交審核咖为, 被拒了, 理由是Guideline 4.0 - Design:
其實就是說我把圖標蘋果登錄的圖標自定義改成了圓的3砝啊躁染! 未按照“Apple人機界面登錄指南”中的按鈕進行設計!
所以說架忌, 大家還是不要搞自定義或者原型圖標吞彤, 就下面這種就行了,別在意整體統(tǒng)一美觀了:
后續(xù)又來了!J嗡 挠羔!
又一次被拒, 心塞的一匹埋嵌, 依然是4.0 說蘋果登錄圖標有問題H焐蕖!
先看一下官方文檔@蚰铡拌喉! (很重要!@)
https://developer.apple.com/design/human-interface-guidelines/sign-in-with-apple/overview/buttons/
其實蘋果是支持自定義圖標的尿背, 但你需要下載它給的圖標文件, 然后進行按鈕設置捶惜, 如果使用系統(tǒng)的按鈕田藐, 也要按照他給定的大小進行設置,so~
下載資源文件給設計吱七, 讓設計做一個標準大小的按鈕圖汽久,然后我們再進行處理: