4 app版本号 swift_已开源 app 实现检查更新的简单方式
如果您开发的 app 没有上架 app store,那么您肯定会考虑如何保证用户及时收到 app 更新的问题,如果您的项目是开源在某个托管平台的,那么本文就提供一种简单的方式助您实现 app 检查更新的功能。
实现平台
- macOS 10.14.3
- swift 4.2.1
- xcode 10.1
1. 思路
本文提供的方法,不需要架设服务器,只要在开源平台上托管就可以。所以,这里假设您的 app 都是在托管平台发布,并且代码也是及时推送到托管平台的。
每个 xcode 工程中都有一个 info.plist
文件,使用其中的 CFBundleShortVersionString
键的值作为版本判断依据,app 运行起来本身能获取自己的版本号,通过网络从托管平台获取最新版本源文件中的 info.plist
文件,然后得到最新版本号,与自身的版本号对比,如果不一样就说明有了最新版本(更严格的判断应该是远端文件中获取的版本号新于 app 自身的版本号),然后通过提示框提醒用户有新版本发现,提示框中给出一个按钮,帮助用户跳转到开源工程最新版本的 release 页面即可。
注:本文描述的具体方法不适用于Xcode 11及以上版本,因为 info.plist 的内容有变化,不过可以继续使用此文描述的思路,不同的是需要解析的文件不是info.plist
而是xxxxx.xcodeproj/project.pbxproj
,版本就是其中的MARKETING_VERSION
。
这里以工程托管在 github 为例,说明几点注意的地方:
- 请求的
info.plist
文件链接必须是直接指向原文件的,而不是浏览代码页面对应的链接,网页 github 平台上浏览工程代码,找到info.plist
文件,然后点击如图位置的raw
按钮即可得到源文件的直链:
- 跳转最新 release 的页面是根据 tag 名进行跳转的,所以 tag 名称最好与版本号命名规则一致,当然不一致也可以,只要最终能对应上就可以,比如十里的一个开源项目 textGO,对应 tag 的 release 页面链接可以轻易获得:
https://github.com/smslit/textGO/releases/tag/v0.3
,规则就是https://github.com/smslit/textGO/releases/tag/v
+ 版本号 - 第一步网络请求
info.plist
文件使用 GET 请求即可完成,网络请求相关内容可以通过另一篇文章了解:macOS 开发之实现 HTTP 的 GET 和 POST 请求
2. 示例
下面以十里的开源项目 textGO 为例说明一下实现。
2.1 更新器类
因为十里将项目托管到的是 github 平台,所以封装的更新器类仅适用于 github,如果适配其它平台只需修改两处 url 的处理即可。更新器类为 TextGoUpdater ,在文件 TextGoUpdater.swift
中定义,您可以打开这个文件查看具体实现代码。
2.1.1 属性
TextGoUpdater 类中定义了两个属性,分别是 user
、url
。
user
指的是 github 的账户名url
指的是info.plist
文件的直链
2.1.2 方法
init(user:)
初始化方法,初始化过程中根据提供的 github 账户名和工程名推断出info.plist
文件的直链并赋给 url 属性check(callback:)
触发检查更新的过程,是公共方法。callback
是个逃逸闭包,完成网络请求后在进行数据处理前执行,主要方便调整控件的状态。checkUpdateRequestSuccess(data:response:error:callback:)
封装了网络请求完成后的处理过程,是私有方法。另外使用的两个tipInfo
方法在TextGoPublic.swift
文件中定义,用来显示提示框告知用户检测更新的结果。检测到更新以后,会根据类的 user 属性和工程名称以及最新版本号推断出 release 页面链接。
2.1.3 使用方法
使用方法很简单,主要分两种:有回调和没有回调。
2.1.3.1 无回调使用
可以在文件 AppDelegate.swift
中看到使用方法
- 定义属性 updater
let updater = TextGoUpdater(user: "smslit") {}
- 在
checkUpdate()
方法中直接调用 updater 实例的 check 方法:
@objc func checkUpdate() {updater.check() {}
}
2.1.3.2 有回调使用
- 定义属性 updater
let updater = TextGoUpdater(user: "smslit") {}
- 在
checkUpdate()
方法中直接调用 updater 实例的 check 方法:
@objc func checkUpdate() {updater.check() {// 实现对界面控件的调整}
}
3. 执行效果
textGO 是一个菜单栏小工具,通过点击检查更新
菜单项触发更新的检查,为了更好的展示效果,以视频展示,同时修改版本号来查看有更新和没更新两种情况的效果。
检查更新效果展示https://www.zhihu.com/video/1085535822274674688
总结
本文更新器的实现思路比较简单,只是提供了检查更新的功能,不过一般情况下这就足够了,其实这种方法也能适用于托管平台的私有项目,可以在平台中共享出某个可以提供版本号的文件,得到它的直链就可以,思路一样,想办法更改两处链接就能实现。最后,祝您成功!
博客原文:
已开源 app 实现检查更新的简单方式www.smslit.top
4 app版本号 swift_已开源 app 实现检查更新的简单方式相关推荐
- Android课程设计本地游戏厅app开发(已开源)
Android课程设计本地游戏厅app开发(已开源) 见链接
- RTK差分共享猫APP后台系统已开源
RTK差分共享猫APP后台系统开源,开源地址https://gitee.com/forgy/NtripShareCatServer 后台系统基于GUNS 6.0(https://gitee.com/s ...
- java对于app版本号比较,Java对比APP版本号大小
/** * 比较版本号的大小,前者大则返回一个正数,后者大返回一个负数,相等则返回0 * @param version1 * @param version2 */ public static int ...
- 一款基于星座的app(项目已开源)
一款基于星座的app(项目已开源) 该星座app是大三时期做的期末项目.结果不被老师赏识,说是网上找的,哈哈.文章最后放源码下载地址. 关注公众号回复 : 1003 . 获取源码地址,回复1004,获 ...
- 移动开发已进入 App 工厂时代!
导语:App工厂,顾名思义,是一个能根据各种素材和组织形式生成App的工厂.更专业一点的描述,是根据一个具有完备组件库以及这些组件的依赖关系,组合成一个个App. 以往的单App研发架构,由于每次打包 ...
- Java实现比较APP版本号大小
实现代码如下: /*** 比较APP版本号的大小* <p>* 1.前者大则返回一个正数* 2.后者大返回一个负数* 3.相等则返回0** @param version1 app版本号* @ ...
- Android最新最全100余款开源App(对应Github开源项目)
最近整理了一些开源的APP,以及对应的一些Github开源项目,现在做一些记录,以便以后查阅. 介绍与链接 BeautifulRefreshLayout-漂亮的美食下拉刷新 https://githu ...
- 一些完整的Android开源app项目
android开源项目有很多,但是完整的app项目不多,下面是最近我 整理的一些开源app项目: 注: jcodecraeer网站上搜集了很多开源项目,更新很快,非常值得关注. 一.photoup 介 ...
- “因为无法从捐赠中抽成,谷歌把我的开源 App 下架了!”
众所周知,苹果税和谷歌税的存在,即"只要你的 App 在 App Store 或 Google Play 上架,产生的收入就必须分给苹果或谷歌." 这个"收入" ...
最新文章
- webDriver测试百度登录java版
- 保护 ASP.NET 会话状态
- android第三次作业
- geth bootnodes
- 工作日志:串口外设的开发总结
- web框架和后台开发_Web开发框架–第1部分:选项和标准
- SQLserver被js注入的全库替换SQL
- AudioBuffer
- STM32工作笔记0060---窗口看门狗实验
- layui table动态选中_微信炫酷炸啦!超视觉动态壁纸来了,还自带音效!
- OFD电子文档阅读器功能说明
- Comet:基于 HTTP 长连接的“服务器推”技术
- ubuntu系统调节电脑亮度
- raid缓存策略设置
- Excel学习笔记:P27-我的表格有重复内容该怎么办?简单三招让它们现出原形
- oracle 访问日志ip,怎么从访问日志中把ip提取出来
- pyqt5实现一个简易音乐播放器(升级到v2版本)
- 二叉排序树(二叉搜索树)
- Jeff的错题集(九):奥利给!
- ISO9001质量体系认证是什么?办理步骤
热门文章
- Mysql5.7数据导出提示--secure-file-priv选项问题的解决方法
- 解决minikube启动时若干问题
- Maven编译jar出现:无法确定 T 的类型参数的异常的原因和处理方案
- IBM X3650 M4服务器安装centos找不到硬盘的解决方法
- 分布式事务之消息补偿解决方案
- 什么是__pycache__?
- 退市35年后,牛仔裤品牌李维斯要重新IPO了
- Android用摄像头的那点破事
- 构建基于AgileEAS.NET应用开发平台的简单应用程序
- iOS进阶之底层原理-block本质、block的签名、__block、如何避免循环引用