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
就可以获取用户个人信息了,这是在服务端做处理的,具体可参考移动应用微信登录开发指南