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