重回前端(四) 您所在的位置:网站首页 网址后缀site 重回前端(四)

重回前端(四)

2023-03-09 03:59| 来源: 网络整理| 查看: 265

Internet 上的每一个网页都具有一个唯一的名称标识,通常称之为 URL(Uniform Resource Locator,统一资源定位器)。它是 www 的统一资源定位标志,简单地说 URL 就是 web 地址,俗称“网址”。几个问题我们敲的地址到底是啥? 网址那网址是啥意思? 答曰:xx常见地址http://www.baidu.com http://www.baidu.com/search http://www.baidu.com:80/search?fr=tieba&lm=0&od=0 http://www.baidu.com:80/search?fr=tieba&lm=0&od=0#/index?label=do网址标准

protocol:[//[user:password@]host[:port]][/]path[?query][#fragment]

URL 由三部分组成:资源类型、存放资源的主机域名、资源文件名。(带方括号[]的为可选项)

标准的 URL 格式中部分内容是可以省略的。

protocol(协议)

指定使用的传输协议,下表列出 protocol 属性的有效方案名称。 最常用的是 HTTP 协议,它也是目前 WWW 中应用最广的协议。

- file 资源是本地计算机上的文件。格式file:///,注意后边应是三个斜杠。 - ftp 通过 FTP访问资源。格式 FTP:// - gopher 通过 Gopher 协议访问该资源。 - http 通过 HTTP 访问该资源。 格式 HTTP:// - https 通过安全的 HTTPS 访问该资源。 格式 HTTPS:// - mailto 资源为电子邮件地址,通过 SMTP 访问。 格式 mailto: - MMS 通过 支持MMS(流媒体)协议的播放该资源。(代表软件:Windows Media Player)格式 MMS:// - ed2k 通过 支持ed2k(专用下载链接)协议的P2P软件访问该资源。(代表软件:电驴) 格式 ed2k:// - Flashget 通过 支持Flashget:(专用下载链接)协议的P2P软件访问该资源。(代表软件:快车) 格式 Flashget:// - thunder 通过 支持thunder(专用下载链接)协议的P2P软件访问该资源。(代表软件:迅雷) 格式 thunder:// - news 通过 NNTP 访问该资源。hostname(主机名)

是指存放资源的服务器的域名系统(DNS) 主机名或 IP 地址。有时,在主机名前也可以包含连接到服务器所需的用户名和密码(格式:username:password@hostname)。

port(端口号)

整数,可选,省略时使用方案的默认端口,各种传输协议都有默认的端口号,如 http 的默认端口为 80。如果输入时省略,则使用默认端口号。有时候出于安全或其他考虑,可以在服务器上对端口进行重定义,即采用非标准端口号,此时,URL 中就不能省略端口号这一项。

path(路径)

由零或多个“/”符号隔开的字符串,一般用来表示主机上的一个目录或文件地址。

query(查询)

可选,用于给动态网页(如使用 CGI、ISAPI、PHP/JSP/ASP/ASP。NET 等技术制作的网页)传递参数,可有多个参数,用“&”符号隔开,每个参数的名和值用“=”符号隔开。

fragment(信息片断)

字符串,用于指定网络资源中的片断。例如一个网页中有多个名词解释,可使用 fragment 直接定位到某一名词解释。

fragment 说明和 query 不同,query 是会带到服务器的,而 fragment 只有浏览器知道;fragment 的改变不会触发浏览器刷新页面,但是会生成浏览历史;fragment 会被浏览器根据文件媒体类型(MIME type)进行对应的处理;部分搜索引擎会忽略#及其后面的字符串。案例说明http://www.baidu.com:80/search?fr=tieba&lm=0&od=0#/index?label=dohttps(协议:protocol)http://www.baidu.com(域名:host)80(端口:port,http 协议默认端口,https 默认端口是 443)/search(路径:path)?fr=tieba&lm=0&od=0(参数:query)/index?label=do(信息片断,在单页面时代又叫路由)

信息片断案例

top[https://m.lu.com/index.html#top]通过上面 url 访问可以直接定位到页面的当前位置拓展 客户端应用可以向操作系统注册一个地址,该地址用于从浏览器或其他应用中启动本应用。 这个后续开发会用到,这里先适当了解即可,Scheme、universal link的核心目的就是让浏览器可以直接把对应的APP(比如百度app)打开,或者用百度app打开淘宝appScheme

客户端自定义的 URL 作为从一个应用调用另一个的基础,遵循 RFC 1808 (Relative Uniform Resource Locators) 标准。这跟我们常见的网页内容 URL 格式一样。

如配置 WebActivity 完整的打开链接为openapp://test:8000/detail,需要在 AndroidManifest.xml 配置

Android 端调起 通过指定 Intent 的 Action 为 Intent.ACTION_VIEW,传入解析的 Uri

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("openapp://test:8000/detail?title=电视影音&url=https://u.jd.com/1dfFwO")); startActivity(intent);

传递参数的方法跟 web 端一样,通过问号?分隔,参数名和值之间使用等号=连接,多个参数之间使用&拼接。

Android 端参数接收

Uri uri = getIntent().getData(); if (uri != null) { // 完整的url信息 String totalUrl = uri.toString(); Log.i(TAG, "完整url: " + totalUrl); // scheme 协议 String scheme = uri.getScheme(); Log.i(TAG, "scheme: " + scheme); // host 主机 String host = uri.getHost(); Log.i(TAG, "host: " + host); //port 端口 int port = uri.getPort(); Log.i(TAG, "port: " + port); // 访问路径 String path = uri.getPath(); Log.i(TAG, "path: " + path); // 获取所有参数 String query = uri.getQuery(); Log.i(TAG, "query: " + query); //获取指定参数值 String title = uri.getQueryParameter("title"); Log.i(TAG, "title: " + title); String url = uri.getQueryParameter("url"); Log.i(TAG, "url: " + url); }

唤起后可以看见打印的日志信息:

日志

web 端唤起 直接当做一个普通的连接形式,直接跳转

window.location = "openapp://test:8000/detail?title=电视影音&url=https://u.jd.com/1dfFwO";

或者设置超链接等待用户点击

在app中打开universal link iOS 9 之前,一直使用的是 URL Schemes 技术来从外部对 App 进行跳转,但是 iOS 系统中进行 URL Schemes 跳转的时候如果没有安装 App,会提示 Cannot open Page 的提示,而且当注册有多个 scheme 相同的时候,目前没有办法区分,但是从 iOS 9 起可以使用 Universal Links 技术进行跳转页面,这是一种体验更加完美的解决方案

什么是 Universal Link(通用链接) Universal Link 是 Apple 在 iOS 9 推出的一种能够方便的通过传统 HTTPS 链接来启动 APP 的功能。如果你的应用支持 Universal Link,当用户点击一个链接时可以跳转到你的网站并获得无缝重定向到对应的 APP,且不需要通过 Safari 浏览器。如果你的应用不支持的话,则会在 Safari 中打开该链接

支持 Universal Link(通用链接) 先决条件:必须有一个支持 HTTPS 的域名,并且拥有该域名下上传到根目录的权限(为了上传 Apple 指定文件)

集成步骤

开发者中心配置 找到对应的 App ID,在 Application Services 列表里有 Associated Domains 一条,把它变为 Enabled 就可以了

工程配置 targets->Capabilites->Associated Domains,在其中的 Domains 中填入你想支持的域名,必须以 applinks:为前缀,如:applinks:domain

配置指定文件 创建一个内容为 json 格式的文件,苹果将会在合适的时候,从我们在项目中填入的域名请求这个文件。这个文件名必须为 apple-app-site-association,切记没有后缀名,文件内容大概是这样子:

{ "applinks": { "apps": [], "details": [ { "appID": "9JA89QQLNQ.com.apple.wwdc", "paths": ["/wwdc/news/", "/videos/wwdc/2015/*"] }, { "appID": "ABCD1234.com.apple.wwdc", "paths": ["*"] } ] } } appID:组成方式是 TeamID.BundleID。如上面的 9JA89QQLNQ 就是 teamId。登陆开发者中心,在 Account -> Membership 里面可以找到 Team ID paths:设定你的 app 支持的路径列表,只有这些指定路径的链接,才能被 app 所处理。*的写法代表了可识别域名下所有链接 上传该文件 上传该文件到你的域名所对应的根目录或者.well-known 目录下,这是为了苹果能获取到你上传的文件。上传完后,先访问一下,看看是否能够获取到,当你在浏览器中输入这个文件链接后,应该是直接下载 apple-app-site-association 文件

代码中的相关支持 当点击某个链接,可以直接进我们的 app,但是我们的目的是要能够获取到用户进来的链接,根据链接来展示给用户相应的内容,我们需要在工程里实现 AppDelegate 对应的方法:

- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler { if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) { NSString *urlStr = userActivity.webpageURL.absoluteString; if ([urlStr isEqualToString:@"https://class.xxxxxxxx.com/app/apple-app-site-association"]) {//这里好像也可以使用链接的其他写法比如:class.xxxxxxxx.com这样就行,没有实验过. return YES; } } return [self UMApplication:application continueUserActivity:userActivity restorationHandler:restorationHandler];// 这里其实是我封装了友盟的相关东西. }

苹果为了方便开发者,提供了一个网页验证我们编写的这个 apple-app-site-association 是否合法有效 Universal Links for Developers

Universal Link(通用链接)注意点

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

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

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

iOS 会先请求https://domain.com/.well-known/apple-app-site-association,如果此文件请求不到,再去请求https://domain.com/apple-app-site-association,所以如果想要避免服务器接收过多GET请求,可以直接把apple-app-site-association放在./well-known目录下

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

Universal Link 的好处

之前的 Custom URL scheme 是自定义的协议,因此在没有安装该 app 的情况下是无法直接打开的。而 Universal Links 本身就是一个能够指向 web 页面或者 app 内容页的标准 web link,因此能够很好的兼容其他情况

Universal links 是从服务器上查询是哪个 app 需要被打开,因此不存在 Custom URL scheme 那样名字被抢占、冲突的情况

Universal links 支持从其他 app 中的 UIWebView 中跳转到目标 app

提供 Universal link 给别的 app 进行 app 间的交流时,对方并不能够用这个方法去检测你的 app 是否被安装(之前的 custom scheme URL 的 canOpenURL 方法可以) Internet 上的每一个网页都具有一个唯一的名称标识,通常称之为 URL(Uniform Resource Locator,统一资源定位器)。它是 www 的统一资源定位标志,简单地说 URL 就是 web 地址,俗称“网址”。

几个问题我们敲的地址到底是啥? 网址那网址是啥意思? 答曰:xx常见地址http://www.baidu.com http://www.baidu.com/search http://www.baidu.com:80/search?fr=tieba&lm=0&od=0 http://www.baidu.com:80/search?fr=tieba&lm=0&od=0#/index?label=do网址标准

protocol:[//[user:password@]host[:port]][/]path[?query][#fragment]

URL 由三部分组成:资源类型、存放资源的主机域名、资源文件名。(带方括号[]的为可选项)

标准的 URL 格式中部分内容是可以省略的。

protocol(协议)

指定使用的传输协议,下表列出 protocol 属性的有效方案名称。 最常用的是 HTTP 协议,它也是目前 WWW 中应用最广的协议。

- file 资源是本地计算机上的文件。格式file:///,注意后边应是三个斜杠。 - ftp 通过 FTP访问资源。格式 FTP:// - gopher 通过 Gopher 协议访问该资源。 - http 通过 HTTP 访问该资源。 格式 HTTP:// - https 通过安全的 HTTPS 访问该资源。 格式 HTTPS:// - mailto 资源为电子邮件地址,通过 SMTP 访问。 格式 mailto: - MMS 通过 支持MMS(流媒体)协议的播放该资源。(代表软件:Windows Media Player)格式 MMS:// - ed2k 通过 支持ed2k(专用下载链接)协议的P2P软件访问该资源。(代表软件:电驴) 格式 ed2k:// - Flashget 通过 支持Flashget:(专用下载链接)协议的P2P软件访问该资源。(代表软件:快车) 格式 Flashget:// - thunder 通过 支持thunder(专用下载链接)协议的P2P软件访问该资源。(代表软件:迅雷) 格式 thunder:// - news 通过 NNTP 访问该资源。hostname(主机名)

是指存放资源的服务器的域名系统(DNS) 主机名或 IP 地址。有时,在主机名前也可以包含连接到服务器所需的用户名和密码(格式:username:password@hostname)。

port(端口号)

整数,可选,省略时使用方案的默认端口,各种传输协议都有默认的端口号,如 http 的默认端口为 80。如果输入时省略,则使用默认端口号。有时候出于安全或其他考虑,可以在服务器上对端口进行重定义,即采用非标准端口号,此时,URL 中就不能省略端口号这一项。

path(路径)

由零或多个“/”符号隔开的字符串,一般用来表示主机上的一个目录或文件地址。

query(查询)

可选,用于给动态网页(如使用 CGI、ISAPI、PHP/JSP/ASP/ASP。NET 等技术制作的网页)传递参数,可有多个参数,用“&”符号隔开,每个参数的名和值用“=”符号隔开。

fragment(信息片断)

字符串,用于指定网络资源中的片断。例如一个网页中有多个名词解释,可使用 fragment 直接定位到某一名词解释。

fragment 说明和 query 不同,query 是会带到服务器的,而 fragment 只有浏览器知道;fragment 的改变不会触发浏览器刷新页面,但是会生成浏览历史;fragment 会被浏览器根据文件媒体类型(MIME type)进行对应的处理;部分搜索引擎会忽略#及其后面的字符串。案例说明 http://www.baidu.com:80/search?fr=tieba&lm=0&od=0#/index?label=dohttps(协议:protocol)http://www.baidu.com(域名:host)80(端口:port,http 协议默认端口,https 默认端口是 443)/search(路径:path)?fr=tieba&lm=0&od=0(参数:query)/index?label=do(信息片断,在单页面时代又叫路由)

信息片断案例

tophttps://m.lu.com/index.html#top通过上面 url 访问可以直接定位到页面的当前位置拓展 客户端应用可以向操作系统注册一个地址,该地址用于从浏览器或其他应用中启动本应用。Scheme

客户端自定义的 URL 作为从一个应用调用另一个的基础,遵循 RFC 1808 (Relative Uniform Resource Locators) 标准。这跟我们常见的网页内容 URL 格式一样。

如配置 WebActivity 完整的打开链接为openapp://test:8000/detail,需要在 AndroidManifest.xml 配置

Android 端调起 通过指定 Intent 的 Action 为 Intent.ACTION_VIEW,传入解析的 Uri

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("openapp://test:8000/detail?title=电视影音&url=https://u.jd.com/1dfFwO")); startActivity(intent);

传递参数的方法跟 web 端一样,通过问号?分隔,参数名和值之间使用等号=连接,多个参数之间使用&拼接。

Android 端参数接收

Uri uri = getIntent().getData(); if (uri != null) { // 完整的url信息 String totalUrl = uri.toString(); Log.i(TAG, "完整url: " + totalUrl); // scheme 协议 String scheme = uri.getScheme(); Log.i(TAG, "scheme: " + scheme); // host 主机 String host = uri.getHost(); Log.i(TAG, "host: " + host); //port 端口 int port = uri.getPort(); Log.i(TAG, "port: " + port); // 访问路径 String path = uri.getPath(); Log.i(TAG, "path: " + path); // 获取所有参数 String query = uri.getQuery(); Log.i(TAG, "query: " + query); //获取指定参数值 String title = uri.getQueryParameter("title"); Log.i(TAG, "title: " + title); String url = uri.getQueryParameter("url"); Log.i(TAG, "url: " + url); }

唤起后可以看见打印的日志信息:

日志

web 端唤起 直接当做一个普通的连接形式,直接跳转

window.location = "openapp://test:8000/detail?title=电视影音&url=https://u.jd.com/1dfFwO";

或者设置超链接等待用户点击

在app中打开universal link iOS 9 之前,一直使用的是 URL Schemes 技术来从外部对 App 进行跳转,但是 iOS 系统中进行 URL Schemes 跳转的时候如果没有安装 App,会提示 Cannot open Page 的提示,而且当注册有多个 scheme 相同的时候,目前没有办法区分,但是从 iOS 9 起可以使用 Universal Links 技术进行跳转页面,这是一种体验更加完美的解决方案

什么是 Universal Link(通用链接) Universal Link 是 Apple 在 iOS 9 推出的一种能够方便的通过传统 HTTPS 链接来启动 APP 的功能。如果你的应用支持 Universal Link,当用户点击一个链接时可以跳转到你的网站并获得无缝重定向到对应的 APP,且不需要通过 Safari 浏览器。如果你的应用不支持的话,则会在 Safari 中打开该链接

支持 Universal Link(通用链接) 先决条件:必须有一个支持 HTTPS 的域名,并且拥有该域名下上传到根目录的权限(为了上传 Apple 指定文件)

集成步骤

开发者中心配置 找到对应的 App ID,在 Application Services 列表里有 Associated Domains 一条,把它变为 Enabled 就可以了

Application Services

工程配置 targets->Capabilites->Associated Domains,在其中的 Domains 中填入你想支持的域名,必须以 applinks:为前缀,如:applinks:domain

Associated Domains

配置指定文件 创建一个内容为 json 格式的文件,苹果将会在合适的时候,从我们在项目中填入的域名请求这个文件。这个文件名必须为 apple-app-site-association,切记没有后缀名,文件内容大概是这样子:

{ "applinks": { "apps": [], "details": [ { "appID": "9JA89QQLNQ.com.apple.wwdc", "paths": ["/wwdc/news/", "/videos/wwdc/2015/*"] }, { "appID": "ABCD1234.com.apple.wwdc", "paths": ["*"] } ] } } appID:组成方式是 TeamID.BundleID。如上面的 9JA89QQLNQ 就是 teamId。登陆开发者中心,在 Account -> Membership 里面可以找到 Team ID paths:设定你的 app 支持的路径列表,只有这些指定路径的链接,才能被 app 所处理。*的写法代表了可识别域名下所有链接 上传该文件 上传该文件到你的域名所对应的根目录或者.well-known 目录下,这是为了苹果能获取到你上传的文件。上传完后,先访问一下,看看是否能够获取到,当你在浏览器中输入这个文件链接后,应该是直接下载 apple-app-site-association 文件

代码中的相关支持 当点击某个链接,可以直接进我们的 app,但是我们的目的是要能够获取到用户进来的链接,根据链接来展示给用户相应的内容,我们需要在工程里实现 AppDelegate 对应的方法:

- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler { if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) { NSString *urlStr = userActivity.webpageURL.absoluteString; if ([urlStr isEqualToString:@"https://class.xxxxxxxx.com/app/apple-app-site-association"]) {//这里好像也可以使用链接的其他写法比如:class.xxxxxxxx.com这样就行,没有实验过. return YES; } } return [self UMApplication:application continueUserActivity:userActivity restorationHandler:restorationHandler];// 这里其实是我封装了友盟的相关东西. }

苹果为了方便开发者,提供了一个网页验证我们编写的这个 apple-app-site-association 是否合法有效

Universal Links for Developers

Universal Link(通用链接)注意点

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

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

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

iOS 会先请求https://domain.com/.well-known/apple-app-site-association,如果此文件请求不到,再去请求https://domain.com/apple-app-site-association,所以如果想要避免服务器接收过多GET请求,可以直接把apple-app-site-association放在./well-known目录下

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

Universal Link 的好处

之前的 Custom URL scheme 是自定义的协议,因此在没有安装该 app 的情况下是无法直接打开的。而 Universal Links 本身就是一个能够指向 web 页面或者 app 内容页的标准 web link,因此能够很好的兼容其他情况

Universal links 是从服务器上查询是哪个 app 需要被打开,因此不存在 Custom URL scheme 那样名字被抢占、冲突的情况

Universal links 支持从其他 app 中的 UIWebView 中跳转到目标 app

提供 Universal link 给别的 app 进行 app 间的交流时,对方并不能够用这个方法去检测你的 app 是否被安装(之前的 custom scheme URL 的 canOpenURL 方法可以)



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有