iOS 唤起 APP: Universal Link(通用链接)(下)

本文涉及的产品
.cn 域名,1个 12个月
简介: iOS 唤起 APP: Universal Link(通用链接)(下)

2.网站验证


上传之后,可以访问 search.developer.apple.com/appsearch-v…,苹果专门提供的验证工具,然后将域名网址填进去,例如 https://www.lazypig.net/,然后点击测试。


image.png


下面如果显示的是 Passed,那就证明符合规则,如果有不合规则的可以参考下面的修正。


image.png


3.网站不合规则的修正方法

3.1 Title 不符合规则

在首页的 header 标签中增加 <title> 标签,例如:

<head>
    <title>胡东东博客</title>
    ……
</head>


3.2 Description 不符合规则

在首页的 header 标签中增加 description  标签,例如:

<head>
    <meta name="description" content="胡东东博客,分享手游和app开发的日常点滴" />
    ……
</head>


3.3 Image不符合规则

在首页的 header 标签中增加 og:image 标签,例如:

<head>
    <meta property="og:image" content="https://www.baidu.com/img/superlogo_c4d7df0a003d3db9b65e9ef0fe6da1ec.png?where=super" />
    ……
</head>


3.4 Touch Icon不符合规则

在首页的 header 标签中增加 apple-touch-icon 标签,例如:

<head>
    <link rel="apple-touch-icon" href="/static/quick0012.png">
    ……
</head>


3.5 Link to Application Action required

这个基本是因为app还没有上架,上架审核通过之后发布即可。


4.显示验证

可以打一个测试包安装到手机,然后用 safari 浏览器打开指定的网页即可看到飘窗,例如打开 www.lazypig.net/app/lazypig…,就会看到 懒猪时间盒 的打开飘窗。


网页配置


网页中对需要唤起 App 的按钮或者控件添加点击事件,事件的函数代码如下:

function wakeUpApp(){
    if (navigator.userAgent.match(/(iPhone|iPod|iPad);?/i)) {
        var loadDateTime = new Date();
        window.setTimeout(function() {
            var timeOutDateTime = new Date();
            if (timeOutDateTime - loadDateTime < 5000) {
                window.location.href = "http://a.app.qq.com/o/simple.jsp?pkgname=你的应用宝BundleID";
            } else {
                window.close();
            }
        },
            25);
        window.location.href = "https://yourdomainname.com/";          
    } else if (navigator.userAgent.match(/android/i)) {
        var state = null;
        try {
            state = window.open("apps custom url schemes ", '_blank');
        } catch(e) {}
        if (state) {
            window.close();
        } else {
            window.location.href = "要跳转的页面URL";
        }
    }
}

注:代码中 yourdomainname.com 还可以后面添加 /goodid/123456 之类的属性id后缀,用来传递事件类型和 id,方便移动端做更丰富的功能需求,比如通过 goodid 识别要做的下一步动作是打开商品 id 为123456 的商品详情页,等等。


测试一下


配置完成,查看是否能唤起 App,也可以通过如下图中,输入域名,长按来唤起 App 做验证。


image.png


网站向 App 传值


AppDelegate 中,可以通过回调函数获取网站向 App 传的链接,通过链接做不同的逻辑处理。


Swift 代码实现

//从通用链接进来
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
    if userActivity.activityType == NSUserActivityTypeBrowsingWeb {
        if let url = userActivity.webpageURL {
            print("从通用链接进入app",url.absoluteString)
        }
    }
    return true;
}


Objective-C 代码实现

- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler {
    if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) {
        NSURL *url = userActivity.webpageURL;
        if (url是我们希望处理的){
            //进行我们的处理
        }
    }
    return YES;
}


注意点


1.Universal Link 有跨域问题

Universal Link 必须要求跨域,如果不跨域,就不会跳转(iOS 9.2 之后的改动) 假如当前网页的域名是 A,当前网页发起跳转的域名是 B,必须要求 B 和 A 是不同域名才会触发 Universal Link,如果 B 和 A 是相同域名,只会继续在当前 WebView 里面进行跳转,哪怕你的 Universal Link 一切正常,根本不会打开 App。

前端开发经常面临跨域问题,恩 Universal Link 也有跨域问题,但不一样的是,Universal Link 必须要求跨域,如果不跨域,就不行,就失效,就不工作。

iOS 9.2之后的改动,苹果就这么规定这么设计的~

这也是上面拿知乎举例子的时候重点强调的一个问题,知乎为什么使用 oia.zhihu.com 做 Universal Link?

  • 假如当前网页的域名是 A
  • 当前网页发起跳转的域名是 B
  • 必须要求 B 和 A 是不同域名,才会触发Universal Link
  • 如果B 和 A 是相同域名,只会继续在当前WebView里面进行跳转,哪怕你的Universal Link一切正常,根本不会打开App


是不是不太好理解,那直接拿知乎举例子,知乎的一般网页 URL 都是 www.zhihu.com 域名,你在微信朋友圈看到了知乎的问题分享,如果 copy url 你就能看到这样的链接:www.zhihu.com/question/22…


image.png


image.png


微信里其实是屏蔽 Schema 的,但是你依然能看到大大的一个按钮 App内打开,这确实就是通过 Universal Link 来实现的,但如果知乎把 Universal Link 配在了 www.zhihu.com 域名,那么即便已经安装了 App,Universal Link 也是不会生效的。


一般的公司都会有自己的主域名,比如知乎的 www.zhihu.com,在各处分享传播的时候,也都是直接分享基于主域名的 url,但为了解决苹果强制要求跨域才生效的问题,Universal Link 就不能配置在主域名下,于是知乎才会准备一个 oia.zhihu.com 域名,专为 Universal Link 使用,不会跟任何主动传播分享的域名撞车,从而在任何活动 WAP 页面里,都能顺利让 Universal Link 生效。

简单一句话

  • 只有当前 webview 的 url 域名,与跳转目标 url 域名不一致时,Universal Link 才生效。


2.Universal Link 请求 apple-app-site-association 时机

当我们的 App 在设备上第一次运行时,如果支持 Associated Domains 功能,那么 iOS 会自动去 GET 定义的 Domain 下的 apple-app-site-association 文件。


iOS 会先请求 domain.com/.well-known…domain.com/apple-app-s… GET 请求,可以直接把 apple-app-site-association放在./well-known 目录下。


服务器上 apple-app-site-association 的更新不会让 iOS 本地的 apple-app-site-association 同步更新,即 iOS 只会在 App 第一次启动时请求一次,以后除非 App 更新或重新安装,否则不会在每次打开时请求 apple-app-site-association。


3.apple-app-association 被覆盖后如何更新

线上已经工作的 Universal Link 功能,突然有一天发现坏了,查了一圈最后查到被覆盖了,那就修复呗,修复倒是没问题,问题在于修复后的 Universal Link,用户必须重新安装一次 App,才能重新生效。


所以关键是需要掌握 apple-app-association 的更新时机,反复重新杀 App 重开完全没用,删了 App 重装确实有用,但不可能让用户这么去做。


stackoverflow.com/questions/3…

这里解释了,每次 App 安装后的第一次 Launch,会拉取 apple-app-association,除此之外在 AppStore 每次 App 的版本更新后的第一次 Launch,也会拉取 apple-app-association。

也就是说,一旦不小心因为意外 apple-app-association,想要挽回又让那部分用户无感,App 再发一个版本就好了。


参考


www.geekhub.cn/a/2629.html



目录
相关文章
|
2月前
|
iOS开发 开发者
iOS微信分享配置universal links步骤
iOS微信分享配置universal links步骤
1334 58
|
30天前
|
JavaScript 小程序 开发者
uni-app开发实战:利用Vue混入(mixin)实现微信小程序全局分享功能,一键发送给朋友、分享到朋友圈、复制链接
uni-app开发实战:利用Vue混入(mixin)实现微信小程序全局分享功能,一键发送给朋友、分享到朋友圈、复制链接
316 0
|
1月前
|
缓存 开发框架 移动开发
uni-app:下载使用uni&创建项目&和小程序链接&数据缓存&小程序打包 (一)
uni-app 是一个跨平台的开发框架,它允许开发者使用 Vue.js 来构建应用程序,并能够同时发布到多个平台,如微信小程序、支付宝小程序、H5、App(通过DCloud的打包服务)等。uni-app 的目标是通过统一的代码库,简化多平台开发过程,提高开发效率。 在这一部分中,我们将逐步介绍如何下载和使用uni-app、创建一个新的项目、如何将项目链接到小程序,以及实现数据缓存的基本方法。
|
1月前
|
安全 网络安全 Android开发
深度解析:利用Universal Links与Android App Links实现无缝网页至应用跳转的安全考量
【10月更文挑战第2天】在移动互联网时代,用户经常需要从网页无缝跳转到移动应用中。这种跳转不仅需要提供流畅的用户体验,还要确保安全性。本文将深入探讨如何利用Universal Links(仅限于iOS)和Android App Links技术实现这一目标,并分析其安全性。
222 0
|
3月前
|
编解码 iOS开发
IOS上架APP Store时预览图尺寸
IOS上架APP Store时预览图尺寸
639 3
|
3月前
|
iOS开发
App备案与iOS云管理式证书 ,公钥及证书SHA-1指纹的获取方法
App备案与iOS云管理式证书 ,公钥及证书SHA-1指纹的获取方法
184 0
App备案与iOS云管理式证书 ,公钥及证书SHA-1指纹的获取方法
|
3月前
|
开发工具 iOS开发
解决Flutter运行报错Could not run build/ios/iphoneos/Runner.app
解决Flutter运行报错Could not run build/ios/iphoneos/Runner.app
141 2
|
3月前
|
Android开发 iOS开发 C#
Xamarin:用C#打造跨平台移动应用的终极利器——从零开始构建你的第一个iOS与Android通用App,体验前所未有的高效与便捷开发之旅
【8月更文挑战第31天】Xamarin 是一个强大的框架,允许开发者使用单一的 C# 代码库构建高性能的原生移动应用,支持 iOS、Android 和 Windows 平台。作为微软的一部分,Xamarin 充分利用了 .NET 框架的强大功能,提供了丰富的 API 和工具集,简化了跨平台移动应用开发。本文通过一个简单的示例应用介绍了如何使用 Xamarin.Forms 快速创建跨平台应用,包括设置开发环境、定义用户界面和实现按钮点击事件处理逻辑。这个示例展示了 Xamarin.Forms 的基本功能,帮助开发者提高开发效率并实现一致的用户体验。
151 0
|
3月前
|
关系型数据库 MySQL Java
【Azure 应用服务】App Service 无法连接到Azure MySQL服务,报错:com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
【Azure 应用服务】App Service 无法连接到Azure MySQL服务,报错:com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
172 0
|
3月前
|
iOS开发
解决IOS上架App Store后显示语言为英文的问题
解决IOS上架App Store后显示语言为英文的问题
84 0