学习参考地址:https://www.jianshu.com/p/01a77fcbf00c
在APP分享的过程中,经常会分享到微信上,但是,很多公司都会考虑打开在浏览区打开的时候,能跳转到APP的特定页面。比如电商页面,分享出来之后,在微信的内置浏览器中打开,没办法直接打开APP,可以像简书一样做一个引导页面,提示用户在微信的内置浏览器中使用Safari浏览器打开页面。
如果分享出来的链接,可以做短连接处理,进行压缩,可以使用网站http://www.mynb8.com,进行长连接压缩,比如你当前的链接为http://www.yidiankeji.online/testApp.html,进行压缩之后为http://t.cn/EoBW3md。
其实,用户在点击链接时,会吊起浏览器,浏览器会对链接进行解析,解析成原来的链接,去访问。如果想要在Safari浏览器中,打开APP的特定页面就是相当于和APP的通信了。
通信原理:URLScheme 和open URL
在你的APP中,配置一个URLScheme ,是你的应用的一个标识,Safari浏览器在打开应用的过程中,会调用AppDelegate的代理方法
-(BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
你可以在这个函数方法中,解析链接,做跳转的操作。
在h5中使用ifframe,打开以特定的方式打开。
myScheme://xxx.com?params={'type':'1','controll':'XXXViewController','params':'{'xxx':'xxx'}'}
- myScheme 当前的应用标识 就是 APP中的URLScheme
- //xxx.com 跳转的路由链接,即是你可以通过配置这一部分的链接,实现通过路由跳转特定页面。
- params= 传递的参数,就是你打开的页面所需要的参数数据
JS代码中的实现
<script>
//吊起原生的页面
function callAPP () {
var safariBtn = document.getElementById('safariBtn');
safariBtn.onclick = function(){
var ua = navigator.userAgent.toLowerCase();
console.log(ua+"打印");
var schemeIOS = getUrlParam('schemeIOS');
var schemeAdr = getUrlParam('schemeAdr');
var config = {
///*scheme:必须*/
scheme_IOS: schemeIOS === null ? "gomeshop://gorder.m.gome.com.cn?params={'type':'1','controll':'TestViewController','params':{'type':'1','entity':{'UserEntity_userInfo':{'birthday':'1988-09-09','name':'hahaha'}}}}" : schemeIOS,
scheme_Adr: schemeAdr === null ? "gomeshop://gorder.m.gome.com.cn/openApp" : schemeAdr,
};
var scheme = ua.indexOf('os') > 0 ? config.scheme_IOS : config.scheme_Adr;
console.log('****'+scheme+"scheme的值");
OpenAppBySchema(scheme);
};
var ua = navigator.userAgent.toLowerCase();
console.log(ua+"打印");
var schemeIOS = getUrlParam('schemeIOS');
var schemeAdr = getUrlParam('schemeAdr');
var config = {
///*scheme:必须 */
// type 类型区分要跳转的页面
scheme_IOS: schemeIOS === null ? "gomeshop://gorder.m.gome.com.cn/productDetail?params={'type':'1','controll':'GMProductDetailVC','params':{'type':'1','storeCode':'','areaCode':'11010000','mid':'30975','stid':'A00T','activityId':'6740','productId':'9140028922','skuId':'1130030597'}}" : schemeIOS,
scheme_Adr: schemeAdr === null ? "gomeshop://gorder.m.gome.com.cn/openApp" : schemeAdr,
};
var scheme = ua.indexOf('os') > 0 ? config.scheme_IOS : config.scheme_Adr;
OpenAppBySchema(scheme);
}
function getUrlParam(name) {
//构造一个含有目标参数的正则表达式对象
var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
//匹配目标参数
var r = window.location.search.substr(1).match(reg);
console.log("参数链接"+r);
//返回参数值
if (r != null)
return unescape(decodeURI(r[2])); //scheme url作为参数需要先编码,所以这里要先decodeURI解码,然后再unescape解码
return null;
}
function OpenAppBySchema(scheme) {
var ua = navigator.userAgent.toLowerCase();
if (ua.indexOf('safari') > -1 && (ua.indexOf('os 8') == -1
|| ua.indexOf('os 7') == -1
|| ua.indexOf('os 6') == -1
|| ua.indexOf('os 5') == -1)) {
var schemeLinkOpen = document.getElementById('schemeLinkOpen');
if (!schemeLinkOpen) {
schemeLinkOpen = document.createElement('a');
schemeLinkOpen.id = 'schemeLinkOpen';
schemeLinkOpen.style.display = 'none';
document.body.appendChild(schemeLinkOpen);
}
schemeLinkOpen.href = scheme;
// 执行click
schemeLinkOpen.dispatchEvent(customClickEvent());
}
var iframeObj = document.createElement("iframe");
if (iframeObj != null) {
iframeObj.setAttribute("style", "height:0px;width:0px;display:none;")
iframeObj.setAttribute("src", scheme);
document.body.appendChild(iframeObj);
document.body.removeChild(iframeObj);
}
}
function customClickEvent() {
var clickEvent;
if (window.CustomEvent) {
clickEvent = new window.CustomEvent("click", {
canBubble: true,
cancelable: true
}
);
} else {
clickEvent = document.createEvent('Event');
clickEvent.initEvent('click', true, true);
}
return clickEvent;
}
callAPP();
</script>
APP中的实现代码
-(BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options{
if (!url) {
return YES;
}
UIAlertView * al = [[UIAlertView alloc]initWithTitle:@"2" message:nil delegate:nil cancelButtonTitle:@"取消" otherButtonTitles:nil, nil];
[al show];
return [self handleAPPURL:url];
}
-(BOOL)handleAPPURL:(NSURL*)url{
NSString * scheme = url.scheme;
NSString * urlstr= url.absoluteString;
if ([@"gomeshop"isEqualToString:scheme]) {
NSString *formatUrl = [urlstr stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSArray * defineArray = [formatUrl componentsSeparatedByString:@"params="];
if (defineArray.count>1) {
NSString * paramStr = [defineArray objectAtIndex:1];
NSString * patternURL = [defineArray objectAtIndex:0];
paramStr = [self changeSingleToDouble:paramStr];
NSLog(@"paramStr%@",paramStr);
NSDictionary * paramJson = [self stringToJson:paramStr];
NSLog(@"paramJson%@",paramJson);
[GMURLRouter pushURLString:patternURL query:paramJson animated:YES completion:nil];
}
}
return YES;
}
-(NSDictionary*)stringToJson:(NSString*)Jsonstr{
if (!Jsonstr) {
return nil;
}
NSDictionary * json = [NSJSONSerialization JSONObjectWithData:[Jsonstr dataUsingEncoding:NSUTF8StringEncoding] options:(NSJSONReadingMutableContainers) error:nil];
return json;
}
-(NSString*)changeSingleToDouble:(NSString*)str{
if (!str) {
return nil;
}
return [str stringByReplacingOccurrencesOfString:@"'" withString:@"\""];
}