https://blog.csdn.net/u014084081/article/details/80857200
iOS微信授權登錄集成
iOS微信授權登錄集成,具體的過程參考官方的文檔
微信集成官方Demo地址: iOS資源下載
不錯的文章:
准備工作
1.向微信注冊你的應用程序id
開發者在微信開發平台,開發者應用登記頁面 進行登記,登記並選擇移動應用進行設置后,將獲得AppID,可立即用於開發
2.下載載微信終端SDK文件
可在 iOS資源下載處下載
3.添加依賴的庫
- SystemConfiguration.framework,
- libz.dylib
- libsqlite3.0.dylib
- libc++.dylib
- Security.framework
- CoreTelephony.framework
- CFNetwork.framework
4.添加URL Type
選中“TARGETS”一欄,在“info”標簽欄的“URL type“添加“URL scheme”為你所注冊的應用程序id
5.添加URL Schemes白名單
在Xcode中,選擇你的工程設置項,選中“TARGETS”一欄,在“info”標簽欄的“LSApplicationQueriesSchemes“添加weixin
集成
在 AppDelegate 的 didFinishLaunchingWithOptions 函數中向微信注冊id
//向微信注冊
[WXApi registerApp:@"wxd930ea5d5a258f4f" enableMTA:YES];
1
2
2.重寫AppDelegate的handleOpenURL和openURL方法
官方Demo實現的效果如下:
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
return [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]];
}
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
return [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]];
}
1
2
3
4
5
6
7
這2個方法在文檔中是這樣解釋的:
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url NS_DEPRECATED_IOS(2_0, 9_0, "Please use application:openURL:options:") __TVOS_PROHIBITED;
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(nullable NSString *)sourceApplication annotation:(id)annotation NS_DEPRECATED_IOS(4_2, 9_0, "Please use application:openURL:options:") __TVOS_PROHIBITED;
1
2
3
表示都已廢棄,並且推薦使用如下的方法,iOS9.0以后有效:
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options NS_AVAILABLE_IOS(9_0); // no equiv. notification. return NO if the application can't open for some reason
1
當用戶通過其它應用啟動本應用時,會回調這個方法,url參數是其它應用調用openURL:方法時傳過來的
上面的3個方法作用其實都是一樣的,只是參數不同而已,函數的返回值是BOOL官方文檔的解釋是:
YES if the delegate successfully handled the request or NO if the attempt to open the URL resource failed.
如果代理成功的處理了請求,則返回YES,如果打開URL資源失敗了,則返回NO
對於這種URL Schemes調用,可參考:
IOS的軟件之間的調用(URL Schemes)
iOS中的URL Scheme
3.向微信請求授權
官方Demo對請求進行了封裝,如下:
//微信授權登錄
- (void)sendAuthRequest {
[WXApiRequestHandler sendAuthRequestScope: kAuthScope
State:kAuthState
OpenID:kAuthOpenID
InViewController:self];
}
該方法其內部實現為:
+ (BOOL)sendAuthRequestScope:(NSString *)scope
State:(NSString *)state
OpenID:(NSString *)openID
InViewController:(UIViewController *)viewController {
SendAuthReq* req = [[SendAuthReq alloc] init];
req.scope = scope; // @"post_timeline,sns"
req.state = state;
req.openID = openID;
return [WXApi sendAuthReq:req
viewController:viewController
delegate:[WXApiManager sharedManager]];
}
創建了SendAuthReq對象,其:
scope - 必須,應用授權作用域,如獲取用戶個人信息則填寫snsapi_userinfo
state - 非必須,用於保持請求和回調的狀態,授權請求后原樣帶回給第三方。該參數可用於防止csrf攻擊(跨站請求偽造攻擊),建議第三方帶上該參數,可設置為簡單的隨機數加session進行校驗
appid - 必須,應用唯一標識,在微信開放平台提交應用審核通過后獲得
參考移動應用微信登錄開發指南
第三方向微信終端發送一個SendAuthReq消息結構,如[WXApi sendReq:req];,可拉起微信打開授權登錄頁:
用戶點擊授權后,微信客戶端會被拉起,跳轉至授權界面,用戶在該界面點擊允許或取消,SDK通過SendAuth
的Resp
返回數據給調用方
在官方的Demo中,WXApiManager
中實現了WXApiDelegate
的- (void)onResp:(BaseResp *)resp
方法和- (void)onReq:(BaseReq *)req
方法
在控制器中的managerDidRecvAuthResponse:
方法處理響應
- (void)managerDidRecvAuthResponse:(SendAuthResp *)response {
NSString *strTitle = [NSString stringWithFormat:@"Auth結果"];
NSString *strMsg = [NSString stringWithFormat:@"code:%@,state:%@,errcode:%d", response.code, response.state, response.errCode];
[UIAlertView showWithTitle:strTitle message:strMsg sure:nil];
}
返回的數據,解釋如下:
獲取到code
后,就可以通過code獲取access_token
和openid
,然后通過access_token
和openid
就可以獲取用戶個人信息了,這是在服務端做處理的,具體可參考移動應用微信登錄開發指南