<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>longjian (jack)</title>
    <link>https://ruby-china.org/longjian</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>利用 Workflow 显示附近的免费 Wi-Fi</title>
      <description>&lt;p&gt;得益于 Workflow 自 1.5.3 版本起更新的 Get Content of URL 动作，该 App 的潜力得到了极大的提升。本文分享一种有趣的用法，搜寻附近的免费 Wi-Fi 并择一显示在系统地图上。&lt;/p&gt;
&lt;h2 id="简介"&gt;简介&lt;/h2&gt;
&lt;p&gt;本 Workflow 主要分三部分，从通知中心运行（下载地址：&lt;a href="https://workflow.is/workflows/1175edbb0578459586b845373a185f9b" rel="nofollow" target="_blank"&gt;https://workflow.is/workflows/1175edbb0578459586b845373a185f9b&lt;/a&gt;）&lt;/p&gt;

&lt;p&gt;获取当前地理位置；&lt;/p&gt;

&lt;p&gt;通过网络资源获取附近的免费 Wi-Fi 资源；&lt;/p&gt;

&lt;p&gt;将所选 Wi-Fi 显示在系统地图上&lt;/p&gt;

&lt;p&gt;大体的步骤很少，所以是非常简单的。下面将逐步介绍。&lt;/p&gt;
&lt;h2 id="1. 获取当前地理位置"&gt;1. 获取当前地理位置&lt;/h2&gt;
&lt;p&gt;这个直接利用 Workflow 自带的 Get Current Location 动作就可以获取，由此获得的地理信息包含经纬度，分别使用 Get Details of Locations 提取即可。经纬度信息将用在步骤 2 中。&lt;/p&gt;
&lt;h2 id="2. 获取附近免费 Wi-Fi 信息"&gt;2. 获取附近免费 Wi-Fi 信息&lt;/h2&gt;
&lt;p&gt;这里就直接使用聚合数据的 全国 Wi-Fi API 了，只需要注册个账号就可以申请 API key，没有使用限制，Wi-Fi API 申请地址：&lt;a href="https://www.juhe.cn/docs/api/id/18" rel="nofollow" target="_blank"&gt;https://www.juhe.cn/docs/api/id/18&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2016/4bd8799140808666fe1666cb0c7b919a.jpg!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;请求方式为 Get/Post，总共有 6 个输入参数：&lt;/p&gt;

&lt;p&gt;lon：经度，使用上一步获取的经度；&lt;/p&gt;

&lt;p&gt;lat：纬度，使用上一步获取的纬度；&lt;/p&gt;

&lt;p&gt;gtype：所传递经纬类型，1：百度 2：谷歌 3：gps，填 gps；&lt;/p&gt;

&lt;p&gt;r：搜索范围，单位 M，填 1000 即可，太远懒得跑；&lt;/p&gt;

&lt;p&gt;key：应用 APPKEY，申请后可以获得，或者直接使用我的；&lt;/p&gt;

&lt;p&gt;dtype：返回数据的格式，不用填。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2016/7d65d3d9e30377a4ed87d20e94e2fcd9.jpg!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;如上填写就可以获取到返回的 json 数据了，参照 API 文档页面的介绍逐层提取数据即可。&lt;/p&gt;

&lt;p&gt;每个 Wi-Fi 的数据形式如下：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
        "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
        },
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="注意"&gt;注意&lt;/h3&gt;
&lt;p&gt;唯一关键的地方是，如果附近有多个 Wi-Fi，则服务器会返回多组数据，这时必须要将它们排成列表供使用者选择。而未经处理的 Dictionary 数据在 Choose from List 动作中的显示统一是「Dictionary」，不利于使用者查看。这里介绍两种解决方式：&lt;/p&gt;
&lt;h3 id="使用 Set Name 动作"&gt;使用 Set Name 动作&lt;/h3&gt;
&lt;p&gt;在使用 Repeat with Each 动作对 Wi-Fi 位置信息进行逐个处理时，首先提取用于显示的信息，如 Wi-Fi 名称、距离，再使用 Set Name 对每个 Dictionary 数据命名：&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2016/1195f1b51d280f09779f7c55c1cc7424.jpg!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;这样在接下来的 Choose from List 动作中所有 Dictionary 都将显示自己独特的名字，而不是一个个干巴巴的「Dictionary」。在使用者做出选择后，就可以安排其它的 Get Dictionary Value 动作来进一步获取数据了。&lt;/p&gt;

&lt;p&gt;该方式唯一的缺点就是在只有一个 Dictionary 数据时，由于 Workflow 开发者更新了 Choose from List 动作，此时会显示 Dictionary 中的键与键值，所以需要安排额外的动作对此进行处理。&lt;/p&gt;
&lt;h3 id="使用 Text 动作"&gt;使用 Text 动作&lt;/h3&gt;
&lt;p&gt;该方式在 Repeat with Each 动作结束后，会产生一个文本 List，随后的 Choose from List 动作将列出每个文本的首行。在使用者做出选择后，需要通过 Match Text 动作使用正则表达式对经纬度数据进行匹配，语法如下：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(?&amp;lt;=lat:).*?(?=\n)
(?&amp;lt;=lon:).*$
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;优点是避免了 Set Name 方案的问题，缺点是每一次循环都需要将经度纬度提取出来，当数据有成百上千个时会多浪费点时间。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2016/913080e524d02437da9c6514527ebed9.jpg!large" title="" alt=""&gt;&lt;/p&gt;
&lt;h2 id="3. 在系统地图显示 Wi-Fi 位置"&gt;3. 在系统地图显示 Wi-Fi 位置&lt;/h2&gt;
&lt;p&gt;查询苹果地图相关的 文档 后，可以知道该 URL 为：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://maps.apple.com/?ll=纬度,经度&amp;amp;q=名称
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;将从步骤二中获取的数据填入并访问即可。&lt;/p&gt;
&lt;h2 id="使用"&gt;使用&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;通知中心访问：&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2016/330cf532229ca789bede5a0faf06c857.jpg!large" title="" alt=""&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;苹果地图显示位置：&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2016/5845be5706d1039207e7802d0e8c0abc.jpg!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;只有两步操作，所以还是很快捷的。虽然距离的显示有点问题，但还在我可以接受的范围内。不过聚合数据的 Wi-Fi 数量不算特别多，不知是否会进一步更新数据库。&lt;/p&gt;</description>
      <author>longjian</author>
      <pubDate>Wed, 07 Dec 2016 13:12:23 +0800</pubDate>
      <link>https://ruby-china.org/topics/31824</link>
      <guid>https://ruby-china.org/topics/31824</guid>
    </item>
  </channel>
</rss>
