2018.8.17 微信登录时,授权一次过后会返回refresh_token ,为用户授权第三方应用的长效凭证,refresh_token拥有较长的有效期(30天),当refresh_token失效的后,需要用户重新授权。期间就算是取消授权(用ShareSDK提供的取消授权)也不会出现确定授权界面而是会直接返回用户信息。
这几天在做有关第三方登录和分享相关的内容,然后出现了各种问题有一些网上可以解决,但是有一个怎么也没有查到。
这儿我遇到最大的问题是 怎样让用户在登录第三方后退出,也就是用户每一次第三方登录都能到授权界面!
其实就一句代码就能实现,就是取消分享平台的授权。其中后面的参数是平台类型。
这儿是退出QQ第三方登陆
[ShareSDK cancelAuthorize:SSDKPlatformTypeQQ];
给效果图,程序还在编写阶段所以很丑不要介意。
其中我点击登录过后再点击退出,就会再次进入授权界面。如果点击退出再点击登录就会直接返回用户信息给我,这与我们的需求是不同的。
这儿我们通常结合[ShareSDK hasAuthorized:SSDKPlatformTypeQQ],来判断用户是否退出第三方登录。
比如:判断QQ是否退出第三方登录
[ShareSDK cancelAuthorize:SSDKPlatformTypeQQ];
BOOL isAuthorizedWithQQ = [ShareSDK hasAuthorized:SSDKPlatformTypeQQ];
if (!isAuthorizedWithQQ) {
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"退出成功" message:@"" preferredStyle: UIAlertControllerStyleAlert];
UIAlertAction *a = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
}];
[alert addAction:a];
[self presentViewController:alert animated:true completion:nil];
} else {
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"退出失败" message:@"" preferredStyle: UIAlertControllerStyleAlert];
UIAlertAction *a = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleDestructive handler:^(UIAlertAction * _Nonnull action) {
}];
[alert addAction:a];
[self presentViewController:alert animated:true completion:nil];
}
根据返回的BooL进行判断
其实我们想要同样的效果 可以在调起第三方登录的时候,取消响应平台的授权再调起第三方登录。这时候就会想退出登录怎么办,我们用第三方的话只是给用户一个快捷登录注册一个接口,我们自己的后台服务器同样也有用户的数据。我们只需要把自己后台服务器登录状态改为未登录状态。
效果图……
调起的时候
[ShareSDK cancelAuthorize:SSDKPlatformTypeWechat]; //这儿就是取消授权
[ShareSDK getUserInfo:SSDKPlatformTypeWechat
onStateChanged:^(SSDKResponseState state, SSDKUser *user, NSError *error)
{
if (state == SSDKResponseStateSuccess)
{
//获取用户的信息 (可以上传到自己后台服务器上/本地缓存)
}
}];
退出登录
CHECK_NETWORK_STATUS
REFRESHSATR
NSDictionary *dic = @{@"id":USERID,@"type":@"1"}; //我这儿就是自己的后台退出登录
[NetworkingRequest POST:LOGOUT_URL parameters:dic sucess:^(id responseObject) {
REFRESHSTOP
if ([responseObject[@"code"] integerValue] == 1) {
PRMOPT(@"退出登陆成功");
LOGOUT;
[[NSNotificationCenter defaultCenter]postNotificationName:@"logOut" object:nil];
BACK;
}
if ([responseObject[@"code"] integerValue] == 106) {
PRMOPT(@"退出登陆失败");
}
} failure:^(NSError *error) {
REFRESHSTOP
if (error.code == -1001) {
PRMOPT(@"请求超时");
return ;
}
if (error.code == - 1004 ){
PRMOPT(@"服务器连接失败");
return;
}
PRMOPT(@"退出登陆失败");
}];
我们在配置QQ的第三方登陆和分享URL Schemes的时候,容易犯了一个小错误。
QQ登陆的Schemes是以tencent + APPId 这儿的Id是你在QQ开发者平台上申请的。
而QQ分享时Schemes 却需要QQ+转换成16进制的APPId。
而其他的好像就没有 比如微博就是wb + APPId
当然微信直接就是申请的APPId