通过 JavaScript 打开应用程序 (iOS/Android),并回退重定向到 App/Play 商店(2016 版)

2023-11-25

给定:网站、iOS 和 Android 应用程序,注册 urlscheme“myapp://”。

目标:在网站上显示一个指向已安装应用程序的 iOS/Android 设备的链接。单击该链接应打开应用程序并调用特定逻辑(由应用程序处理,本质上类似于苹果的“通用链接”,但不隐藏网站链接)。

由于安全限制,如果没有 webview cookie magic,检测应用程序是否安装会很麻烦。鉴于此,尝试通过 JavaScript 打开应用程序并在失败时调用后备重定向的最佳方法是什么?

此线程的解决方案:是否可以为 iPhone 应用程序(例如 YouTube 和地图)注册基于 http+ 域的 URL 方案?不适用于 iOS10。不确定安卓。


在 2016 年,仅通过 Javascript 是不可能实现的

您仍然可以在 Android 上使用该方法,但 Apple 在 iOS 9.2 中进行了更改,这意味着这在 iOS 设备上基本上没有用。


它过去如何在 iOS 上运行

过去完成此操作的方法是尝试通过将 window.location 设置为您想要的自定义 URI 路径来在 Javascript 中打开应用程序。

window.location = “imdb://title/tt3569230”;

应用程序未安装

问题是,当应用程序未安装时,它会显示“无法打开页面”错误。相信大家都看过了。这是深度链接的祸根。 iOS 7和iOS 8期间曾有过一段辉煌时期,可以绕过这个,但黄金时代已经过去了。

为了避免这种情况,您必须在页面中添加一些 Javascript,以便重定向到 App Store。这样,用户就不会在屏幕上看到错误。

window.location = 'imdb://title/tt3569230';
setTimeout(function() {
  window.location = 'itms-apps://itunes.apple.com/us/app/imdb-movies-tv/id342792525'
}, 250);

应用程序已安装

安装应用程序后,它将显示以下模式,提示用户是否要打开该应用程序:

现在发生的事情是,在 iOS 9 中,苹果改变了在“[应用程序]”中打开来自 Javascript 的模态blocking模态到 a非阻塞模态。这意味着当您尝试通过 Javascript 重定向到自定义 URI 方案打开应用程序时,模式将不再阻止 Javascript 执行,因此到 App Store 的回退重定向将立即执行在用户点击“打开”按钮之前.

At Branch.io(全面披露:我是 Branch 团队的成员),我们在 iOS 9.2 测试版中看到了这一问题,并希望我们的 Apple 雷达(错误报告)和有影响力的合作伙伴能够促使 Apple 在发布前解决该问题。不幸的是,对于 iOS 开发者来说,事实并非如此。苹果对我们担忧的回应非常清楚地表明了他们希望每个人都能做的事情:采用通用链接。


2016年解决方案

拥有可在任何地方使用的单个链接(包括路由到应用程序(如果已安装)或回退 Web URL(如果未安装)的唯一方法必须包括在 iOS 上使用通用链接。当然,iOS 中实际上还没有全面支持通用链接,因此在某些特定的边缘情况下仍然需要自定义 URI 方案(Chrome 和 Gmail 是两个大例子)。您需要检测这些并构建自定义处理。

大多数公司没有资源为此投入一名(或两名)全职工程师,这就是为什么 Pinterest、Tinder、Airbnb、Jet.com、Yummly 等都采用了链接平台,例如Branch.io或 Firebase 动态链接。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过 JavaScript 打开应用程序 (iOS/Android),并回退重定向到 App/Play 商店(2016 版) 的相关文章

  • 如何从 Facebook 邀请好友到 Android 应用程序? - 给出错误

    我正在开发一个 Android 应用程序 我正在努力将 邀请朋友 功能添加到我的应用程序中 它转到我的AppLinkUrl成功但显示错误 我的清单代码如下
  • ACCESS_BACKGROUND_LOCATION 不适用于低于 Q (29) 的 Android 版本

    我的应用程序面向 Android API 28 根据文档 https developer android com preview privacy location target android 10 我应该要求ACCESS BACKGROU
  • 有没有办法将变量从 javascript 导入到 sass 或反之亦然?

    我正在制作一个依赖于块概念的 CSS 网格系统 所以我有一个基本文件 例如 max columns 4 block width 220px block height 150px block margin 10px 它被 mixin 使用 m
  • 删除Android所有语言中的字符串

    我有一个包含多个翻译的应用程序 我想删除一些字符串 我怎样才能重构并删除它们一次 例如在默认情况下strings xml文件并自动将删除传播到其他翻译的其他 strings xml 文件 您可以通过 Android Studio 中的 翻译
  • console.log() 显示同一对象属性的矛盾值

    我想我可能要疯了 我使用 console log 来查看对象的状态 然后在下一行对同一对象的特定属性执行 console log 并为每个属性获取不同的值 我正在使用的代码是 console log this pictures Items
  • 如何更改自动完成中的结果过滤器?

    我不想进行字面匹配 而是想通过正则表达式选择结果 我可以覆盖自动完成的默认行为来完成此任务还是需要替代结构 有一个内置的方法可以做到这一点 只需提供一个函数source http jqueryui com demos autocomplet
  • ToggleClass 动画 jQuery?

    我的网站上有一个部分 当用户单击时我希望它展开 我正在使用 jQuerytoggleClass为了这 expandable function e e preventDefault this closest article toggleCla
  • 如何使用 Core Graphics 在我的触摸位置绘制一个圆圈?

    新程序员来了 我在尝试使用 Core Graphics 在触摸位置周围绘制描边弧时遇到问题 我有绘制圆圈的方法工作正常 并且我已经测试并在点击屏幕时注册触摸 但是当我尝试在点击时调用绘制圆圈的方法时 我收到错误 CG ContextBlah
  • 在视图之间传递核心数据实体变量

    我无法理解如何在视图之间使用核心数据实体变量 为了更好地理解我的问题是什么 我的代码如下 View A 基本上 您必须将完整预算实体或相关预算实体的 ID 从视图 A 传递到视图 B 由于不知道您的应用程序的视图层次结构和逻辑 我假设您选择
  • 如何检测元素内容何时发生变化

    我正在寻找一种方法来监视元素内动态填充 无页面重新加载 内容 以便我可以将类添加到另一个元素 到目前为止我有这个 HTML div class message container div class messages error span
  • 如何使用 vanilla JS 实现可维护的反应式 UI

    今天我遇到了一个问题 可以通过使用像 Vue 这样的反应式和状态管理框架来轻松解决 遗憾的是 无法使用它 以下 简化 情况 链接到代码笔 https codepen io theiaz pen BazErKV 我们有一个服务器渲染的页面 其
  • 获取点击的的DOM路径

    HTML div class lol a class rightArrow href a div 伪代码 rightArrow click function rightArrowParents this dom dom is the pse
  • 使用日期字符串数组在引导日期选择器中设置禁用月份不起作用

    我有一个日期选择器 其配置如下 HTML div class input group date div
  • 禁用特定 div 上的 Tab 键

    我有以下结构 div div Some content div div Some content div div 我想 禁用 div2 上的 tab 键 我的意思是按下 tab 键时 div2 的元素不会获得焦点 有没有简单的方法可以使用
  • “无法实例化活动”错误

    我的一个 Android 应用程序拥有大约 100 000 个用户 每周大约 10 次 我会通过 Google 的市场工具向我报告以下异常情况 java lang RuntimeException Unable to instantiate
  • Knockout.js 安全绑定

    我想使用带有淘汰赛的安全绑定 为此我使用敲除安全绑定 js https github com brianmhunt knockout secure binding 谁能解释一下为什么下面的代码不起作用 它会抛出一个错误 未捕获 淘汰 安全
  • JavaScript 数组扩展语法的时间复杂度是多少?

    我想知道在 JavaScript 中使用数组扩展的时间复杂度是多少 是线性 O n 还是常数 O 1 下面的语法示例 let lar Math max nums 传播称为 Symbol iterator 有关对象的属性 对于数组 这将迭代数
  • Android 中的 Google Places API - 适用于个人用户的 API_KEY

    我已经浏览了与在 Android 应用程序中使用 Places API 相关的 Android 文档和其他博客 到处都建议使用 API KEY 来调用 REST 服务 API KEY 在整个项目 应用程序中都是相同的 每天的请求数限制为 1
  • ios - Gamekit 的 GKOctree 未找到元素

    我正在尝试使用GKOctree https developer apple com documentation gameplaykit gkoctree用于高效检索 3D 空间中的对象 然而 以下代码似乎没有按预期工作 import Gam
  • iOS 电池监控 Swift

    我已将监控设置为启用 但模拟器和设备中的电池电量仍然为 1 UIDevice currentDevice batteryMonitoringEnabled true var level UIDevice currentDevice batt

随机推荐

  • 如何编写 Windows 批处理脚本来从目录复制最新文件?

    我需要将目录中的最新文件复制到新位置 到目前为止我已经找到了资源forfiles命令 一个与日期相关的问题这里 还有另一个相关问题 我只是在将各个部分组合在一起时遇到了一些麻烦 如何将该目录中的最新文件复制到新位置 接受的答案给出了在命令中
  • TypeScript 中使用 async/await 进行方法链接

    我遇到一种情况 我需要对异步方法的结果调用异步方法 class Parent constructor private child Child private getChild Promise
  • 如何显示屏幕已锁定?

    在我的应用程序中 我需要知道设备何时被锁定 在 HTC 上 它看起来像是短按 电源 按钮 那么问题是 设备锁定时会触发哪个事件 或者设备将要休眠 你应该延长BroadcastReceiver并实施onReceive 像这样 public c
  • 如何使用 Cocoa 将文本从一个应用程序粘贴到另一个应用程序?

    我读过关于NSPasteBoard在Apple文档中 以及它如何允许应用程序写入PasteBoard并允许其他应用程序读取该文本并使用它 有人可以告诉我如何将应用程序 位于状态栏中 的文本粘贴到NSTextField那是在不同的应用程序内
  • 将 collada (dae) 文件加载到 SCNNode (Swift - SceneKit)

    这有效 let scene SCNScene named house dae 节点有等价物吗 let node SCNNode geometry SCNGeometry house dae 我到处搜索 没有找到任何可以将整个 dae 文件加
  • 如果新标签发布,jenkins 会触发构建

    我想配置 jenkins 以便在 git 存储库的任何分支中发布新标签时它开始构建 我如何配置此行为 触发 将 refspec 设置为 refs tags refs remotes origin tags 分支说明符 在构建触发器下 选中将
  • 具有可变根元素名称的 JAXB 编组通用列表

    所以我试图编组一个通用的对象列表 但我希望每个列表都有一个特定的 XmlRootElement name 按照我的做法 我知道如果不为每种类型的对象编写特定的包装类并声明 XmlRootElement 这实际上是不可能的 但也许还有另一种方
  • 如何在 python 中合并大型 csv 文件?

    我有 18 个 csv 文件 每个文件大约 1 6Gb 每个文件包含大约 1200 万行 每个文件代表一年的数据 我需要组合所有这些文件 提取某些地理位置的数据 然后分析时间序列 做这个的最好方式是什么 我厌倦了使用 pd read csv
  • 为什么 O(n) 等于 O(2n)

    我知道 O N 本质上等于 O cN 其中 c 某个常数 但如果 N c 这不是 O N 2 吗 随着 c 的增加 这是否成立 或者是否存在某种正式的限制 If N c then c不是恒定的 因此 情况从来都不是这样
  • 应用“自动”数字格式/数字格式重置

    是否可以通过 GAS 以编程方式应用 自动 数字格式 我的问题是 当我编写数字列时 表格似乎尝试应用适当的格式 但有时会出错 也就是说 特定的小整数 有时为 1 将被格式化为日期 范围被写在一个myRange setValues 方法 我看
  • List 保证插入顺序吗?

    假设列表中有 3 个字符串 例如 1 2 3 然后我想重新排序它们以将 2 放置在位置 1 例如 2 1 3 我正在使用这段代码 将indexToMoveTo设置为1 listInstance Remove itemToMove listI
  • Flask(带有 Flask-RESTful)不解析 JSON 有效负载

    I m creating a frontend in Angular and the backend in Flask with the RESTful extension By default Angular likes to send
  • 如何在 Oracle PL/SQL where 子句中使用变量

    我似乎无法让变量在 Oracle PL SQL where 子句中工作 我有 Microsoft SQL Server 背景 这很容易 例如 执行类似以下操作所需的所有步骤是什么 declare var int set var 1 sele
  • 尝试理解/确定基本的 Git 工作流程

    我一直在读这个流行文件一遍又一遍地尝试起草我自己的 git 工作流程 我想我已经明白了 但我还是有点失落 这是我目前的理解 我们有两个分支机构将始终保持活跃 Master 这是我将推送实际部署到我的生产服务器并由我的用户使用的代码的地方 开
  • 从父目录导入脚本

    如何导入位于父目录中的模块 python 文件 两个目录都有一个 init py文件 但我仍然无法从父目录导入文件 在此文件夹布局中 脚本 B 尝试导入脚本 A Folder A init py Script A Folder B init
  • 使用javascript上下滚动iframe

    是否可以使用按键或 JavaScript 从父窗口滚动 iframe 窗口 iframe 内容来自另一个域 与父窗口不同 由于 iframe 内容来自另一个域 因此出于安全原因您将无法更改它的 DOM 尽管您可以使用箭头键滚动它 但当您激活
  • 如何在Eclipse中查看Javadoc?

    我正在使用第三方库 我已将其包含到我的项目中 它包含应用程序的类 但没有源代码或 Javadoc 正如预期的那样 将鼠标悬停在导入的对象上不会显示 javadoc Note This element neither has attached
  • Android .aidl 中的单向声明是否保证该方法将在单独的线程中调用?

    我正在为 Android 手机设计一个客户端 服务器应用程序框架 我对 Java 和 Android 都很陌生 但对一般编程 特别是线程编程并不陌生 有时我的服务器和客户端将位于同一进程中 有时它们将位于不同的进程中 具体取决于具体的用例
  • 在基本构造函数中使用 lambda 表达式的极端情况

    在我们正在构建的框架中 我们需要以下模式 public class BaseRenderer Func
  • 通过 JavaScript 打开应用程序 (iOS/Android),并回退重定向到 App/Play 商店(2016 版)

    给定 网站 iOS 和 Android 应用程序 注册 urlscheme myapp 目标 在网站上显示一个指向已安装应用程序的 iOS Android 设备的链接 单击该链接应打开应用程序并调用特定逻辑 由应用程序处理 本质上类似于苹果