iOS中通过长短连接打开到APP的特定页面

学习参考地址: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:@"\""];
}

代码的地址:https://github.com/ioszhanghui/SafariOpenApp.git

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值