AppWishList
—— 基于Pythonista
的苹果AppStore
愿望单系统。
前言
也许是为了促使用户立马买下中意的App,AppStore从iOS 11
取消了愿望单系统,从此没有了类似Steam
那样的应用关注和收藏功能。很多时候喜欢的应用打折也不能及时得知,或者是看到有意思的App过段时间想用时又想不起名字找不到了。
不知道你在生活中有没有遇到过这种情况,反正我是有切身体会。在网上找了半天也没发现合适的AppStore愿望单应用,所以就决定自己写一款AppWishList
。
功能介绍
本程序可以实现AppStore应用的收藏,并对收藏的应用进行管理和查看价格曲线。收藏的应用被分为两大类,收藏夹
和愿望单
,使用快捷指令
的自动化脚本可以每天自动采集应用的最新价格。当愿望单
中的应用降价时,还会通过通知中心向用户发起通知。
愿望单页面
在这个界面中展示你重点关注的应用,当他们降价的时候会有消息提醒。你可以对他们进行排序,方便用户优先看到最想要的应用。
分类页面
点开收藏夹选项会看到这个分类页面,其分类默认是根据苹果商店对应用的分类来进行的,之后可以在详情页面自定义分类。用户也可在此直接删除一整个分类的App。
应用列表
每个分类选项点开展示该类下应用的基本信息,一般有降价的话右边的按钮会有类似Steam折扣标签那样的展示。比如下面这张数据测试图:
右上方的按钮可以根据“收藏时间”、“价格”、“名称”三个关键字进行排序。
详情页面
无论是在分类应用列表还是愿望单,点击选中每一个应用项都可以进入到详情页面,这个页面主要展示的是单个应用的价格变化曲线。
柱状图按年份进行展示一年的信息,这个数据来自于该应用被收藏以来程序运行所采集到的价格信息,都存储在本地sqlite数据库,所以还是需要用户经常运行程序抓取数据才能及时获取降价信息。不过好在有自动化抓取的脚本,在下面会有使用说明。
下方横坐标只显示每月1号或15号的日期,当你按住柱状图中的每一条数据上时,具体的时间和价格会显示在正上方,红色代表涨价,绿色代表降价,蓝色则价钱不变。这个柱状图之前考虑过使用matplotlib
来绘制,不过后来效果不理想,还是自己手动封装了一个类来实现,每一个bar都是自己手动计算偏移量绘制上去的。ԅ(¯﹃¯ԅ)
点击分类名称可以修改分类,但分类名称长度限制在1到20之间。
点击自动更新按钮,可以将该应用添加或移除自动更新列表。在设置页面点击数据更新或使用自动化脚本进行批量更新的时候,只有开启了自动更新设置的应用才会被更新。对于那些免费下载或者已经购买的应用可已关闭自动更新以节省更新时间。
说到这里,应用基本的功能就介绍完了,但其实有个问题还是没法解决。就是很多软件是免费下载,订阅付费或者内购解锁完整功能,但是在官网的主页上只能获取到价格为免费
的信息。
环境要求
- iOS设备 : v1.1.1版本更新后,加入对iPhone设备的屏幕适配!
- iOS 13 : 尽量用最新的吧,能向下兼容到什么版本主要还是看下面这位老哥。╮(╯▽╰)╭
- Pythonista : 这个是必备的,不然你怎么在iOS上运行python为所欲为,至于价钱嘛,68¥简直是赚暴了。
- 快捷方式: 苹果自家的产品,零成本,用来实现自动化的辅助功能。
- AppStore : 数据源。
安装配置及使用方法
方法1
手动下载源代码,放到Pythonista
中你想放的位置即可,使用Python 3
进行运行。
下载方式可以通过Working Copy
下载导入,只是下载的话免费版就OK了。
如果直接下载的文件夹到iOS设备中,可以先将项目文件夹移动到Pythonista
在iCloud
中的文件夹中,然后再到Pythonista
中将该文件夹移动到本地存储,不过如果你就在iCloud
文件夹中使用反而方便多设备同步代码与数据。最后也可以直接在EXTERNAL FILES
导入外部文件夹进行运行,但是这样不便于代码文件管理,适合于临时使用。
方法2(推荐)
直接在控制台输入以下命令运行或者创建一个新.py文件然后粘贴该命令运行。使用命令运行将会默认安装在根目录,即“This iPad/iPhone
”目录下,安装好之后你可以再挪动文件夹位置。
1 | import requests as r;exec(r.get('http://img.siriyang.cn/source/AppWishList/installer.py').content) |
收藏App
首先将AppWishList
文件夹下的ExtAddApp.py
添加到Share Extention Shortcuts
中,然后在浏览App Store
的时候看见喜欢的应用时,点击分享按钮,然后选择Run Pythonista Script
,在列表中选择运行之前添加的脚本就行了。
</img>
在添加应用时会弹出一个对话框,询问你是添加到收藏夹还是愿望单。
看到显示“添加成功”就表示程序运行结束了,有的链接请求可能比较久,但只要不报错就肯定还在后台运行中。其实你只要立马点第二次系统就会提醒这个脚本已经在执行,就知道上一次还没结束了。
不想等的话点击收藏以后直接关闭窗口就行了,它会在后台执行直到完成结束。一般你从一个应用界面切换到另一个应用界面的时间他也差不多该运行结束了。不过这样有个问题就是如果发生连接超时或链接有问题添加失败就不知道了。
当重复添加同一个App的时候,会对该App执行更新操作,会获取最新的价格及应用信息,不过应用分类不会再改变,以当前值的为准。目前版本在更新应用的时候不会改变应用的愿望单和自动更新状态,今后版本会考虑以用户选择的类别为准。
添加应用这个过程没有界面,都是通过提示框来显示信息,执行和时长取决于请求下载该页面的速度。后台在使用请求命令获取页面代码以后会自动解析出需要的信息,快的一秒就好了,一般平均也就两三秒的样子,收藏国外的软件可能要慢点。
哎,其实我需要的只是整个页面最前面的一段jeson数据,奈何得把整个页面都下载下来,目前还没想好优化方法。
不过值得注意的是,为了节省收藏用应用的时间,首次添加应用只获取了基本信息如应用图标的链接,并没有下载应用图标,因为下载图片的过程会比较慢,慢的可能要十秒左右。应用图标会在应用更新的时候检查下载。
同一张图片下载以后只要不删除就不会再下载了,如果不想下载图标节省存储空间可以在设置页面关闭图片下载。
数据管理
我在设置页面中还放了点数据统计,在几个功能设置按钮的最下方是数据清理选项,当然会有确认框二次确认,但在这块操作的时候要小心不要误触删库了…
你在设置页面可以对所有开启了的自动更新
选项的应用进行批量的更新。
通知
在设置中开启降价通知(默认是开启的),只会当你愿望单
(在应用详情中设置)中的应用在更新数据时检测到降价才会发起通知,价格的比较是根据最近一次采集到的数据来进行计算的。也就是说如果你长期不更新数据,程序会一直显示上一次计算的折扣,但不用担心,每条价格数据只会提醒一次,不会收到同一个折扣的重复提醒。
自动化更新
使用苹果官方的快捷方式
实现定时自动化更新的功能。在自动化中创建脚本,添加“运行Pythonista脚本
”的命令,然后填上AppWishList
文件夹下的AutoUpdateApp.py
的路径,这个路径的起点是从Pythonista
中的“This iPad/iPhone
”算起的,也就是用户能看到的根目录了。
不过现在这个自动化功能有个问题,就是它到点了指挥给你个消息提醒和执行按钮跟你说该更新数据了,并不会自动执行代码,还是得需要用户手动点击确认一下才行。查了一下,是苹果出于用户的安全考虑留了一手。╮(╯▽╰)╭
目前最新版的
快捷指令
已经可以设置不用用户确认直接调用pythonista执行脚本了。
今后待解决的问题
考虑之后像安装stash那样做一个自动化安装的脚本,今后只需要在控制台输入一行命令就可以自动下载安装了。(已解决)由于一开始设计程序的时候很多底层核心代码都放在了最外面一层文件夹,对用户来说体验不是很好,虽然以后都可以直接创建快捷方式来运行,但头一次还是不怎么好找。考虑过把文件整理一下,但不知道(已解决)Pythonista
的模块导入是有什么问题,当我把文件挪动后就死活导入不进来,提示没有这个模块,网上找了好多解决方案都不行。- 好吧,我承认界面都做得比较丑,我也是边做边学,一开始
ui
模块也不熟悉。今后看到好看的UI再考虑借鉴
过来优化完善吧,嘿嘿。 - 功能上的不足之后用的时候遇到了再添加吧,至少现在的功能够满足我自己的需求了,如果用户有什么需求或者使用过程中遇到Bug也可以在我的博客下方留言。
感想体会
开发应用愿望单的想法从之前考研复习在高频使用iPad的时候就萌生了,但是由于有正事要做就先搁置了下来,不过也给了我时间思考和构想这个程序的设计。通过链接下载页面源码,解析并抓取jeson那段代码在当时闲暇的时候就已经写好了,获取了数据基本上最关键的问题就已经解决了,剩下的就是如何管理和呈现数据。
后台数据管理
对于数据管理这块说白了就是做一个“XXX管理系统”,平时在学校做的这类课程设计已经够多了,不过也从之前开发SpringBoot网站项目上吸取了很多经验,如模型层、控制层、服务层经典架构的使用还有日志系统和错误代码处理的技巧。
整个系统做下来数据表改了三次,每一次改动都会从下往上的层层影响,都需要做出相应改动,可是吃够了苦头,也难怪不得数据库工程师那么吃香。不过也确实写的一手的好SQL语句就能省去后台代码很多计算量,也减轻了应用程序开发的负担。
前端数据展示
前端界面的话,最开始有想过渲染成网页或者PDF来查看,但不是做成服务器网站那种,就像是运行程序导出一张数据报表一样。但后来想一想,这样做还挺麻烦的,还不如直接做成图形用户界面来的方便快捷。可惜的就是只能使用Pythonista
自己的ui
库,相比我以前使用过的Qt
或者pyqt
还是差了不少,很多想要的组件都没有,但能重载View
这个最基础的类也算是给了用户足够的发展空间。
其实最累人的是使用这个ui
库的开发遇到问题在国内基本上找不到好的解决方案,基本上没有什么关于这方面的博客文章,只有翻墙去外网谷歌搜索、官方论坛和github
上找答案。当然最重要的就是仔细阅读官方文档,每天打开电脑的第一件事就是把文档网页打开,遇到问题就反反复复的查文档,现在这个文档基本上已经过通读了好几遍了,每个类有些什么方法和属性基本上也都快记下来了。
整个程序就是在这样一个基本上完全英文的环境下开发出来的,虽然可以直接谷歌翻译整个网页,但是很多专业词汇翻出来都变了味,甚至把一些不该翻译的代码和变量名都翻译了,一些国外论坛上的回复也有打错字机翻不出来的地方。所以到头来还是自己直接看英文原文来的稳当,不过好在考完研以后现在的英语水平已经能应付的了了。
这篇文章记录了我在开发过程中的一些笔记:学习日志200129:在AppWishList开发中遇到的一些问题
这张图是最近这一个星期以来使用Pythonista
的使用时间统计,算上之前零零散散还没计入的一些时间,整个程序开发应该有80+小时,而代码量的话使用SourceCounter
软件统计出来有4633
行。这段时间因为肺炎疫情禁足在家无所事事,也算是能全身心投入到这个差点就要烂尾不了了之的项目开发中来。每天从起床就开始写,除了吃饭和上厕所基本上整体就坐在平板和电脑面前,有的时候要干到晚上2点才睡觉,躺在床上满脑子也都是在想程序怎么设计更好。自大一、大二以来好久都没像这样痴迷于写一个程序了,能让我比打游戏看剧更上瘾的也唯有码瘾了,平均下来一天可能有12个小时的工作时间,不知不觉一天的时间就过去了。
好在现在写完了,可以好好放松一下看看美剧了….╰( ̄▽ ̄)╭
更新日志
2020.09.01 v1.2.2
- 修复steam风格价标降价时折扣符号为正号的错误
2020.04.08 v1.2.1
- 将自定义alertView改为console.alert
- 调整价标等UI以适配iPhone小屏幕
- 修复活动指示器无法居中的问题
2020.04.05 v1.2.0
- 去除主页改为底部栏切换样式,将愿主页信息以及更新功能移至“更多设置”页面
- 添加自动化安装脚本
- 调整设置页面样式
- 将日志窗口嵌入导航试图
- 针对全面屏iPhone优化底部按钮高度
- 修复uiImgResize()传入空值引发的异常
- 修复通知工具路径裁剪出错的问题
2020.04.04 v1.1.2
- 添加应用顶部名称标题
- 调整价格柱状图样式
- 调整应用详情页面分割线样式
- 调整并将应用详情界面各区域尺寸设为固定值
- 调整自定义对话框样式
- 调整iPhone应用详情横屏状态下的图标尺寸
- 调整iPhone应用列表竖屏状态下的图标尺寸
- 修复应用列表中价标对触摸事件的遮挡问题
- 取消主页面选中背景高亮
- 取消TableView单元格选中时的背景高亮
- 优化代码
2020.03.30 v1.1.1
- 添加对iPhone的页面适配
- 调整分类页面数量标签位置
- 取消更新对话框的关闭按钮
2020.03.29 v1.1.0
- 使用新版的notification模块重写通知功能函数,不再通过提醒事项进行通知
- 调整项目文件结构,并在根目录下添加LunchMainWin.py文件作为主程序入口
- 调整愿望单页面价标位置
- 优化代码
2020.03.28 v1.0.2
- 在收藏夹App列表页面添加收藏和自动更新设置按钮
- 在自动更新设置更改成功后添加HUD提示窗口
- 在添加应同时,添加选择加入愿望单还是收藏夹的对话框
- 在外部添加应用操作结束后,自动关闭共享表单
- 修复Pythonista 3.3版本更新后分类页面无法自动居中的问题
- 修复在App详情页面手动更新价格后最新价格无法正常在价格柱状图中显示的问题
2020.03.12 v1.0.1
- 修复部分bug
- 修复软件升级后造成的UI布局异常
- 将新添加的App默认设置为自动更新并加入愿望单