我這里用的是WKWebView担租,首先要實現(xiàn)WKNavigationDelegate協(xié)議
1抵怎、由H5頁跳轉(zhuǎn)微信客戶端--WKNavigationDelegate方法
該方法是決定H5頁面是否允許跳轉(zhuǎn)的
-(void)webView:(WKWebView*)webView decidePolicyForNavigationAction:(WKNavigationAction*)navigationAction decisionHandler:(void(^)(WKNavigationActionPolicy))decisionHandler{
? ? WKNavigationActionPolicy ?actionPolicy = WKNavigationActionPolicyAllow;//允許
? ? NSString*urlString = [[navigationAction.request URL] absoluteString];
? ? urlString = [urlString stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
? ? NSLog(@"跳轉(zhuǎn):>>>???>>%@",urlString);
? ? //打開微信
? ? if([urlString containsString:@"weixin://wap/pay?"]) {
? ? ? ? actionPolicy =WKNavigationActionPolicyCancel;//不允許跳轉(zhuǎn)
? ? ? ? NSURL*url = [NSURL URLWithString:urlString];
? ? ? ? if([[UIApplication sharedApplication] respondsToSelector:@selector(openURL:options:completionHandler:)]) {
? ? ? ? ? ? [[UIApplication sharedApplication] openURL:url options:@{UIApplicationOpenURLOptionUniversalLinksOnly: @NO} completionHandler:^(BOOL success) {
? ? ? ? ? ? }];
? ? ? ? }else{
? ? ? ? ? ? [[UIApplication sharedApplication]openURL:webView.URL];
? ? ? ? }
? ? }
? ? decisionHandler(actionPolicy);?//這句是必須加上的反惕,不然會異常
}
2、從微信客戶端跳回APP
很多小伙伴兒都遇到回跳的問題背亥,點擊“完成”或“取消”跳到了Safari卻跳不回APP。
1狡汉、配置 URL Types ??添加schemes:www.xxxx.com
2盾戴、配置?Referer
[request setValue:@"www.xxxx.com://" forHTTPHeaderField:@"Referer"];
3、服務(wù)器回調(diào)的URL中一定要寫成 ?www.xxxx.com:// , 如果一定要拼接锐峭,可以讓后臺區(qū)分一下可婶,如果是iOS 前面一定要寫成?www.xxxx.com:// ,不然跳不回APP矛渴。
注意:www.xxxx.com 此域名一定是H5授權(quán)的域名,如果是二級域名蚕涤,可以寫成:aaa.xxxx.com
3铣猩、支付回來頁面不刷新或產(chǎn)生空白頁
一般支付完不管完成與否都要調(diào)一下回調(diào)地址來刷新支付頁面的,但問題是iOS的回調(diào)地址中一定要寫成?www.xxxx.com:// 這樣的格式才能跳回來天吓,但是調(diào)回來后沒有執(zhí)行回調(diào)地址峦椰,頁面又刷新不了,或者跳回來后是個空白頁物邑,這又產(chǎn)生了一個新的問題滔金。當點擊微信支付頁上的“完成”或“取消”返回APP時,會調(diào)用?AppDelegate 中的?openURL: 方法
-(BOOL)application:(UIApplication*)app openURL:(NSURL*)url options:(NSDictionary *)options{?
? ? // url.scheme 就是?www.xxxx.com 餐茵,你只需要在這做一個判斷,如果是?www.xxxx.com 你就給外部發(fā)一個通知钟病,那外部接收到這個通知刚梭,刷新界面就行了票唆。
那么問題又來了走趋,刷新方法是什么呢?簿煌?
刷新地址也就是支付完的回調(diào)地址,后臺可以把回調(diào)地址拼接在?www.xxxx.com:// 后面惩琉,例如:www.xxxx.com://http://www.baidu.com 夺荒。 那么?url 就是?www.xxxx.com://?http://www.baidu.com ,你向外部發(fā)通知時把?url 作為參數(shù)傳出去即可?
if ([url.scheme containsString:@"www.xxxx.com"]) { ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
[[NSNotificationCenter defaultCenter] postNotificationName:@"refreshWXH5Pay" object:nil userInfo:@{@"url":url}]; ? ? ? ? ? ? ? ? ?
?} ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
}
//這是外部接收伍玖、處理通知的方法 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?-(void)refreshOrderData:(NSNotification*)notifi{ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
NSDictionary*dic = notifi.userInfo; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
NSString*url = [NSString stringWithFormat:@"%@",dic[@"url"]]; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
NSString*urlStr = [url substringFromIndex:14]; ?//截取?www.xxxx.com://?http://www.baidu.com? ? 后面的部分 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
[self.webView loadRequest:[self getRequest:urlStraction:nil]];
}