2017-02-24 15:39:29 Keep_Dream 阅读数 2321
详细的介绍可以在网上查询,这里简单说一下.这项技术主要是为了方便广告跳转而产生的.最大的例子就是淘宝,天猫,京东等购物APP.在第三方APP中点击广告链接直接跳转到对应的客户端的商品的详情中,节省用户的时间,一步到位.

2.自己APP实现deeplink需要的准备工作

通过Xcode添加URL Scheme跳转,操作步骤如下:
第一步找到URL Types的添加处:TARGETS-info-Url types.
第二步点击加号 添加Url Schemes 添加为当前APP的标识(bundle ID),为了第三方APP跳转

3.iOS端具体的实现过程

在Appdelegate.m中找到如下方法
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
此方法的作用就是在当前APP是其他APP通过URL打开时便会调用.在此处解析URL便可实现跳转到指定页面的需求 也就是deeplink技术
以下为淘宝给出的URL规范,用来调用淘宝客户端的
    宝贝详情 taobao://item.taobao.com/item.htm?id=12688928896
    宝贝搜索 taobao://s.taobao.com/?q=iphone
    店铺搜索 taobao://shopsearch.taobao.com/browse/shop_search.htm?q=iphone
首先,需要定制好跳转协议的格式 当前我们就是使用最简单的跳转协议.
com.deeplink://deeplink.htm?id=123456
com.deeplink 代表就是我们第2步时设置的 Url Schemes
deeplink.htm 可以设置为区别当前要跳转的页面的一个字符串
id=123456    一般代表页面的ID 用来请求数据
其次,便是在打开APP时获取到这个跳转协议,取出其中的值
    NSString *scheme = [url scheme];
    NSString *host = [url host];
    NSString *query = [url query];
之后便是判断,拿出需要的id进行跳转
if (scheme && [scheme isEqualToString:@"com.deeplink"]) {
    NSString *typeStr = [host componentsSeparatedByString:@"."].firstObject;
    if (typeStr && [typeStr isEqualToString:@"deeplink"]) {
//判断了当前要跳转的页面是和我们设置的 deeplink 标识有关的页面
        NSString *idStr = [query componentsSeparatedByString:@"="].lastObject;
        NSDictionary *dict = @{@"type":@"1",@"id":idStr};
说明:如果当前APP架构 window的rootController为Navigationcontroller的话变在此处取得window的rootcontroller进行跳转,由于我司项目根控制器是Tabbar所以无法直接实现push
可以参考我使用发送通知给主页控制器,然后通过主页控制器进行跳转.
值得注意的是 关于这个GCD延迟1秒执行的必要性.实验证明,如果不加,如需要被打开的APP不是处于后台活跃状态,那么将无法进行跳转,原因是因为并没有发送通知.
解决方法也是参考淘宝的跳转,在打开淘宝客户端后会有一定延迟才跳转到对应的商品页面.
关于接收到通知之后的跳转逻辑这里就不贴出代码了.
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

                [[NSNotificationCenter defaultCenter] postNotificationName:@"DEEPLINK" object:nil userInfo:dict];
            });      

4.怎么使用协议跳转

NSString *urlString = @"com.deeplink://deeplink.htm?id=123456";
if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:urlString]]) {
    //若安装了需要跳转的app->跳转到APP
    NSURL * url = [NSURL URLWithString:[urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
    [[UIApplication sharedApplication] openURL:url];
}else{
    //若未安装需要跳转的app->跳转到APP的下载界面
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"itms-apps://itunes.apple.com/cn/app/appname/id1070087534?mt=8"]];
    //或者直接显示web端的页面
}
DeepLink
2018-02-01 15:32:40 qq_27070117 阅读数 306

DeepLink(APPLink)技术——通过网页打开APP任意Activity

  由于工作要求, 非要搞什么深度链接, 在百度的帮助下花了半小时搞明白了DeepLink是什么, 怎么用, 能做什么.
  那么, DeepLink是什么呢? 其实说白了, 就是可以通过一个网页链接来打开APP中某一界面的技术, 没错, 就是通过链接来打开APP. 那么要怎么做呢? 首先要在想要被打开的activity的清单文件中注册一个意图过滤器:
Manifast
  如上图所示,其中action 和两个 category 是固定不变必须要加的, 特别是 BROWSABLE这个 category, 不加入这个就不能再浏览器中打开APP.

<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>

  然后就是data节点了, 上图的data节点对应demo://www.open.com:8080这个链接, 这个data就是用来匹配具体应用的, data节点中还可以加入path属性, 如果加了该属性(例如:android:path="\aaa")要匹配到APP就需要在链接的端口号后边加\aaa, 需要注意的是, 清单文件 data节点path属性必须要以\开头. 当然host port path属性都可以不加, 仅仅有scheme也是可以匹配到应用的, 当然, 你需要保证自己的scheme是手机APP中唯一的.
  还有一个地方需要注意, 就是如果把链接 demo://www.open.com:8080直接复制到浏览器中, 你会发现其实并不能打开APP, 这是因为浏览器检测到你的链接不是以http开头所以自动识别进行搜索, 所以需要写一个简单的html页面来进行测试:
比如这个:

<html>
  <head>
    <meta charset="UTF-8">
    <title>Test</title>
    <link href="/style.css" rel="stylesheet" type="text/css" media="all">
  </head>
  <body>
<a href="demo://www.open.com:8080/open?activity=com.eshel.chat.deeplink.LoginActivity">open</a>
  </body>
</html>

复制上述html代码, 新建文本文件, 粘贴并修改链接后改后缀为.html, 之后选择打开方式为浏览器, 点击open按钮就可以测试了.
  如果上述步骤都执行完, 那么应该可以通过DeepLink打开 APP了, 但是又有一个问题来了, 怎么才能打开app中任意界面呢? 难道每个activity都要加意图过滤器, 然后先不管这个问题, 我在想假如链接后边有参数, 那么会传到被打开的activity中呢?
  这个是我测试用的链接:demo://www.open.com:8080/open?activity=com.eshel.chat.deeplink.LoginActivity, 下边截图是测试结果:

Intent

点击链接后我在 MainActivity中 getIntent().tostring 设置到textview上, 可以看出其中dat部分就是我的链接, 那么dat是什么呢? 既然结果是通过toString方法得到的, 那么先看下intent的toString方法:
这里写图片描述
可以看出, toString的实现其实都是在toShortString里. 那么再来看下toShortString:
这里写图片描述
终于看到dat中的url是mData toString得到的, mData是什么呢? 再来看一个方法:
这里写图片描述
通过getData方法可以看出mData是个Uri, 那么这个mData应该就是对应的是清单文件中的data节点了, 通过代码提示和文档注释可以找到Uri中有方法来获取’?’后边的参数, 代码如下:

        setContentView(R.layout.activity_main);
        mTest = findViewById(R.id.test);
        Intent intent = getIntent();
        if(intent != null){
            mTest.setText(intent.toString());
            try {//com.eshel.chat.deeplink.LoginActivity
                String parameter = intent.getData().getQueryParameter("activity");
                Class<?> aClass = Class.forName(parameter);
                if(aClass != null){
                    Intent intent1 = new Intent(this,aClass);
                    startActivity(intent1);
                    finish();
                }
//              mTest.setText(path);
            }catch (Exception e){
                e.printStackTrace();
            }catch (Error e){
                e.printStackTrace();
            }
        }

获取到URL中的参数, activity的值, 并通过反射尝试找到那个类, 如果存在则跳转, 当然千万不要忘记try catch. 通过这种方法就可以在URL中指定任意存在的activity并进行跳转了.
  现在又有一个问题了, 虽然已经可以打开任意activity了, 但有的 activity 是依赖一些参数的, 它们在创建的时候 通常会通过 getIntent().getStringExtra("aaa")等方法从上个activity获取一些数据, 那么从链接跳转到该activity并没有携带extra的数据, 怎么办呢? 很简单, 在参数后拼接一个参数extra, 最好是一个json数组, 然后在代码中获取到该数据, 转换json格式并遍历, 通过循环进行putExtra到intent中, 这样就可以在把参数传递到actvity中了, 当然如果需要传递一个对象的话我就帮不了你了, 这种方式只能传递基本数据类型, 如果要传递javabean对象可以自己定义格式写代码解析json, 并通过反射或者gson框架将json转成javabean对象, 具体怎么搞这里就不再说了, 感兴趣的可以自己操作试试.

2015-07-09 18:32:26 piratest 阅读数 13604

Update: 2017.04.08 增加了使用iOS DeepLinkKit使用Universal Links的部分

---------------------------------------------------------

废话不多说,先说做这个的需求:

1.应用中有些社交元素的分享会分享一个链接到facebook, twitter, google+这类的社交媒体上

2.当用户点击某个链接的时候先跳转到自己的页面,然后再传递参数到iOS应用上打开指定的分享数据


思路:iOS提供了Scheme这个东西可以从浏览器或者其他应用跳转到自己的应用,查询scheme相关的内容。在大概了解了Scheme机制之后在github上找到DeepLinkKit这个第三方组件。


使用如下:

1.在plist中添加一个URL Type, 比如URL Schemes叫com.test.test

2.在AppDelegate 中添加如下代码:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    router = [[DPLDeepLinkRouter alloc] init];
    
    //浏览器调用url: "com.test.test://L/aa/123/456", 这样bb取到123, cc取到456
    router[@"/aa/:bb/:cc"] = ^(DPLDeepLink *link) {
        NSLog(@"----------DeepLink: %@, %@----------", link.routeParameters[@"bb"], link.routeParameters[@"cc"]);
    };
}

3.在AppDelegate 中添加如下代码:
- (BOOL)application:(UIApplication *)application
            openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication
         annotation:(id)annotation {
    BOOL success = [router handleURL:url withCompletion:nil];
    return success;
}

4.将应用退到后台,在浏览器中输入com.test.test://L/aa/123/456,这里router的block会生效。


解释一下,这里L是DeepLinkKit这个组件需要的,但内容可随便输入,总之在host之前必须要有一个字段。aa是DeepLinkKit中提到的host,这个要跟router注册时的字符一样。其他不必解释了。

用下来,DeepLinkKit还是比较简单的,但文档写得比较不好,我看了好久代码,其中研究他的demo帮助最大。

希望对需要做深度链接的同学有帮助,有任何问题,请在这里留言,我们一起交流。谢谢!


-------------------------

Update: 2017.04.08

从iOS 9.2开始加入了Universal Links机制来进一步加强应用间跳转相关的功能,关于这方面的内容推荐阅读一下Deferred Deep Linking in iOS ,这篇文章对Deep Linking的两种方式有很详细的讲解,你不可错过,我就不搬运过来了。

使用iOS DeepLinkKit要支持Universal Links,首先你要在你官网的根目录下放一个JSON文件,前面提到的网页里面都有详细的讲述。

在做好这些前期准备后,你需要将以下代码加入到你的项目里面:

- (BOOL)application:(UIApplication *)application
        continueUserActivity:(NSUserActivity *)userActivity
          restorationHandler:(void (^)(NSArray *))restorationHandler {

    return [self.router handleUserActivity:userActivity withCompletion:NULL];
}


另外,因为我有比较多的类似于收集效果之类的需求,很早之前就开始使用Branch了,这个用起来也不错,不过官方的文档也全是英文的,目前还没有比较好的中文使用简介,可能对一些对自己的英文能力不够自信的朋友会造成压力,有时间我整理一份中文的使用简介出来吧。



2018-06-20 17:06:22 yingaizhu 阅读数 4191

Deeplink启动应用配置注意事项

1. Deeplink格式说明

  Deeplink是目前使用广告跟踪非常热门的一种方式,Deeplink的链接类型一般是schema://host/path?params样式。

2. 为接收Deeplink配置intent-filter

  在Android设备中,点击Deeplink后可以打开指定应用,为了能够正确定位到需要打开的应用,并正确打开指定的Activity,需要应用开发过程中对Intent进行过滤接收进行配置(就是intent-filter),具体做法是在AndroidManifest.xml中对Activity声明的时候添加<intent-filter><data>节点,配置schema和一些必要的区分属性参数(如:hostpath等)即可,配置的属性参数越多越详细,越能保证唯一性,准确打开需要打开的应用,而不是弹出打开应用选择框。

<intent-filter>标签包含以下属性

  • 动作:外部打开必须配置成ACTION_VIEW,这样外部的打开指令才能到达;
  • 范畴:必须包含DEFAULT,这个category允许你的Activity可以接收隐式Intent,如果没有配置这个,Activity只能通过指定应用程序容器名称打开;也必须包含BROWSABLE,这个category允许你的intent-filter可以在Web浏览器中访问,如果没有配置这个,点击Web浏览器中的Deeplink链接将无法解析并打开Activity;
  • 数据:需要添加一个或者多个<data>标签,每一个<data>标签都描述了什么样格式的URI将会分派到Activity进行处理。每一个<data>标签至少且必须包含一个android:schema属性。
    你可以添加更多的属性来提高Activity所能接收的URI类型的精准度。举个例子:你的应用会在多个activity中接收类似的URI(相同的schemahost),但这些URI根据有这不同的路径(path),在这种情况下,使用android:path属性,或者使用路径正则表达式(pathPattern)和路径前缀(pathPrefix)变种来区分对于不同的路径,系统需要打开哪个Activity。

测试的Deeplink链接:rsdkdemo://rs.com/test?referer=Deeplink_Test

Activity的配置intent-filter如下:

<activity
    android:name="com.rastargame.sdk.oversea.demo.RSDemoActivity"
    android:configChanges="orientation|keyboardHidden|navigation|screenSize"
    android:launchMode="singleTop"
    android:screenOrientation="sensor"
    android:theme="@android:style/Theme.Holo.Light.NoActionBar.Fullscreen">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="rsdkdemo"
            android:host="rs.com"
            android:pathPrefix="/test"/>
    </intent-filter>
</activity>

说明:
1.<data>中的属性参数配置必须要根据Deeplink来配置,尽可能配置更多属性参数保证唯一,否则点击deeplink连接会出现选择打开应用页面。
2.如果需要在浏览器中也能打开应用,需要在intent-filter中添加<category android:name="android.intent.category.BROWSABLE" />这个配置(这个属性的含义就是在特定的情况下,可以在浏览器中打开Activity)

3. intent-filter配置注意事项

  1. 在有<action android:name="android.intent.action.MAIN" /><intent-filter>中添加<data>标签配置会无法通过Deeplink正确打开相应页面。一个Activity是可以有多个<intent-filter>标签,所以添加另外的<intent-filter>标签进行配置;
  2. <category android:name="android.intent.category.LAUNCHER" /><category android:name="android.intent.category.DEFAULT" />两个是相互冲突的,同时添加这两个category会导致桌面图标无法显示的问题;

说明:如果你添加<intent-filter>Activity不包含android.intent.action.MAIN<action>标签,就无需配置多个intent-filter

4. Deeplink数据解析

  点击Deeplink打开应用的时候,会将Deeplink传入到应用,应用在Activity的onCreateonNewIntent对数据就进行处理。

5. Deeplink测试

  直接使用命令行adb测试deeplink,使用命令:

adb shell am start -a android.intent.action.VIEW -d "rsdkdemo://rs.com/test?referer=Deeplink_Test"
  1. 首先,需要编写一个简单的html文件,保存为test.html,html文件内容如下:
<!DOCTYPE html>
<head>
    <meta charset="UTF-8" />
    <meta id="viewport" name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,minimal-ui">
</head>
<html>
    <input type="button" value="点击我打开Deeplink" onclick="javascrtpt:window.location.href='rsdkdemo://rs.com/test?referer=Deeplink_Test'">
</html>
  1. 然后将html文件拷贝到设备中,使用浏览器打开,点击按钮即可打开应用。

  测试Facebook deeplink需要集成Facebook SDK,然后完成相应的配置,然后通过广告助手测试DeepLinked,测试设备上必须安装了Facebook客户端,并且登录了开发者账号对应的Facebook账号。

2017-06-08 11:27:07 Newsolider2012 阅读数 3375

一、引言

在做安卓项目时,如果遇到需要把项目中的商品连接分享到微信或者微博,然后通过点击连接地址到对应app的相关页面中,这时就需要使用Android的deepLink技术。

二、集成步骤

原理:主要利用的是Intent的隐式机制

1.在对应项目的启动页面的AndroidManifest文件中添加如下的隐式过滤

<activity android:name=".WelcomeActivity">
    ......
  <intent-filter>
      <action android:name="android.intent.action.VIEW"/>
      <category android:name="android.intent.category.DEFAULT"/>
      <category android:name="android.intent.category.BROWSABLE"/>
      <data 
          android:scheme="com.zjbl.stock"
       />
  </intent-filter>
</activity>
对这一部分的解释

对于熟悉隐式Intent的部分,这部分代码应该不难理解。这里我们新增了一个标签,在里面加入了action,

category和data三部分内容。其中action和category部分要固定写成这个样子,我们不能修改的,

因为当你点击一个html链接时系统自动发出就是这样的action和category。

然后data部分就需要我们来自定义了,android:scheme用于指定协议,类似于http这样的东西,

这里我们指定成了com.example.androidtest,这是一个自定义的协议,指定成这样是为了避免

和其它的应用程序冲突,从而误把deep links链到人家的程序里去了。 除了android:scheme之外,

我们还可以通过android:host来指定域名,android:port来指定端口,android:path来指定路径,

这些属性都可以对deep links进行更多的限制,

要满足特定条件才能打开指定App。那这里我希望只要是使用com.example.androidtest协议的链接

就能打开我们的程序,因此就不对其他属性进行设置了。

2.在本地开启tomcat服务器,建立一个测试网页,在手机里打开该网页,在该网页上放一个连接

<a href="com.zjbl.stock://goodsId">Try Deep Links</a>
这里要注意网页中的连接与上面AndroidManifest文件中添加的data中的scheme要一致,否则掉不起该app

3.在WelcomeActivity中添加以下代码
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Intent intent = getIntent();
        if (intent != null) {
            Uri uri = intent.getData();
            String host = uri.getHost();
            if ("goodsId".equals(host)) {
                // 跳转到商品详情页面
            }
        }
    }
如果不添加goodsId字段,则可以打开对应的app,而不进入具体的界面去。

三、总结
总体而言,集成交简单,注意隐式intent的使用。
思考:1.不能通过分享的地址直接跳到对应的app中去,必须要先跳到一个共用页面中,在页面中点击链接到app中;
      2.没办法判断手机中没有安装app时,跳转到下载app界面

deeplink

阅读数 629

要实现DeepLink功能

博文 来自: skateboard1

DeepLink功能

阅读数 366

没有更多推荐了,返回首页