得益于 Workflow 自 1.5.3 版本起更新的 Get Content of URL 动作,该 App 的潜力得到了极大的提升。本文分享一种有趣的用法,搜寻附近的免费 Wi-Fi 并择一显示在系统地图上。
本 Workflow 主要分三部分,从通知中心运行(下载地址:https://workflow.is/workflows/1175edbb0578459586b845373a185f9b)
获取当前地理位置;
通过网络资源获取附近的免费 Wi-Fi 资源;
将所选 Wi-Fi 显示在系统地图上
大体的步骤很少,所以是非常简单的。下面将逐步介绍。
这个直接利用 Workflow 自带的 Get Current Location 动作就可以获取,由此获得的地理信息包含经纬度,分别使用 Get Details of Locations 提取即可。经纬度信息将用在步骤 2 中。
这里就直接使用聚合数据的 全国 Wi-Fi API 了,只需要注册个账号就可以申请 API key,没有使用限制,Wi-Fi API 申请地址:https://www.juhe.cn/docs/api/id/18。
请求方式为 Get/Post,总共有 6 个输入参数:
lon:经度,使用上一步获取的经度;
lat:纬度,使用上一步获取的纬度;
gtype:所传递经纬类型,1:百度 2:谷歌 3:gps,填 gps;
r:搜索范围,单位 M,填 1000 即可,太远懒得跑;
key:应用 APPKEY,申请后可以获得,或者直接使用我的;
dtype:返回数据的格式,不用填。
如上填写就可以获取到返回的 json 数据了,参照 API 文档页面的介绍逐层提取数据即可。
每个 Wi-Fi 的数据形式如下:
{
"name":"瑞尔威饭店",
"intro":"中F1旅馆门厅;中F2办公区;中F3-F7奇数层走廊;中F4,F6走廊;东F2餐厅,办公;东F3-F7奇数层走廊;东F4,F6走廊;西F3-F7走廊;西F1快餐厅;西B1公共区域",
"address":"北京市丰台区北京市丰台区莲花池东路116-2号",
"google_lat":"39.896877",
"google_lon":"116.325342",
"baidu_lat":"39.9026269139",
"baidu_lon":"116.33193121541",
"province":"北京市",
"city":"北京市",
"distance":2959
},
唯一关键的地方是,如果附近有多个 Wi-Fi,则服务器会返回多组数据,这时必须要将它们排成列表供使用者选择。而未经处理的 Dictionary 数据在 Choose from List 动作中的显示统一是「Dictionary」,不利于使用者查看。这里介绍两种解决方式:
在使用 Repeat with Each 动作对 Wi-Fi 位置信息进行逐个处理时,首先提取用于显示的信息,如 Wi-Fi 名称、距离,再使用 Set Name 对每个 Dictionary 数据命名:
这样在接下来的 Choose from List 动作中所有 Dictionary 都将显示自己独特的名字,而不是一个个干巴巴的「Dictionary」。在使用者做出选择后,就可以安排其它的 Get Dictionary Value 动作来进一步获取数据了。
该方式唯一的缺点就是在只有一个 Dictionary 数据时,由于 Workflow 开发者更新了 Choose from List 动作,此时会显示 Dictionary 中的键与键值,所以需要安排额外的动作对此进行处理。
该方式在 Repeat with Each 动作结束后,会产生一个文本 List,随后的 Choose from List 动作将列出每个文本的首行。在使用者做出选择后,需要通过 Match Text 动作使用正则表达式对经纬度数据进行匹配,语法如下:
(?<=lat:).*?(?=\n)
(?<=lon:).*$
优点是避免了 Set Name 方案的问题,缺点是每一次循环都需要将经度纬度提取出来,当数据有成百上千个时会多浪费点时间。
查询苹果地图相关的 文档 后,可以知道该 URL 为:
http://maps.apple.com/?ll=纬度,经度&q=名称
将从步骤二中获取的数据填入并访问即可。
只有两步操作,所以还是很快捷的。虽然距离的显示有点问题,但还在我可以接受的范围内。不过聚合数据的 Wi-Fi 数量不算特别多,不知是否会进一步更新数据库。