如果您开发的 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 类中定义了两个属性,分别是 userurl

  • 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 实现检查更新的简单方式相关推荐

  1. Android课程设计本地游戏厅app开发(已开源)

    Android课程设计本地游戏厅app开发(已开源) 见链接

  2. RTK差分共享猫APP后台系统已开源

    RTK差分共享猫APP后台系统开源,开源地址https://gitee.com/forgy/NtripShareCatServer 后台系统基于GUNS 6.0(https://gitee.com/s ...

  3. java对于app版本号比较,Java对比APP版本号大小

    /** * 比较版本号的大小,前者大则返回一个正数,后者大返回一个负数,相等则返回0 * @param version1 * @param version2 */ public static int ...

  4. 一款基于星座的app(项目已开源)

    一款基于星座的app(项目已开源) 该星座app是大三时期做的期末项目.结果不被老师赏识,说是网上找的,哈哈.文章最后放源码下载地址. 关注公众号回复 : 1003 . 获取源码地址,回复1004,获 ...

  5. 移动开发已进入 App 工厂时代!

    导语:App工厂,顾名思义,是一个能根据各种素材和组织形式生成App的工厂.更专业一点的描述,是根据一个具有完备组件库以及这些组件的依赖关系,组合成一个个App. 以往的单App研发架构,由于每次打包 ...

  6. Java实现比较APP版本号大小

    实现代码如下: /*** 比较APP版本号的大小* <p>* 1.前者大则返回一个正数* 2.后者大返回一个负数* 3.相等则返回0** @param version1 app版本号* @ ...

  7. Android最新最全100余款开源App(对应Github开源项目)

    最近整理了一些开源的APP,以及对应的一些Github开源项目,现在做一些记录,以便以后查阅. 介绍与链接 BeautifulRefreshLayout-漂亮的美食下拉刷新 https://githu ...

  8. 一些完整的Android开源app项目

    android开源项目有很多,但是完整的app项目不多,下面是最近我 整理的一些开源app项目: 注: jcodecraeer网站上搜集了很多开源项目,更新很快,非常值得关注. 一.photoup 介 ...

  9. “因为无法从捐赠中抽成,谷歌把我的开源 App 下架了!”

    众所周知,苹果税和谷歌税的存在,即"只要你的 App 在 App Store 或 Google Play 上架,产生的收入就必须分给苹果或谷歌." 这个"收入" ...

最新文章

  1. webDriver测试百度登录java版
  2. 保护 ASP.NET 会话状态
  3. android第三次作业
  4. geth bootnodes
  5. 工作日志:串口外设的开发总结
  6. web框架和后台开发_Web开发框架–第1部分:选项和标准
  7. SQLserver被js注入的全库替换SQL
  8. AudioBuffer
  9. STM32工作笔记0060---窗口看门狗实验
  10. layui table动态选中_微信炫酷炸啦!超视觉动态壁纸来了,还自带音效!
  11. OFD电子文档阅读器功能说明
  12. Comet:基于 HTTP 长连接的“服务器推”技术
  13. ubuntu系统调节电脑亮度
  14. raid缓存策略设置
  15. Excel学习笔记:P27-我的表格有重复内容该怎么办?简单三招让它们现出原形
  16. oracle 访问日志ip,怎么从访问日志中把ip提取出来
  17. pyqt5实现一个简易音乐播放器(升级到v2版本)
  18. 二叉排序树(二叉搜索树)
  19. Jeff的错题集(九):奥利给!
  20. ISO9001质量体系认证是什么?办理步骤

热门文章

  1. Mysql5.7数据导出提示--secure-file-priv选项问题的解决方法
  2. 解决minikube启动时若干问题
  3. Maven编译jar出现:无法确定 T 的类型参数的异常的原因和处理方案
  4. IBM X3650 M4服务器安装centos找不到硬盘的解决方法
  5. 分布式事务之消息补偿解决方案
  6. 什么是__pycache__?
  7. 退市35年后,牛仔裤品牌李维斯要重新IPO了
  8. Android用摄像头的那点破事
  9. 构建基于AgileEAS.NET应用开发平台的简单应用程序
  10. iOS进阶之底层原理-block本质、block的签名、__block、如何避免循环引用