iOS wkwebview 网站qq一键登录

  最近有个朋友问为何wkwebview第三方登录点击一键登录会提示qq版本过低,我的第一个反应是这个要装qq最新的sdk吧,然后研究发现,其实情况不是这么简单。
  先说结论,不需要装sdk,不需要去qq互联注册,只需要安排好自己的wkwebview就好了。
1.安排一个vc,里面加上wkwebview,navigationDelegate设置为vc,实现navigationDelegate的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
    if ([navigationAction.request.URL.absoluteString hasPrefix:@"wtloginmqq"]) {
        NSString *urlStr = [NSString stringWithFormat:@"%@&schemacallback=bbb://",navigationAction.request.URL.absoluteString];
        NSURL *url = [NSURL URLWithString:urlStr];
        self.currentURLStr = [navigationAction.request.URL.absoluteString stringByReplacingOccurrencesOfString:@"wtloginmqq://ptlogin/qlogin?p=" withString:@""];
        [[UIApplication sharedApplication] openURL:url options:@{} completionHandler:^(BOOL success) {
            
        }];
        decisionHandler(WKNavigationActionPolicyCancel);
        return;
    }
    decisionHandler(WKNavigationActionPolicyAllow);
}

2.这里的bbb是当前应用的url schemes,可自定义,这里的&schemacallback一个字母都不能改,不然会跳不回当前应用。这里的currentURLStr 是保存出去的URL的,在下面会用到。
在vc里实现一个方法,加载url的,为了登录跳回刷新webview做准备,还需要准备一个urldecode的方法,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
- (void)loadWithURL:(NSString*)url {
    NSString *decodeStr = [self decodeString:self.currentURLStr];
    NSString *allURL = [NSString stringWithFormat:@"%@%@",decodeStr,url];
    NSURL *newUrl = [NSURL URLWithString:allURL];
    [self.wkWebView loadRequest:[NSURLRequest requestWithURL:newUrl]];
}
-(NSString *)decodeString:(NSString*)encodedString
 
{
    //NSString *decodedString = [encodedString stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding ];
 
    NSString *decodedString  = (__bridge_transfer NSString *)CFURLCreateStringByReplacingPercentEscapesUsingEncoding(NULL,
                                                                                                                     (__bridge CFStringRef)encodedString,
                                                                                                                     CFSTR(""),
                                                                                                                     CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding));
    return decodedString;
}

3.在appdelegate里实现跳转回来接入的代码

1
2
3
4
5
6
7
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary*)options{
    NSLog(@"aaaa==%@",url);
    NSString *str = [url.absoluteString stringByReplacingOccurrencesOfString:@"bbb://(null)" withString:@""];
    NSLog(@"str==%@",url);
    [[vc sharedInstance] loadWithURL:str];
    return YES;
}

4.这里有坑的地方就是qq回来的会是bbb://(null)xxxx,你要用到的是xxxx,需要做一次替换,在跳转qq的时候也是要把wtloginmqq://ptlogin/qlogin?p=去掉,保留的2个字符串最后拼起来,才能完整完成qq登录,最后,vc可以单例,也可以不单例,只要能在appdelegate找到最开始的vc就行了,做的时候记得设置自己的url scheme和qq的白名单。