linkedme_vue linkedme - CSDN
精华内容
参与话题
  • 深度链接LinkedME与Deeplink

    千次阅读 2018-01-30 10:06:46
    LinkedME是国内首家企业级深度链接服务提供商,致力于帮助移动APP解决用户增长和流量变现的问题。 LinkedME提供“一键活跃”,“场景还原”,“场景运营”等功能,大大提供APP的活跃度,更好地解决流量变现。致力于...

    一、前言

    介绍

    LinkedME是国内首家企业级深度链接服务提供商,致力于帮助移动APP解决用户增长和流量变现的问题。 LinkedME提供“一键活跃”,“场景还原”,“场景运营”等功能,大大提供APP的活跃度,更好地解决流量变现。致力于打造App与App之间的桥梁,感知用户行为,引发场景消费。

    作用

    由于苹果公司设立的安全机制限制了各APP之间的信息交互,LinkedMe使用Deeplink技术实现在A(App)点击链接,跳转到B(App)的某个界面,如果用户没有安装B(App),则指引到App Store 下载,并且保证用户下载安装B(App)后,依旧可以跳转到具体页面。

    二、配置及使用

    1.准备工作

    这里是LinkedME文档中心

    1.1. 获取LinkedME Key

    新用户:在官网网站注册账号,注册后创建应用,在后台导航栏“设置”中查看LinkedME Key。
    老用户:已经在官网网站注册账号,直接创建应用(可以创建多个应用),直接到导航栏“设置”中查看LinkedME Key。

    1.2. 获取LinkedME iOS SDK及Demo
    到官方网站下载LinkedME-iOS-Deep-Linking-SDK,下载Demo工程

    1. 导入SDK
      您可以直接导入下载的SDK或通过Cocoapods安装SDK

    2.1. 直接导入LinkedME iOS SDK
    把Demo工程中的LinkedME_iOS.framework,导入工程中。

    CoreSpotlight.framework (status:Optional)
    SystemConfiguration.framework
    Security.framework
    WebKit.framework
    StoreKit.framework

    注意事项:CoreSpotlight.framework必须标记为可选。

    2.2. 通过Cocoapods安装SDK
    如果您想更方便地集成/更新 LinkPage的SDK,可以使用Cocoapods工具,想要了解Cocoapods,推荐参考官方文档《CocoaPods安装和使用教程》。
    编辑Podfile文件并添加以下代码

    pod 'LinkedME_LinkPage'

    运行 pod installin

    从现在开始使用 .xcworkspace 打开项目,而不是 .xcodeproj
    提示:如果提示[!] Unable to find a pod with name, author, summary, or description matching LinkedME_LinkPage
    解决方法就是Finder前往资源库去删除缓存中的search_index.json
    执行:rm -rf ~/Library/Caches/CocoaPods/search_index.json 再重新search/install/update

    1. 基本配置
      3.1. 添加系统Framework
      CoreSpotlight.framework(status:Optional)
      SystemConfiguration.framework
      Security.framework
      WebKit.framework
      StoreKit.framework
      注意:CoreSpotlight.framework必须标记为可选。

    3.2. 配置linkedme_key
    打开info.plist文件
    在列表中点击右键选择add row添加一个分组
    创建一个新的item名称为linkedme_key,类型为Dictionary
    在linkedme_key新增一个字符串类型的item,live字段,到后台“设置”->“应用”中进行查看

    3.3. 配置URL Scheme
    配置URL Scheme,以便通过URL Scheme来唤起APP
    打开info.plist
    找到URL Types(如果没有就右键add row添加一个)
    添加”you app”(你的app的唯一标识字符串)

    3.4. 配置Universal Link支持 (仅支持iOS 9)
    配置Universal Link,使得iOS9中可以通过Universal Link来唤起APP
    在左侧导航器中点击您的项目
    选择’Capabilities’标签
    打开’Associated Domains’开关
    添加applinks:lkme.cc和applinks:www.lkme.cc

    3.5. 添加URLScheme和Universal Link支持
    在SDK中配置URL Scheme和Universal Link,使得可以通过URL Scheme和Universal Link唤起APP 在Appdelegate中实现下列方法:

    - (BOOL)application:(UIApplication*)application openURL:(NSURL*)url sourceApplication:(NSString*)sourceApplication annotation:(id)annotation{
      //判断是否是通过LinkedME的UrlScheme唤起App
      if ([[url description] rangeOfString:@"click_id"].location != NSNotFound) {
        return [[LinkedME getInstance] handleDeepLink:url];
      }
    
      return YES;
    }
    //Universal Links 通用链接实现深度链接技术
    - (BOOL)application:(UIApplication*)application continueUserActivity:(NSUserActivity*)userActivity restorationHandler:(void (^)(NSArray*))restorationHandler{
    
      //判断是否是通过LinkedME的Universal Links唤起App
      if ([[userActivity.webpageURL description] rangeOfString:@"lkme.cc"].location != NSNotFound) {
        return  [[LinkedME getInstance] continueUserActivity:userActivity];
      }
      return YES;
    }
    //URI Scheme 实现深度链接技术
    - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary *)options{
      NSLog(@"opened app from URL %@", [url description]);
    
      //判断是否是通过LinkedME的UrlScheme唤起App
      if ([[url description] rangeOfString:@"click_id"].location != NSNotFound) {
        return [[LinkedME getInstance] handleDeepLink:url];
      }
      return YES;
    }
    1. 深度链接功能
      本模块实现的功能是创建深度链接及通过深度链接跳转到APP内的详情页面,若想要使用如下功能,请务必将“基本配置”部分全部实现

    4.1. 创建深度链接

    温馨提示:如果web端集成了web sdk,则无需客户端创建深度链接,本节无需集成。
    通过SDK创建深度链接,例如在分享页面时,页面的链接是通过SDK生成的深度链接,当打开分享内容时就可以通过深度链接唤起APP并进入对

    //创建短链
    -(void)addPara{
      self.linkedUniversalObject = [[LMUniversalObject alloc] init];
      self.linkedUniversalObject.title = title;//标题
      LMLinkProperties *linkProperties = [[LMLinkProperties alloc] init];
      linkProperties.channel = @"";//渠道(微信,微博,QQ,等...)
      linkProperties.feature = @"Share";//特点
      linkProperties.tags=@[@"LinkedME",@"Demo"];//标签
      linkProperties.stage = @"Live";//阶段
      [linkProperties addControlParam:@"View" withValue:arr[page][@"url"]];//自定义参数,用于在深度链接跳转后获取该数据,这里代表页面唯一标识
      [linkProperties addControlParam:@"LinkedME" withValue:@"Demo"];//自定义参数,用于在深度链接跳转后获取该数据,这里标识是Demo 
      //开始请求短链
      [self.linkedUniversalObject getShortUrlWithLinkProperties:linkProperties andCallback:^(NSString *url, NSError *err) {
        if (url) {
          NSLog(@"[LinkedME Info] SDK creates the url is:%@", url);
          //拼接连接
          [H5_LIVE_URL stringByAppendingString:arr[page][@"form"]];
          [H5_LIVE_URL stringByAppendingString:@"?linkedme="];
          H5_LIVE_URL = [NSString stringWithFormat:@"https://www.linkedme.cc/h5/%@?linkedme=",arr[page][@"form"]];
          //前面是Html5页面,后面拼上深度链接https://xxxxx.xxx (html5 页面地址) ?linkedme=(深度链接)
          //https://www.linkedme.cc/h5/feature?linkedme=https://lkme.cc/AfC/mj9H87tk7
          LINKEDME_SHORT_URL = [H5_LIVE_URL stringByAppendingString:url];      
        } else {
          LINKEDME_SHORT_URL = H5_LIVE_URL;
        }
      }];
    }

    参数名称 含义 功能

    Channel 渠道 表示深度链接的渠道,方便统计分析和追踪,例如微信、微博,百度等等;
    Feature 特点 表示深度链接的特点,例如邀请,分享等等;
    Tags 标签 表示深度链接的标签特性,自定义任何值;
    Stage 阶段 表示深度链接的阶段特性,比如第一版产品发布,第二版本测试等等;

    4.2. 解析深度链接
    通过深度链接唤起APP时,解析深度链接携带的参数以打开对应页面

    4.2.1. 配置AppDelegate
    Objective-C请先进行如下配置:
    在AppDelegate中引入头文件#import

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.'
    //初始化及实例
    LinkedME* linkedme = [LinkedME getInstance];
    
    //    //注册需要跳转的viewController
    UIStoryboard * storyBoard=[UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];
    DetailViewController  *dvc=[storyBoard instantiateViewControllerWithIdentifier:@"detailView"];
    
    //[自动跳转]如果使用自动跳转需要注册viewController
    //    [linkedme registerDeepLinkController:featureVC forKey:@"LMFeatureViewController"];
    
    //获取跳转参数
    [linkedme initSessionWithLaunchOptions:launchOptions automaticallyDisplayDeepLinkController:NO deepLinkHandler:^(NSDictionary* params, NSError* error) {
      if (!error) {
        //防止传递参数出错取不到数据,导致App崩溃这里一定要用try catch
        @try {
          NSLog(@"LinkedME finished init with params = %@",[params description]);
          //获取标题
          NSString *title = [params objectForKey:@"$og_title"];
          NSString *tag = params[@"$control"][@"View"];
    
          if (title.length >0 && tag.length >0) {
    //如果app需要登录或者注册后,才能打开详情页,这里可以先把值存起来,登录/注册完成后,再使用
            //[自动跳转]使用自动跳转
            //SDK提供的跳转方法
            /**
            *  pushViewController : 类名
            *  storyBoardID : 需要跳转的页面的storyBoardID
            *  animated : 是否开启动画
            *  customValue : 传参
            *
            *warning  需要在被跳转页中实现次方法 - (void)configureControlWithData:(NSDictionary *)data;
            */
    
            //  [LinkedME pushViewController:title storyBoardID:@"detailView" animated:YES customValue:@{@"tag":tag} completion:^{
            
            //  }];
    
            //自定义跳转
            dvc.openUrl = params[@"$control"][@"ViewId"];
            [[LinkedME getViewController] showViewController:dvc sender:nil];
          }
        } @catch (NSException *exception) {
    
        } @finally {
        }
      } else {
        NSLog(@"LinkedME failed init: %@", error);
      }
    }];
      return YES;
    }
    1. 其他功能
      5.1. Debug模式
      在Debug模式下会打印日志
    [linkedme setDebug];

    5.2. 测试模式
    若想测试集成SDK后是否能正确生成并解析深度链接,可以使用测试模式。测试模式需要先在后台中注册您的测试设备,测试设备产生的数据将进入测试系统(Test)中。
    在后台(Dashboard)中-设置-测试-添加测试设备
    OC:通过[LinkedME getTestID]获取设备ID,去后台中添加设备
    Swift:通过LinkedME.getTestID()获取设备ID,去后台中添加设备

    5.3. Spotlight 索引
    配置Spotlight索引后,可以在iPhone的系统级搜索(主屏下拉或下拉菜单中的搜索)中搜索内容并直接打开APP的特定页面

    5.3.1. 创建Spotlight索引

    NSSet *keyWord = [NSSet setWithObjects:@"linkedme", nil];

    需要传递的参数

    NSSet *set5 = [NSSet    setWithObjects:@"linkedme",@"linked",@"深度链接", nil];

    关键字详解

    title   标题
    description 描述
    publiclyIndexable   是否公开
    type    类型
    thumbnailUrl    缩略图Url
    keywords    关键字
    userInfo    用户详情
    expirationDate  失效日期,设置失效日期会自动删除索引
    identifier  标志符
    callback    回调
    spotlightCallback   Spotlight回调

    5.3.2. 删除索引
    删除所有索引

    [LinkedME removeAllSearchItems];

    通过spotlightIdentifier删除索引

    [LinkedME removeSearchItemWith:@[@"linkedme"]];

    dg思考的问题

    LinkedMe通过链接把用户带领到未知的地方,是否会恶意引导去下载某些APP呢?

    展开全文
  • VUE 项目落地页使用 LinkedME 深度链接服务跳回App 当前需求: 在微信或者浏览器中打开页面, 需要跳转回对应app; 当前实现技术: 使用 LinkedME 深度链接服务 实现流程: 1。 ios 后台配置及处理相关参数完成 2。 ...

    VUE 项目落地页使用 LinkedME 深度链接服务跳回App

    当前需求: 在微信或者浏览器中打开页面, 需要跳转回对应app;
    当前实现技术: 使用 LinkedME 深度链接服务
    实现流程:

    1。 ios 后台配置及处理相关参数完成

    2。 javascript 前端调用

    3。 在项目中,api目录下 引入了 linkedme.min.js ,同时创建了 linkedme.js , 对初始化LinkedME 初始化及创建进行了封装, 方便在所需页面引入使用。

       3.1   linkedme.js  中跟ios拿到 linkedme_key ,并设置 linkedme 对象参数
    
       3.2   导出函数, 由所需功能组件引入
    
       3.3   对组件传入的参数做处理, (注意: 组件使用参数为字符类型)
    

    4。 组件使用

       4.1  在页面中准备 a 表标签, 绑定href, 在 mounted 钩子中, 使用引入的  linkedmeLink 处理后, 返回了 LinkedME 服务端所需的参数
    
       4.2  赋值给 href, 完成调用
    

    在这里插入图片描述

    linkedme.js

    let linkedmePromise =
    import('./linkedme.min.js')
    var hosts = EnvSupport.env.API_SERVER.split("//")[1].split('.')[0];
    var linkedmeType = "live";
    //  以下判断是自己判定了环境, 用来测试的, 需要的同学干掉就好了
    if (EnvSupport.env.API_SERVER == 'test2' || EnvSupport.env.API_SERVER == 'rc') {
      linkedmeType = "test";
    }
    let defaultData = {};
    defaultData.type = linkedmeType; //表示现在使用线上模式,如果填写"test", 表示测试模式.【可选】
    defaultData.feature = "功能名称"; // 自定义深度链接功能,多个用逗号分隔,【可选】
    defaultData.stage = "阶段名称"; // 自定义深度链接阶段,多个用逗号分隔,【可选】
    defaultData.channel = "渠道名称"; // 自定义深度链接渠道,多个用逗号分隔,【可选】
    defaultData.tags = "标签名称"; // 自定义深度链接标签,多个用逗号分隔,【可选】
    defaultData.ios_custom_url = ""; // 自定义iOS平台下App的下载地址,如果是AppStore的下载地址可以不用填写,
    defaultData.android_custom_url = ""; // 自定义安卓平台下App的下载地址,【可选】
    // 下面是自定义深度链接参数,用户点击深度链接打开app之后,params参数将被带入app
    // 比如详情页面的参数,可以写进去,这样唤起app后可直接跳转到详情页【可选】
    
    export default async function (para) {
      await linkedmePromise
      if (linkedme.LinkedME_KEY !== "e8a88452ee127077067d2eaf264") {
        linkedme.init("e8a88452ec1b87077067d2eaf264", {
          type: linkedmeType
        }, null);
      }
      para = para || {}
      let str = '';
      for (let k in para) {
        str += `"${k}":"${para[k]}",`
      }
      str = str.slice(0, -1)
      let params = `{${str}}`
      return new Promise((resolve, reject) => {
        // console.log({
        //   ...defaultData,
        //   ...{params: params},
        // })
        let datas = {
          ...defaultData,
          ...{
            params: params
          }
        };
        linkedme.link(datas, function (err, data) {
          if (err) {
            // 生成深度链接失败,返回错误对象err
            let s = err;
            s = JSON.parse(s);
            reject(err)
          } else {
            /*
             生成深度链接成功,深度链接可以通过data.url得到,
             将深度链接绑定到<a>标签,这样当用户点击这
             个深度链接,如果是在pc上,那么跳转到深度链接二维
             码页面,用户用手机扫描该二维码就会打开app;如果
             在移动端,深度链接直接会根据手机设备类型打开ios
             或者安卓app
             */
            resolve(data)
          }
        }, false);
    
      });
    }
    

    linkedme.min.js

    // 你最好去自己官网下载
    !function(){"use strict";var a={key_str:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",encode:function(e){var i,n,o,r,t,s,a,d="",l=0;for(e=this._utf8_encode(e);l<e.length;)r=(i=e.charCodeAt(l++))>>2,t=(3&i)<<4|(n=e.charCodeAt(l++))>>4,s=(15&n)<<2|(o=e.charCodeAt(l++))>>6,a=63&o,isNaN(n)?s=a=64:isNaN(o)&&(a=64),d=d+this.key_str.charAt(r)+this.key_str.charAt(t)+this.key_str.charAt(s)+this.key_str.charAt(a);return d},decode:function(e){var i,n,o,r,t,s,a="",d=0;for(e=e.replace(/[^A-Za-z0-9\+\/\=]/g,"");d<e.length;)i=this.key_str.indexOf(e.charAt(d++))<<2|(r=this.key_str.indexOf(e.charAt(d++)))>>4,n=(15&r)<<4|(t=this.key_str.indexOf(e.charAt(d++)))>>2,o=(3&t)<<6|(s=this.key_str.indexOf(e.charAt(d++))),a+=String.fromCharCode(i),64!=t&&(a+=String.fromCharCode(n)),64!=s&&(a+=String.fromCharCode(o));return a=this._utf8_decode(a)},_utf8_encode:function(e){e=e.replace(/\r\n/g,"\n");for(var i="",n=0;n<e.length;n++){var o=e.charCodeAt(n);o<128?i+=String.fromCharCode(o):(127<o&&o<2048?i+=String.fromCharCode(o>>6|192):(i+=String.fromCharCode(o>>12|224),i+=String.fromCharCode(o>>6&63|128)),i+=String.fromCharCode(63&o|128))}return i},_utf8_decode:function(e){for(var i="",n=0,o=c1=c2=0;n<e.length;)(o=e.charCodeAt(n))<128?(i+=String.fromCharCode(o),n++):191<o&&o<224?(c2=e.charCodeAt(n+1),i+=String.fromCharCode((31&o)<<6|63&c2),n+=2):(c2=e.charCodeAt(n+1),c3=e.charCodeAt(n+2),i+=String.fromCharCode((15&o)<<12|(63&c2)<<6|63&c3),n+=3);return i}},d={chrome:"01",safari:"02",ucbrowser:"03",oppobrowser:"04",vivobrowser:"05",miuibrowser:"06",baidubrowser:"07",baiduboxapp:"08",micromessenger:"09",qqbrowser:"10",qihoobrowser:"11",mb2345browser:"12",sogoumobilebrowser:"13",qq:"14",weibo:"15",opera:"16",dolphin:"17",firefox:"18",netscape:"19",webview:"20",webkit:"21",androidbrowser:"22",mzbrowser:"23"},l={ios:"1",android:"2"};function c(e){var i=document.createElement("div"),n=i;i.attachShadow&&(n=i.attachShadow({mode:"open"}));var o=document.createElement("span");o.innerText=e,n.appendChild(o),document.body.appendChild(i),function(e){var i=document.getSelection(),n=document.createRange();n.selectNodeContents(e),i.removeAllRanges(),i.addRange(n)}(o);var r=document.execCommand("copy");return document.getSelection().removeAllRanges(),document.body.removeChild(i),r}function h(e,i){i=i&&i.replace("https://lkme.cc/","");var n=(new D).get_result();if("INPUT"!=e.target.nodeName&&"TEXTAREA"!=e.target.nodeName&&"true"!=e.target.contentEditable&&!e.target.required)try{var o=document.querySelectorAll("body>*:not(script):not(style)");if(Array.prototype.map.call(o,function(e,i,n){e.removeEventListener("click",h)}),!d[n.browser.name.toLowerCase()])return;if(-1!=n.browser.name.toLowerCase().indexOf("liebao")||-1!=n.browser.name.toLowerCase().indexOf("samsungbrowser"))return;var r,t="01"+l[n.os.name.toLowerCase()]+d[n.browser.name.toLowerCase()]+z("identity_id");if(i){var s=(new Date).getTime();r="data:image/png;base64,`+"+a.encode(t)+"#"+i+"/"+s+"`+"}else r="data:image/png;base64,`+"+a.encode(t)+"`+";try{if("ios"==n.os.name.toLowerCase())c(r);else{if("android"!=n.os.name.toLowerCase())return;!function(i){function e(e){e.clipboardData.setData("text/plain",i),e.preventDefault()}document.addEventListener("copy",e);var n=document.execCommand("copy");document.removeEventListener("copy",e)}(r)}}catch(e){console.log(e)}}catch(e){console.log(e)}}function u(e,i){var n=(65535&e)+(65535&i);return(e>>16)+(i>>16)+(n>>16)<<16|65535&n}function w(e,i,n,o,r,t){return u(function(e,i){return e<<i|e>>>32-i}(u(u(i,e),u(o,t)),r),n)}function m(e,i,n,o,r,t,s){return w(i&n|~i&o,e,i,r,t,s)}function p(e,i,n,o,r,t,s){return w(i&o|n&~o,e,i,r,t,s)}function f(e,i,n,o,r,t,s){return w(i^n^o,e,i,r,t,s)}function _(e,i,n,o,r,t,s){return w(n^(i|~o),e,i,r,t,s)}function g(e,i){var n,o,r,t,s;e[i>>5]|=128<<i%32,e[14+(i+64>>>9<<4)]=i;var a=1732584193,d=-271733879,l=-1732584194,c=271733878;for(n=0;n<e.length;n+=16)d=_(d=_(d=_(d=_(d=f(d=f(d=f(d=f(d=p(d=p(d=p(d=p(d=m(d=m(d=m(d=m(r=d,l=m(t=l,c=m(s=c,a=m(o=a,d,l,c,e[n],7,-680876936),d,l,e[n+1],12,-389564586),a,d,e[n+2],17,606105819),c,a,e[n+3],22,-1044525330),l=m(l,c=m(c,a=m(a,d,l,c,e[n+4],7,-176418897),d,l,e[n+5],12,1200080426),a,d,e[n+6],17,-1473231341),c,a,e[n+7],22,-45705983),l=m(l,c=m(c,a=m(a,d,l,c,e[n+8],7,1770035416),d,l,e[n+9],12,-1958414417),a,d,e[n+10],17,-42063),c,a,e[n+11],22,-1990404162),l=m(l,c=m(c,a=m(a,d,l,c,e[n+12],7,1804603682),d,l,e[n+13],12,-40341101),a,d,e[n+14],17,-1502002290),c,a,e[n+15],22,1236535329),l=p(l,c=p(c,a=p(a,d,l,c,e[n+1],5,-165796510),d,l,e[n+6],9,-1069501632),a,d,e[n+11],14,643717713),c,a,e[n],20,-373897302),l=p(l,c=p(c,a=p(a,d,l,c,e[n+5],5,-701558691),d,l,e[n+10],9,38016083),a,d,e[n+15],14,-660478335),c,a,e[n+4],20,-405537848),l=p(l,c=p(c,a=p(a,d,l,c,e[n+9],5,568446438),d,l,e[n+14],9,-1019803690),a,d,e[n+3],14,-187363961),c,a,e[n+8],20,1163531501),l=p(l,c=p(c,a=p(a,d,l,c,e[n+13],5,-1444681467),d,l,e[n+2],9,-51403784),a,d,e[n+7],14,1735328473),c,a,e[n+12],20,-1926607734),l=f(l,c=f(c,a=f(a,d,l,c,e[n+5],4,-378558),d,l,e[n+8],11,-2022574463),a,d,e[n+11],16,1839030562),c,a,e[n+14],23,-35309556),l=f(l,c=f(c,a=f(a,d,l,c,e[n+1],4,-1530992060),d,l,e[n+4],11,1272893353),a,d,e[n+7],16,-155497632),c,a,e[n+10],23,-1094730640),l=f(l,c=f(c,a=f(a,d,l,c,e[n+13],4,681279174),d,l,e[n],11,-358537222),a,d,e[n+3],16,-722521979),c,a,e[n+6],23,76029189),l=f(l,c=f(c,a=f(a,d,l,c,e[n+9],4,-640364487),d,l,e[n+12],11,-421815835),a,d,e[n+15],16,530742520),c,a,e[n+2],23,-995338651),l=_(l,c=_(c,a=_(a,d,l,c,e[n],6,-198630844),d,l,e[n+7],10,1126891415),a,d,e[n+14],15,-1416354905),c,a,e[n+5],21,-57434055),l=_(l,c=_(c,a=_(a,d,l,c,e[n+12],6,1700485571),d,l,e[n+3],10,-1894986606),a,d,e[n+10],15,-1051523),c,a,e[n+1],21,-2054922799),l=_(l,c=_(c,a=_(a,d,l,c,e[n+8],6,1873313359),d,l,e[n+15],10,-30611744),a,d,e[n+6],15,-1560198380),c,a,e[n+13],21,1309151649),l=_(l,c=_(c,a=_(a,d,l,c,e[n+4],6,-145523070),d,l,e[n+11],10,-1120210379),a,d,e[n+2],15,718787259),c,a,e[n+9],21,-343485551),a=u(a,o),d=u(d,r),l=u(l,t),c=u(c,s);return[a,d,l,c]}function v(e){var i,n="";for(i=0;i<32*e.length;i+=8)n+=String.fromCharCode(e[i>>5]>>>i%32&255);return n}function b(e){var i,n=[];for(n[(e.length>>2)-1]=void 0,i=0;i<n.length;i+=1)n[i]=0;for(i=0;i<8*e.length;i+=8)n[i>>5]|=(255&e.charCodeAt(i/8))<<i%32;return n}function o(e){var i,n,o="0123456789abcdef",r="";for(n=0;n<e.length;n+=1)i=e.charCodeAt(n),r+=o.charAt(i>>>4&15)+o.charAt(15&i);return r}function n(e){return unescape(encodeURIComponent(e))}function r(e){return function(e){return v(g(b(e),8*e.length))}(n(e))}function t(e,i){return function(e,i){var n,o,r=b(e),t=[],s=[];for(t[15]=s[15]=void 0,16<r.length&&(r=g(r,8*e.length)),n=0;n<16;n+=1)t[n]=909522486^r[n],s[n]=1549556828^r[n];return o=g(t.concat(b(i)),512+8*i.length),v(g(s.concat(o),640))}(n(e),n(i))}function k(e,i,n){return i?n?t(i,e):function(e,i){return o(t(e,i))}(i,e):n?r(e):function(e){return o(r(e))}(e)}var y="function",E="object",e="model",i="name",s="type",C="vendor",S="version",L="architecture",x="console",A="mobile",T="tablet",N="smarttv",O="wearable",R={extend:function(e,i){for(var n in i)-1!=="browser cpu device engine os".indexOf(n)&&i[n].length%2==0&&(e[n]=i[n].concat(e[n]));return e},has:function(e,i){return"string"==typeof e&&-1!==i.toLowerCase().indexOf(e.toLowerCase())},lowerize:function(e){return e.toLowerCase()},major:function(e){return"string"==typeof e?e.split(".")[0]:void 0}},I={rgx:function(){for(var e,i,n,o,r,t,s,a=0,d=arguments;a<d.length&&!t;){var l=d[a],c=d[a+1];if(void 0===e)for(o in e={},c)c.hasOwnProperty(o)&&(typeof(r=c[o])==E?e[r[0]]=void 0:e[r]=void 0);for(i=n=0;i<l.length&&!t;)if(t=l[i++].exec(this.get_UA()))for(o=0;o<c.length;o++)s=t[++n],typeof(r=c[o])==E&&0<r.length?2==r.length?typeof r[1]==y?e[r[0]]=r[1].call(this,s):e[r[0]]=r[1]:3==r.length?typeof r[1]!=y||r[1].exec&&r[1].test?e[r[0]]=s?s.replace(r[1],r[2]):void 0:e[r[0]]=s?r[1].call(this,s,r[2]):void 0:4==r.length&&(e[r[0]]=s?r[3].call(this,s.replace(r[1],r[2])):void 0):e[r]=s||void 0;a+=2}return e},str:function(e,i){for(var n in i)if(typeof i[n]==E&&0<i[n].length){for(var o=0;o<i[n].length;o++)if(R.has(i[n][o],e))return"?"===n?void 0:n}else if(R.has(i[n],e))return"?"===n?void 0:n;return e}},M={browser:{oldsafari:{version:{"1.0":"/8",1.2:"/1",1.3:"/3","2.0":"/412","2.0.2":"/416","2.0.3":"/417","2.0.4":"/419","?":"/"}}},device:{amazon:{model:{"Fire Phone":["SD","KF"]}},sprint:{model:{"Evo Shift 4G":"7373KT"},vendor:{HTC:"APA",Sprint:"Sprint"}}},os:{windows:{version:{ME:"4.90","NT 3.11":"NT3.51","NT 4.0":"NT4.0",2e3:"NT 5.0",XP:["NT 5.1","NT 5.2"],Vista:"NT 6.0",7:"NT 6.1",8:"NT 6.2",8.1:"NT 6.3",10:["NT 6.4","NT 10.0"],RT:"ARM"}}}},U={browser:[[/(qq)[\/\s]([\w\.]+)/i],[[i,"QQ"],S],[/(uc\s?browser)[\/\s]?([\w\.]+)/i,/ucweb.+(ucbrowser)[\/\s]?([\w\.]+)/i,/JUC.+(ucweb)[\/\s]?([\w\.]+)/i],[[i,"UCBrowser"],S],[/(sogoumobilebrowser)[\/\s]?([\w\.]+)/i,/(liebao[a-z]*)[\/\s]?([\w\.]+)/i,/(oppobrowser)[\/\s]?([\w\.]+)/i,/(vivobrowser)[\/\s]?([\w\.]+)/i,/(miuibrowser)[\/\s]?([\w\.]+)/i,/(samsungbrowser)[\/\s]?([\w\.]+)/i,/(baidubrowser)[\/\s]?([\w\.]+)/i,/(baiduboxapp)[\/\s]?([\w\.]+)/i,/(micromessenger)[\/\s]?([\w\.]+)/i,/(qqbrowser)[\/\s]?([\w\.]+)/i,/(qihoobrowser)[\/\s]?([\w\.]+)/i,/(mb2345browser)[\/\s]?([\w\.]+)/i,/(mzbrowser)[\/\s]?([\w\.]+)/i,/(weibo)[\_]+([\d\.]+)/i],[i,S],[/(wv\))[\/\s]?([\w\.]+)/i],[[i,"WebView"],S],[/(chrome)[\/\s]?([\w\.]+)/i,/((?:android.+)crmo|crios)\/([\w\.]+)/i],[[i,"Chrome"],S],[/(opera\smini)\/([\w\.-]+)/i,/(opera\s[mobiletab]+).+version\/([\w\.-]+)/i,/(opera).+version\/([\w\.]+)/i,/(opera)[\/\s]+([\w\.]+)/i],[i,S],[/\s(opr)\/([\w\.]+)/i],[[i,"Opera"],S],[/(kindle)\/([\w\.]+)/i,/(lunascape|maxthon|netfront|jasmine|blazer)[\/\s]?([\w\.]+)*/i,/(avant\s|iemobile|slim)(?:browser)?[\/\s]?([\w\.]*)/i,/(?:ms|\()(ie)\s([\w\.]+)/i,/(rekonq)\/([\w\.]+)*/i,/(chromium|flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs)\/([\w\.-]+)/i],[i,S],[/(trident).+rv[:\s]([\w\.]+).+like\sgecko/i],[[i,"IE"],S],[/(edge)\/((\d+)?[\w\.]+)/i],[i,S],[/(yabrowser)\/([\w\.]+)/i],[[i,"Yandex"],S],[/(comodo_dragon)\/([\w\.]+)/i],[[i,/_/g," "],S],[/(dolfin)\/([\w\.]+)/i],[[i,"Dolphin"],S],[/android.+version\/([\w\.]+)\s+(?:mobile\s?safari|safari)/i],[S,[i,"AndroidBrowser"]],[/FBAV\/([\w\.]+);/i],[S,[i,"Facebook"]],[/fxios\/([\w\.-]+)/i],[S,[i,"Firefox"]],[/version\/([\w\.]+).+?mobile\/\w+\s(safari)/i],[S,[i,"Safari"]],[/version\/([\w\.]+).+?(mobile\s?safari|safari)/i],[S,i],[/webkit.+?(mobile\s?safari|safari)(\/[\w\.]+)/i],[i,[S,I.str,M.browser.oldsafari.version]],[/(konqueror)\/([\w\.]+)/i,/(webkit|khtml)\/([\w\.]+)/i],[i,S],[/(navigator|netscape)\/([\w\.-]+)/i],[[i,"Netscape"],S],[/(swiftfox)/i,/(icedragon|iceweasel|camino|chimera|fennec|maemo\sbrowser|minimo|conkeror)[\/\s]?([\w\.\+]+)/i,/(firefox|seamonkey|k-meleon|icecat|iceape|firebird|phoenix)\/([\w\.-]+)/i,/(mozilla)\/([\w\.]+).+rv\:.+gecko\/\d+/i,/(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|sleipnir)[\/\s]?([\w\.]+)/i,/(links)\s\(([\w\.]+)/i,/(gobrowser)\/?([\w\.]+)*/i,/(ice\s?browser)\/v?([\w\._]+)/i,/(mosaic)[\/\s]([\w\.]+)/i],[i,S],[/(chrome|omniweb|arora|[tizenoka]{5}\s?browser)\/v?([\w\.]+)/i],[i,S]],cpu:[[/(?:(amd|x(?:(?:86|64)[_-])?|wow|win)64)[;\)]/i],[[L,"amd64"]],[/(ia32(?=;))/i],[[L,R.lowerize]],[/((?:i[346]|x)86)[;\)]/i],[[L,"ia32"]],[/windows\s(ce|mobile);\sppc;/i],[[L,"arm"]],[/((?:ppc|powerpc)(?:64)?)(?:\smac|;|\))/i],[[L,/ower/,"",R.lowerize]],[/(sun4\w)[;\)]/i],[[L,"sparc"]],[/((?:avr32|ia64(?=;))|68k(?=\))|arm(?:64|(?=v\d+;))|(?=atmel\s)avr|(?:irix|mips|sparc)(?:64)?(?=;)|pa-risc)/i],[[L,R.lowerize]]],device:[[/(android).*;SAMSUNG ([a-z0-9 _-]+) build/i],[C,e,[s,A]],[/(android).*; ([a-z0-9 _-]+) build/i],[C,e,[s,A]],[/(android)[\- ][\d]+\.[\d]+\.[\d]; ([a-z0-9 _-]+) build/i],[C,e,[s,A]],[/(lenovo)\s?(S(?:5000|6000)+(?:[-][\w+]))/i],[C,e,[s,T]],[/(htc)[;_\s-]+([\w\s]+(?=\))|\w+)*/i,/(zte)-(\w+)*/i,/(alcatel|geeksphone|huawei|lenovo|nexian|panasonic|(?=;\s)sony)[_\s-]?([\w-]+)*/i],[C,[e,/_/g," "],[s,A]],[/(nexus\s9)/i],[e,[C,"HTC"],[s,T]],[/\((ipad|playbook);[\w\s\);-]+(rim|apple)/i],[e,C,[s,T]],[/applecoremedia\/[\w\.]+ \((ipad)/],[e,[C,"Apple"],[s,T]],[/(apple\s{0,1}tv)/i],[[e,"Apple TV"],[C,"Apple"]],[/(archos)\s(gamepad2?)/i,/(hp).+(touchpad)/i,/(kindle)\/([\w\.]+)/i,/\s(nook)[\w\s]+build\/(\w+)/i,/(dell)\s(strea[kpr\s\d]*[\dko])/i],[C,e,[s,T]],[/(kf[A-z]+)\sbuild\/[\w\.]+.*silk\//i],[e,[C,"Amazon"],[s,T]],[/(sd|kf)[0349hijorstuw]+\sbuild\/[\w\.]+.*silk\//i],[[e,I.str,M.device.amazon.model],[C,"Amazon"],[s,A]],[/\((ip[honed|\s\w*]+);.+(apple)/i],[e,C,[s,A]],[/\((ip[honed|\s\w*]+);/i],[e,[C,"Apple"],[s,A]],[/(blackberry)[\s-]?(\w+)/i,/(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|huawei|meizu|motorola|polytron)[\s_-]?([\w-]+)*/i,/(hp)\s([\w\s]+\w)/i,/(asus)-?(\w+)/i],[C,e,[s,A]],[/\(bb10;\s(\w+)/i],[e,[C,"BlackBerry"],[s,A]],[/android.+(transfo[prime\s]{4,10}\s\w+|eeepc|slider\s\w+|nexus 7)/i],[e,[C,"Asus"],[s,T]],[/(sony)\s(tablet\s[ps])\sbuild\//i,/(sony)?(?:sgp.+)\sbuild\//i],[[C,"Sony"],[e,"Xperia Tablet"],[s,T]],[/(?:sony)?(?:(?:(?:c|d)\d{4})|(?:so[-l].+))\sbuild\//i],[[C,"Sony"],[e,"Xperia Phone"],[s,A]],[/\s(ouya)\s/i,/(nintendo)\s([wids3u]+)/i],[C,e,[s,x]],[/android.+;\s(shield)\sbuild/i],[e,[C,"Nvidia"],[s,x]],[/(playstation\s[34portablevi]+)/i],[e,[C,"Sony"],[s,x]],[/(sprint\s(\w+))/i],[[C,I.str,M.device.sprint.vendor],[e,I.str,M.device.sprint.model],[s,A]],[/[\s\(;](xbox(?:\sone)?)[\s\);]/i],[e,[C,"Microsoft"],[s,x]],[/(kin\.[onetw]{3})/i],[[e,/\./g," "],[C,"Microsoft"],[s,A]],[/\s(milestone|droid(?:[2-4x]|\s(?:bionic|x2|pro|razr))?(:?\s4g)?)[\w\s]+build\//i,/mot[\s-]?(\w+)*/i,/(XT\d{3,4}) build\//i,/(nexus\s[6])/i],[e,[C,"Motorola"],[s,A]],[/android.+\s(mz60\d|xoom[\s2]{0,2})\sbuild\//i],[e,[C,"Motorola"],[s,T]],[/\(dtv[\);].+(aquos)/i],[e,[C,"Sharp"],[s,N]],[/sie-(\w+)*/i],[e,[C,"Siemens"],[s,A]],[/(maemo|nokia).*(n900|lumia\s\d+)/i,/(nokia)[\s_-]?([\w-]+)*/i],[[C,"Nokia"],e,[s,A]],[/android\s3\.[\s\w;-]{10}(a\d{3})/i],[e,[C,"Acer"],[s,T]],[/android\s3\.[\s\w;-]{10}(lg?)-([06cv9]{3,4})/i],[[C,"LG"],e,[s,T]],[/(lg) netcast\.tv/i],[C,e,[s,N]],[/(nexus\s[45])/i,/lg[e;\s\/-]+(\w+)*/i],[e,[C,"LG"],[s,A]],[/android.+(ideatab[a-z0-9\-\s]+)/i],[e,[C,"Lenovo"],[s,T]],[/linux;.+((jolla));/i],[C,e,[s,A]],[/((pebble))app\/[\d\.]+\s/i],[C,e,[s,O]],[/android.+;\s(glass)\s\d/i],[e,[C,"Google"],[s,O]],[/android.+(\w+)\s+build\/hm\1/i,/android.+(hm[\s\-_]*note?[\s_]*(?:\d\w)?)\s+build/i,/android.+(mi[\s\-_]*(?:one|one[\s_]plus)?[\s_]*(?:\d\w)?)\s+build/i],[[e,/_/g," "],[C,"Xiaomi"],[s,A]],[/\s(tablet)[;\/\s]/i,/\s(mobile)[;\/\s]/i],[[s,R.lowerize],C,e]],engine:[[/windows.+\sedge\/([\w\.]+)/i],[S,[i,"EdgeHTML"]],[/(presto)\/([\w\.]+)/i,/(webkit|trident|netfront|netsurf|amaya|lynx|w3m)\/([\w\.]+)/i,/(khtml|tasman|links)[\/\s]\(?([\w\.]+)/i,/(icab)[\/\s]([23]\.[\d\.]+)/i],[i,S],[/rv\:([\w\.]+).*(gecko)/i],[S,i]],os:[[/microsoft\s(windows)\s(vista|xp)/i],[i,S],[/(windows)\snt\s6\.2;\s(arm)/i,/(windows\sphone(?:\sos)*|windows\smobile|windows)[\s\/]?([ntce\d\.\s]+\w)/i],[i,[S,I.str,M.os.windows.version]],[/(win(?=3|9|n)|win\s9x\s)([nt\d\.]+)/i],[[i,"Windows"],[S,I.str,M.os.windows.version]],[/\((bb)(10);/i],[[i,"BlackBerry"],S],[/(blackberry)\w*\/?([\w\.]+)*/i,/(tizen)[\/\s]([\w\.]+)/i,/(android|webos|palm\sos|qnx|bada|rim\stablet\sos|meego|contiki)[\/\s-]?([\w\.]+)*/i,/linux;.+(sailfish);/i],[i,S],[/(symbian\s?os|symbos|s60(?=;))[\/\s-]?([\w\.]+)*/i],[[i,"Symbian"],S],[/\((series40);/i],[i],[/mozilla.+\(mobile;.+gecko.+firefox/i],[[i,"Firefox OS"],S],[/(nintendo|playstation)\s([wids34portablevu]+)/i,/(mint)[\/\s\(]?(\w+)*/i,/(mageia|vectorlinux)[;\s]/i,/(joli|[kxln]?ubuntu|debian|[open]*suse|gentoo|(?=\s)arch|slackware|fedora|mandriva|centos|pclinuxos|redhat|zenwalk|linpus)[\/\s-]?([\w\.-]+)*/i,/(hurd|linux)\s?([\w\.]+)*/i,/(gnu)\s?([\w\.]+)*/i],[i,S],[/(cros)\s[\w]+\s([\w\.]+\w)/i],[[i,"Chromium OS"],S],[/(sunos)\s?([\w\.]+\d)*/i],[[i,"Solaris"],S],[/\s([frentopc-]{0,4}bsd|dragonfly)\s?([\w\.]+)*/i],[i,S],[/(ip[honead]+)(?:.*os\s([\w]+)*\slike\smac|;\sopera)/i],[[i,"iOS"],[S,/_/g,"."]],[/(mac\sos\sx)\s?([\w\s\.]+\w)*/i,/(macintosh|mac(?=_powerpc)\s)/i],[[i,"Mac OS"],[S,/_/g,"."]],[/((?:open)?solaris)[\/\s-]?([\w\.]+)*/i,/(haiku)\s(\w+)/i,/(aix)\s((\d)(?=\.|\)|\s)[\w\.]*)*/i,/(plan\s9|minix|beos|os\/2|amigaos|morphos|risc\sos|openvms)/i,/(unix)\s?([\w\.]+)*/i],[i,S]]},D=function(e,i){if(!(this instanceof D))return new D(e,i).get_result();var n=e||(window&&window.navigator&&window.navigator.userAgent?window.navigator.userAgent:""),o=i?R.extend(U,i):U;return this.get_browser=function(){var e=I.rgx.apply(this,o.browser);return e.major=R.major(e.version),e},this.get_CPU=function(){return I.rgx.apply(this,o.cpu)},this.get_device=function(){return I.rgx.apply(this,o.device)},this.get_engine=function(){return I.rgx.apply(this,o.engine)},this.get_OS=function(){return I.rgx.apply(this,o.os)},this.get_result=function(){return{ua:this.get_UA(),browser:this.get_browser(),engine:this.get_engine(),os:this.get_OS(),device:this.get_device(),cpu:this.get_CPU()}},this.get_UA=function(){return n},this.set_UA=function(e){return n=e,this},this.set_UA(n),this};function z(e){for(var i=e+"=",n=document.cookie.split(";"),o=0;o<n.length;o++){for(var r=n[o];" "==r.charAt(0);)r=r.substring(1);if(0==r.indexOf(i))return r.substring(i.length,r.length)}return""}function q(){return event&&event.preventDefault?event.preventDefault():window.event.returnValue=!1,!1}D.VERSION="0.7.10",D.BROWSER={NAME:i,MAJOR:"major",VERSION:S},D.CPU={ARCHITECTURE:L},D.DEVICE={MODEL:e,VENDOR:C,TYPE:s,CONSOLE:x,MOBILE:A,SMARTTV:N,TABLET:T,WEARABLE:O,EMBEDDED:"embedded"},D.ENGINE={NAME:i,VERSION:S},D.OS={NAME:i,VERSION:S},String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")});function H(){}function X(e){var i=server.LinkedME_LIVE_URL+"/js/record_id",n="app_id="+e.app_id+"&identity_id="+e.identity_id+"&is_valid_identityid="+e.is_valid_identityId+"&browser_fingerprint_id="+e.browser_fingerprint_id+"&deeplink_id="+e.deeplink_id+"&is_pc_scan=false";server.XHR_async(i,n,"POST",null,function(e,i){},null)}function j(e,i){h(event,e);var n=new D,o=n.get_browser(),r=n.get_OS(),t=n.get_device(),s=server.LinkedME_LIVE_URL+"/sdk/click?uri="+e+"&os="+r.name+"&os_version="+r.version+"&browser_name="+o.name+"&browser_major="+o.major+"&device_model="+t.model;if("UCBrowser"==o.name&&(s=server.LinkedME_LIVE_URL+"/sdk/click?uri="+e+"&os="+r.name+"&os_version="+r.version+"&browser_name=QQ&browser_major="+o.major+"&device_model="+t.model),i&&(s+="&scan=1"),"ios"==r.name.toLowerCase()&&"micromessenger"==o.name.toLowerCase()){if((a=server.XHR_sync(s,null,"get",null,function(e,i){})).err_code||!a.has_android)return;X(a)}if("Android"==r.name)try{var a;if((a=server.XHR_sync(s,null,"get",null,function(e,i){})).err_code||!a.has_android)return;if(0<="MicroMessenger,baidubrowser".toLowerCase().indexOf(o.name.toLowerCase())){var d=a.deeplink_name,l=a.android_uri_scheme,c="link.linkedme.cc";0<=o.name.toLowerCase().indexOf("baidubrowser")&&(c="127.0.0.1");var u=a.us_port,w=(new Date).getTime(),m=encodeURIComponent(l+"://linkedme?click_id="+d+"&lkme=1")+"&lm_timestamp="+w;if(u&&c){var p=u.split(",");if(p&&0<p.length)for(var f=0;f<p.length;f++){var _="http://"+c+":"+p[f]+"/lkme?android_scheme="+m;server.XHR_async(_,null,"get",null,function(e,i){})}}}if("weibo"!=o.name.toLowerCase()&&"micromessenger"!=o.name.toLowerCase()){if(a.android_direct_open)return a.android_custom_url.endsWith(".apk")&&X(a),window.location=a.android_custom_url,q();switch(o.name){case"Chrome":!function(e,i){var n=(new Date).getTime(),o=e.android_uri_scheme+"://linkedme?click_id="+e.deeplink_name+"&lkme=1&r="+n,r="intent://linkedme?click_id="+e.deeplink_name+"&lkme=1#Intent;scheme="+e.android_uri_scheme+";package="+e.android_package_name+";end",t="market://details?id="+e.android_package_name;if(i<37||40==i)window.location=r;else if(37<=i&&i<=41&&39!=i)window.open(o,"_blank").close(),setTimeout(function(){document.hasFocus()&&(X(e),"app_store"==e.download_way?window.location=t:"download_page"==e.download_way&&(window.location=e.android_custom_url))},1e3);else if(39==i||41<i)if("app_store"==e.download_way)window.location=o,setTimeout(function(){document.hasFocus()&&(X(e),window.location=t)},1e3);else if("download_page"==e.download_way){var s=server.LinkedME_LIVE_URL+"/js/record_id_and_redirect?app_id="+e.app_id+"&identity_id="+e.identity_id+"&is_valid_identityid="+e.is_valid_identityId+"&browser_fingerprint_id="+e.browser_fingerprint_id+"&deeplink_id="+e.deeplink_id+"&url="+e.android_custom_url;s=encodeURIComponent(s);var a=r.substring(0,r.length-3)+"S.browser_fallback_url="+s+";end";window.location=a}}(a,o.major);break;case"QQ":case"QQBrowser":!function(e){var i=(new Date).getTime(),n=e.android_uri_scheme+"://linkedme?click_id="+e.deeplink_name+"&lkme=1&r="+i,o="market://details?id="+e.android_package_name;window.location=n;var r=setTimeout(function(){X(e),"app_store"==e.download_way?window.location=o:"download_page"==e.download_way&&(window.location=e.android_custom_url)},500);document.addEventListener("webkitvisibilitychange",function(){document.webkitHidden&&clearTimeout(r)},!1)}(a);break;default:!function(e){var i=(new Date).getTime(),n=e.android_uri_scheme+"://linkedme?click_id="+e.deeplink_name+"&lkme=1&r="+i,o="market://details?id="+e.android_package_name;window.location=n;var r=setTimeout(function(){X(e),"app_store"==e.download_way?window.location=o:"download_page"==e.download_way&&(window.location=e.android_custom_url)},2e3);document.addEventListener("webkitvisibilitychange",function(){document.webkitHidden&&clearTimeout(r)},!1)}(a)}q()}}catch(e){console.log(e)}}H.prototype.XHR_async=function(e,i,n,o,r,t){var s=window.XMLHttpRequest?new XMLHttpRequest:new ActiveXObject("Microsoft.XMLHTTP");s.withCredentials=!0,s.ontimeout=function(){r("timeout",null,504)},s.onerror=function(e){r(e.error||"Error in API: "+s.status,null,s.status)},s.onreadystatechange=function(){var i;if(4===s.readyState)if(200===s.status){if(t)i=s.responseText;else try{i=JSON.parse(s.responseText)}catch(e){i={}}r(null,i,s.status)}else 402===s.status?r("Not enough credits to redeem.",null,s.status):"4"!==s.status.toString().substring(0,1)&&"5"!==s.status.toString().substring(0,1)||r("Error in API: "+s.status,null,s.status)};try{s.open(n,e,!0),s.timeout=this.TIMEOUT,i?(s.setRequestHeader("Content-Type","application/x-www-form-urlencoded"),s.send(i)):s.send()}catch(e){console.log(e)}},H.prototype.XHR_sync=function(e,i,n,o,r,t){var s=window.XMLHttpRequest?new XMLHttpRequest:new ActiveXObject("Microsoft.XMLHTTP");s.withCredentials=!0,s.onerror=function(e){r(e.error||"Error in API: "+s.status,null,s.status)};try{if(s.open(n,e,!1),i?(s.setRequestHeader("Content-Type","application/x-www-form-urlencoded"),s.send(i)):s.send(),200===s.status){if(t)i=s.responseText;else try{i=JSON.parse(s.responseText)}catch(e){i={}}r(null,i,s.status)}else 402===s.status?r("Not enough credits to redeem.",null,s.status):"4"!==s.status.toString().substring(0,1)&&"5"!==s.status.toString().substring(0,1)||r("Error in API: "+s.status,null,s.status);return i}catch(e){console.log(e)}},H.prototype.LinkedME_LIVE_URL="https://lkme.cc/i",window.server=new H;function V(){}var B=!1;V.prototype.DEBUG=0,V.prototype.TIMEOUT=5e3,V.prototype.LinkedME_KEY="",V.prototype.LinkedME_SESSION_ID="",V.prototype.version="1.0.4",V.prototype.trigger_deeplink=j,V.prototype.init=function(e,i,n){this.DEBUG&&console.log("linkedme.init()"),null!=(i=i||{}).type&&null!=i.type||(i.type="live");var o=server.LinkedME_LIVE_URL+"/sdk/webinit";if(this.LinkedME_SESSION_ID&&this.LinkedME_KEY==e){var r=z("identity_id");null!=n&&n(null,{identity_id:r,session_id:this.LinkedME_SESSION_ID},null)}else{this.LinkedME_KEY=e;var t=this;server.XHR_async(o+"?linkedme_key="+e+"&type="+i.type,null,"get",null,function(e,i){t.LinkedME_SESSION_ID=i.session_id,document.cookie="identity_id="+i.identity_id,null!=n&&n(e,i),function(){var e=document.querySelectorAll("body>*:not(script):not(style)");Array.prototype.map.call(e,function(e,i,n){e.addEventListener("click",h)})}(),B=!0},null)}},V.prototype.link=function(s,a,d,l){s=s;var c=this,u=0,w=setInterval(function(){if(1==B){clearInterval(w),u++,l=null==l||l,this.DEBUG&&console.log("linkedme.link()");var e=server.LinkedME_LIVE_URL+"/sdk/url";if(null==d&&(d=!1),(s=s||{}).linkedme_key=c.LinkedME_KEY,s.session_id=c.LinkedME_SESSION_ID,s.identity_id=z("identity_id"),s.params&&""!==s.params.trim())try{var i="string"==typeof s.params?JSON.parse(s.params):s.params;s.params={},s.params.$control=i,s.params.$og_title="DetailViewController",s.params=JSON.stringify(s.params)}catch(e){return alert("params鐨凧SON鏁版嵁鏍煎紡鏈夎, 鎻愮ず:JSON鏍煎紡鐨刱ey鍜寁alue鐢ㄥ弻寮曞彿鎷捣鏉�!"),void a("params鐨凧SON鏁版嵁鏍煎紡鏈夎, 鎻愮ず:JSON鏍煎紡鐨刱ey鍜寁alue鐢ㄥ弻寮曞彿鎷捣鏉�!",{url:null})}else s.params="{}";null!=s.type&&null!=s.type||(s.type="live"),s.source="Web",s.sdk_version="web1.0.2",s.timestamp=+new Date,s.sign="",s.h5_url=window.location.href,s.deeplink_md5=k(s.linkedme_key.trim()+"&"+s.tags+"&"+s.channel+"&"+s.feature+"&"+s.stage+"&"+s.params);var n=s.linkedme_key.trim().split("_");3==n.length&&(s.linkedme_key=n[2]),s.tags=null==s.tags||null==s.tags?"":s.tags,s.channel=null==s.channel||null==s.channel?"":s.channel,s.feature=null==s.feature||null==s.feature?"":s.feature,s.stage=null==s.stage||null==s.stage?"":s.stage,"live"==s.type?s.deeplink_md5_new=k(s.linkedme_key.trim()+"&"+s.tags+"&"+s.channel+"&"+s.feature+"&"+s.stage+"&"+s.params):"test"==s.type&&(s.deeplink_md5_new=k(s.linkedme_key.trim()+"&"+s.tags+"&"+s.channel+"&"+s.feature+"&"+s.stage+"&"+s.params+"&test"));var o=new D;s.os=o.get_OS()?o.get_OS().name:"";var r=[];for(var t in s)r.push(encodeURIComponent(t)+"="+encodeURIComponent(s[t]));if(!l)return void server.XHR_sync(e,r.join("&"),"post",null,a);server.XHR_async(e,r.join("&"),"post",null,function(e,i){if(e)a(e,i);else if(i.err_code)a(e,i);else{d&&(window.location=i.url),a(e,i);for(var n=document.getElementsByClassName("linkedme"),o=0;o<n.length;o++)n[o].addEventListener("click",function(){j(i.url)})}})}else 30<u&&(clearInterval(w),console.log("娣卞害閾炬帴鍒濆鍖栧け璐�"))},100)},V.prototype.close=function(e){this.DEBUG&&console.log("linkedme.close()"),null!=(e=e||{}).type&&null!=e.type||(e.type="live"),e.linkedme_key=this.LinkedME_KEY,e.session_id=this.LinkedME_SESSION_ID,e.identity_id=z("identity_id"),e.timestamp=+new Date;var i=[];for(var n in e)i.push(encodeURIComponent(n)+"="+encodeURIComponent(e[n]));var o=server.LinkedME_LIVE_URL+"/sdk/webclose";server.XHR_async(o,i.join("&"),"post",null,function(e,i){})},window.linkedme=new V,window.onbeforeunload=function(){linkedme.close(null)}}();
    
    展开全文
  • H5页面(vue项目)使用LinkedME实现唤起APP的功能 最近开发的混合app要做个分享的功能,需要实现在微信或者qq打开app分享出去的链接能够直接调起手机的app,所以用了LinkedME来实现h5页面唤起app的功能 LinkedME官网...

    最近开发的混合app要做个分享的功能,需要实现在微信或者qq打开app分享出去的链接能够直接调起手机的app,所以用了LinkedME来实现h5页面唤起app的功能
    LinkedME官网就有js集成的文档,按照那个步骤来就可以实现,详情见:官网
    但因为我的项目是vue的,所以封装了下来实现这个功能

    1.在index.html中引入 JS SDK

    <script src="https://static.lkme.cc/linkedme.min.js" ></script>
    

    因为它这个js sdk会不定时的更新,建议直接引用线上的版本

    2.创建linkedme.js

    在这里插入图片描述
    在你的项目里面创建linkedme.js,以下是封装的代码

    let LinkedME_KEY = ''		//这是你在官网网站注册账号,创建应用后生成的LinkedME Key
    let linkedmeType = "live";
    let defaultData = {};
    defaultData.type = linkedmeType; //线上模式,填写"test"表示测试模式.【可选】
    //这些参数在官网上都有详细的说明
    defaultData.feature = "功能名称"; 
    defaultData.stage = "阶段名称"; 
    defaultData.channel = "渠道名称"; 
    defaultData.tags = "标签名称"; 
    defaultData.ios_custom_url = ""; 
    defaultData.android_custom_url = ""; 
    
    // 下面是自定义深度链接参数,用户点击深度链接打开app之后,params参数将被带入app,你可以通过这些参数跳到app里对应的页面
    export default function(obj) {
        if (window.linkedme.LinkedME_KEY !== LinkedME_KEY) {
            window.linkedme.init(LinkedME_KEY, { type: linkedmeType }, null);
        }
        obj = obj || {}
        let str = '';
        for (let k in obj) {
            str += `"${k}":"${obj[k]}",`
        }
        str = str.slice(0, -1)
        let params = `{${str}}`
        return new Promise((resolve, reject) => {
            window.linkedme.link({
                ...defaultData,
                ... { params: params },
            }, function(err, data) {
                if (err) {
                    console.log(err)
                    reject(err)
                } else {
                    /*
                     生成深度链接成功,深度链接可以通过data.url得到,
                     将深度链接绑定到<a>标签,这样当用户点击这
                     个深度链接,如果是在pc上,那么跳转到深度链接二维
                     码页面,用户用手机扫描该二维码就会打开app;如果
                     在移动端,深度链接直接会根据手机设备类型打开ios
                     或者安卓app
                     */
                    resolve(data)
                }
            }, false);
    
        });
    }
    

    3.在页面引入linkedme.js

    <template>
      <div class="share-header">
          <a class="open" :href="hrefUrl" id=“open_header”>
              打开
          </a>
      </div>
    </template>
    
    <script>
    import linkedmeLink from '@/utils/libs/linkedme';
      export default {
        name: "share-header",
        data() {
            return {
                hrefUrl:''
            }
        },
        mounted() {
            linkedmeLink({
            //这里面传你要携带的自定义参数
    			id: '',
    			type: ''
    		}).then(res => {
                this.hrefUrl = res.url;
                //后面他们官方文档添加了trigger_deeplink
                //分享个做ios时遇到的问题,ios版分享的时候点击外链会先跳到APP store,然后再手动点击打开APP,这样整个跳转的流程就多了一步,后面和客户端的小伙伴研究了好久还和linked me的研发人员沟通才发现他们的文档后续做了更新,在生成url的时候除了给a标签赋值href外还要给a标签添加addEventListener来调用linkedme.trigger_deeplink方法
                var open_header= document.getElementById("open_header");
                open_header.addEventListener("click",function(){
                    linkedme.trigger_deeplink(res.url);
                })
            });
        },
        methods: {
          
        }
      }
    
    展开全文
  • 开始之前,我们先介绍两个概念:深度链接(Deep Linking)和延迟深度链接(Deferred Deep Linking)。 深度链接 我们通过例子来说明这个问题,比如说我们使用淘宝,看到一个宝贝很不错,这时候呢我们会将宝贝的...

    开始之前,我们先介绍两个概念:深度链接(Deep Linking)和延迟深度链接(Deferred Deep Linking)。
    深度链接
    我们通过例子来说明这个问题,比如说我们使用淘宝,看到一个宝贝很不错,这时候呢我们会将宝贝的信息分享到朋友圈或者分享给朋友,我们的朋友点击,在Android M系统之前呢一般会打开一个H5界面,界面中会有一个按钮(像“打开手机淘宝”),如果手机上有淘宝的话会打开手机淘宝,而深度链接呢,不但要打开手机淘宝,还要跳转到手机淘宝中该宝贝的展示界面。如果是Android M系统中,就不需要再打开一个H5界面而是可以点击链接直接打开手机淘宝,因为Android M引入了App Links功能。
    延迟深度链接
    在深度链接的基础上,并且手机上没有指定的App,需要下载、安装之后,在定位到App中特定的界面。
    App Links
    我们都知道从Android M(6.0)开始,Android系统实现了App Links功能:在系统中点击URL会定位到指定的App进行处理,而不是像以前一样打开浏览器。想了解App Links的具体实现可以参考下面这篇文章:
    Android M App Links: 实现, 缺陷以及解决办法
    为了实现App Links,需要我们做如下配置:
    1、我们需要在AndroidManifest.xml进行配置,如下:

    <activity  
      android:name="com.your.app.activity.ParseDeepLinkActivity"
      ...>
    
      <intent-filter android:autoVerify="true">
        <data android:scheme="http" android:host="yourdomain.com" />
        <data android:scheme="https" android:host="yourdomain.com" />
        ...
      </intent-filter>
    </activity>

    这里配置的意思是,如果在系统中点击“http[s]://youdomain.com”开头的URL,系统会打开该activity进行处理。前提是通过验证,验证什么呢,客观莫着急,我们下边会解释。android:autoVerify就是用来开启验证的,data是用来配置我们处理什么样的URL.
    2、验证:当你请求成为某URL的默认处理App的时候,系统回去验证,URL所属的站点是否同意你来处理。系统会去站点的该地址https://yourdomain.com/.well-known/statements.json取一个文件,如果文件存在,并且通过验证的话,以后在系统中,你的App就会成为此URL的默认处理App。statements.json的格式为下:

    [{
      "relation": ["delegate_permission/common.handle_all_urls"],
      "target": {
        "namespace": "android_app",
        "package_name": "com.mycompany.myapp",
        "sha256_cert_fingerprints": ["6C:EC:C5:0E:34:AE....EB:0C:9B"]
      }
    }]

    “package_name”填写你App的包名;”sha256_cert_fingerprints”你App签名文件的SHA256指纹.TIPS:现在Android验证的时候,只支持https协议
    LinkedME
    从上边的介绍大家应该都对App Links有了一定的了解,App Links具有一定的局限性:
    (1)App Links只能在Android M以上使用;
    (2)你得有自己的Web站点,并且Web站点支持Https协议
    LinkME之类的服务可以帮助我们快速搭建深度链接,下边是个人分析的LinkME原理:
    原理图

    展开全文
  • Core Spotlight和深度链接结合使用(下)

    千次阅读 2016-08-11 10:03:19
    上篇文章中我们已经说了Spotlight的创建和使用了,这篇文章着重说怎么创建深度链接,深度链接(Universal links)怎么和Spotlight结合使用。
  • LinkedME——国内首家企业级深度链接服务提供商,致力于帮助APP解决用户增长(拉新、拉活、留存、转化等)和流量变现等问题。 LinkedME,企业级深度链接(Deep Linking)服务平台 https://www.linkedme.cc/
  • linkedMe JS-SDK集成 //导入LinkedME JS SDK &lt;script src="https://static.lkme.cc/linkedme.min.js"&gt;&lt;/script&gt; var videotype = res.data.videotype; var videoid = res....
  • 从Android 6.0开始,Android又增加了一种更加直接的方式来打开应用——App Links,该技术可以通过一个链接直接打开应用,不再需要浏览器的协助。
  • H5(vue)页面中尝试调起APP

    千次阅读 2017-12-29 11:29:03
    H5(vue)页面中尝试调起APP
  • 命令

    2019-09-30 02:09:28
    sudo su linkedmelinkedme用户的权限进行操作 scp linkedme.war bofeng@10.11.11.188:~ 远程传文件 mvn clean install -Dmaven.test.skip=true -P dev 打成war包 转载于:...
  • 作者 si1ence 关注 2017.03.14 18:51* 字数 2500 阅读 589评论 4喜欢 29 ...以后不做标题党了,感觉现在越来越多的技术文章题目屌炸天,内容空泛没有干货,甚至好多把官方文档摘过来,还摘得不全,简直是...
  • 深度链接(Universal links)怎么和Spotlight结合使用,在这里就不过多赘述什么是深度连接了,在文末提供了几篇文章供大家参考,以及国内成熟的深度链接(Universal links)技术服务商LinkedME。可以与iOS9 s...
  • 当下,几乎每个App,都可以通过微信分享内容给朋友,于是有大量的流量,停留在了微信端。那么如何才能让这部分流量高效的回流到App内呢?今天我们来聊聊【微信分享页面跳回App的小按钮】的那些小事(重头戏在文末,...
  • 题目: 合并k个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。 示例: 输入: [ ...实现方法其实和普通的归并排序差不多,最大的区别是这里我们每一次合并只需要处理两个链表就行了。...
  • 自己留存的一些东东

    2017-05-09 16:51:03
    // 获取连接WiFi的 ssd - (id)fetchSSIDInfo {  NSArray *ifs = (__bridge_transfer id)CNCopySupportedInterfaces();  NSLog(@"Supported interfaces: %@", ifs);  id info = nil;... for (NSString
1 2 3 4 5
收藏数 99
精华内容 39
关键字:

linkedme