热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

一切为了运营!如何从推广短信链接唤起App?

●●●需求描述写这篇文章,也是缘于运营的一个需求:在App运营过程中,会有大量的推广短信,里面附有链接,目的是

 

需求描述

写这篇文章,也是缘于运营的一个需求:在 App 运营过程中,会有大量的推广短信,里面附有链接,目的是引导用户参与活动。如果用户手机没有安装我们的 App 就引导其去下载页,如果用户已经安装了我们的 App 就直接在 App 中打开对应的活动。

 

方案讨论

对需求进行分析,归纳起来实际上就是一个问题,如何从短信唤起App?

这里有两种方案。

第一种,也是最理想的直接从短信唤起,也就是点击短信中的链接后如果安装了 App 就跳转到 App,如果没有安装就在浏览器打开对应页面,如下图:

第二种,经浏览器中转唤起,也就是点击短信链接后先用浏览器打开对应页面,在页面中进行“判断”(实际上不是真正的判断,而是发一个scheme给系统)如果安装了 App 就跳转到 App,否则就停留在当前页。

下面将对这两种方案分别进行分析、实施。

 

从短信直接唤起 App

通常,App 监听私有短域名strange.com(不要问我为什么是短域名,因为短信就是按字算钱的,能省一分是一分)地址:


1. Android 系统

当点击短信中的链接后,系统会自行判断,如果安装了 App 就会出一个弹框让用户选择在 App 中打开还是在浏览器中打开,如图。

对用户来说要多做一次选择,这绝对不是好的体验。

为了解决这个问题,Android 6.0 开始支持 Deep Links,让用户点击链接直达App。

首先,在 intent-filter 中添加 android:autoVerify="true"。

其次,在私有域下上传一个 json 文件: https://strange.com/.well-known/assetlinks.json

文件内容:

[{"relation": ["delegate_permission/common.handle_all_urls"],"target": {"namespace": "android_app","package_name": "应用ID","sha256_cert_fingerprints":["签名证书指纹"]        }    }
]

系统在安装应用后会自动访问 json 文件进行检验,如果检验通过,用户访问 strange.com 域名下的链接会直接跳转到应用。

2.iOS 系统

必须采用 Universal Links,否则点击还是直接跳转到浏览器。

从短信直接唤起 App 总结:

要实现短信直接唤起 App,Android可以用 intent-filter 对域名进行监听,但是会出弹框让用户进行选择,为了更好的体验,建议采用 Deep Links 技术方案,只支持 6.0 以上系统;iOS 只能采用 Universal Links 技术方案,只支持 9.0 以上系统。

系统

首选方案

备选方案

Android

Deep Links(Android 6.0+)

intent-filter

iOS

Universal Links(iOS 9.0+)

无,只能跳浏览器

 

经浏览器中转唤起 App

上表所示,如果只能用备选方案,那么用户就有可能会首先跳转到浏览器(对应的是下载页面),经过浏览器中转,唤起 App。

通常的做法是,App 中监听scheme strange:

H5 页面中内嵌:

或者执行脚本:

window.location.href="strange://login"

因为浏览器只会处理http、https协议,当浏览器打开我们的 H5 下载页面遇到不能处理的私有协议 strange,就会发 intent 给系统,如果有 App 可以处理这个协议会出弹框询问用户是否用该 App 打开,否则什么都不做,具体效果:

虽然弹框体验欠缺,不过也是目前比较好的方案了。

兼容性问题

可是,重点来了,我们在实际测试过程中发现了一堆兼容性问题,在说明这些兼容性问题前,我们先解释一个概念:intent:// 协议。

Android Chrome 25+ 后已经不支持自定义 scheme 的方式,只支持 intent:// 协议,最终要的是需要用户手动进行 点击 才能跳转,举个例子:

Take a QR code
// 失效
// 失效

intent:// 协议格式说明:

intent://scan/#Intent; package=com.google.zxing.client.android; scheme=zxing; end;

目前市面上大多第三方浏览器都是基于 Chrome 开发,这就带来了兼容性问题(没有条件覆盖所有的系统浏览器,这里只是有限测试的结果):

1、部分浏览器,只支持 intent:// 协议 手动 唤起,如chrome、锤子。

2、部分浏览器只支持 scheme 唤起,如 UC 浏览器。

3、大部分浏览器,同时支持 scheme 私有协议和intent:// 协议 自动 唤起。但,都没有按标准的 intent:// 协议来实现(除了 360 浏览器,给 360 点个赞):

·       有的浏览器在 App 没安装时并没有执行S.browser_fallback_url,而是跳转到应用市场如猎豹浏览器4.46.3、乐视浏览器 1.2.1.29。

·       有的浏览器不支持S.browser_fallback_url如搜狗浏览器、欧朋浏览器、猎豹浏览器。

·       有的浏览器无论应用有无安装S.browser_fallback_url一直都会执行如 QQ 浏览器。

所以对这部分浏览器,不能使用 intent:// 协议。

4、更奇葩者,二者都不支持,如百度浏览器。

兼容性问题解决方案

针对上述三个兼容性问题,第 4 种情况无解我们直接忽略,第 2 第 3 种情况只能用自定义scheme 的方式。

问题出在第 1 种情况,因为只能手动唤起,我们需要对浏览器类型进行判断(浏览器没有提供是否支持自定义 scheme、intent://的 API 只能通过 UA 判断),结合我们有限的测试结果,如果是锤子、Chrome 原生浏览器,需在页面中内置一个“下载应用”的按钮引导用户点击。

// 如果安装了 App 就跳转,否则就访问 S.browser_fallback_url 的值 http://strange.com
跳转到活动页/下载

我们来分析一下浏览器的 UA ,举几个例子:

//小米系统浏览器User-Agent:Mozilla/5.0 (Linux; U; Android 6.0.1; zh-cn; MI 3W Build/MMB29M) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/53.0.2785.146 Mobile Safari/537.36 XiaoMi/MiuiBrowser/8.9.5// 小米 Chrome 原生浏览器User-Agent:Mozilla/5.0 (Linux; Android 6.0.1; MI 3W Build/MMB29M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.108 Mobile Safari/537.36// 锤子系统浏览器User-Agent:Mozilla/5.0 (Linux; Android 5.1.1; YQ603 Build/LMY47V) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.11 Mobile Safari/537.36// 锤子 Chrome 原生浏览器User-Agent:Mozilla/5.0 (Linux; Android 5.1.1; YQ603 Build/LMY47V) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.89 Mobile Safari/537.36

可以看出小米浏览器是在 Chrome 原生浏览器的 UA 上增加了 XiaoMi/MiuiBrowser/8.9.5 这部分特征码。类似的,很多第三方浏览器都是在 Chrome 基础上增加自己的特征码,换句话说 Chrome 原生浏览器 UA 没有自己的特征。

而锤子系统浏览器和 Chrome 原生浏览器 UA 几乎一样,这就使得判断是否锤子系统浏览器、 Chrome 原生浏览器 变得异常困难,要想尽可能完美解决问题只能使用排除法。

排除法由于不可能排除所有非 Chrome 原生浏览器,可能会存在误伤的可能。

经浏览器中转唤起 App 总结:

要实现经浏览器中转 自动 唤起 App,Android和 iOS 都可以通过 自定义 scheme 的方式,但 Android 的情况稍显复杂,因为部分浏览器并不支持,必须换成 intent:// 协议的方式 手动 唤起。

考虑到浏览器判断的难度,结合浏览器市场占有率的情况,我们最终的方案是暂时忽略 锤子系统浏览器、 Chrome 原生浏览器 这部分不支持 自定义 scheme 自动唤起 App 的用户。

从短信唤起 App 最终方案

综合起来就是:

·       通过 Deep Links(iOS则是Universal Links),可以实现点击短信链接直接唤起 App;

·       如果系统因为各种原因不支持 Deep Links,备选方案是 intent filter,不过会出弹框让用户选择用哪个 App 打开链接;

·       如果用户没有选择我们的 App 而是选择了浏览器打开,则通过 自定义 scheme 尝试唤起 App;

·       由于技术和成本问题,我们忽略不支持 自定义 scheme 的浏览器。

如下图所示: 

当然除了技术层面的,短信本身的稳定性到达率也很重要。网易云短信,三网合一,验证码、运营短信、通知短信全能发,而且关键价格一样。活儿好不好,戳【阅读原文】,申请试用短信,试试就知道~



推荐阅读
  • 本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
author-avatar
孔阳kyy
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有