背景
某一天早上,被领导叫过去聊天,问我能不能在APP之间做跳转,后来沟通清楚说是想跳转到QQ打开企业QQ的聊天界面,但是隔壁部门的同事在原生跳转上面没有处理好,出现了消息无法发送的问题。然后我就得去预研了。。。
踩坑
在QQ开发平台上面查的资料···提供的只有web端导入一个.php的脚本然后做下交互处理就完了,讲道理这是没有错的,但是我是原生啊!!!
而根据查到的资料链接:4008205555招行的企业QQ
(http://wpa.b.qq.com/cgi/wpa.php?ln=2&uin=4008205555)
利用网页方式可以正常跳转,但是利用协议的跳转方式却不行,消息无法正常发送了。进而发现400的号码大部分是不可以的!而800的号码是可以的!
埋坑
在利用webView的方式进行跳转的时候,无意中捕获到400跳转的URL,发现uin码差异的问题。得出了两个可行方式。
- 1.网页跳转
//iOS
NSString *url = @"http://wpa.b.qq.com/cgi/wpa.php?ln=2&uin=4008205555";
NSURL *phoneURL = [NSURL URLWithString:url];
UIWebView *webView = [UIWebView new];
[webView loadRequest:[NSURLRequest requestWithURL:phoneURL]];
[self.view addSubview:webView];
//以上方法据说在iOS10以后就失效了,但是我在iOS10的某个版本上面还可以正常执行
//Android
webview = (WebView)findViewById(X.id.webview);
webview.loadUrl("http://wpa.b.qq.com/cgi/wpa.php?ln=2&uin=4008205555");
- 2.协议跳转
// Android 取真实的uin码 800的一般是没有问题的 没有真正的调试过
String url="mqqwpa://im/chat?chat_type=crm&uin=800095555&version=1&src_type=web&web_src=http://wpa.b.qq.com";
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
//iOS 直接打开QQ公众号 获取真正的跳转uin
NSString *urlStr = @"mqqwpa://im/chat?chat_type=crm&uin=938035179&version=1&src_type=web&web_src=http:://wpa.b.qq.com";
NSURL *url = [NSURL URLWithString:urlStr];
[[UIApplication sharedApplication] openURL:url];
以上方式在iOS的系统版本都可以使用 uin码是根据400号码捕获得到的
捕获正确的uin
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
NSLog(@"-->测试 %@",request.URL.absoluteString);
if ([request.URL.absoluteString containsString:@"mqqwpa://im/chat?chat_type=crm&uin="]) {
DebugLog(@"--真实跳转的URL = %@", request.URL.absoluteString);
}
return YES;
}
以上是UIWeView捕获跳转的链接的信息,此时你可以打印出来打开QQ客户端的链接得到真正的uin码进而进行替换就可以了!这个算法我们肯定是不知道了,只能按照这个方式来了。真机调试的时候你只要判断跳转过去的是一个公众号类型的就知道是正确的了!
写在最后
一开始以为企业QQ没有开通推广功能,后来发现并不是,而且普通的QQ号码是不需要转uin码的,但是400的企业QQ是肯定要处理的不然发消息的时候会变成临时好友导致发送失败的。