Workflow 实现签到应用客户端
Workflow 是 iOS 平台里一个扩展性极强的自动流程 app,可以自定义一系列复杂操作并把它们编排成脚本,之后便可一键快速执行。网上虽然流传着不少 Workflow 脚本,但大多都仅用于简化日常操作或者实现一些扩展功能而已,经过一段时间的体验,我发现它的潜力远远不止于此:只要有些编程基础,完全可以把它当作一个简单的可视化脚本编程工具来用。这就意味着,可以用它实现一些原本需要真正的编程语言才能实现的东西,比如一个记录当前地理位置的应用。
如果你在用电脑阅读这篇博文,你可以在屏幕左侧看到一个显示我当前所在地的模块(如果你看不到就说明我已经回家了,看上面的图片吧)。我每次到达一个新城市后,在手机上“签到”一下就会更新这里显示的所在地,并在我个人主页的旅行足迹地图加上相关信息。此前这个签到功能是通过一个 Web App 实现的:用 Javascript 通过 HTML5 的 Geolocation API 调用手机 GPS 定位获取经纬度,然后使用第三方接口来将经纬度转换为具体的城市,最后再用 AJAX 提交到我的服务器保存。我每次签到都需要在浏览器中打开签到页面,输入密码登录之后才能“一键签到”。这个过程虽然算不上繁琐,却也并不简便,当然,如果用 Swift 写一个原生 app 来实现,用起来会更方便一些,然而为了“更方便点”专门写个 app 似乎又不太值得……于是这事就不了了之了,直到我用上 Workflow 才真正解决这个问题。这听起来很神奇,实现起来却并不复杂,在这里我会尽量用通俗易懂语言和大家分享一下我的实现方法。
获取定位信息
首先添加一个 Get Current Location 动作,并将返回的结果保存为一个变量,我这里将它命名为 location。
接下来读取这个变量,并通过 Get Details of Locations 动作来获取城市名,然后将结果保存为一个名叫 city 的变量。当然只有城市名是不够的,所以之后还要重复几次这个流程,来获取省份、国家名称和经纬度等信息,并将它们分别保存到变量里。
发送数据到服务器
现在我们已经获取到了所需的信息,接下来需要把它们发送给我服务器的签到接口。这个接口接受 HTTP GET 请求,所以简单拼接 URL 并访问即可发送数据,就像这样:
https://api.dandyweng.com/.../checkin?lat=纬度&lng=经度&city=城市名&state=省份名&country=国家名
这里我先用变量中的信息拼接好 URL,之后用 Get Contents of URL 来发送请求,最后用 Show Notification 来显示服务器返回的内容。
运行测试
大致功能已经实现,现在把它保存成脚本,添加进通知中心的 Widgets 里试试看。
点击之后脚本就开始在后台执行,不需要打开任何 app,几秒钟就执行完毕并显示服务器端返回的成功提示。
这时在服务器端查询数据库,已经可以看到新的签到记录,我个人主页上的旅行足迹地图和这个博客上的所在地信息也已经同步更新。
提升安全性
虽然已经实现了签到功能,但在正式投入使用前还有一个非常重要的问题要解决,那就是安全性。按照目前的实现方式,任何一个知道上面的 URL 和参数的人都可以通过这个接口来提交数据,有非常大的安全隐患。解决的方式是加个密码,但密码通过 GET 方式明文传输依然有可能被截获和盗用,所以并没有什么意义,因此这里要用复杂些的对称密钥加密的方法来进行校验。
首先,生成一个九位数的随机数字,保存为 rand 变量;之后再设置一个密码,保存为 key 变量;最后把随机数和密码拼接在一起,进行 MD5 加密,然后将密文保存为 token 变量。
最后把 token 的密文和 rand 的明文放在 HTTP 请求里一起发送。服务器收到 rand 参数后,使用相同的步骤和预置的密码 key 来重新生成另一个 token,并检测与 Workflow 里生成的 token 是否一致,若是就表明前一步中填写的密码是正确的,否则就拒绝签到请求。这里的 token 每次都会变,只要密码 key 和随机数 rand 相同,在服务器端生成的 token 就必然是相同的,这里密码本身并不会被传输,从而避免被截获和盗用的风险。
至此这个“地理位置签到应用 iOS 客户端”就已经开发完成,根据我最近几天的使用体验,总结起来就一个字:爽!大家有兴趣也可以自己试试看,有任何问题都可以在这里留下评论,我会尽量解答。
匿名
酷!!!!
匿名
可以有多一点的锻炼吗 拜托拜托
匿名
网站挺漂亮的
匿名
老铁 太强了吧
匿名
大佬好强!