获取iOS和Android的app下载渠道和相关参数的方式

1. iOS

1.1 Deep Link

  • 作用:Deep Link 允许应用响应特定的链接,直接打开应用内的某个特定内容或页面。这意味着用户可以通过点击一个链接,直接跳转到应用内部的某个具体位置,而不是每次都从应用的首页开始。
  • 配置:开发者需要在应用内配置URL schemes,并处理传入的URL来决定打开应用时显示哪个界面。
  • 限制:Deep Link 主要限制在应用已安装的情况下有效。如果应用未安装,用户点击链接会发生什么,完全取决于开发者的处理逻辑(例如,可以跳转到App Store)。

1.2 Universal Link

  • 作用:Universal Link 是一种更先进的链接方式,不仅支持深链接到应用内部的特定内容,还能在应用未安装时打开网页链接。这提供了更为流畅的用户体验,因为它可以智能地决定是打开网页还是应用内容。
  • 配置:开发者需要在自己的服务器上配置一个文件(apple-app-site-association 或 AASA 文件),并在应用的Info.plist中声明对应的域名。这样,iOS系统可以验证链接是否应该打开应用,并自动处理。
  • 优势:Universal Link 支持的场景更广泛,提供了更好的用户体验。如果应用已安装,它可以直接打开应用内的相关内容;如果未安装,链接会打开网页版内容。此外,Universal Link 还支持搜索引擎索引,有利于提高内容的可发现性。

总的来说,Universal Link 是 Apple 推荐的链接方案,它在用户体验和技术实现上都比传统的 Deep Link 更加先进和完善。但在某些情况下,根据应用的需求和特定场景,开发者可能仍然需要使用 Deep Link。

1.3 代码获取外部链接带过来的参数

func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {// 确认是不是由 Universal Link 触发的if userActivity.activityType == NSUserActivityTypeBrowsingWeb, let url = userActivity.webpageURL {// 解析 URL 来获取需要的参数handleUniversalLink(url: url)}return true
}func handleUniversalLink(url: URL) {// 这里是解析 URL 和查询参数的逻辑// 例如,你可以使用 URLComponents 类来解析 URLlet components = URLComponents(url: url, resolvingAgainstBaseURL: true)if let queryItems = components?.queryItems {for item in queryItems {print("\(item.name) = \(item.value ?? "")")// 根据参数名称处理相应的逻辑}}
}
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler {// 确认是不是由 Universal Link 触发的if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) {NSURL *url = userActivity.webpageURL;// 解析 URL 来获取需要的参数[self handleUniversalLink:url];}return YES;
}- (void)handleUniversalLink:(NSURL *)url {// 解析 URL 和查询参数的逻辑NSURLComponents *components = [NSURLComponents componentsWithURL:url resolvingAgainstBaseURL:YES];NSArray *queryItems = components.queryItems;for (NSURLQueryItem *item in queryItems) {NSLog(@"%@ = %@", item.name, item.value);// 根据参数名称处理相应的逻辑}
}



2.Android

2.1 Intent Filters

  • 作用:Intent Filters 类似于 iOS 中的 Deep Link。它们允许 Android 应用响应外部的意图(Intent),如从网页中打开应用的特定页面。通过在应用的 manifest 文件中声明 Intent Filters,开发者可以指定应用可以处理的 URL。
  • 配置:开发者需要在 AndroidManifest.xml 文件中为相应的 Activity 配置 Intent Filter,包括指定要匹配的动作(Action)、数据(Data)和类别(Category)。
  • 限制:就像 Deep Link,如果应用未安装,点击链接将不会有任何作用,除非开发者在网页上提供了额外的逻辑来引导用户下载应用。

2.2 App Links

  • 作用:App Links 是 Android 对 Universal Links 的答案。它允许应用在用户设备上更为无缝地处理网页链接,实现在应用和网页之间的自由跳转。当点击一个链接时,系统会智能地判断是打开浏览器还是直接打开应用内的对应内容,即使应用未安装,也能优雅地回退到网页视图。
  • 配置:为了使用 App Links,开发者需要在应用的 AndroidManifest.xml 中添加相应的 Intent Filter,并且必须在服务器上托管一个特定的 JSON 文件(assetlinks.json),用于验证应用是否有权处理网站的链接。
  • 优势:App Links 提供了更加直接和安全的方式来处理深度链接,包括在应用未安装时的情况,从而提供更好的用户体验。它也支持通过 HTTPS 进行验证,确保了链接的安全性。

总结来说,Android 的 App Links 和 Intent Filters 分别与 iOS 的 Universal Link 和 Deep Link 相当。App Links 提供了一个更为先进和流畅的用户体验,使得在应用和网页之间的跳转更加无缝,同时也增加了链接的安全性和可靠性。

2.3 代码获取外部链接带过来的参数

@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 获取意图Intent intent = getIntent();String action = intent.getAction();Uri data = intent.getData();// 检查是否是由深度链接激活的if (Intent.ACTION_VIEW.equals(action) && data != null) {String channelId = data.getQueryParameter("channelId");// 使用渠道ID做相应的处理}
}


3.服务器根目录下的文件

3.1 iOS的apple-app-site-association文件

官网解释

{"applinks": {"details": [{"appIDs": [ "ABCDE12345.com.example.app", "ABCDE12345.com.example.app2" ],"components": [{"#": "no_universal_links","exclude": true,"comment": "Matches any URL with a fragment that equals no_universal_links and instructs the system not to open it as a universal link."},{"/": "/buy/*","comment": "Matches any URL with a path that starts with /buy/."},{"/": "/help/website/*","exclude": true,"comment": "Matches any URL with a path that starts with /help/website/ and instructs the system not to open it as a universal link."},{"/": "/help/*","?": { "articleNumber": "????" },"comment": "Matches any URL with a path that starts with /help/ and that has a query item with name 'articleNumber' and a value of exactly four characters."}]}]},"webcredentials": {"apps": [ "ABCDE12345.com.example.app" ]},"appclips": {"apps": ["ABCED12345.com.example.MyApp.Clip"]}
}

3.2 Android的assetlinks.json文件

官方文档,上传到服务器的路径是https://www.example.net/.well-known/assetlinks.json

[{"relation": ["delegate_permission/common.handle_all_urls"],"target": {"namespace": "android_app","package_name": "com.example.app","sha256_cert_fingerprints":["YOUR_APP_CERTIFICATE_SHA256_FINGERPRINT"]}
}]
  • relation: 定义了与目标的关系类型。对于深度链接,通常使用 “delegate_permission/common.handle_all_urls” 来表示应用有权限处理所有相关的 URL。
  • target: 描述了目标应用的详情。
  • namespace: 对于 Android 应用,这里总是 “android_app”。
  • package_name: 应用的包名,比如 “com.example.app”。
  • sha256_cert_fingerprints: 应用签名证书的 SHA-256 指纹数组。你需要将 “YOUR_APP_CERTIFICATE_SHA256_FINGERPRINT” 替换为你的应用签名证书的实际 SHA-256 指纹。
    确保替换 package_name 和 sha256_cert_fingerprints 中的值为你的实际应用信息。你可以使用如下命令来获取应用签名证书的 SHA-256 指纹:
keytool -list -v -keystore your_keystore_path -alias your_alias_name

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/747698.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录刷题笔记 Day 52 | 打家劫舍 No.198 | 打家劫舍 II No.213 | 打家劫舍III No.337

文章目录 Day 5201. 打家劫舍&#xff08;No. 198&#xff09;<1> 题目<2> 笔记<3> 代码 02. 打家劫舍 II&#xff08;No. 213&#xff09;<1> 题目<2> 笔记<3> 代码 03.打家劫舍III&#xff08;No. 337&#xff09;<1> 题目<2&g…

H5/微信 Video标签移动端播放问题

一、禁止/阻止/取消默认的全屏播放 亲测&#xff1a; IOS和安卓均有效 <video x5-playsinline"true"playsinline"true"webkit-playsinline"true"x-webkit-airplay"true"x5-video-orientation"portraint"><source…

工智能的迷惑是技术发展的产物

简述&#xff1a; 随着ChatGPT在全球科技舞台上掀起一股热潮&#xff0c;人工智能再次成为了人们关注的焦点。各大公司纷纷紧跟潮流&#xff0c;推出了自己的AI大模型&#xff0c;如&#xff1a;文心一言、通义千问、讯飞星火、混元助手等等&#xff0c;意图在人工智能领域占据…

sqlplus登录卡死无响应异常处理

一、问题描述 通过Sqlplus 访问数据hang死在登录界面&#xff0c;且不能通过CtrlC取消&#xff0c;如下所示&#xff1a; [oracletest01 ~]$ sqlplus / as sysdbaSQL*Plus: Release 19.0.0.0.0 - Production on Fri Mar 13 10:41:36 2024 Version 19.3.0.0.0Copyright (c) 198…

Vue多文件学习项目综合案例——购物车,黑马vue教程

一、项目截图 二、主要知识点 vuex的使用json-server的使用json-server --watch index.json三、需要注意的点 json-server 安装成功&#xff0c;查看版本直接报错。安装默认版本埋下的一个坑&#xff0c;和node版本不匹配作者直接安装vuex&#xff0c;默认安装也是版本不匹配…

C语言案例01, 输入两个整数,获得两个数加减乘除的值,持续更新中~

一.题目 /* 输入两个整数,获得两个数加减乘除的值 */ *///头文件 #include <stdio.h>//主方法 int main() {//声明两个int类型的变量int a;int b;//提示用用户输入printf("请输入两个整数!\n");//用scanf 获取a和b在内存中的值scanf("%d%d",&a…

ai智能外呼机器人的功能,机器人对话常用语模板搭建

智能外呼机器人就是用来往外呼出打电话的;经常看到有文章说电话机器人将要代替传统人工话务员、电话销售员要失业了、外呼机器人要颠覆电销革命了等等&#xff0c;我想说的是&#xff0c;目前市场上的电话机器人还远远不能达到&#xff0c;未来几年内也不一定会实现。 下面就简…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:Panel)

可滑动面板&#xff0c;提供一种轻量的内容展示窗口&#xff0c;方便在不同尺寸中切换。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 可以包含子组件。 说明&#xff1a; 子组件类型&a…

QMI8658芯片I2C驱动开发指南

这个芯片纯国产挺好用的&#xff0c;电路很好设计&#xff0c;我这垃圾焊功&#xff0c;纯手焊&#xff0c;&#xff0c;居然能用。 第一部分 硬件连接 画的很简陋&#xff0c;看看就可以了&#xff0c;这里I2C总线需要接10K上拉没有画出来&#xff0c;这个需要注意一下。 …

树形结构 一篇文章梳理

树形结构是一种非常重要的非线性数据结构&#xff0c;它模拟了具有层次关系的数据模型。在树形结构中&#xff0c; 目录 一、组成元素&#xff1a; 二、树的属性&#xff1a; 深度或高度 度 路径 路径长度 三、树的类型 1 二叉树 2 多叉树 3 完全二叉树 4 满二叉树…

【计算机网络_传输层】UDP和TCP协议

文章目录 1. 重新理解端口号端口号划分netstat指令pidof 2. UDP协议2.1 UDP协议端格式2.2 UDP的特点2.3 UDP的注意事项2.4 基于UDP的应用层协议 3. TCP协议&#xff08;传输控制协议&#xff09;3.1 TCP协议的格式和报头字段3.2 如何解包和分用3.3 理解TCP协议报头3.4 TCP协议的…

day-20 二叉树的层序遍历

思路&#xff1a;利用队列进行广度优先遍历即可 注意点&#xff1a;ArrayList执行remove之后&#xff0c;索引i会立即重排&#xff0c;注意可能越界 code: /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeN…

[Java、Android面试]_05_内存泄漏和内存溢出

本人今年参加了很多面试&#xff0c;也有幸拿到了一些大厂的offer&#xff0c;整理了众多面试资料&#xff0c;后续还会分享众多面试资料。 整理成了面试系列&#xff0c;由于时间有限&#xff0c;每天整理一点&#xff0c;后续会陆续分享出来&#xff0c;感兴趣的朋友可关注收…

Xcode调试Qt 源码

在Mac下使用Xcode 开发Qt程序&#xff0c;由于程序断点或者崩溃后&#xff0c;Qt库的堆栈并不能够正确定位到源码的cpp文件&#xff0c;而是显示的是汇编代码&#xff0c;导致不直观的显示。 加载的其他三方库都是同理。 所以找了攻略和研究后&#xff0c;写的这篇文章。 一&a…

SIP调试之SIPP测试工具

SIPP是针对SIP协议的一个性能测试的命令行工具&#xff0c;可以动态显示测试的统计信息&#xff08;如呼叫速率、延时、消息统计等&#xff09;。用户可以通过XML场景配置文件&#xff0c;自定义模拟各种UAC/UAS测试场景的信令交互流程&#xff0c;可以被用来测试IP话机、SIP代…

【IC设计】Verilog线性序列机点灯案例(二)(小梅哥课程)

文章目录 该系列目录&#xff1a;设计目标设计思路RTL 及 Testbench仿真结果存在的问题&#xff1f;改善后的代码RTL代码testbench代码 仿真结果 案例和代码来自小梅哥课程&#xff0c;本人仅对知识点做做笔记&#xff0c;如有学习需要请支持官方正版。 该系列目录&#xff1a;…

Nexus如何导入jar以及批量导入Maven的本地库目录

上传依赖包到Nexus 服务器的方式有多种, 包含: 1.单个jar上传: 在Nexus管理台页面上传单个jar 2.源码编译上传:在源码项目中使用 Maven的deploy 命令发布 3. 使用脚本批量上传Maven本地库的目录 前言 本篇基于 Nexus 的版本是 nexus-3.55.0-01本方法适用Linux和WindowsWind…

C++中using 和 typedef 的区别

C中using 和 typedef 的区别_typedef using-CSDN博客 在C中&#xff0c;“using”和“typedef”执行声明类型别名的相同任务。两者之间没有重大区别。C中的“Using”被认为是类型定义同义词。此方法也称为别名声明。定义这些别名声明的工作方式类似于使用“using”语句定义C中…

MySQL-HMA 高可用故障切换

本章内容&#xff1a; 了解MySQL MHA搭建MySQL MHAMySQL MHA故障切换 1.案例分析 1.1.1案例概述 目前 MySQL 已经成为市场上主流数据库之一&#xff0c;考虑到业务的重要性&#xff0c;MySQL 数据库 单点问题已成为企业网站架构中最大的隐患。随着技术的发展&#xff0c;MHA…

【四 (2)数据可视化之 Matplotlib 常用图表及代码实现 】

目录 文章导航一、介绍二、安装Matplotlib三、导入Matplotlib四、设置可以中文显示四、常用图形1、散点图&#xff08;Scatter Plot&#xff09;2.1、线性图&#xff08;Line Plot&#xff09;2.2、堆叠折线图2.3、多图例折线图3.1、柱状图/条形图&#xff08;Bar Chart&#x…