- 最近公司项目的一个需求,需要在没有导入微信SDK和支付宝SDK的情况下调起相应的客户端进行支付。
废话不多说,直接来干货:
- 首先,为了能调起微信和支付宝客户端,需要在项目中添加对应的白名单:
image.png
<key>LSApplicationQueriesSchemes</key>
<array>
<string>alipay</string>
<string>alipayshare</string>
<string>weixin</string>
<string>wechat</string>
</array>
- 进行WKWebView的配置:
- 先设置好WKNavigationDelegate
_webView.navigationDelegate = self;
- (重点) 然后实现代理方法:
#pragma mark - WKNavigationDelegate
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
WKNavigationActionPolicy actionPolicy = WKNavigationActionPolicyAllow;
NSString *urlString = navigationAction.request.URL.absoluteString;
urlString = [urlString stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
//微信
if ([urlString containsString:@"weixin://wap/pay?"]) {
actionPolicy = WKNavigationActionPolicyCancel;
//判断是否安装的微信
BOOL isInstalled = [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"weixin://"]];
if (!isInstalled) {
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"提示" message:@"未检测到微信客户端,请安装后重试!" preferredStyle:UIAlertControllerStyleAlert];
[alert addAction:[UIAlertAction actionWithTitle:@"知道了" style:UIAlertActionStyleDefault handler:nil]];
UIViewController *vc = [PublicTool getCurrentVC];//这里是我工具类中,获取当前试图控制器的方法,可自行替换
[vc presentViewController:alert animated:YES completion:nil];
//这句是必须加上的,不然会异常
decisionHandler(actionPolicy);
return;
}
//解决wkwebview weixin://无法打开微信客户端的处理
NSURL *url = [NSURL URLWithString:urlString];
if ([[UIApplication sharedApplication] respondsToSelector:@selector(openURL:options:completionHandler:)]) {
if (@available(iOS 10.0,*)) {
[[UIApplication sharedApplication] openURL:url options:@{UIApplicationOpenURLOptionUniversalLinksOnly: @NO} completionHandler:^(BOOL success) {
}];
}
else {
[[UIApplication sharedApplication] openURL:url];
}
} else {
[[UIApplication sharedApplication] openURL:webView.URL];
}
}
//支付宝
if ([urlString containsString:@"alipay://alipayclient/?"]) {
BOOL isInstalled = [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"alipay://alipayclient/?"]];
if (!isInstalled) {
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"提示" message:@"未检测到支付宝客户端,请安装后重试!" preferredStyle:UIAlertControllerStyleAlert];
[alert addAction:[UIAlertAction actionWithTitle:@"知道了" style:UIAlertActionStyleDefault handler:nil]];
UIViewController *vc = [PublicTool getCurrentVC];
[vc presentViewController:alert animated:YES completion:nil];
//这句是必须加上的,不然会异常
decisionHandler(actionPolicy);
return;
}
if ([[UIApplication sharedApplication] respondsToSelector:@selector(openURL:options:completionHandler:)]) {
NSString *dataStr = [urlString substringFromIndex:23];
NSMutableString *mString = [[NSMutableString alloc] init];
[mString appendString:@"alipay://alipayclient/?"];
//url进行编码
[mString appendString:[self encodeString:dataStr]];
NSURL *url = [NSURL URLWithString:mString];
if (@available(iOS 10.0,*)) {
[[UIApplication sharedApplication] openURL:url options:@{UIApplicationOpenURLOptionUniversalLinksOnly: @NO} completionHandler:^(BOOL success) {
}];
}
else {
[[UIApplication sharedApplication] openURL:url];
}
} else {
[[UIApplication sharedApplication] openURL:webView.URL];
}
}
//这句是必须加上的,不然会异常
decisionHandler(actionPolicy);
}
- 下面是对应的urlencode方法:
#pragma mark - Utils
- (NSString *)encodeString:(NSString *)unencodedString {
NSString *encodedString = (NSString *)
CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
(CFStringRef)unencodedString,
NULL,
(CFStringRef)@"!*'();:@&=+$,/?%#[]",
kCFStringEncodingUTF8));
return encodedString;
}
最后说明一下,本人发帖仅为记录,方便以后再做类似功能。
分享出来是希望能帮助更多开发的童靴。
所以,杠精请绕道,谢谢。