欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

ios開發(fā)第三方登錄,ios開發(fā)登錄功能實(shí)現(xiàn)

iOS開發(fā)--使用友盟快速分享與第三方登錄注意事項(xiàng)

官方說(shuō)的比較詳細(xì),但是就是有些重復(fù),而且有很多坑

10年積累的成都網(wǎng)站建設(shè)、網(wǎng)站制作經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站設(shè)計(jì)后付款的網(wǎng)站建設(shè)流程,更有信宜免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

在info.plist中加入安全域名白名單(右鍵info.plist用source code打開)

在info.plist的NSAppTransportSecurity下新增NSAllowsArbitraryLoads并設(shè)置為YES,指定所有HTTP連接都可正常請(qǐng)求

打開app,用第三方登錄,發(fā)現(xiàn)沒有sso授權(quán)頁(yè)面,或打開QQ失敗、微信失敗、微博失敗等

info.plist增加:

在iOS9下就需要增加一個(gè)可跳轉(zhuǎn)的白名單,指定對(duì)應(yīng)跳轉(zhuǎn)App的URL Scheme,否則將在第三方平臺(tái)判斷是否跳轉(zhuǎn)時(shí)用到的canOpenURL時(shí)返回NO,進(jìn)而只進(jìn)行webview授權(quán)或授權(quán)/分享失敗。

iOS. 通過appleId進(jìn)行蘋果第三方登錄

2020年4月后,有第三方平臺(tái)登錄的app必須有蘋果的第三方登錄

開發(fā)者賬號(hào)的app綁定的identifiers 中選中

在Xcode 中的

添加

在登錄界面添加?#import?AuthenticationServices/AuthenticationServices.h

if ( @available (iOS13.0, *)) {

? ? // Sign In With Apple Button

? ? ASAuthorizationAppleIDButton *appleIDBtn = [ASAuthorizationAppleIDButton buttonWithType:ASAuthorizationAppleIDButtonTypeDefault style:ASAuthorizationAppleIDButtonStyleWhite];

? ? appleIDBtn.frame=? CGRectMake(50,100,100,40);

? ? appleIDBtn.layer.cornerRadius=5;

? ? appleIDBtn.layer.masksToBounds= YES ;

? ? [appleIDBtnaddTarget: self action: @selector (handleAuthorizationAppleIDButtonPress)forControlEvents:UIControlEventTouchUpInside];

? ? [self.view addSubview:appleIDBtn];

}

//蘋果第三方登錄

-( void )handleAuthorizationAppleIDButtonPress{

if ( @available (iOS13.0, *)) {

? ? // 基于用戶的Apple ID授權(quán)用戶,生成用戶授權(quán)請(qǐng)求的一種機(jī)制

? ? ASAuthorizationAppleIDProvider *appleIDProvider = [[ASAuthorizationAppleIDProvider alloc] init];

? ? // 創(chuàng)建新的AppleID 授權(quán)請(qǐng)求

? ? ASAuthorizationAppleIDRequest*appleIDRequest = [appleIDProvidercreateRequest];

? ? // 在用戶授權(quán)期間請(qǐng)求的聯(lián)系信息

? ? appleIDRequest.requestedScopes = @[ASAuthorizationScopeFullName, ASAuthorizationScopeEmail];

? ? // 由ASAuthorizationAppleIDProvider創(chuàng)建的授權(quán)請(qǐng)求 管理授權(quán)請(qǐng)求的控制器

? ? ASAuthorizationController*authorizationController = [[ASAuthorizationControlleralloc]initWithAuthorizationRequests:@[appleIDRequest]];

? ? // 設(shè)置授權(quán)控制器通知授權(quán)請(qǐng)求的成功與失敗的代理

? ? authorizationController.delegate= self ;

? ? // 設(shè)置提供 展示上下文的代理,在這個(gè)上下文中 系統(tǒng)可以展示授權(quán)界面給用戶

? ? authorizationController.presentationContextProvider= self ;

? ? // 在控制器初始化期間啟動(dòng)授權(quán)流

? ? [authorizationControllerperformRequests];

}

}

// 如果存在iCloud Keychain 憑證或者AppleID 憑證提示用戶 ?

//這個(gè)方法在viewDidAppear里添加

- ( void )perfomExistingAccountSetupFlows{

NSLog(@"http:///已經(jīng)認(rèn)證過了/////");

if ( @available (iOS13.0, *)) {

? ? // 基于用戶的Apple ID授權(quán)用戶,生成用戶授權(quán)請(qǐng)求的一種機(jī)制

? ? ASAuthorizationAppleIDProvider *appleIDProvider = [[ASAuthorizationAppleIDProvider alloc] init];

? ? // 授權(quán)請(qǐng)求AppleID

? ? ASAuthorizationAppleIDRequest*appleIDRequest = [appleIDProvidercreateRequest];

? ? // 為了執(zhí)行鑰匙串憑證分享生成請(qǐng)求的一種機(jī)制

? ? ASAuthorizationPasswordProvider *passwordProvider = [[ASAuthorizationPasswordProvider alloc] init];

? ? ASAuthorizationPasswordRequest*passwordRequest = [passwordProvidercreateRequest];

? ? // 由ASAuthorizationAppleIDProvider創(chuàng)建的授權(quán)請(qǐng)求 管理授權(quán)請(qǐng)求的控制器

? ? ASAuthorizationController*authorizationController = [[ASAuthorizationControlleralloc]initWithAuthorizationRequests:@[appleIDRequest, passwordRequest]];

? ? // 設(shè)置授權(quán)控制器通知授權(quán)請(qǐng)求的成功與失敗的代理

? ? authorizationController.delegate= self ;

? ? // 設(shè)置提供 展示上下文的代理,在這個(gè)上下文中 系統(tǒng)可以展示授權(quán)界面給用戶

? ? authorizationController.presentationContextProvider= self ;

? ? // 在控制器初始化期間啟動(dòng)授權(quán)流

? ? [authorizationControllerperformRequests];

}

}

#pragma mark - delegate

//@optional 授權(quán)成功地回調(diào)

- ( void )authorizationController:(ASAuthorizationController *)controller didCompleteWithAuthorization:(ASAuthorization *)authorization{

NSLog(@"授權(quán)完成:::%@", authorization.credential);

NSLog(@"%s", __FUNCTION__ );

NSLog(@"%@", controller);

NSLog(@"%@", authorization);

// 測(cè)試配置UI顯示

NSMutableString *mStr = [NSMutableString string];

if ([authorization.credential isKindOfClass:[ASAuthorizationAppleIDCredential class]]) {

? ? // 用戶登錄使用ASAuthorizationAppleIDCredential

? ? ASAuthorizationAppleIDCredential*appleIDCredential = authorization.credential;

? ? NSString*user = appleIDCredential.user;

? ? NSString*familyName = appleIDCredential.fullName.familyName;

? ? NSString*givenName = appleIDCredential.fullName.givenName;

? ? NSString*email = appleIDCredential.email;

? NSString *authorizationCode = [[NSString alloc] initWithData:appleIDCredential.authorizationCode encoding:NSUTF8StringEncoding]; // refresh token

? ? NSString *identityToken = [[NSString alloc] initWithData:appleIDCredential.identityToken encoding:NSUTF8StringEncoding]; // access token

? ? ASUserDetectionStatusrealUserStatus = appleIDCredential.realUserStatus;

//? ? ? ? NSData *identityToken = appleIDCredential.identityToken;

//? ? ? ? NSData *authorizationCode = appleIDCredential.authorizationCode;

? ? // Create an account in your system.

? ? // For the purpose of this demo app, store the userIdentifier in the keychain.

? ? //? 需要使用鑰匙串的方式保存用戶的唯一信息

//? ? ? ? [mStr appendString:user];

//? ? ? ? [mStr appendString:@"\n"];

//? ? ? ? [mStr appendString:familyName];

//? ? ? ? [mStr appendString:@"\n"];

//? ? ? ? [mStr appendString:givenName];

//? ? ? ? [mStr appendString:@"\n"];

//? ? ? ? [mStr appendString:email];

//? ? ? ? NSLog(@"mStr:::%@", mStr);

//? ? ? ? [mStr appendString:@"\n"];

} else if ([authorization.credentialisKindOfClass:[ASPasswordCredentialclass]]){

? ? // Sign in using an existing iCloud Keychain credential.

? ? // 用戶登錄使用現(xiàn)有的密碼憑證

? ? ASPasswordCredential*passwordCredential = authorization.credential;

? ? // 密碼憑證對(duì)象的用戶標(biāo)識(shí) 用戶的唯一標(biāo)識(shí)

? ? NSString*user = passwordCredential.user;

? ? // 密碼憑證對(duì)象的密碼

? ? NSString*password = passwordCredential.password;

? ? [mStrappendString:user];

? ? [mStrappendString:@"\n"];

? ? [mStrappendString:password];

? ? [mStrappendString:@"\n"];

? ? NSLog(@"mStr:::%@", mStr);

} else {

? ? NSLog(@"授權(quán)信息均不符");

? ? mStr = [@"授權(quán)信息均不符"copy];

}

}

// 授權(quán)失敗的回調(diào)

- ( void )authorizationController:(ASAuthorizationController *)controller didCompleteWithError:(NSError *)error{

// Handle error.

NSLog(@"Handle error:%@", error);

NSString*errorMsg = nil ;

switch (error.code) {

? ? case ASAuthorizationErrorCanceled:

? ? ? ? errorMsg =@"用戶取消了授權(quán)請(qǐng)求";

? ? ? ? break ;

? ? case ASAuthorizationErrorFailed:

? ? ? ? errorMsg =@"授權(quán)請(qǐng)求失敗";

? ? ? ? break ;

? ? case ASAuthorizationErrorInvalidResponse:

? ? ? ? errorMsg =@"授權(quán)請(qǐng)求響應(yīng)無(wú)效";

? ? ? ? break ;

? ? case ASAuthorizationErrorNotHandled:

? ? ? ? errorMsg =@"未能處理授權(quán)請(qǐng)求";

? ? ? ? break ;

? ? case ASAuthorizationErrorUnknown:

? ? ? ? errorMsg =@"授權(quán)請(qǐng)求失敗未知原因";

? ? ? ? break ;

? ? default :

? ? ? ? break ;

}

//? ? NSMutableString *mStr = [_appleIDInfoLabel.text mutableCopy];

//? ? [mStr appendString:@"\n"];

//? ? [mStr appendString:errorMsg];

//? ? [mStr appendString:@"\n"];

}

// 告訴代理應(yīng)該在哪個(gè)window 展示內(nèi)容給用戶

- (ASPresentationAnchor)presentationAnchorForAuthorizationController:(ASAuthorizationController *)controller{

NSLog(@"88888888888");

// 返回window

return self .view.window;

}

后臺(tái)進(jìn)行驗(yàn)證信息,返回驗(yàn)證信息過期,我一直在找原因,找了一天,后來(lái)發(fā)現(xiàn)是后臺(tái)code碼整錯(cuò)了,-1代表驗(yàn)證通過,驗(yàn)證不通過是重新調(diào)用一下handleAuthorizationAppleIDButtonPress這個(gè)方法就可以,我甚至去看官方文檔,也沒有說(shuō)重新獲取token或者刪除賬號(hào)的方法

iOS實(shí)現(xiàn)蘋果第三方登錄功能 - Sign in with apple

閑話少說(shuō),直接上碼

登陸developer賬號(hào),在app bundle ID的Capabilities里,打勾 Sign In with Apple .

打開Xcode 11.0 Beta或更新版本,在項(xiàng)目設(shè)置 - Signing Capabilities 里,開啟 Sign in with Apple 選項(xiàng)。

實(shí)現(xiàn)分四大部分:

在上面 ASAuthorizationControllerDelegate 的用戶通過驗(yàn)證的回調(diào)里,可以拿到 credential ,這里面有一些信息值得提下:

授權(quán)或者用戶信息是有可能被改變的,我們能做到就是盡早的檢測(cè)出這樣的改變,并做以應(yīng)對(duì)。

檢測(cè)授權(quán)的狀態(tài)需要記錄在上面所得到的

在 AppleDelegate 里,把之前存的用戶ID放到 ASAuthorizationAppleIDProvider 里驗(yàn)證即可,可以得到幾種用戶授權(quán)狀態(tài):

如果有錯(cuò)誤歡迎指出,也歡迎各種討論,謝????!

網(wǎng)頁(yè)標(biāo)題:ios開發(fā)第三方登錄,ios開發(fā)登錄功能實(shí)現(xiàn)
網(wǎng)站URL:http://aaarwkj.com/article38/dsiecsp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、虛擬主機(jī)網(wǎng)站導(dǎo)航、、外貿(mào)網(wǎng)站建設(shè)、外貿(mào)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

營(yíng)銷型網(wǎng)站建設(shè)
av成人综合在线资源站| 蜜桃av一区二区三区在线| 人人人妻人人澡人人爽e| 天天操天天干夜夜骑| 国产免费一区二区福利| 亚洲中文字幕乱码熟女在线| 国产自愉怕一区二区三区| 欧美三级黄片免费视频| 91久久一区二区秋霞免费| 中文字幕变态另类一区二区| 99久久精品免费国产一区| 九九久久亚洲av成人乱片| 色哟哟网站在线精品视频| 色婷婷中文字幕久久久| 日韩精品福利片午夜免费| 精品自拍一区在线观看| 伊人久久亚洲精品综合| 亚洲精品一级二级三级| 日韩精品一区二区三区都在看| 日韩特级黄片在线免费观看| 粉嫩一区二区三区精品视频| 国产三级精品在线免费| 午夜福利成人在线免费观看| 激情五月综合开心五月| 最新日韩欧美不卡一二三区| 亚洲美腿丝袜综合在线| 黄色av链接在线观看| 国产精品一区二区三区播放| 亚洲成人精品免费观看| 国产麻豆91精品女同性恋| 亚洲a∨乱码一区二区三区蜜臀| 超碰国产精品一区二区| 成人av在线播放亚洲| 后入动漫视频在线观看| 欧美日韩国产精品精品| 日本高清免费中文字幕| 日本精品中文字幕人妻| 18禁免费无遮挡免费视频| 国产一区在线免费在线观看| 日韩在线视频不卡播放| 国产在线成年人免费观看|