URL Scheme 查询指南

编者注:本文涉及到 URLSchemes、UniversalLink 和 LaunchCenterPro 相关知识。

对 URL Scheme 有一定了解的读者都能感受到它的便捷之处,但是在实际运用的时候很多人会遇到一个现实的问题:不知道某个软件的 URL Scheme 是什么。

最常见的解决办法就是直接上网搜索。但是搜索引擎也并非万能,总还是有一些比较难找到的 URL Scheme。以查询软件的 Info.plist 的办法来说,它只能查询到 scheme 头,没有任何可以使用的参数,URL Scheme 支持的功能只能局限于打开或者返回软件。

另一种情况是没有官方文档可供查询,这样的问题多见于国产软件,对国内非效率类型的 App 来说,支持 URL Scheme 是一件费力不讨好的事情。功能做强大了,却只有少部分用户会去使用;功能做少了,Power User 又不满足。在这样的背景条件下,会用心去打磨 URL Scheme 的开发者就屈指可数了。

所以本文将结合传统 URL Scheme 查询方法,以及新的网页 URL Scheme 查询法,共同讲解如何查询软件的 URL Scheme。

下图是一份 URL Scheme 查询思路,推荐三个方向入手去查询软件的 URL Scheme。三个方向依次是:网络搜索法、网页法、书签法

为方便读者直接使用,笔者整理了部分常见的生活类应用的 URL Scheme,有需要的可以直接 含参数的 URL Scheme 部分收集 查阅。

网络搜索查询

捷径社区

在网上有人整理了很多常用的 URL Scheme 可供查询,例如「捷径社区」只要输入软件名进行搜索,如果该软件有被收录即可查询到对应的 URL Scheme。

官方文档

大多的的效率类 App 都会有自己官方的 URL Scheme 文档库,在大多数的情况下只要在谷歌搜索:「软件名 + URL Scheme」即可在第一个结果就直接找到官方文档结果。

微信支持 URL Scheme 跳转吗?在大多数人的印象里微信支持的 URL Scheme 少之又少,最常用的也只有扫描二维码 (weixin://scanqrcode) 这么一个 URL Scheme。但是通过查阅 微信小程序的官方文档 可以知道其实企业的小程序也是支持外部 URL Scheme 跳转的,它的格式是:

weixin://dl/business/?t= *TICKET*

利用这样的 URL Scheme 可以利于企业推广自己的商品,例如在少数派文章里插入 PiStore 的商品链接,点击即可直接进入小程序的商品页面。但是缺点就是目前只对企业小程序开放,个人小程序无法使用该功能。

第三方文档

还有一些热心网友自己创建了 URL Scheme 整理表格,在 Hum《URL Schemes 使用详解》这篇文章下面看到读者 @张小刚 做了一份共同维护收集的表格,有兴趣的读者也可参考阅读:URL Scheme 分享

但是网络搜索法有一个问题,由于是纯人工记录,会受限于精力和时间的限制,无法保证 100% 查询到需要的 URL Scheme,于是就有了下面的 Launch Center Pro 查询法。它支持超过 100,000 种 App 的 URL Scheme 查询,足以对付多数的国外厂商开发的 App。

Launch Center Pro 查询

Launch Center Pro 是最简单的查询方法之一,可以直接给出构造好的 URL Scheme。

这里以 Bear 为例,点击右上角的编辑之后再点击任意加号,新增一个 Action。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

依次点击 Action ComposerApps with Actions

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在顶部搜索栏搜索 Bear,点击进去可以看到有许多支持的 Action。

以 Prepend to Note 为例,点击进去填写参数之后再点击右上角的 Done 即可在 URL 地址栏中获得到 Bear 追加笔记的 URL Scheme。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

但是这个方法也有一定的局限性,如果 Launch Center Pro 没有收录该软件的 URL Scheme 就无法通过这个方法查询。而且 Launch Center Pro 并不一定会收录全部支持的参数,对于部分软件只会给出最常用的一些 URL Scheme。

Info.plist 查询

非越狱 Info.plist 查询法

非越狱的 Info.plist 查询法是最广为人知的 URL Scheme 查询方法,但是自从 macOS Catalina 开始 iTunes 就被移除了,不能通过 iTunes 直接下载 ipa 来查询 Info.plist 了,所以目前的解决方法是使用 iMazing 下载 ipa。

下载 iMazing 之后连接设备,点击管理应用程序

点击资料库,选择需要查询的程序,下载之后右键选择导出 ipa。

导出 ipa 文件之后就需要对其进行解包,ipa 文件的本质是一个 zip 文件,将它的后缀修改为 zip 即可进行解压。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

进入解压文件夹的 Payload 目录,右键选择显示包内容

进入主程序文件夹后,找到 Info.plist 文件。

选择合适的文本编辑器打开,例如此处的 Sublime Text,在文件中搜索「CFBundleURLSchemes」,在这个数组下的元素即是该软件对应的所有 URL Scheme。

可以看到知识星球支持的 URL Scheme 有 zsxq、xmq、xiaomiqian 和 com.unnoo.quan。可以看出知识星球的 URL Scheme 命名是产品前名称「小密圈」的拼音和拼音缩写,还有知识星球的拼音缩写。

越狱 Info.plist 查询法

越狱用户可以使用 Filza 文件管理器来查阅 Info.plist 中的 URL Scheme。它可以通过内置的「App 管理器」直接跳转到对应的目录,不需要像 iFile 遍历查找过去。该方法需要在 Cydia 下载 Filza File Manager,该文件管理器在自带的 BigBoss 源就有,无需额外添加软件源。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

进入主界面后,点击下方的星标按钮,选择 App管理器

以微信为例,点击微信右边的 info 图标,进入软件详情页,再点击主程序,跳转到微信主程序目录。

进入 WeChat.app 主程序目录,点击上方的搜索栏,搜索关键词「info.plist」

经过等待,发现会匹配到多个搜索结果,一般情况下文件大小最大的才是我们真正需要的 Info.plist,如下图高亮的 12KB 大小的 Info.plist。

打开 Info.plist,依次点击 CFBundleURLTypesItem 0CFBundleURLSchemes,在这个数组下的元素即是该软件对应的所有 URL Scheme。比如此处微信 7.0.14 支持的 wexinVideoAPI、weixin、weixinapp、wechat 等 URL Scheme。

但是无论是越狱或者非越狱的 Info.plist 查询法,它们能做到的也只有查询 App 的 Host URL Scheme,无法查询到包含参数的 URL Scheme。以目前的眼光来看,实用性不如 Launch Center Pro 、官方文档查询和网络搜索法。

到此为止,传统的 URL Scheme 查询方法介绍完毕,接下来是新的网页 URL Scheme 查询法介绍。

网页报错法

报错法的原理是让浏览器伪装成 iPhone Safari 客户端,打开链接对应的 URL Scheme,因为电脑上没有安装相应的 App,所以报错显示出真实的 URL Scheme 地址。报错法需要使用到电脑上的 Safari 或者 Chrome 浏览器。接下来以最复杂的京东 URL Scheme 举例进行说明。

京东

第一步:本文以 Safari 为例,在菜单栏中选择开发用户代理,将用户代理设置为 iPhone。(如果菜单栏中没有开发子菜单,需要在偏好设置的高级页面勾选在菜单栏中显示“开发”菜单)Chrome 浏览器需要另外下载修改 User Agent 的插件实现。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

第二步:访问京东网页版,任意搜索一件商品,向下滑动商品列表看到一个立即打开按钮,点击得到 URL Scheme 报错地址如右图所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

第三步:从地址栏复制这段 URL Scheme 进行处理。

根据已知的 URL Scheme 相关知识,可以知道 %XX 的形式是字符被编码之后得到的结果,所以需要对这段 URL Scheme 进行解码。将这段 URL Scheme 粘贴到 URL Decoder 进行解码得到结果。

关注到 URL Scheme 前段的参数,含有刚才搜索的关键词,后面是其他的参数可以忽略不看。将这几个参数逐一翻译过去,猜测它们的意思分别为:描述、商品关键词、来源、动作分类。

openapp.jdmobile://virtual?params={
"des":"productList",
"keyWord":"烧水壶",
"from":"search",
"category":"jump",
"sourceType":"Search",
"sourceValue":"search-ware"
......

在传统的 URL Scheme 进行查询一般只需要关键词参数即可,所以可以再删除 sourceType 和 sourceValue 这两个无关参数。根据剩下四个参数可以这样猜测出这样一个流程:jump 到 App 的 search 页面,以烧水壶为 keyWord 搜索并显示 productList,所以这四个参数缺一不可。通过实验验证只要缺少四个参数中的任何一个,跳转到京东 App 之后都无法进行搜索,最后证明结论与猜测一致。

删除可被忽略的参数,闭合最后的方括号,得到如下京东搜索 URL Scheme:

openapp.jdmobile://virtual?params={"des":"productList","keyWord":"商品名称","from":"search","category":"jump"}

用这段京东搜索的 URL Scheme 创建一个 Launch Center Pro 的搜索 Action,并将 keyWord 参数来源设置为键盘输入。但是 Launch 之后发现提示「URL could not be opened」。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这是由于 {}" 没有进行 URL 编码导致的,熟悉 Launch Center Pro 的用户应该知道可以使用 {{}} 将字符括起来就可以对它们进行编码,所以更新得到:

openapp.jdmobile://virtual?params={{{"des":"productList","keyWord":"[prompt]","from":"search","category":"jump"}}}

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

小结

京东 URL Scheme 较为复杂且参数较多,这是通过传统的查阅 Info.plist 无法查出来的。使用报错法能够非常方便地一次爆出所有参数,但是该方法有以下局限性:

  1. 如果该网站没有搜索栏,就无法使用该方法。例如闲鱼在早期是有搜索栏的,但是后来被彻底地移除了,经过其他方式验证闲鱼确实不支持搜索的 URL Scheme。
  2. 即使有搜索栏,如果网站开发者没有在此处设置跳转的 URL Scheme 同样无法通过这个方法获取 URL Scheme。比如当当就是在商品详情页设置了跳转,而搜索页没有设置,导致了无法获取到当当的搜索 URL Scheme。

在构造 URL Scheme 时,如果有 {}" 三种需要被编码的字符,记得要加上 {{}} 进行编码或者直接硬编码,否则 URL Scheme 可能无法被正确识别。

淘宝

相信多数人都有过这样的经历,朋友用微信发给你了一个淘宝链接。点进去一看,微信提示说请复制后使用浏览器访问,你不得不复制了再切换到 Safari 粘贴打开。由于两大巨头之间的竞争,让这原本简单的事情变得复杂了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在 Safari 粘贴打开链接之后,会提示是否要在淘宝中打开。看到下图这样的提示弹窗,结合上面京东搜索的例子,就可以得到一个重要的结论:「凡是弹窗提示打开的,背后都是 URL Scheme」

一般的在微信之前打开淘宝链接的过程是:复制链接 → 打开 Safari → 粘贴到 Safari → 打开链接。但是借助 Shortcuts 和 URL Scheme 就可以复制链接 → 运行捷径直接打开。

接下来就来看看如何通过报错法获取淘宝的打开店铺的 URL Scheme。方法和京东类似,将 Safari 浏览器的 UA 改为 iPhone 然后访问即可。

和京东略微不同的是不需要手动点击,访问之后会直接跳转报错得到 URL Scheme

根据经验盲猜通过 URL Scheme 打开淘宝店铺,最少只需要一个店铺的 ID 参数即可,扫一眼过去就看到了 shopId 参数,至于 shopId 后面的参数都可以删去不看了,所以删除无用参数后得到更新的 URL Scheme:

tbopen://m.taobao.com/tbopen/index.html?h5Url=https://shop.m.taobao.com/shop/shop_index.htm?shopId=184770392

打开这个 URL Scheme,可以看出这是在淘宝客户端内打开了一个网页链接,不仅没有实现需要的打开指定店铺的功能,反而还访问了一个未知的网址。

那么就可以考虑不要使用淘宝内的网页打开,而是直接使用淘宝客户端访问店铺地址,删除前面的跳转页面,得到如下 URL Scheme,经测试可以正确打开淘宝店铺。

tbopen://fshop.m.taobao.com/shop/shop_index.htm?shopId=184770392

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

到此已经得到了直接打开淘宝店铺的 URL Scheme,它的 Scheme 并不是熟悉的 taobao:// 而是 tbopen,格式如下:

tbopen://shop.m.taobao.com/shop/shop_index.htm?shopId=店铺 ID

接下来的工作就是编写捷径通过 URL Scheme 直接打开店铺了,捷径下载:淘宝店铺捷径。淘宝分享店铺有两种方式:淘口令和网页链接,两者的基本格式如下:

2👈💲5PTlXcKr44c🗝 https://m.tb.cn/h.4piUivo?sm=b0be17  少数派正版软件

https://shop184770392.taobao.com/?spm=a230r.7195193.1997079397.2.7a3e4e09eDyokfhttps://shop184770392.taobao.com/?spm=a230r.7195193.1997079397.2.7a3e4e09eDyokf

网页链接中含有 shopId 可以直接匹配出来使用。淘口令没有相关参数,但是复制到剪切板后可以被淘宝客户端直接识别。为了优化体验,捷径对于这两种分享格式都可以正确识别并打开。为什么要考虑支持两种分享格式?这是因为淘宝对部分人来说并不是一个需要摆在主屏幕的 App,它是可以被收到文件夹里的。在这种情况下,微信复制 → 打开文件夹 → 打开淘宝又成了一个很麻烦的事情,而 URL Scheme 的存在正是为了解决这种不必要的点击。所以有了这个捷径之后我直接打开淘宝的频率更低了,甚至都可以直接移除淘宝这个图标了。

捷径具体制作过程以后另写文章介绍,目前只要会用即可,具体演示视频如下:

进阶版:网页分析法

网页分析法我认为是进阶版的报错法,它不像报错法只要修改 UA 再点击即可爆出 URL Scheme,它需要对网页 HTML 代码进行分析得出 URL Scheme。此处以 QQ 为例讲解网页分析法,为什么此处不能使用报错法?这是因为 QQ 跳转名片的页面设计考虑比较周到,如果检测到没有安装 QQ 并不会报错,而是提示前往 App Store 下载,所以报错法对于 QQ 来说就失效了。

使用 Launch Center Pro 的二维码扫描功能扫描 QQ 名片,扫描成功后可以直接将得到的结果复制到剪切板,这个 Action 的 URL Scheme 如下:

launch://x-callback-url/clipboard?text=[scan]

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

扫描得到如下的 QQ 名片链接地址:

https://qm.qq.com/cgi-bin/qm/qr?k=kPVripBdv5wz46kyXXXXXXXXXF0gls&noverify=0

打开网页检查器,在控制台输入如下代码就可以获取网页内所有的协议的链接。这段代码的作用比较好理解,它先把网页的所有 HTML 代码以 ; 分割,分割完了赋值给 text 变量,接着以 text 数组长度写一个 for 循环,匹配出所有的 :// 格式的文本。

text = document.getElementsByTagName('html')[0].innerHTML.split(';')
for (var i = 0 ; i < text.length ; i++)
  console.log(text[i].match(/:\/\/.*?\/.*/))

按下回车,可以看出控制台输入了所有匹配到的链接。扫一眼过去中间的这一段 URL 格外引人注目,它含有关键词 card 而且没有 com org net 这样的域名后缀,更能肯定它是一个 URL Scheme 而不是 URL。

card/show_pslcard 为关键词在网页源代码中搜索,可以找到这样一段代码:

var scheme = 'mqqapi';
if(isQim){
    scheme = 'qimapi';
}
var iosUrl = scheme + "://card/show_pslcard?src_type=internal&version=1&uin="+ rawuin +"&card_type=group&source=qrcode&jump_from=" + jump_from + "&auth=" + auth_key+"&authSig=" + auth_sig + "&source_id=" + (isQR ? '2_40002' : '2_40001');

删除不必要的参数,拼接构造跳转 QQ 个人信息页面的 URL Scheme:

mqqapi://card/show_pslcard?src_type=internal&version=1&uin= QQ 号码

网页分析法看上去需要一定的技术门槛,但是只要多动手实践几次就能举一反三,掌握这个技能。

基本方法就是:找点击按钮或者直接找 URL Scheme,大致分析一下 JS 代码即可拼接出对应的 URL Scheme。在部分网站中,甚至不需要拼接,只要执行了上面 JavaScript 之后基本就能直接看出 URL Scheme。

另外谈论一下像 QQ 添加好友这类带有 ID 参数的 URL Scheme,相比较于搜索的 URL Scheme,在以前很多人会认为带有 ID 参数的 URL Scheme 是无用的,比如下面这个:

fleamarket://item?id=商品 ID

但是通过 QQ 这个例子的介绍,读者还可以认识到这类 URL Scheme 的其他用途:

  1. 配合捷径绕过微信的屏蔽,直接打开商品页面。
  2. 微信小程序的 URL Scheme 可以帮助商家提供推广的点击率。
  3. 小红书的个人主页的 URL Scheme 插入在文章里降低别人关注你的门槛。

组合技:配置文件法

配置文件法一般不单独使用,而是配合前面的网页分析法一起使用。原理是查阅网站的 Universal Link 配置文件推测出 scheme 支持的参数。查阅 苹果开发者文档 可以看到这样一段话:

Create an apple-app-site-association file that contains JSON data about the URL Scheme that your app can handle.

Upload the apple-app-site-association file to your HTTPS web server. You can place the file at the root of your server or in the .well-known subdirectory.

由此可知配置文件 apple-app-site-association 都存放在网站的根目录或者 .well-known 子目录下,而且是以 JSON 格式无后缀保存。以知乎为例进行分析,直接访问 https://www.zhihu.com/apple-app-site-association 或者在终端中使用 curl 命令发送请求均可,这里以 curl 发送请求为例,得到如下结果:

➜ curl https://www.zhihu.com/apple-app-site-association
{
  "applinks": {
    "apps": [],
    "details": {
      "8J52SRPW6X.com.zhihu.ios": {
        "paths": [
          "/universal-links-callback/*",
          "/qq_conn/100490701/*",
          "NOT /question/*/log",
          "/question/*",
          "/people/*",
          "/topic/*",
          "/p/*"
        ]
      },
......

通过 paths 的键值可以分析出知乎的 URL Scheme 支持跳转到指定问题、主页、主题和文章,再配合网页分析法即可得到整个 URL Scheme 的基本结构。

但是需要特别指出的是,即使一个网站的 apple-app-site-association 为空,也并不代表着这个网站对应的软件不支持 URL Scheme,因为它可能是将 URL Scheme 直接写在了 HTML 代码中。

➜ curl https://h5.m.taobao.com/apple-app-site-association
{}

所以配置文件法只能作为一个辅助方法配合 Universal Link 或者上面的这些方法一起使用,关于 Universal Link 可参阅 Hum 写的《Universal Link 使用详解》

网页书签法

闽政通

由于 2021 年疫情防控的需要,在福建省内出入人流量较大的公共场所,需要出示闽政通上的健康码才可以进出。但是闽政通 App 打开健康码需要点两下才行,因为软件优化不佳比较卡顿,这两下反应也比较慢。所以闽政通的开发者添加了一个功能,可以在桌面以书签的形式创建健康码的快捷方式方便打开。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

既然可以通过快捷方式直接跳转健康码页面,那么就可以再次猜想背后是在调用一个 URL Scheme 进行跳转。出于好奇查看一下地址栏的 URL,如下所示:

https://mztapp.fujian.gov.cn:8190/mztAppWeb/app/lnk/index.jsp?pwd=evecom123&appName=福建八闽健康码&appLogo=https://mztapp.fujian.gov.cn:8192/mztAppFile/uploadfile/image/null/20210128/wu_1et39pvj74l91vj7ulc1pbo16sq4.png&appUrl=mztapp://quickOpenServer?jumpUrl=-cw-ff8080816f9cc87501703eda492e017a

对 URL Scheme 熟悉的读者就可以看出此处应该使用 & 进行分割,分割后的结果如下所示:

https://mztapp.fujian.gov.cn:8190/mztAppWeb/app/lnk/index.jsp?
pwd=evecom123
&appName=福建八闽健康码
&appLogo=https://mztapp.fujian.gov.cn:8192/mztAppFile/uploadfile/image/null/20210128/wu_1et39pvj74l91vj7ulc1pbo16sq4.png
&appUrl=mztapp://quickOpenServer?jumpUrl=-cw-ff8080816f9cc87501703eda492e017a

在这段书签 URL 地址中,一共有四个参数,授权密码、软件名字、软件图标和软件对应的 URL,而这个 URL 参数就是闽政通打开健康码页面的 URL Scheme,之前的猜想再一次被证实。

那么从书签中获得到了这段 URL Scheme 有什么用吗?它比直接打开书签好在哪里?从书签中获得了 URL Scheme 之后至少有以下两个用途:

  1. 现在只有这样一个书签,但是如果是有三四个 URL Scheme 类型的书签,它们就会在主屏幕上占用 1/6 的区域,对于单屏用户来说这是不划算的。所以可以把它整合到 Launch Center Pro 成为一个 Action,或者新建一个捷径打开这个 URL Scheme 并设置双击屏幕背部运行捷径。
  2. 添加 Due 提醒。例如我们学校之前要求每周末截图健康码上传,获得到了这段 URL Scheme 之后我就可以在 Due 提醒事项内容中直接添加这段 URL Scheme。在滑动确认任务完成之后可以直接打开健康码的界面,这样可以保证每周都会记得打卡且简化了流程。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

小结

书签法是一种通解的 URL Scheme 查询方式,只要软件支持生成桌面书签,那么一定是可以在 URL 的参数中查到 URL Scheme 的。但是我翻遍了 iPhone 上安装的所有软件,支持桌面书签的软件寥寥无几,只有闽政通、支付宝和菜鸟。好在支付宝是一个很大的聚合平台,有很多的官方和第三方接入,解决了这个支持桌面书签软件少的问题。接下来我们就以支付宝为例再探寻一下书签法。

支付宝

在支付宝中无论是支付宝官方的小程序或者第三方个人的小程序,都可以生成书签添加到桌面。以我市支付宝的乘车码为例,从添加书签的页面拷贝 URL 得到如下链接:

https://render.alipay.com/p/s/shortcut/index?appId=200011235&appName=支付宝乘车码&appIcon=https://gw.alipayobjects.com/mdn/gov_busmetro_card/afts/img/A*wrG-S5kIrsgAAAAAAAAAAABjAQAAAQ/original

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这与闽政通的四个参数不同,此处只要三个参数即可,同样使用 & 进行分割,分割后的结果如下所示:

https://render.alipay.com/p/s/shortcut/index?
appId=200011235
&appName=支付宝乘车码
&appIcon=https://gw.alipayobjects.com/mdn/gov_busmetro_card/afts/img/A*wrG-S5kIrsgAAAAAAAAAAABjAQAAAQ/original

但是此处可以看出支付宝的书签与闽政通的书签最大不同之处在于:支付宝没有 appUrl 参数,也就是我们所说的 URL Scheme。一眼看过 appId 引起了我的注意,不难猜出 appId 就是每个小程序的「身份证号」。那么如何使用这个「身份证号」呢?

URL Scheme 肯定不是凭空产生的,既然在 URL 地址里看不出什么,那就打开网页检查器,看看支付宝书签页面的源代码里都有些什么。可以看到有一个「立即进入」的按钮,点击之后会调用 jumpSchema() 函数。

往下翻到 <script> 查看 jumpSchema() 函数的具体实现代码,很快就可以定位到下图高亮处。此处代码的用途是将支付宝打开小程序的固定格式 URL Scheme 和 appId 进行字符串拼接然后跳转。

此处的 URL Scheme 如下所示:

alipays://platformapi/startapp?appId=${appId}&chInfo=ch_desktop${appUrl}

此处 URL Scheme 的 chInfo 参数可以被省略,所以得到这样一段新的 URL Scheme:

alipays://platformapi/startapp?appId=${appId}

所以现在你就知道如何获取任意支付宝小程序的 URL Scheme 了,这也就是网上常见的各种支付宝小程序 URL Scheme 的来源,本质上就是支付宝打开小程序的固定 Scheme 格式与 appId 的拼接。

支付宝的八闽健康码和莆田市乘车码小程序调用 URL Scheme 如下,给福建省内的读者们参考使用。其他省市也基本都有在支付宝提供相应的健康码小程序,可以如法炮制获取相关的 URL Scheme。

八闽健康码小程序
alipays://platformapi/startapp?appId=2021002125635929

莆田市乘车码小程序
alipays://platformapi/startapp?appId=200011235
小结

得益于支付宝的开放性,可以很轻易地获取官方和第三方任意小程序的 URL Scheme 链接进行跳转,使用场景在闽政通的例子中总结过了,此处不在赘述。但是可以补充增加一个用处,比如上面提到的闽政通也提供了支付宝小程序,可以直接使用支付宝小程序的 URL Scheme 调用闽政通,手机上就可以把闽政通删除了。

另外,由于不同的小程序权限不同,它们可以被添加到的位置也是不同的。如下图所示闽政通和乘车码权限对比。闽政通可以添加到支付宝首页,而乘车码只被允许添加到桌面。

https://cdnfile.sspai.com/2021/04/28/article/b9e162e37fa43e7acc3eee4c4163db8c?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1

所以在获得了乘车码的 URL Scheme 之后就摆脱支付宝的束缚,可以将它添加为一个 Launch Center Pro Action 或者 Shortcuts 负一屏组件方便使用。

在这里插入图片描述

调试工具

Launch Center Pro

介绍完了上面四种查询 URL Scheme,肯定会有读者跃跃欲试,想亲自拿几个 App 来练练手。但是大家以前都是如何调试 URL Scheme?修改了然后再粘贴到 Safari 打开吗?这是一种效率很低的调试方法,所以在此介绍两种高效的 URL Scheme 调试方法,首先以 Launch Center Pro 为例。

构思一下如何想做出一个可以方便调试的 Action,这个 Action 需要实现哪些功能?

我认为应该有以下两个:

  1. 可以编辑 URL Scheme,方便调试;
  2. 调试完的结果应该可以暂存到剪切板方便下次继续修改。

基于上面两个需求,可以编写出这样的一条 URL Scheme:

launch://x-callback-url/clipboard?text=[prompt-return:URL Scheme Debug 🐛=[clipboard]]&x-success=[clipboard]

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这个 Action 的运行流程是这样的:

  1. 首先从剪切板读取内容,一般情况下需要先查询一个基本的 URL Scheme 拷贝到剪切板,这也就是初始 URL Scheme 的来源。
  2. 弹出文本编辑界面,可以对这条 URL Scheme 参数进行编辑。编辑完成后点击 Launch 在 prompt-return 的作用下会覆盖原始剪切板内容。
  3. 前两个步骤完成后执行 x-success 参数内容。x-success 从剪切板读取刚刚编辑好的 URL Scheme 并进行跳转。

从演示图片和视频中可以看出,这是在调试一段 Bear 的 URL Scheme。唯一需要说明的就是调试的时候中文字符同样要遵循 Launch Center Pro 的编码原则,在中文字符的左右两边加上两对方括号,如下所示:

bear://x-callback-url/add-text?title={{测试笔记}}&text={{这是一段测试文本内容}}&mode=prepend&x-success=launch://

Drafts

考虑到有些读者是只有购买 Drafts,而没有 Launch Center Pro,这里同样提供可供 Drafts 使用的调试工具(点击下载)。下面是制作思路:

第一步:新建 Action,命名:「URL Scheme Debug 🐛」,点击0 steps添加 Script 模块。

第二步:编辑 JavaScript 代码,简单的两行代码如下:

url = encodeURI(draft.content);

draft.setTemplateTag('url', url);

第一行调用 draft.content 方法可以获取到 Drafts 的草稿内容,对它使用 encodeURI 进行 URL 编码,接着赋值给 url 变量。第二行使用内置的 draft.setTemplateTag 函数将编码后的内容定义为 url 标签。

读者在这里可能会有疑问,为什么要使用 encodeURI() 进行编码,而不是直接在 URL 当中进行编码?这是因为如果在 URL 中选择对标签进行编码,:// 会被编码成 %3A%2F%2F 而导致 URL Scheme 无法打开报错。

第三步:新增 URL 模块,来源就是刚刚定义好的 url 标签。与以往的 URL 不同的是这里一定要记得关闭「URL encode tags」,因为刚才已经使用 encodeURI() 编码过了,在这里不可以重复编码。

第四步:回到 Action 编辑页面,将「AFTER SUCCESS」修改为 Nothing,因为大多数情况下,复杂的 URL Scheme 可能不会一次调试成功,所以动作执行成功后可以保留草稿方便继续调试。

至此,Drafts 用户也有了一个高效方便的调试 Action 了。

文章小结

最后,我们来总结下查询 URL Scheme 的流程。

首先考虑软件开发商,如果软件开发商是国外开发商,那么很大概率会被收录在 Launch Center Pro 中,可以先去它里面进行查询。如果查询不到再考虑网络搜索查询方法,比如捷径社区、官方文档和个人文档。

如果该软件有网页端,访问网页端,试着寻找有无按钮可以选择跳转 App 客户端,如果有就可以使用网页报错法、网页分析法和脚本分析法。在做这一步的同时也可以查询一下网页上的 Universal Link 配置文件内容,用以辅助查询 URL Scheme。

如果是国产 App 且支持创建功能桌面快捷方式,就可以考虑使用网页书签法,这是最简单的办法之一,可以快速得到功能的 URL Scheme。

至于 Info.plist 查询法,这个方法查询到的 URL Scheme 意义不大,除非是只有通过 URL Scheme 打开应用的需求,否则一般不建议使用该方法。

经过这个流程,可以查询出 95% 以上支持 URL Scheme 的 App。剩下 5% 是需要更高级的脚本分析法,对网页的 JS 脚本进行分析,难度不定,所以在此不展开讨论,有能力的读者碰上这种情况时可以自行分析。

参考文章

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第1章 初识Hadoop 数据!数据! 数据存储与分析 与其他系统相比 关系型数据库管理系统 网格计算 志愿计算 1.3.4 Hadoop 发展简史 Apache Hadoop和Hadoop生态圈 第2章 关于MapReduce 一个气象数据集 数据的格式 使用Unix工具进行数据分析 使用Hadoop分析数据 map阶段和reduce阶段 横向扩展 合并函数 运行一个分布式的MapReduce作业 Hadoop的Streaming Ruby版本 Python版本 Hadoop Pipes 编译运行 第3章 Hadoop分布式文件系统 HDFS的设计 HDFS的概念 数据块 namenode和datanode 命令行接口 基本文件系统操作 Hadoop文件系统 接口 Java接口 从Hadoop URL中读取数据 通过FileSystem API读取数据 写入数据 目录 查询文件系统 删除数据 数据流 文件读取剖析 文件写入剖析 一致模型 通过 distcp并行拷贝 保持 HDFS 集群的均衡 Hadoop的归档文件 使用Hadoop归档文件 不足 第4章 Hadoop I/O 数据完整性 HDFS的数据完整性 LocalFileSystem ChecksumFileSystem 压缩 codec 压缩和输入切分 在MapReduce中使用压缩 序列化 Writable接口 Writable类 实现定制的Writable类型 序列化框架 Avro 依据文件的数据结构 写入SequenceFile MapFile 第5章 MapReduce应用开发 配置API 合并多个源文件 可变的扩展 配置开发环境 配置管理 辅助类GenericOptionsParser,Tool和ToolRunner 编写单元测试 mapper reducer 本地运行测试数据 在本地作业运行器上运行作业 测试驱动程序 在集群上运行 打包 启动作业 MapReduce的Web界面 获取结果 作业调试 使用远程调试器 作业调优 分析任务 MapReduce的工作流 将问题分解成MapReduce作业 运行独立的作业 第6章 MapReduce的工作机制 剖析MapReduce作业运行机制 作业的提交 作业的初始化 任务的分配 任务的执行 进度和状态的更新 作业的完成 失败 任务失败 tasktracker失败 jobtracker失败 作业的调度 Fair Scheduler Capacity Scheduler shuffle和排序 map端 reduce端 配置的调优 任务的执行 推测式执行 重用JVM 跳过坏记录 任务执行环境 第7章 MapReduce的类型与格式 MapReduce的类型 默认的MapReduce作业 输入格式 输入分片与记录 文本输入 二进制输入 多种输入 数据库输入(和输出) 输出格式 文本输出 二进制输出 多个输出 延迟输出 数据库输出 第8章 MapReduce的特性 计数器 内置计数器 用户定义的Java计数器 用户定义的Streaming计数器 排序 准备 部分排序 总排序 二次排序 联接 map端联接 reduce端联接 边数据分布 利用JobConf来配置作业 分布式缓存 MapReduce库类 第9章 构建Hadoop集群 集群规范 网络拓扑 集群的构建和安装 安装Java 创建Hadoop用户 安装Hadoop 测试安装 SSH配置 Hadoop配置 配置管理 环境设置 Hadoop守护进程的关键属性 Hadoop守护进程的地址和端口 Hadoop的其他属性 创建用户帐号 安全性 Kerberos和Hadoop 委托令牌 其他安全性改进 利用基准测试程序测试Hadoop集群 Hadoop基准测试程序 用户的作业 云上的Hadoop Amazon EC2上的Hadoop 第10章 管理Hadoop HDFS 永久性数据结构 安全模式 日志审计 工具 监控 日志 度量 Java管理扩展(JMX) 维护 日常管理过程 委任节点和解除节点 升级 第11章 Pig简介 安装与运行Pig 执行类型 运行Pig程序 Grunt Pig Latin编辑器 示例 生成示例 与数据库比较 PigLatin 结构 语句 表达式 1.4.4 类型 模式 函数 用户自定义函数 过滤UDF 计算UDF 加载UDF 数据处理操作 加载和存储数据 过滤数据 分组与连接数据 对数据进行排序 组合和分割数据 Pig实战 并行处理 参数代换 第12章 Hive 1.1 安装Hive 1.1.1 Hive外壳环境 1.2 示例 1.3 运行Hive 1.3.1 配置Hive 1.3.2 Hive服务 1.3.3 Metastore 1.4 和传统数据
CCOpenServiceLite 是CC轻量级开放平台服务,统一入口,一行代码获取微信,QQ,微博等帐号信息,分享,收藏等功能。目前市面上提供的第三方SDK,相当繁琐臃肿,还需要去他们的集成平台上注册各种key之类的,相当麻烦.CC轻量级开放平台服务提供一行代码请求数据服务,底层集成了各平台SDK,用户无需关心具体平台的实现,省事省心.主要功能集成微信,QQ,微博的开放平台SDK.提供统一的请求入口,一句代码即可完成任务,简单高效.目前支持开放平台登录接入功能,其他功能(分享,收藏,评论等)后期有时间会更新上.使用方法1 直接将整个目录拖到你的项目中.(注意用group形式,目录会显示成黄色).本库用到AFNetworking,需要自己集成.2 在AppDelegate.m文件顶部引入头文件CCOpenService.h,CCOpenConfig.h,并且写入下面的配置信息(注意,类似WeiXinAppID这样的,填写自己的微信appID)//AppDelegate.m - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {     //微信配置     [CCOpenConfig setWeiXinAppID:WeiXinAppID];     [CCOpenConfig setWeiXinAppSecret:WeiXinAppSecret];     //QQ配置     [CCOpenConfig setQQAppID:QQAppID];     [CCOpenConfig setQQAppKey:QQAppKey];     //微博配置     [CCOpenConfig setWeiBoAppKey:WeiBoAppKey];     [CCOpenConfig setWeiBoAppSecret:WeiBoAppSecret];     [CCOpenConfig setWeiBoRedirectURI:WeiBoRedirectURI];     return YES; } -(BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url{     //配置微信,QQ,新浪     CCOpenService *wxService = [CCOpenService getOpenServiceWithName:CCOpenServiceNameWeiXin];     CCOpenService *qqService = [CCOpenService getOpenServiceWithName:CCOpenServiceNameQQ];     CCOpenService *wbService = [CCOpenService getOpenServiceWithName:CCOpenServiceNameWeiBo];     return [wxService handleOpenURL:url] || [qqService handleOpenURL:url] || [wbService handleOpenURL:url]; } -(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{     //配置微信,QQ,新浪     CCOpenService *wxService = [CCOpenService getOpenServiceWithName:CCOpenServiceNameWeiXin];     CCOpenService *qqService = [CCOpenService getOpenServiceWithName:CCOpenServiceNameQQ];     CCOpenService *wbService = [CCOpenService getOpenServiceWithName:CCOpenServiceNameWeiBo];     return [wxService handleOpenURL:url] || [qqService handleOpenURL:url] || [wbService handleOpenURL:url]; }3 参考各个平台关于URL scheme的配置指南.例如微信: 4 iOS9 设备需要添加白名单,参考iOS9白名单接口使用说明  服务类型目前支持CCOpenServiceNameWeiXin,CCOpenServiceNameQQ,CCOpenServiceNameWeiBo第三方登录接口//微信登录 CCOpenService *wxService = [CCOpenService getOpenServiceWithName:CCOpenServiceNameWeiXin]; [wxService requestOpenAccount:^(CCOpenRespondEntity *respond) {     if (respond == nil) {         UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"温馨提示" message:@"^_^亲,您木有安装微信哟~ " delegate:nil cancelButtonTitle:@"知道啦" otherButtonTitles:nil];         [alert show];         return;     }     NSLog(@"Respond data is %@",respond.data); }];其他说明  WeiXin,QQ,WeiBo目录下的SDK需要手动导入,另外第三方平台的SDK可能需要手动导入一些类库,具体的先参考具体平台的官方说明,有空更新上.   由于本人工作忙,所以很多功能还没时间写上.目前已经写好了整体框架,有兴趣的同学可当作自己学习锻炼机会,参考我的源码设计模式,将新增的功能PullRrequest给我,谢谢. 标签:微服务框架
内容简介   本书从Hadoop的缘起开始,由浅入深,结合理论和实践,全方位地介绍Hadoop这一高性能处理海量数据集的理想工具。全书共16章,3个附录,涉及的主题包括:Haddoop简介;MapReduce简介;Hadoop分布式文件系统;Hadoop的I/O、MapReduce应用程序开发;MapReduce的工作机制;MapReduce的类型和格式;MapReduce的特性;如何构建Hadoop集群,如何管理Hadoop;Pig简介;Hbase简介;Hive简介;ZooKeeper简介;开源工具Sqoop,最后还提供了丰富的案例分析。   本书是Hadoop权威参考,程序员可从中探索如何分析海量数据集,管理员可以从中了解如何安装与运行Hadoop集群。 目录 第1章 初识Hadoop  数据!数据!  数据存储与分析  与其他系统相比  关系型数据库管理系统  网格计算  志愿计算  1.3.4 Hadoop 发展简史  Apache Hadoop和Hadoop生态圈 第2章 关于MapReduce  一个气象数据集  数据的格式  使用Unix工具进行数据分析  使用Hadoop分析数据  map阶段和reduce阶段  横向扩展  合并函数  运行一个分布式的MapReduce作业  Hadoop的Streaming  Ruby版本  Python版本  Hadoop Pipes  编译运行 第3章 Hadoop分布式文件系统  HDFS的设计  HDFS的概念  数据块  namenode和datanode  命令行接口  基本文件系统操作  Hadoop文件系统  接口  Java接口  从Hadoop URL中读取数据  通过FileSystem API读取数据  写入数据  目录  查询文件系统  删除数据  数据流  文件读取剖析  文件写入剖析  一致模型  通过 distcp并行拷贝  保持 HDFS 集群的均衡  Hadoop的归档文件  使用Hadoop归档文件  不足 第4章 Hadoop I/O  数据完整性  HDFS的数据完整性  LocalFileSystem  ChecksumFileSystem  压缩  codec  压缩和输入切分  在MapReduce中使用压缩  序列化  Writable接口  Writable类  实现定制的Writable类型  序列化框架  Avro  依据文件的数据结构  写入SequenceFile  MapFile 第5章 MapReduce应用开发  配置API  合并多个源文件  可变的扩展  配置开发环境  配置管理  辅助类GenericOptionsParser,Tool和ToolRunner  编写单元测试  mapper  reducer  本地运行测试数据  在本地作业运行器上运行作业  测试驱动程序  在集群上运行  打包  启动作业  MapReduce的Web界面  获取结果  作业调试  使用远程调试器  作业调优  分析任务  MapReduce的工作流  将问题分解成MapReduce作业  运行独立的作业 第6章 MapReduce的工作机制  剖析MapReduce作业运行机制  作业的提交  作业的初始化  任务的分配  任务的执行  进度和状态的更新  作业的完成  失败  任务失败  tasktracker失败  jobtracker失败  作业的调度  Fair Scheduler  Capacity Scheduler  shuffle和排序  map端  reduce端  配置的调优  任务的执行  推测式执行  重用JVM  跳过坏记录  任务执行环境 第7章 MapReduce的类型与格式  MapReduce的类型  默认的MapReduce作业  输入格式  输入分片与记录  文本输入  二进制输入  多种输入  数据库输入(和输出)  输出格式  文本输出  二进制输出  多个输出  延迟输出  数据库输出 第8章 MapReduce的特性  计数器  内置计数器  用户定义的Java计数器  用户定义的Streaming计数器  排序  准备  部分排序  总排序  二次排序  联接  map端联接  reduce端联接  边数据分布  利用JobConf来配置作业  分布式缓存  MapReduce库类 第9章 构建Hadoop集群  集群规范  网络拓扑  集群的构建和安装  安装Java  创建Hadoop用户  安装Hadoop  测试安装  SSH配置  Hadoop配置  配置管理  环境设置  Hadoop守护进程的关键属性  Hadoop守护进程的地址和端口  Hadoop的其他属性  创建用户帐号  安全性  Kerberos和Hadoop  委托令牌  其他安全性改进  利用基准测试程序测试Hadoop集群  Hadoop基准测试程序  用户的作业  云上的Hadoop  Amazon EC2上的Hadoop 第10章 管理Hadoop  HDFS  永久性数据结构  安全模式  日志审计  工具  监控  日志  度量  Java管理扩展(JMX)  维护  日常管理过程  委任节点和解除节点  升级 第11章 Pig简介  安装与运行Pig  执行类型  运行Pig程序  Grunt  Pig Latin编辑器  示例  生成示例  与数据库比较  PigLatin  结构  语句  表达式  1.4.4 类型  模式  函数  用户自定义函数  过滤UDF  计算UDF  加载UDF  数据处理操作  加载和存储数据  过滤数据  分组与连接数据  对数据进行排序  组合和分割数据  Pig实战  并行处理  参数代换 第12章 Hive  1.1 安装Hive  1.1.1 Hive外壳环境  1.2 示例  1.3 运行Hive  1.3.1 配置Hive  1.3.2 Hive服务  1.3.3 Metastore  1.4 和传统数据库进行比较  1.4.1 读时模式(Schema on Read)vs.写时模式(Schema onWrite)  1.4.2 更新、事务和索引  1.5 HiveQL  1.5.1 数据类型  1.5.2 操作和函数  1.6 表  1.6.1 托管表(Managed Tables)和外部表(External Tables)  1.6.2 分区(Partitions)和桶(Buckets)  1.6.3 存储格式  1.6.4 导入数据  1.6.5 表的修改  1.6.6 表的丢弃  1.7 查询数据  1.7.1 排序(Sorting)和聚集(Aggregating)  1.7.2 MapReduce脚本  1.7.3 连接  1.7.4 子查询  1.7.5 视图(view)  1.8 用户定义函数(User-Defined Functions)  1.8.1 编写UDF  1.8.2 编写UDAF 第13章 HBase  2.1 HBasics  2.1.1 背景  2.2 概念  2.2.1 数据模型的“旋风之旅”  2.2.2 实现  2.3 安装  2.3.1 测试驱动  2.4 客户机  2.4.1 Java  2.4.2 Avro,REST,以及Thrift  2.5 示例  2.5.1 模式  2.5.2 加载数据  2.5.3 Web查询  2.6 HBase和RDBMS的比较  2.6.1 成功的服务  2.6.2 HBase  2.6.3 实例:HBase在Streamy.com的使用  2.7 Praxis  2.7.1 版本  2.7.2 HDFS  2.7.3 用户接口(UI)  2.7.4 度量(metrics)  2.7.5 模式设计  2.7.6 计数器  2.7.7 批量加载(bulkloading) 第14章 ZooKeeper  安装和运行ZooKeeper  示例  ZooKeeper中的组成员关系  创建组  加入组  列出组成员  ZooKeeper服务  数据模型  操作  实现  一致性  会话  状态  使用ZooKeeper来构建应用  配置服务  具有可恢复性的ZooKeeper应用  锁服务  生产环境中的ZooKeeper  可恢复性和性能  配置 第15章 开源工具Sqoop  获取Sqoop  一个导入的例子  生成代码  其他序列化系统  深入了解数据库导入  导入控制  导入和一致性  直接模式导入  使用导入的数据  导入的数据与Hive  导入大对象  执行导出  深入了解导出  导出与事务  导出和SequenceFile 第16章 实例分析  Hadoop 在Last.fm的应用  Last.fm:社会音乐史上的革命  Hadoop a Last.fm  用Hadoop产生图表  Track Statistics程序  总结  Hadoop和Hive在Facebook的应用  概要介绍  Hadoop a Facebook  假想的使用情况案例  Hive  问题与未来工作计划  Nutch 搜索引擎  背景介绍  数据结构  Nutch系统利用Hadoop进行数据处理的精选实例  总结  Rackspace的日志处理  简史  选择Hadoop  收集和存储  日志的MapReduce模型  关于Cascading  字段、元组和管道  操作  Tap类,Scheme对象和Flow对象  Cascading实战  灵活性  Hadoop和Cascading在ShareThis的应用  总结  在Apache Hadoop上的TB字节数量级排序  使用Pig和Wukong来探索10亿数量级边的 网络图  测量社区  每个人都在和我说话:Twitter回复关系图  degree(度)  对称链接  社区提取 附录A 安装Apache Hadoop  先决条件  安装  配置  本机模式  伪分布模式  全分布模式 附录B Cloudera’s Distribution for Hadoop 附录C 准备NCDC天气数据
URL Scheme跳转是一种在iOS中实现App之间跳转的方式。它可以通过在Safari或其他浏览器中输入特定的URL Scheme来启动目标App,并且可以通过在URL中添加自定义的参数来传递信息。URL Scheme的形式类似于网页,可以在Safari中输入类似"yourscheme://xxxxx"的URL来进行跳转。如果配置成功,则会弹出提示框询问是否访问该应用。 在iOS中,还有另一种常见的跳转方式叫做Universal Links。与URL Scheme不同,Universal Links是通过在网页上添加普通的超链接来实现跳转。当用户点击这个超链接时,会直接在对应的App内打开相关页面。相比URL Scheme,Universal Links更加方便,因为它不需要在URL中添加特定的Scheme,并且可以在App内部直接处理跳转逻辑。 总结起来,URL Scheme跳转是通过在浏览器中输入特定的URL Scheme来启动目标App并传递参数,而Universal Links是通过在网页上添加超链接来实现跳转到对应的App内部。两种方式都可以实现App之间的跳转,具体使用哪种方式取决于具体的需求和场景。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [IOS应用跳转URL scheme和Universal Links](https://blog.csdn.net/shaobing32/article/details/131170384)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值