XML模板
WXML(WeiXin Markup Language)是小程序框架设计的一套标签语言,用来构建小程序页面的结构,其作用类似于网页开发中的 HTML。
WXML 和 HTML 的区别:
WXSS样式
WXSS (WeiXin Style Sheets)是一套样式语言,用于描述 WXML 的组件样式,类似于网页开发中的 CSS。
WXSS 和 CSS 的区别:
小程序的宿主环境
宿主环境(host environment)指的是程序运行所必须的依赖环境。例如:
Android 系统和 iOS 系统是两个不同的宿主环境。安卓版的微信 App 是不能在 iOS 环境下运行的,所以,Android 是安卓软件的宿主环境,脱离了宿主环境的软件是没有任何意义的!
手机微信是小程序的宿主环境,如图所示:
小程序借助宿主环境提供的能力,可以完成许多普通网页无法完成的功能,例如:
微信扫码、微信支付、微信登录、地理定位、etc…
组件
小程序中的组件也是由宿主环境提供的,开发者可以基于组件快速搭建出漂亮的页面结构。官方把小程序的组件分为了 9 大类,分别是:
实现如图的 flex 横向布局效果:
实现如图的纵向滚动效果:
实现如图的轮播图效果:
属性 | 类型 | 默认值 | 说明 |
indicator-dots | boolean | false | 是否显示面板指示点 |
indicator-color | color | rgba(0, 0, 0, .3) | 指示点颜色 |
indicator-active-color | color | #000000 | 当前选中的指示点颜色 |
autoplay | boolean | false | 是否自动切换 |
interval | number | 5000 | 自动切换时间间隔 |
circular | boolean | false | 是否采用衔接滑动 |
通过 text 组件的 selectable 属性,实现长按选中文本内容的效果:
通过 rich-text 组件的 nodes 属性节点,把 HTML 字符串渲染为对应的 UI 结构:
image 组件的 mode 属性用来指定图片的裁剪和缩放模式,常用的 mode 属性值如下:
mode 值 | 说明 |
scaleToFill | (默认值)缩放模式,不保持纵横比缩放图片,使图片的宽高完全拉伸至填满 image 元素 |
aspectFit | 缩放模式,保持纵横比缩放图片,使图片的长边能完全显示出来。也就是说,可以完整地将图片显示出来。 |
aspectFill | 缩放模式,保持纵横比缩放图片,只保证图片的短边能完全显示出来。也就是说,图片通常只在水平或垂直方向是完整的,另一个方向将会发生截取。 |
widthFix | 缩放模式,宽度不变,高度自动变化,保持原图宽高比不变 |
heightFix | 缩放模式,高度不变,宽度自动变化,保持原图宽高比不变 |
API
小程序 API 概述
小程序中的 API 是由宿主环境提供的,通过这些丰富的小程序 API,开发者可以方便的调用微信提供的能力,例如:获取用户信息、本地存储、支付功能等。
小程序 API 的 3 大分类
小程序官方把 API 分为了如下 3 大类:
WXML 模板语法
数据绑定
在页面对应的 .js 文件中,把数据定义到 data 对象中即可:
把data中的数据绑定到页面中渲染,使用 Mustache 语法(双大括号)将变量包起来即可。语法格式为:
Mustache 语法的主要应用场景如下:
页面的数据如下:
页面的结构如下:
页面的数据如下:
页面的结构如下:
页面的数据如下:
页面的结构如下:
页面的数据如下:
页面的结构如下:
事件绑定
事件是渲染层到逻辑层的通讯方式。通过事件可以将用户在渲染层产生的行为,反馈到逻辑层进行业务的处理。
类型 | 绑定方式 | 事件描述 |
tap | bindtap 或 bind:tap | 手指触摸后马上离开,类似于 HTML 中的 click 事件 |
input | bindinput 或 bind:input | 文本框的输入事件 |
change | bindchange 或 bind:change | 状态改变时触发 |
当事件回调触发的时候,会收到一个事件对象 event,它的详细属性如下表所示:
属性 | 类型 | 说明 |
type | String | 事件类型 |
timeStamp | Integer | 页面打开到触发事件所经过的毫秒数 |
target | Object | 触发事件的组件的一些属性值集合 |
currentTarget | Object | 当前组件的一些属性值集合 |
detail | Object | 额外的信息 |
touches | Array | 触摸事件,当前停留在屏幕中的触摸点信息的数组 |
changedTouches | Array | 触摸事件,当前变化的触摸点信息的数组 |
target 是触发该事件的源头组件,而 currentTarget 则是当前事件所绑定的组件。举例如下:
点击内部的按钮时,点击事件以冒泡的方式向外扩散,也会触发外层 view 的 tap 事件处理函数。
此时,对于外层的 view 来说:
在小程序中,不存在 HTML 中的 onclick 鼠标点击事件,而是通过 tap 事件来响应用户的触摸行为。
通过调用 this.setData(dataObject) 方法,可以给页面 data 中的数据重新赋值,示例如下:
小程序中的事件传参比较特殊,不能在绑定事件的同时为事件处理函数传递参数。例如,下面的代码将不能正常工作:
因为小程序会把 bindtap 的属性值,统一当作事件名称来处理,相当于要调用一个名称为 btnHandler(123) 的事件处理函数。
可以为组件提供 data-* 自定义属性传参,其中 * 代表的是参数的名字,示例代码如下:
最终:
在事件处理函数中,通过 event.target.dataset.参数名 即可获取到具体参数的值,示例代码如下:
在小程序中,通过 input 事件来响应文本框的输入事件,语法格式如下:
实现步骤:
定义数据:
渲染结构:
美化样式:
绑定 input 事件处理函数:
条件渲染
小程序中,使用 wx:if="{{condition}}" 来判断是否需要渲染该代码块:
也可以用 wx:elif 和 wx:else 来添加 else 判断:
如果要一次性控制多个组件的展示与隐藏,可以使用一个 标签将多个组件包装起来,并在 标签上使用 wx:if 控制属性,示例如下:
注意: 并不是一个组件,它只是一个包裹性质的容器,不会在页面中做任何渲染。
在小程序中,直接使用 hidden="{{ condition }}" 也能控制元素的显示与隐藏:
列表渲染
通过 wx:for 可以根据指定的数组,循环渲染重复的组件结构,语法示例如下:
默认情况下,当前循环项的索引用 index 表示;当前循环项用 item 表示。
示例代码如下:
类似于 Vue 列表渲染中的 :key,小程序在实现列表渲染时,也建议为渲染出来的列表项指定唯一的 key 值,从而提高渲染的效率,示例代码如下:
WXSS模板样式
介绍
WXSS (WeiXin Style Sheets)是一套样式语言,用于美化 WXML 的组件样式,类似于网页开发中的 CSS。
WXSS 具有 CSS 大部分特性,同时,WXSS 还对 CSS 进行了扩充以及修改,以适应微信小程序的开发。
与 CSS 相比,WXSS 扩展的特性有:
rpx
rpx(responsive pixel)是微信小程序独有的,用来解决屏适配的尺寸单位。
rpx 的实现原理非常简单:鉴于不同设备屏幕的大小不同,为了实现屏幕的自动适配,rpx 把所有设备的屏幕,在宽度上等分为 750 份(即:当前屏幕的总宽度为 750rpx)。
小程序在不同设备上运行的时候,会自动把 rpx 的样式单位换算成对应的像素单位来渲染,从而实现屏幕适配。
在 iPhone6 上,屏幕宽度为375px,共有 750 个物理像素,等分为 750rpx。则:
750rpx = 375px = 750 物理像素
1rpx = 0.5px = 1物理像素
设备 | rpx换算px (屏幕宽度/750) | px换算rpx (750/屏幕宽度) |
iPhone5 | 1rpx = 0.42px | 1px = 2.34rpx |
iPhone6 | 1rpx = 0.5px | 1px = 2rpx |
iPhone6 Plus | 1rpx = 0.552px | 1px = 1.81rpx |
官方建议:开发微信小程序时,设计师可以用 iPhone6 作为视觉稿的标准。
开发举例:在 iPhone6 上如果要绘制宽100px,高20px的盒子,换算成rpx单位,宽高分别为 200rpx 和 40rpx。
样式导入
使用 WXSS 提供的 @import 语法,可以导入外联的样式表。
@import 后跟需要导入的外联样式表的相对路径,用 ; 表示语句结束。示例如下:
全局样式和局部样式
定义在 app.wxss 中的样式为全局样式,作用于每一个页面。
在页面的 .wxss 文件中定义的样式为局部样式,只作用于当前页面。
注意:
当局部样式和全局样式冲突时,根据就近原则,局部样式会覆盖全局样式
当局部样式的权重大于或等于全局样式的权重时,才会覆盖全局的样式
全局配置
全局配置文件及常用的配置项
小程序根目录下的 app.json 文件是小程序的全局配置文件。常用的配置项如下:
记录当前小程序所有页面的存放路径
全局设置小程序窗口的外观
设置小程序底部的 tabBar 效果
是否启用新版的组件样式
window
属性名 | 类型 | 默认值 | 说明 |
navigationBarTitleText | String | 字符串 | 导航栏标题文字内容 |
navigationBarBackgroundColor | HexColor | #000000 | 导航栏背景颜色,如 #000000 |
navigationBarTextStyle | String | white | 导航栏标题颜色,仅支持 black / white |
backgroundColor | HexColor | #ffffff | 窗口的背景色 |
backgroundTextStyle | String | dark | 下拉 loading 的样式,仅支持 dark / light |
enablePullDownRefresh | Boolean | false | 是否全局开启下拉刷新 |
onReachBottomDistance | Number | 50 | 页面上拉触底事件触发时距页面底部距离,单位为px |
设置步骤:app.json -> window -> navigationBarTitleText
需求:把导航栏上的标题,从默认的 “WeChat”修改为“黑马程序员”,效果如图所示:
设置步骤:app.json -> window -> navigationBarBackgroundColor
需求:把导航栏标题的背景色,从默认的 #fff 修改为 #2b4b6b ,效果如图所示:
设置步骤:app.json -> window -> navigationBarTextStyle
需求:把导航栏上的标题颜色,从默认的 black 修改为 white ,效果如图所示:
注意: navigationBarTextStyle 的可选值只有 black 和 white
概念:下拉刷新是移动端的专有名词,指的是通过手指在屏幕上的下拉滑动操作,从而重新加载页面数据的行为。
设置步骤:app.json -> window -> 把 enablePullDownRefresh 的值设置为 true
注意:在 app.json 中启用下拉刷新功能,会作用于每个小程序页面!
当全局开启下拉刷新功能之后,默认的窗口背景为白色。如果自定义下拉刷新窗口背景色,设置步骤为: app.json -> window -> 为 backgroundColor 指定16进制的颜色值 #efefef。效果如下:
当全局开启下拉刷新功能之后,默认窗口的 loading 样式为白色,如果要更改 loading 样式的效果,设置步骤为 app.json -> window -> 为 backgroundTextStyle 指定 dark 值。效果如下:
注意: backgroundTextStyle 的可选值只有 light 和 dark
概念:上拉触底是移动端的专有名词,通过手指在屏幕上的上拉滑动操作,从而加载更多数据的行为。
设置步骤: app.json -> window -> 为 onReachBottomDistance 设置新的数值
注意:默认距离为50px,如果没有特殊需求,建议使用默认值即可。
tabBar
tabBar 是移动端应用常见的页面效果,用于实现多页面的快速切换。小程序中通常将其分为:
注意:
tabBar中只能配置最少 2 个、最多 5 个 tab 页签
当渲染顶部 tabBar 时,不显示 icon,只显示文本
属性 | 类型 | 必填 | 默认值 | 描述 |
position | String | 否 | bottom | tabBar 的位置,仅支持 bottom/top |
borderStyle | String | 否 | black | tabBar 上边框的颜色,仅支持 black/white |
color | HexColor | 否 | tab 上文字的默认(未选中)颜色 | |
selectedColor | HexColor | 否 | tab 上的文字选中时的颜色 | |
backgroundColor | HexColor | 否 | tabBar 的背景色 | |
list | Array | 是 | tab 页签的列表, 最少 2 个、最多 5 个 tab |
属性 | 类型 | 必填 | 描述 |
pagePath | String | 是 | 页面路径,页面必须在 pages 中预先定义 |
text | String | 是 | tab 上显示的文字 |
iconPath | String | 否 | 未选中时的图标路径;当 postion 为 top 时,不显示 icon |
selectedIconPath | String | 否 | 选中时的图标路径;当 postion 为 top 时,不显示 icon |
页面配置
小程序中,每个页面都有自己的 .json 配置文件,用来对当前页面的窗口外观、页面效果等进行配置。
小程序中,app.json 中的 window 节点,可以全局配置小程序中每个页面的窗口表现。
如果某些小程序页面想要拥有特殊的窗口表现,此时,“页面级别的 .json 配置文件”就可以实现这种需求。
注意:当页面配置与全局配置冲突时,根据就近原则,最终的效果以页面配置为准。
属性 | 类型 | 默认值 | 描述 |
navigationBarBackgroundColor | HexColor | #000000 | 当前页面导航栏背景颜色,如 #000000 |
navigationBarTextStyle | String | white | 当前页面导航栏标题颜色,仅支持 black / white |
navigationBarTitleText | String | 当前页面导航栏标题文字内容 | |
backgroundColor | HexColor | #ffffff | 当前页面窗口的背景色 |
backgroundTextStyle | String | dark | 当前页面下拉 loading 的样式,仅支持 dark / light |
enablePullDownRefresh | Boolean | false | 是否为当前页面开启下拉刷新的效果 |
onReachBottomDistance | Number | 50 | 页面上拉触底事件触发时距页面底部距离,单位为 px |
网络数据请求
出于安全性方面的考虑,小程序官方对数据接口的请求做出了如下两个限制:
需求描述:假设在自己的微信小程序中,希望请求 https://www.escook.cn/ 域名下的接口
配置步骤:登录微信小程序管理后台 -> 开发 -> 开发设置 -> 服务器域名 -> 修改 request 合法域名
注意事项:
调用微信小程序提供的 wx.request() 方法,可以发起 GET 数据请求,示例代码如下
调用微信小程序提供的 wx.request() 方法,可以发起 POST 数据请求,示例代码如下:
在很多情况下,我们需要在页面刚加载的时候,自动请求一些初始化的数据。此时需要在页面的 onLoad 事件中调用获取数据的函数,示例代码如下:
如果后端程序员仅仅提供了 http 协议的接口、暂时没有提供 https 协议的接口。
此时为了不耽误开发的进度,我们可以在微信开发者工具中,临时开启「开发环境不校验请求域名、TLS 版本及 HTTPS 证书」选项,跳过 request 合法域名的校验。
注意:
跳过 request 合法域名校验的选项,仅限在开发与调试阶段使用!
跨域问题只存在于基于浏览器的 Web 开发中。由于小程序的宿主环境不是浏览器,而是微信客户端,所以小程序中不存在跨域的问题。
Ajax 技术的核心是依赖于浏览器中的 XMLHttpRequest 这个对象,由于小程序的宿主环境是微信客户端,所以小程序中不能叫做“发起 Ajax 请求”,而是叫做“发起网络数据请求”。
视频讲解到黑马程序员哦~
单赚佣金,这种兼职广告,大家并不陌生。一部手机、动动手指,足不出户就能轻松赚钱。“工资当日结算秒到账”等广告字眼,让不少人动了心,为什么明知刷单是诈骗还要参与?为什么被骗了还要继续刷单?
警方提醒:不要抱有侥幸心理,警惕诈骗陷阱!
典型案例
01
刷单尝到甜头,步步深入陷阱
2021年5月15日,80后男子通过直播点赞赚红包,关注了一个名为村亮商贸的微信公众号,该男子向客服提供了自己的名字、年龄和地址、支付宝收款码等信息,之后在客服的指导下,男子下载了一个App,添加了该App客服的账号,该客服向男子发放任务,一开始只是点赞做任务,完成之后会有佣金,起初男子赚了20元佣金,到后来该客服又让男子下载了另一款App做抢单刷单的任务,在客服的指导下,男子开始进行刷单,最初的时候赚了80多元,正当男子想要提现时却发现要满300元以上才能提现,客服告诉男子想要提现就必须继续刷单,该男子遂向对方提供的账户总共进行了十次转账,从最初的300元、3000元到后面的30000元50000元,转出的数额越来越大男子却没有丝毫怀疑自己已经落入骗子的刷单陷阱,总共损失共计229300元。
02
明知是陷阱仍以身犯险
5月22日,家住大箕铺的17岁女生吴某因为刷单被骗了近四千余元,令人意想不到的是,该女生明知是陷阱仍以身犯险。5月22日一大早,吴某在网上看到一条刷单赚钱的信息,通过该信息吴某很快联系上了对方,在填写了一份《在线申请入职登记表》后对方开始给吴某派单,第一单是要求吴某在某购物平台上购买一件价值83元的衣服,同时对方向吴某提供了一个微信收款码,让吴某直接扫描该二维码付款,付款成功后吴某收到了7元的佣金奖励,吴某看到真的有钱可赚于是继续完成对方下发的“任务”,金额从300元、1200元、2400元直到4800元,到了4800元的时候对方仍表示吴某没有完成刷单任务不能结算,吴某觉得自己被骗了遂报警。事后吴某表示:“在转账1200元的时候我就意识到自己被骗了,但我又觉得或许真的能赚大钱呢。”抱有侥幸心理让吴某最终损失数千元。
03
加大投入,发觉被骗已为时晚矣
3月31日,大冶罗桥街道的韩女士遭遇了一场刷单骗局,当天晚上7点多钟的时候正在刷手机的韩女士突然被人拉进了一个刷单兼职赚外快的微信群,韩女士本对这些不感兴趣,当她看到群里有人说自己刷单赚了钱时有些心动了,通过扫描群里发送的二维码韩女士进入了一个聊天界面,对方自称接待人员,韩女士选了一个36元的单便开始了任务,首先向对方发过来的支付宝收款码转账了36元,对方发来一个链接,韩女士点开后里面显示“押骰子比大小”,按照对方所说的押了36元后韩女士成功提现了71元,以同样的方式韩女士陆续获得了105元、1000元的佣金。韩女士看到回报越来越大也越来越放开胆子来,按照对方所说的分别充值了5000元、25000元、12000元、20000元,可是对方始终辩称韩女士没有达到要求要继续充值,韩女士将此事告知了自己的丈夫,丈夫一听意识到被骗了赶紧报警,仅仅一晚上韩女士被骗金额共计62000元。
所有刷单都是诈骗!
不要有“轻轻松松松赚大钱”的心理!
不要有任何侥幸心理!
更不要轻易向陌生账户汇款!
如不幸被骗,请保存好聊天记录和转账记录,及时报警!
来源: 平安黄石
iOS 15/iPadOS 15 之后,移动端的 Safari 有了对扩展插件的全面支持,在各种插件的辅助之下,移动端 Safari 变得更加全面,体验也愈发接近桌面端,这对那些希望用 iPad 替代笔记本作为生产力工具的群体而言,是个极大的升级点。
如今新系统也已正式推出,Safari 插件的数量也增至一个较为可观的水平,是时候为大家推荐一些好用的插件了,下文我以 iPad 上的 Safari 为例给各位进行演示。
首先,iPad Safari 的扩展插件与桌面端的 Safari 插件不同,它其实是个 app,Safari 插件功能是在它原生 app 派生出的一部分功能。
因此我们要到 App Store 去下载 app,然后在 Safari 当中开启相关拓展插件功能。
苹果为这类 Safari 扩展插件设立了推荐专区,在「系统设置-Safari-扩展-更多扩展」中可以看到整个专区页面。
地区不同,推荐的插件内容也有所不同。
1. Momentum
这是一个启动页美化工具,设置启用之后,每次打开新的标签页时都会展示一张好看的图片作为背景,还会显示当前时间,还能设立 To Do 任务和常用网页。
免费版本会为用户每天更新一张背景图,如果想用自己相册里的图片则需要升级成付费版本。
2. AdBlock
官方放出的免费插件排行榜中,粗略算算至少有 4 成是广告拦截插件,AdBlock 作为此类工具中的老面孔,我自然也把它作为首选。
需要注意的是,此类插件一律被归为内容拦截器,开启的方式与其他插件有所不同,在域名栏左侧「大小/Aa 按键」中调用 ,点击该键就能看到内容拦截器的开关。
之所以叫内容拦截器,是因为它们拦截的不光是广告,还可以把违规网站、跟踪程序、评论等恼人的内容拦下来,还用户一个干净纯粹的页面。
实际效果中规中矩,它可以拦下部分 Banner 类广告,还有流媒体上的贴片广告,但偶尔还是会出现一些漏网之鱼。
3. Apollo for Reddit
这是个 Reddit 论坛的第三方 app,作用类似于第三方微博客户端,它们针对 Safari 开发的插件名叫 Open in Apollo,顾名思义,当它侦测到你在 Safari 浏览器上打开 Reddit 页面时,会自动跳转至 Apollo app 界面,作用简单粗暴。
4. 1Password
它也算是老牌密码储存器了,它所做的 Safari 扩展插件的功能,也就是为网站自动生成或填充对应平台账号的密码。
若你更常用苹果自带的密钥卡包,那还能省下安装 Safari 插件的步骤,可以自动识别和填充密码。
5. Firefox Focus
这是火狐开发的一个无痕浏览器,它的 Safari 插件也被归为内容拦截器,但它并不拦截广告,而是截下广告跟踪,让广告商没办法通过你点击了哪些页面来分析你的喜好和习惯。可以配合上面的 AdBlock 一同使用。
6. Turn Off the Lights for Safari
有了这个插件,可以在大部分视频网站上,把除视频窗口的一切内容低亮化,类似于流媒体网站上常见的关灯模式。
7. StartPage.ai
我们在网上冲着浪,不自觉发现自己已经打开了数十个页面,在桌面端要关闭多个页面,有键鼠的帮助也还算简单,但在移动端可就没那么方便了。
StartPage.ai 所做的,就是打开一个新的标签页,该页展示的是当前所有页面,有哪些网站一目了然,关闭页面的按键也足够大,方便手指点摁。不过它与前面推荐的 Momentum 插件同属启动页工具,二者只能选其一。
8. DForce
Safari 本身支持系统原生的夜间模式,功能栏会根据系统改变浅色或深色背景,但网页具体页面并不会随之改变,DForce 所做的,就是让页面内容也变成深色,暗光下阅读的时候多少能起到护眼的效果。
▲ 插件启用前后对比
它提供了免费版本,个人觉得基本够用,付费版只是多了些自定义选项。
9. Keyword Search
这个软件就为解决一件事,Safari 地址栏进行特定网站的快速搜索。
听起来还是有点复杂,我举个例子你很快就明白了,譬如我想在爱范儿搜索某篇文章,基本操作是在地址栏输入「ifanr.com」,然后进入爱范儿网页里点击搜索,输入关键词按回车,最终才会跳转至结果页面。
但有了 Keyword Search,我们可以提前设置好关键字,譬如用「i」设置为爱范儿站内搜索指令的快捷词,后面接上我们想要搜索的关键词,按下回车即可。
若你正在学习日语,或者你经常逛一些日文网站,那不让试试这款插件。它的功能类似于 Mate,只不过它专攻日语翻译。
另外,该插件开发者为用户预设好了数个常用网站的捷径,当你安装好这个插件后,不妨输入「y Rick Astley」试试。
10. Mate
它本身是个翻译 app,所以在 Safari 上也是充当翻译插件的角色存在,不过用户只能选取字段进行翻译,并不能把一键翻译整个页面的内容,看着跟其 198 元的售价不太相符。
不过这一需求,可以用系统自带的翻译功能满足,当我们浏览全外文网站时,地址栏左边会出现翻译按键,按一下就能把整个页面转换成中文,虽然准确度差强人意,不过可以起到辅助理解的作用,聊胜于无。
11. 10tenJapanese
若你正在学习日语,或者你经常逛一些日文网站,那不让试试这款插件。它的功能类似于 Mate,只不过它专攻日语翻译。
启用该插件后,页面会出现一个光标,长按并拖动至日文字上,就会实时显示出它的英文释义,确实它也有局限性,看来以后学日语之前,还得先学好英文。
12. JSBox
移动端的 Safari 本身没有自带检查器,JSBox 插件的出现弥补了这一缺陷。不过代码呈现的形式不太友好,点开就把整个页面挡住了。
用户在这上面还可以设立一些 Javascript 脚本,执行一些简单的功能是没有问题的。
13. Notebook
有了这个插件,用户可以不离开 Safari 网页,直接开始笔记,支持 Apple Pencil,还有页面截图功能,之后在 app 里进行更细致的划重点、圈段落等细致操作,也很不错,算是原生备忘录的一个补充。
14. 网页二维码生成
它能将当前浏览的页面生成二维码,方便你把它分享出去。
还可以辅助线下宣传,譬如大学社团可以通过它,把赛事活动的报名页面做成二维码,放在线下报名海报上。
目前看来,移动端 Safari 的插件生态处于数量尚可,质量参差的状态,如果你奔着某种特定功能上 App Store 去搜索的话,大概率会无功而返,只能去插件专区里一个一个点开去找,操作略微繁琐,整体来看还有较高的上升空间。
不过当你花费一段时间,把 Safari 打造得更符合你的使用习惯后,所得到的正向反馈,也足以把一切辛劳统统抵消,这不正是折腾 app 的乐趣所在吗?
*请认真填写需求信息,我们会在24小时内与您取得联系。