Swift - 通用链接(Universal Links)的使用详解(链接打开app)

82 篇文章 1 订阅
订阅专栏

一、通用链接介绍

通用链接( Universal Links)是  iOS9 推出的一项功能。如果我们的应用支持通用链接,那么就能够方便的通过传统的  HTTP 链接来启动  APP(只要设备上已经安装了这个  App,不需要额外做任何判断),或者打开网页(如果  iOS 设备上没有安装该  App


1,通用链接与URL Scheme的区别

(1) URL Scheme 使用介绍

(2)通用链接( Universal Links) 使用介绍
  • 通用链其实就是一条普通的 http 链接。比如:https://www.hangge.com/app
  • 如果我们的 App 支持通用链接,且设备中安装了该 App。那么当用户点击链接,就会直接进入到我们的 App 中了。
  • 如果设备中没有支持这个链接的 App,那么点击链接后还是继续进到链接对应的 html 页面中。完全不需要我们人为判断是去打开 App,还是打开 Web 页面。
  • 同时通过通用链接进入到 App 这个过程是不会弹出提示框的,整个流程十分顺畅。(如果手机安装了“知乎”,我们随便在浏览器中搜索一个知乎页面点击就可以看到效果。)

2,通用链接的优点

  • 唯一性:不像自定义的 scheme,因为它使用标准的 http/https 链接到你的 web 站点,所以它不会被其它的 app 所声明。另外,Custom URL scheme 因为是自定义的协议,所以在没有安装 app 的情况下是无法直接打开的,而 universal links 本身是一个 HTTP/HTTPS 链接,所以有更好的兼容性。
  • 安全:当用户的手机上安装了你的 app,那么 iOS 将去你的网站上去下载你上传上去的说明文件(这个说明文件声明了你的 app 可以打开哪些类型的 http 链接)。因为只有你自己才能上传文件到你网站的根目录,所以你的网站和你的 app 之间的关联是安全的。
  • 可变:当用户手机上没有安装你的 app 的时候,Universal Links 也能够工作。如果你愿意,在没有安装你的 app 的时候,用户点击链接,会在 safari 中展示你网站的内容。
  • 简单:一个 URL 链接,可以同时作用于网站和 app
  • 私有:其它 app 可以在不需要知道你的 app 是否安装了的情况下和你的 app 相互通信。


3,使用条件

  • 有一个注册的域名
  • 通过 SSL 访问域名(即使用 HTTPS 请求)
  • 支持上传一个 JSON 文件到你的域名
  • 至少 iOS 9 beta 2 版本。
  • 至少 Xcode 7 beta 2

二、相关配置

1,创建apple-app-site-association文件

首先创建一个名为  apple-app-site-association 的文件(注意没有后缀),其内容是  json 格式的数据。假设内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
     "applinks" : {
         "apps" : [],
         "details" : [
             {
                 "appID" "MNARL96.com.hangge.demo" ,
                 "paths" : [  "NOT /blog/support/*" "/blog/*" "/app/" ]
             },
             {
                 "appID" "ABCDEFG12.com.hangge.demo" ,
                 "paths" : [  "*"  ]
             }
         ]
     }
}
相关参数说明
  • appID:由 TeamID.BundleId 组成。TeamID 可以从苹果开发账号页面中查看,BundleId 就是 Bundle Identifier,可以直接在工程里查看。
  • paths:其设定一个我们的 App 支持的路径列表,只有这些指定的路径的链接,才能被 App 所处理。
    (注意:path 是大小写敏感。通配符表示任意路径。NOT 关键字表示禁止的部分。数组内优先级从左到右逐渐降低。)


2,上传apple-app-site-association文件

(1)首先在网站的根目录下新建一个  .well-known 文件夹,并将  apple-app-site-association 文件上传到该文件夹中。
如果服务器是  windows 系统,可以在命令提示符( cmd)中使用命令来创建文件夹:
1
md .well-known
apple-app-site-association 文件保存的位置
  • 在 iOS9.3 以前,该文件需要上传到网站的根目录下。
  •  iOS9.3 起,苹果更改了通用链接的请求文件的路径,变成了在 .well-known 目录下。

(2)如果使用的是  IIS 服务器,为了让  apple-app-site-association 文件能被访问到,需要  MIME 类型配置。否则会报  404 错误。
  • 文件扩展名:.
  • MIME类型:application/json
原文:Swift - 通用链接(Universal Links)的使用详解
  
(3)我们使用浏览器测试下是否能访问到。
原文:Swift - 通用链接(Universal Links)的使用详解

(4)当然苹果为了方便开发者,也提供了一个网页来验证我们编写的这个  apple-app-site-association 是否合法有效。
验证地址: https://search.developer.apple.com/appsearch-validation-tool/

3,Xcode相关配置

(1)首先就是将工程配置中的  Associated Domains 打开,并填写上我们想支持的域名(前缀是  applinks)。 App 会在第一次启动的时候从这里填写的域名中请求  apple-app-site-association 文件。
原文:Swift - 通用链接(Universal Links)的使用详解

(2)配置后会发现我们工程中会自动添加了一个  .entitlements 文件。
原文:Swift - 通用链接(Universal Links)的使用详解

同时在开发者中心里可以看到, Associated Domains 是启用状态。
原文:Swift - 通用链接(Universal Links)的使用详解

三、测试使用

编译部署  App 后,我们就可以测试下通用链接是否生效了。这里提供三种方法。

1,使用备忘录测试

(1)我们在  iOS 设备自带的备忘录中添加两条链接,其中一条不符合我们在  apple-app-site-association 文件配置的规则,另一条符合规则。
原文:Swift - 通用链接(Universal Links)的使用详解

(2)如果点击不符合规则的链接,则像原来一样,会使用  safari 浏览器打开这个链接。
原文:Swift - 通用链接(Universal Links)的使用详解

(3)如果点击是符合通用规则的链接,则会自动跳转到我们的  App 中。
原文:Swift - 通用链接(Universal Links)的使用详解

如果长按这个链接,在出现的弹出菜单中还有“ 在XXX中打开”这个选项。
原文:Swift - 通用链接(Universal Links)的使用详解

2,使用邮件测试

给自己的邮箱发封邮件,正文带上要测试的链接。使用手机“ 邮件”App接收并点击测试。
原文:Swift - 通用链接(Universal Links)的使用详解

3,使用浏览器测试

(1)将需要测试的地址放在一个网页中,并使用  safari 浏览器访问这个页面(注意:直接在浏览器地址栏中打开测试地址是没有用的)。这里我访问  hangge.com
原文:Swift - 通用链接(Universal Links)的使用详解

(2)随便点击一个链接(都是符合我前面配置的规则的)打开新页面。这时在出现的网页上用手指下滑,会发现页面上方出现 在" XXX"应用中打开 这个提示信息。
原文:Swift - 通用链接(Universal Links)的使用详解

(3)点击“ 打开”即可跳转到我们的  App 中。
为什么在Safari中点击链接不能直接进入App?
上面样例可以看到我们点击一个链接后还是使用  Safari 打开,只不过新页面下拉多了个使用App打开的选项。
这是由于从  iOS9.3 起,通用链接不支持域内跳转了,跳转前后的两个  domain 必须是不同的,否则只会  Safari 打开。
前面的样例中,我跳转前跳转后都是在  hangge.com 这个域名下,自然不会进入  App。如果我是使用百度搜索到  hangge.com 的页面,然后点击链接,由于前后域不一样则会自动进入到  App 中。

四、在App中添加相关的响应处理

虽然用户点击某个链接,已经可以直接可以进入到我们的  App 中。但我们还是需要获取到用户进来的链接,然后根据链接来处理、展示给用户相应的信息。


在AppDelegate中实现相关的响应方法

下面代码实现,当用户通过链接进入到我们的  App 中时,将这个链接打印出来。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import  UIKit
 
@UIApplicationMain
class  AppDelegate UIResponder UIApplicationDelegate  {
     
     var  window:  UIWindow ?
     
     func  application(_ application:  UIApplication continue  userActivity:  NSUserActivity ,
                      restorationHandler:  @escaping  ([ Any ]?) ->  Void ) ->  Bool  {
         //判断是从Universal Links进来的链接
         if  userActivity.activityType ==  NSUserActivityTypeBrowsingWeb  {
             let  webpageURL = userActivity.webpageURL
             print ( "点击的链接是:\(webpageURL)" )
             //进行后续的处理
             //......
         }
         return  true
     }
     
     func  application(_ application:  UIApplication , didFinishLaunchingWithOptions
         launchOptions: [ UIApplicationLaunchOptionsKey Any ]?) ->  Bool  {
         return  true
     }
     
     func  applicationWillResignActive(_ application:  UIApplication ) {
     }
     
     func  applicationDidEnterBackground(_ application:  UIApplication ) {
     }
     
     func  applicationWillEnterForeground(_ application:  UIApplication ) {
     }
     
     func  applicationDidBecomeActive(_ application:  UIApplication ) {
     }
     
     func  applicationWillTerminate(_ application:  UIApplication ) {
     }
}
运行结果如下
原文:Swift - 通用链接(Universal Links)的使用详解


原文出自: www.hangge.com   转载请保留原文链接: http://www.hangge.com/blog/cache/detail_1554.html
Swift - 打开第三方应用,并传递参数(附常用App的URL Scheme)
C
05-23 2263
我之前写过一篇文章:Swift - URL schemes的使用样例(如:在Safari中打开App)。介绍通过自定义的URL Scheme,实现从外部浏览器或外部应用打开我们的应用。 同样的,如果想从本地应用中跳转到其他的第三方应用并传值。同样是通过URL Scheme实现。 一,使用样例 常用的第三方应用都定义了不同的URL Scheme,我们通过UIApplicatio...
swift-网页打开或者推送根据url地址跳转到相应界面
08-14
网页打开或者推送,根据url地址跳转到相应界面
Android 点击Url(短信链接打开App
03-15 1078
今天关于面试的分享就到这里,还是那句话,有些东西你不仅要懂,而且要能够很好地表达出来,能够让面试官认可你的理解,例如Handler机制,这个是面试必问之题。有些晦涩的点,或许它只活在面试当中,实际工作当中你压根不会用到它,但是你要知道它是什么东西。最后在这里小编分享一份自己收录整理上述技术体系图相关的几十套腾讯、头条、阿里、美团等公司2021年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。还有。
iOS9 Universal Links (通用链接
sun___shine的博客
05-24 547
“What is Universal Links?” Apple 推出通用链接:一种能够方便的通过传统 HTTP 链接启动 APP, 使用相同的网址打开网站和 APP。 通过唯一的网址, 不需要特别的schema就可以链接一个特定的视图到APP 里面 。比如:在微信中使用通用链接, 那么用户在Safari、UIWebView或者 WKWebView点击一个链接, iOS设备上的微信
Universal links(页面跳转app)
Jayant_Y的博客
09-18 1961
http://www.cocoachina.com/ios/20150902/13321.html
iOS Universal Link
Fu_Tong的博客
09-17 980
iOS Universal Link https://www.jianshu.com/p/96649a73795b https://www.jianshu.com/p/77b530f0c67b
Universal links 使用
qq_36724920的博客
11-28 734
外部跳转到APP内部有两种方式 1、Universal Links 2、schema 一、Universal Links tips: 这个文章是给已经创建有现成的app的开发者看的,如果没有创建app,请先去创建app。 工作原理: 在安装某个app的时候,iOS系统会检查App bundle中的Info.plist文件。如果发现有associated domain字段...
swift-在Swift应用中使用自定义深层链接URL的简单方法
08-15
Swift应用中使用自定义深层链接URL的简单方法
swift-App内购买使用soeasy使用SwiftyStoreKit
08-15
App 内购买使用 so easy 使用 SwiftyStoreKit
基于Objective-C和Swift的IoT设备链接iOS应用设计源码
最新发布
05-27
本设计源码提供了一个基于Objective-C和Swift的IoT设备链接iOS应用,包含1714个文件,其中包括446个h头文件,430个m源文件,427张png图片,234个json数据文件,46个xib文件,31个md文档,19个swift源文件,18个...
swift-QAPM是去哪儿使用APP监控系统
08-15
QAPM是去哪儿使用APP监控系统。已在内部稳定运行3年。提供功能如下:网络请求时长、网络数据流量、网络请求成功或失败以及失败原因等。帧率检测、CPU使用率、电池电量。
swift-iOS应用跳转路由通过URL直接跳转到应用的某一控制器
08-15
iOS 应用跳转路由,通过URL直接跳转到应用的某一控制器
iOS 通用链接Universal Link)配置详解
08-25
主要介绍了iOS 通用链接Universal Link)配置详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
Swift-App架构
10-11
介绍 App设计模式概览 Model-View-Controller Model-View-ViewModel+协调器(MVVM-C) 网络 Model-View-Controller+ViewState Model适配器-View绑定器
iOS 唤起APPUniversal Link(通用链接)
a787188834的专栏
11-18 453
苹果为了方便开发者,提供了一个网页验证我们编写的这个apple-app-site-association是否合法有效 Universal Link通用链接)注意点 Universal Link跨域Universal Link有跨域问题,Universal Link必须要求跨域,如果不跨域,就不会跳转(iOS 9.2之后的改动) 假如当前网页的域名是A,当前网页发起跳转的域名是B,必须要求B和A是不同域名才会触发Universal Link,如果B和A是相同域名,只会继续在当前WebView里面进行跳转.
ios13文件管理器 连接服务器,iOS 通用链接Universal Links(更新到最新的ios13)
weixin_32048835的博客
08-06 607
什么是Universal Links?在iOS9之前,对于从各种从浏览器、Safari中唤醒APP的需求,我们通常只能使用scheme。但是这种方式需要提前判断系统中是否安装了能够响应此scheme的appUniversal Links是iOS9推出的一项功能,你的应用如果iOS设备上已经安装了你的app可以通过传统的HTTP链接启动APP,iOS设备上没有安装你的app打开网页。官方的说明...
趣谈 iOS Universal Link
iOS_开发
06-08 416
????????关注后回复“进群”,拉你进程序员交流群????????本文对 iOS Universal Link通用链接)的浅入浅出介绍,从产品的角度来了解其发展历程。1、了解 Universal Link 背后的故事2、学习 Universal Link 功能的使用3、总结 Universal Link 产品的思考一、前言说起 Universal Link通用链接),对于有过 iOS...
Universal Links 踩坑之路
dingzuhua的博客
06-30 4457
Universal Links 踩坑之路 1、关于AASA(apple-app-site-association)里的appID 坑爹的苹果官网: Enabling Universal Links Supporting Associated Domains in Your App 为什么说坑爹? 都是官方文档却是两种说法,大部分可能会说,这两个就是一样的值,其实并不是所有人都这样,有一些人这两个是不一样的值(虽然我也不知道是为什么!!!) 通过解压api才发现appID=App ID Prefix . bu
Universal Links 接入指南
热门推荐
zhz459880251的博客
10-12 1万+
如果你的app支持了Universal Links, iOS用户点击你网站的链接可以直接打开已经安装的app, 而不用通过打开Safari, 如果你的app没有安装那么点击链接是通过Safari打开你的网站, Universal Links为您提供了一些自定义Scheme方案无法获得的关键优势, 主要包括: 独特: 与自定义Scheme方案不同,其他应用无法声明通用链接,因为通用链接使用的是指向...
swift怎样打开链接
08-25
### 回答1: 可以使用 `UIApplication.shared.open(_:options:completionHandler:)` 方法来打开链接。 示例代码: ``` if let url = URL(string: "https://www.google.com") { UIApplication.shared.open(url, options: [:]) { success in if success { print("The URL was delivered successfully.") } else { print("The URL failed to open.") } } } ``` 这将会在系统的默认浏览器中打开链接。 ### 回答2: 要在Swift打开链接,你可以使用`UIApplication`类的实例来完成。`UIApplication`是一个表示应用程序对象的类,它提供了一系列方法来处理应用程序级别的任务,如打开URL。 首先,你需要导入UIKit框架,以便可以访问`UIApplication`类。在你的代码中加入以下导入语句: ```swift import UIKit ``` 然后,在适当的地方创建一个`UIApplication`类的实例。通常,在您的应用程序委托(AppDelegate)类中创建这个实例,以便在整个应用程序中都能够访问。创建实例的代码类似如下: ```swift let app = UIApplication.shared ``` 现在,你可以使用创建的`app`实例来打开链接。首先,创建一个`URL`对象,它代表你要打开链接。例如,要打开一个网页链接,代码如下: ```swift if let url = URL(string: "https://www.example.com") { app.open(url) } ``` 在这个例子中,我们将一个URL字符串转换成URL对象,并使用`open`方法来打开链接。`open`方法将尝试打开指定的链接,如果成功则会在用户的默认浏览器或其他适当的应用程序中打开链接。如果链接无效,则什么都不会发生。 这就是在Swift打开链接的基本过程。你可以根据需要,使用不同的URL和调用适当的`open`方法重复这个过程。请注意,某些链接可能需要在应用程序中打开,而不是外部应用程序。这涉及到深层链接和自定义URL方案的使用,需要更详细的讨论和实现。 ### 回答3: 在Swift中,我们可以使用`UIApplication`的`open`方法来打开链接。下面是一个简单示例: ```swift import UIKit // 创建一个URL对象 if let url = URL(string: "https://www.example.com") { // 检查是否可以通过UIApplication打开链接 if UIApplication.shared.canOpenURL(url) { // 使用UIApplication打开链接 UIApplication.shared.open(url) } } ``` 首先,我们使用`URL`类创建了一个表示链接的URL对象。然后,我们使用`UIApplication.shared.canOpenURL`方法来检查设备上是否有任何应用程序可以打开这个链接。如果可以,我们调用`UIApplication.shared.open`方法来打开链接。这将以默认的方式在设备上打开链接,例如,在浏览器中打开网页。 请注意,为了使用`open`和`canOpenURL`方法,你需要导入`UIKit`框架。 此外,如果你想以特定的方式打开链接,你还可以通过传递额外的参数给`open`方法来实现。例如,你可以指定链接应该在Safari中打开而不是在应用程序内部的Web视图中打开: ```swift if let url = URL(string: "https://www.example.com") { if UIApplication.shared.canOpenURL(url) { UIApplication.shared.open(url, options: [:], completionHandler: nil) } } ``` 在这个示例中,我们将空字典作为`options`参数传递给`open`方法,以使用默认选项打开链接。你也可以通过传递不同的选项字典来指定不同的行为。另外,你还可以通过传递一个`completionHandler`参数来在链接完成加载后执行自定义操作。 总之,我们可以使用`UIApplication`的`open`方法来打开链接并在设备上的应用程序中浏览它们。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • Chrome插件 - FireShot捕捉网页截图(可截取完整页面) 29750
  • Swift - 获取当前时间的时间戳(时间戳与时间互相转换) 28416
  • Swift - 改变UIImage图片的大小尺寸,或按比例缩放 27037
  • Swift - 使用OpenWeatherMap获取天气的实时数据、预测数据 21909
  • Swift - 字符串的替换与过滤(附:过滤emoji表情符号) 11706

分类专栏

  • iOS 86篇
  • iOS上线 1篇
  • swift 82篇
  • string 1篇
  • 扩展 4篇
  • float 1篇
  • 圆形头像 1篇
  • 网络图片 1篇
  • NSDate 2篇
  • 商店评分 1篇
  • 百度地图 1篇
  • MD5加密 1篇
  • 推送 1篇
  • iOS10 1篇
  • git 2篇
  • sourceTree 1篇

最新评论

  • Swift - 省市县三级联动功能的实现(使用UIPickerView选择框)

    wushenhaoyu: 救命恩人啊

  • Swift Protobuf 初探 —— 继 XML 后,JSON 也要被淘汰了吗

    xuhang513: 这篇文章代码格式显示感觉有问题,看着好难受。还是json香

  • iOS开发:UITableView的优化技巧-异步绘制Cell

    governor_0708: 你的

  • Swift - zip函数使用详解(附样例)

    TRexMan: good

  • Swift - 通用链接(Universal Links)的使用详解(链接打开app)

    _Jxyz: 打开怎么没有弹出app

大家在看

  • ChatGPT网站5月访问量超过23亿,日均访问7700万次,你有使用吗?
  • 每日一题31:数据统计之即时配送食物 443
  • vuInhub靶场实战系列--bulldog-1
  • 混合动力电动汽车介绍(二)
  • windows连接iphone热点总是断开的可能解决办法 217

最新文章

  • Swift - zip函数使用详解(附样例)
  • Swift - 高阶函数介绍(map、flatMap、filter、reduce)
  • iOS - AR引擎Vuforia入门教程(官方样例的安装部署说明)
2017年24篇
2016年96篇

目录

目录

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳SEO优化公司济宁品牌网站设计多少钱甘孜网站搜索优化多少钱德州品牌网站设计多少钱衢州高端网站设计哪家好西安网站seo优化价格布吉百姓网标王推广价格盘锦seo优化哪家好铜陵seo排名价格恩施网站seo优化哪家好榆林外贸网站设计报价黄冈营销网站哪家好连云港优秀网站设计哪家好防城港网络营销北京设计网站价格泸州网络推广价格眉山网页设计推荐长葛SEO按天收费多少钱临沧企业网站改版推荐宝安如何制作网站报价鸡西seo排名价格阿坝百度爱采购公司本溪百度爱采购公司民治百姓网标王多少钱汕尾网站推广方案哪家好崇左阿里店铺运营吴忠关键词按天计费报价大鹏网站设计模板多少钱红河网站设计推荐布吉企业网站建设推荐三明网站优化按天扣费价格歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化