IOS应用跳转URL scheme和Universal Links

news2024/11/15 18:01:49

简介

IOS常见的跳转方式有URL scheme和Universal Links。这两个均可以实现App之间的跳转,以及通过网页实现跳转到对应的App内。通过本文章可以了解到两者的区别和具体的使用方法,以及参数的传递。应对常见的几种跳转需求。

URL scheme:需要配置URL scheme,可以通过该URL直接启动App。该URL实际上不是真正可以访问的网页域名,因此如果App没有安装,就没有任何反应。并且URL scheme是各自开发者在App内设置的,所以可能出现冲突的情况。

Universal Links:配置实际可以访问的域名,并且根据配置表,可以将路径和对应的App进行关联。如果已经安装了App可以直接跳转到App。如果没有安装App,可以直接跳转到对应的网页。

官方文档:https://developer.apple.com/documentation/xcode/allowing-apps-and-websites-to-link-to-your-content?language=objc

配置Url Scheme

1.配置

打开Xcode工程,在Info.plist的URL Types添加一个新的Url Scheme。需要填入Identifier和URL Schemes

这里分别命名为youridentifieryourscheme需要注意URL Schemes需要起的复杂一些,避免重名。

Tips:如果出现App A与App B也定义了相同的URL Scheme。那么访问URL Scheme的时候只会访问其中一个应用,另外一个App的URL Scheme就失效了

2.测试链接是否成功

设置完Url Scheme后,在测试设备上安装该应用。之后可以通过safari或者备忘录,直接通过URL Scheme访问。

Url Scheme的形式有点类似于网页。可以直接在Safari输入yourscheme://xxxxx 如果弹出提示框,是否访问该应用说明配置成功 。这里填写的yourscheme就是Info.plist中填写的URL Scheme。"://"之后填写的是自定义的参数。可以通过参数来得知启动的来源。

3.添加启动参数获取代码

Unity获取启动参数,需要通过继承UnityAppController的方式进行。在Assets/Plugins/IOS/目录下添加YourAppController.h和YourAppController.mm

对应代码如下:

SQL
#ifndef YourAppController_h
#define YourAppController_h
#import "UnityAppController.h"
 
@interface YourAppController : UnityAppController
 
@end

#endif

SQL
 
#import <Foundation/Foundation.h>
#import "YourAppController.h"
@implementation YourAppController
 
 
- (void)applicationDidBecomeActive:(UIApplication*)application
{
   
    [super applicationDidBecomeActive:application];
   
}
 
 
- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
{
    [super application:application didFinishLaunchingWithOptions:launchOptions];

    return YES;
}
 
 
 
// UIApplicationOpenURLOptionsKey was added only in ios10 sdk, while we still support ios9 sdk
- (BOOL)application:(UIApplication*)app openURL:(NSURL*)url options:(NSDictionary<NSString*, id>*)options
{
    [super application:app openURL:url options:options];
    if(url)
    {
        UnitySendMessage("YourReceiver", "YourMethod", url.absoluteString.UTF8String);
    }
    return YES;
}
 
 
//进入 后台
- (void)applicationDidEnterBackground:(UIApplication*)application
{
    [super applicationDidEnterBackground:application];
}
 
//进入前台
- (void)applicationWillEnterForeground:(UIApplication*)application
{
    [super applicationWillEnterForeground:application];
}
 
 
 
 
 
 
@end
 
//设置当前类为启动类
IMPL_APP_CONTROLLER_SUBCLASS(YourAppController);
 
 

获取参数的函数为- (BOOL)application:(UIApplication*)app openURL:(NSURL*)url options:(NSDictionary<NSString*, id>*)options,获取完参数之后可以通过UnitySendMessage的方式,在C#端处理逻辑

配置Universal Links

1.开发者后台配置

在developer.apple.com的后台,点击对应的Identifiers,勾选Associated Domains

2.工程配置

打开Xcode工程,在Signing&Capabilities页签点击+Capability 之后选择Associated Domains

之后添加具体的Associated Domains。比如你的域名为yourdomains.com,填入的具体形式为applinks:yourdomains.com

3.apple-app-site-association配置

然后设置apple-app-site-association。apple-app-site-association的格式如下,details是一个列表。列表内是每个应用对应的配置。appID的格式是,前面为TeamID(可以在developer.apple.com查看),后面则是应用的bundleid。path为应用对应的路径,"*"为通配符。

下面的例子代表有三个app。打开yourdomains.com/path1/ 路径下的网页,访问app1。yourdomains.com/path2/  代表访问app2。其他yourdomains.com/ 下的网页均访问app3。需要注意的是,配了下一级路径的,比如"paths": ["/path1/*"] 也要在结尾加上*。还有就是如果没有下一级路径比如下面的app3的"paths": ["*"]。建议配置在数组的末端。之前测试时,这个apple-app-site-association是顺序访问的,所以如果配在顶部,会出现所有网页均访问"*"的情况。

XML
{
        "applinks": {
                "apps": [],
                "details": [{
                                "appID": "TEAMID.BUNDLEID1",
                                "paths": ["/path1/*"]
                        }, {
                                "appID": "TEAMID.BUNDLEID2",
                                "paths": ["/path2/*"]
                        }, {
                                "appID": "TEAMID.BUNDLEID3",
                                "paths": ["*"]
                        }

                ]
        }
}

4.上传apple-app-site-association到文件服

如果自己未搭建文件服务器可以直接使用阿里云。这里需要注意,必须将apple-app-site-association放置在根目录,或者根目录/.well-known/ 目录下

https://yourdomains.com/apple-app-site-association

https://yourdomains.com/.well-known/apple-app-site-association

5.测试链接是否成功

下面以访问app1为例子进行链接测试。前面的配置都完成之后,用测试设备安装应用,确保网络是正常的。

由于之前配置的Associated Domains为yourdomains.com,app1在apple-app-site-association内配置的路径为["/path1/*"],所以最后需要将域名和path拼在一起:https://yourdomains.com/app1

可以将该网址放在复制到备忘录,然后长按该路径。如果出现如下在"xxx"中打开的提示,说明Universal Links配置正确。并且可以直接点击该链接进入App。

也可以直接在safari浏览器输入上面的网址。网页的顶部会出现在"xxx"App中打开的提示。并且点击右侧的打开按钮,

6.注意事项

  • apple-app-site-association不能有后缀名
  • apple-app-site-association是在app第一次安装和后续更新的时候获取。如果网络不好,有可能出现没有获取到,导致Universal Link失效的情况
  • 如果修改了apple-app-site-association的内容,apple-app-site-association生效需要等待一段时间。同时需要卸载重装后再测试
  • 苹果会先访问.well-known/下的apple-app-site-association,如果不存在,再访问根目录下的文件,所以建议将文件存放在.well-known/下,减少访问服务器的次数
  • 访问的网址需要配置为https

Unity内配置

上面修改Xcode工程,添加Url Scheme和AssociatedDomains的操作,也可以通过Editor的PostProcessBuild脚本。进行添加。具体代码如下

添加Url Scheme

XML
 public static void SetInfoList(string buildPath)
    {
        string listPath = buildPath + "/Info.plist";
        PlistDocument plist = new PlistDocument();
        plist.ReadFromString(File.ReadAllText(listPath));

        // 在“info”标签栏的“URL type“添加“URL scheme”
        PlistElementArray urlArray = plist.root.CreateArray("CFBundleURLTypes");
        PlistElementDict dict = urlArray.AddDict();
        dict.SetString("CFBundleTypeRole", "Editor");
        dict.SetString("CFBundleURLName", "youridentifier");
        PlistElementArray urlSchemes = dict.CreateArray("CFBundleURLSchemes");
        urlSchemes.AddString("yourscheme");

  

        File.WriteAllText(listPath, plist.WriteToString());
    }

 设置Associated Domains

XML
 // 设置Associated Domains
    public static void SetAssociatedDomains(string pbxProjectPath, string domainUrl)
    {
        //默认 Target Name, 你自己的可能不一样
        string targetName = "Unity-iPhone";
        //Set the entitlements file name to what you want but make sure it has this extension
        string entitlementsFileName = "my_app.entitlements";

        var entitlements = new ProjectCapabilityManager(pbxProjectPath, entitlementsFileName, targetName);
        entitlements.AddAssociatedDomains(new string[] { "applinks:" + domainUrl });

        entitlements.WriteToFile();
    }

IOS跳转的解决方案

跳转流程

下面举一个简单的邀请好友获取奖励的例子。

1.配置一个网页,负责承接跳转的业务和必要的信息展示。应用可以将该网址分享到IM工具,并且根据业务需要添加具体的参数。比如玩家A给玩家B分享了关于app1的邀请链接:

https://yourdomains.com/app1/index.html?type=invite&uid=10000

这里路径为Universal Link的地址。前端将网页部署在app1/index.html的位置。

分享的参数为type=invite&uid=10000 (参数可以自定义)

2.玩家B在IM工具内点开该链接后,如果玩家已经安装了该应用app1,可以直接跳转到应用内,并且将该参数传递给app1。如果未安装该应用,或者不支持直接跳转。可以在该网页内配置下载的按钮,或者其他相关的跳转链接。

3.假如玩家B通过上面的链接正常进入到app1内,可以获取type=invite&uid=10000的参数。玩家B与服务器通信,完成对玩家A的邀请奖励发放,跳转流程到此结束。

部分网页逻辑

有的IM软件(比如Messenger),点开Universal Link并不会直接跳转App。但是可以通过网页调用URL Scheme进行跳转。所以可以添加一下的逻辑,完成跳转操作。

网页启动的时候,先判断是不是IOS设备。如果是,可以直接通过URL Scheme跳转。

XML
(function () {
  let userAgentInfo = navigator.userAgent;
  let Agents = [
    "iPhone",
    "iPod",
    "iPad",
  ];
  let search = location.search;
  for (let i = 0; i < Agents.length; i++) {
   //判断是不是IOS设备
    if (userAgentInfo.indexOf(Agents[i]) > 0) {
      //获取网页中参数
      let webParams = location.search;
      window.location.href = "yourscheme://"+webParams;
      break;
    }
  }
})();

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

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

相关文章

增值税高不再是难事,只需一招即可解决!

《税筹顾问》专注于园区招商&#xff0c;您的贴身节税小能手&#xff0c;合理合规节税&#xff01; 任何一家企业&#xff0c;都逃脱不了一种税费的缴纳&#xff0c;那就是增值税。但其实小规模纳税人增值税缴纳&#xff0c;是可以享受到一些税收优惠照顾的&#xff0c;未达到月…

看完阿里大牛的LeetCode算法刷题手册后,成功在四面字节斩获offer

最近有看到很多朋友想进大厂&#xff0c;四面竟然都考了算法&#xff0c;很多同学面对算法的问题都很头大&#xff0c;因为自己做项目很难用到&#xff0c;但是但凡高薪的职位面试都会问到。最近我整理了一份刷题宝典&#xff0c;这份刷题宝典&#xff0c;也让我进了心仪的大厂…

MyBatis Plus 解决大数据量查询慢问题

常规查询 流式查询 游标查询 大数据量操作的场景大致如下&#xff1a; 数据迁移 数据导出 批量处理数据 在实际工作中当指定查询数据过大时&#xff0c;我们一般使用分页查询的方式一页一页的将数据放到内存处理。但有些情况不需要分页的方式查询数据或分很大一页查询数…

实用工具指南:2个提升效率的互联网利器

工具一&#xff1a; 字体酷站是全球最大的字体网址导航网站&#xff0c;收录了大量优质的字体素材和字体设计资源。该网站拥有丰富多样的字体分类和标签&#xff0c;用户可以根据需求选择不同类型、不同风格的字体&#xff0c;如商务字体、手写字体、卡通字体等。同时&#xf…

B+树单表超过2500万行的性能影响

&#xff08;有许多人是用青春的幸福作成功的代价的。——莫扎特&#xff09; B树 关于B树的原理请查看这篇文章 分析 MySQL采用了索引组织表的形式组织数据&#xff0c;叶子节点存储数据&#xff0c;非叶子节点存储主键与页面号的映射关系。若用户的主键长度是8字节时&…

基于MATLAB涡度通量数据处理

查看原文>>>基于MATLAB涡度通量数据处理实践技术应用 【内容简述】&#xff1a; 基于MATLAB语言、以实践案例为主&#xff0c;提供代码、原理与操作结合1、以涡度通量塔的高频观测数据为例&#xff1a;基于MATLAB上机操作2、涡度通量观测基本概况&#xff1a;观测技术…

用友 畅捷通T+ DownloadProxy.aspx 任意文件读取漏洞

1. 漏洞描述 用友 畅捷通T DownloadProxy.aspx文件存在任意文件读取漏洞&#xff0c;攻击者通过漏洞可以获取服务器上的敏感文件. 2.FOFA app"畅捷通-TPlus" 3.漏洞复现 登录页面 验证POC /tplus/SM/DTS/DownloadProxy.aspx?preload1&Path../../Web.Confi…

2.3 逻辑代数的基本公式和常用公式

博主介绍&#xff1a;一个爱打游戏的计算机专业学生 博主主页&#xff1a;夏驰和徐策 所属专栏&#xff1a;程序猿之数字电路 学习目标&#xff1a; 1. 学习基本概念&#xff1a;首先&#xff0c;了解逻辑代数的基本概念和术语&#xff0c;如命题、逻辑运算符&#xff08;与…

探索上位机编程的挑战与乐趣

上位机编程的难度取决于多个因素&#xff0c;包括您的编程经验、所使用的编程语言和开发工具、应用程序的复杂程度等等。 如果您具备一定的编程经验并且熟悉所选的编程语言和开发工具&#xff0c;那么上位机编程可能相对容易上手。上位机编程通常涉及与外部设备&#xff08;如…

Unity入门1——窗口布局

文章目录 一、Hierarchy 窗口 二、Scene 窗口 三、工具栏 四、Game 窗口 五、Project 工程窗口 六、Inspector 窗口 七、Console 窗口 一、Hierarchy 窗口 ​ 在这里创建对象、操作对象。 ​ 快捷键&#xff1a;F2&#xff1a;对象改名 ​ CtrlC&#xff1a;复制 ​ CtrlV&…

avue curd 中的配置项插槽使用

效果图&#xff1a;&#xff08;新增时候的步骤条&#xff0c;以为是设置透明度是0-1中的小数 avue中步骤是整数 于是使用到插槽用element-ui&#xff09; html&#xff1a; <template slot"opacityForm"><el-row class"row"><el-slider v-…

ABAP:后台执行JOB报错问题

错误&#xff1a;CL_GUI_CUSTOM_CONTAINERCP生成容器错误&#xff0c;主要在OOALV中运用到 原因&#xff1a;是由于我们在JOB后台执行的时候无法打开GUI端而报错的 此时&#xff0c;我们就需要在程序中去规避后台执行这一段逻辑&#xff0c;可以通过SY-BATCH解决&#xff0c;当…

今天终于知道了,阿里巴巴 P8、P9 及以上到底是什么水平?

做人做事不能万事向钱看&#xff0c;但是钱这个东西很多时候都反映了事物的价值以及一个人的能力水平。 比如阿里P8、P9 这些拿着高薪的程序员他们的技术水平就一直是大家好奇的。 今天在逛某乎的时候就恰好看见了一个几百万人关注的问题&#xff1a; 阿里的高p们动辄百万以上…

探索地理空间的无限可能:GIS地图的应用与发展

随着科技的飞速发展和数字化时代的来临&#xff0c;GIS地图正成为一个强大的工具&#xff0c;为我们提供了更准确、全面的地理空间数据和智能化的解决方案。GIS地图集成了地理信息、空间分析和可视化技术&#xff0c;为我们打开了一个全新的世界&#xff0c;让我们能够更好地理…

linux进阶 --- chrony服务器

chrony服务器 &#xff08;1&#xff09;定义&#xff1a; 是一个开源自由的网络时间协议NTP的客户端与服务器端软件。让计算机保持系统时钟与时钟服务器&#xff08;NTP&#xff09;同步。chrony由两个程序组成&#xff0c;chronyd&#xff08;服务器端&#xff09;和chronyc…

接口如何运用pytest+HttpRunner展开测试?

目录 前言&#xff1a; 一、 什么是接口测试 二、 引入自动化背景 三、 自动化技术选型 四、 自动化测试用例 五、自动化成果 前言&#xff1a; pytest和HttpRunner都是Python编程语言中常用的接口测试框架。 pytest是一种成熟的、灵活的、社区支持良好的测试框架&…

【问题记录】Visual Studio 下的Qt工程无法打开 “xxx.ui“ 文件和LNK1104 无法打开文件“Qt5Cored.lib”错误

环境 Windows 11 家庭中文版Microsoft Visual Studio Community 2022 (64 位) - Current 版本 17.5.3qt-vsaddin-msvc2022-2.9.1-rev.06 问题产生 VS下Qt环境准备好后&#xff0c;创建了Qt工程然后点击 Form Files 下的 “xxx.ui” 文件&#xff0c;在弹出 Qt 设计师 界面后…

全网最详细,性能测试-连接池与线程详解,8年测试总结...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 连接池 1、什么是…

基础硬件查漏补缺

1、开发板常见物理设备接口 跳线&#xff08;Jumper&#xff09;&#xff1a;跳线是起短接作用的微型插头&#xff0c;与多针微型插座配合使用。用来调整参数&#xff0c;扩大主板通用性。一般的跳线是方形塑料帽&#xff0c;其内部是金属&#xff0c;也叫做跳帽。 跳线有三代…

Jetpack Compose —— 深入理解 Column 布局

Jetpack Compose 是 Android 最新的 UI 工具包&#xff0c;其中的 Column 是一种常用的布局组件。在本篇我们将深入了解 Column 的使用方法和特性&#xff0c;以帮助您更好地理解和应用 Jetpack Compose 中的 Column 布局。 一、什么是 Column Column 是 Jetpack Compose 中用…