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

简介: 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



目录
相关文章
|
12天前
|
运维 iOS开发 Windows
windows电脑备案ios APP获取公钥和证书指纹Sha-1值的方法
在阿里云进行APP备案、在备案IOS端的环节的时候,发现需要我们将p12证书安装在电脑上,再用xcode或或钥匙串访问来获取这个证书的公钥和sha-1值。 但是大部分开发uniapp应用的同学们,或者进行发布的运维人员的电脑都是windows,无法按照阿里云的教程来获取ios的公钥和sha-1。备案就被卡主了。 这里介绍下另一个方法,就是使用香蕉云编来在线上传证书获取。如下图所示,打开香蕉云编后,找到下图这个功能
151 0
|
3月前
|
人工智能 IDE 前端开发
写给尊贵的 Tare Pro 用户的喂饭级 IOS APP 开发指南
本文介绍了如何利用 AI IDE Trae,从零开始快速开发一个 iOS 应用《回声》。通过 AI 辅助完成需求梳理、原型设计、编码与调试,展示了 AI 在整个开发流程中的强大助力。
254 0
|
12月前
|
Web App开发 开发框架 前端开发
移动端window.open跳转链接时,iOS没有反应的问题
【10月更文挑战第9天】在移动端使用 `window.open` 跳转链接时,iOS 可能无响应,原因是 iOS 的安全策略和弹出窗口阻止功能。解决方法包括:确保在用户交互后触发 `window.open`,将目标设置为 `_self`,使用锚点链接模拟跳转,或利用专门的移动端框架。需综合考虑这些方案以优化用户体验。
1857 61
|
5月前
|
存储 数据可视化 开发工具
【Application Insights】Application Insights存储的Function App的日志存在"Operation Link" 为空的情况
在将 Azure Functions 升级到 .NET 8 和 Isolated Worker 模式后,Application Insights 的请求日志中 `operation_Link` 字段为空,导致分布式追踪无法正常关联。解决方法包括:确保引用正确的 SDK 包(如 `Microsoft.Azure.Functions.Worker.ApplicationInsights`),正确配置 Application Insights 服务,移除默认日志过滤规则,并使用最新依赖包以支持分布式追踪。通过这些步骤,可恢复端到端事务视图的可视化效果。
100 10
|
iOS开发 开发者
iOS微信分享配置universal links步骤
iOS微信分享配置universal links步骤
2881 58
|
7月前
|
Swift iOS开发 开发者
苹果app上架-ios上架苹果商店app store 之苹果支付In - App Purchase内购配置-优雅草卓伊凡
苹果app上架-ios上架苹果商店app store 之苹果支付In - App Purchase内购配置-优雅草卓伊凡
674 13
苹果app上架-ios上架苹果商店app store 之苹果支付In - App Purchase内购配置-优雅草卓伊凡
|
7月前
|
存储 数据安全/隐私保护 开发者
苹果app上架app store 之苹果开发者账户在mac电脑上如何使用钥匙串访问-发行-APP发布证书ios_distribution.cer-优雅草卓伊凡
苹果app上架app store 之苹果开发者账户在mac电脑上如何使用钥匙串访问-发行-APP发布证书ios_distribution.cer-优雅草卓伊凡
233 8
苹果app上架app store 之苹果开发者账户在mac电脑上如何使用钥匙串访问-发行-APP发布证书ios_distribution.cer-优雅草卓伊凡
|
9月前
|
安全 数据安全/隐私保护 Android开发
【05】2025年1月首发完整版-篇幅较长-苹果app如何上架到app store完整流程·不借助第三方上架工具的情况下无需花钱但需仔细学习-优雅草央千澈详解关于APP签名以及分发-们最关心的一篇来了-IOS上架app
【05】2025年1月首发完整版-篇幅较长-苹果app如何上架到app store完整流程·不借助第三方上架工具的情况下无需花钱但需仔细学习-优雅草央千澈详解关于APP签名以及分发-们最关心的一篇来了-IOS上架app
1063 75
|
8月前
|
JavaScript 搜索推荐 Android开发
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
246 8
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
|
8月前
|
数据采集 JavaScript Android开发
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
237 7
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡

热门文章

最新文章