IOS开发笔记(Swift):利用开源类库实现检测更新功能

Stella981
• 阅读 727

    上一篇《IOS开发笔记(Swift):UITableView表格视图的静态使用》中,我们通过UITableView静态化表格实现App中常用的更多功能布局,本篇我们来实现一下其中的检测更新功能。本篇也会介绍几种常用的类库:Alamofire、SwiftyJson、JLToast、SweetAlert等,这几个类库在github上搜索关键字都可以找到。

    我们继续在上一篇创建的UITableViewDemo工程的基础上,一步步的实现检测更新功能。《IOS开发笔记(Swift):Cocoapods安装与使用》中,我们已经学习了如何使用Pods,在开始之前我们先做一些准备工作,把上面说的一些类库,都引入进来。修改Pofile文件如下:

# Uncomment this line to define a global platform for your project

source 'https://github.com/CocoaPods/Specs.git'

platform :ios, '9.0'

target 'UITableViewDemo' do

  # Comment this line if you're not using Swift and don't want to use dynamic frameworks

  use_frameworks!

  # Pods for UITableViewDemo

  pod 'Alamofire','~> 3.4'

  pod 'SwiftyJSON'

  pod 'AlamofireSwiftyJSON'

  pod 'JLToast','~> 1.4'

  target 'UITableViewDemoTests' do

    inherit! :search_paths

    # Pods for testing

  end

  target 'UITableViewDemoUITests' do

    inherit! :search_paths

    # Pods for testing

  end

end

    需要注意的是,SwiftAlert我们只需要在我们的工程里面添加SweetAlert.swift文件就可以了,文件在这里:https://github.com/codestergit/SweetAlert-iOS/blob/master/SweetAlert/SweetAlert.swift

    重新install一下pod,然后打开工程。我们在故事板里选中检测更新的单元格,在Attributes inspector里面讲Style属性从之前的Basic修改为Right Detail,主要是我们希望在单元格的右侧展示当前的app版本。然后再简单的修改一下右侧Label的文字。效果如下:

IOS开发笔记(Swift):利用开源类库实现检测更新功能

    我们将这个展示app版本的label与上一篇创建的MoreTableViewController建立关联,选中此Label,右键拖动到对应的ViewController,并命名为versionLabel,如下图:

    IOS开发笔记(Swift):利用开源类库实现检测更新功能

    在viewDidLoad方法里,我们需要将versionLabel设置为当前app的版本,但是当前app的版本怎么获取呢?其实在工程的info.plist文件中,我们可以找到应用的版本。我们将它的值简单的修改一下,默认为1.0,如下图所示:

IOS开发笔记(Swift):利用开源类库实现检测更新功能

    我们知道info.plist文件是以键值对的形式保存工程的一些信息,通过自带的文本编辑器,看一下Info.plist文件,找到对应版本号的key值,如下图:

    IOS开发笔记(Swift):利用开源类库实现检测更新功能

    我们通过bundle中infoDictionary取出对应key为CFBundleShortVersionString的值,获取当前的版本号,并设置到相应的label上面。代码如下:

let version = (NSBundle.mainBundle().infoDictionary["CFBundleShortVersionString"])! as! String
versionLabel.text = "当前版本:\(version)"

    接下来,我们重写didSelectRowAtIndexPath,这个方法在单元格被选中的时候触发,本篇中我们是控制用户在点击检测更新时向服务端发出请求,获取服务器上最新的app版本,控制是否提醒用户更新,如下:

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        switch indexPath.section {
        case 0:
            if indexPath.row == 1 {
                //第一部分第二行,就是检测更新的单元格
            }
        default:
            break
    }

    下面,我们提前准备了一个服务端,在请求时会返回json格式的版本数据,假设是如下的数据格式:

{"content":"{\"ISUSEFUL\":true,\"VERSION_NAME\":\"1.0.1\",\"ISFORCE\":false,\"CREATE_TIME\":\"2016-06-27 09:25:38\",\"VERSION_ID\":2,\"DOWNLOAD_URL\":\"https:\\\/\\\/itunes.apple.com\\\/cn\\\/app\\\/qq\\\/id444934666?mt=8\",\"VERSION_DESC\":\"1:包含用户充值、查看投资及投资、收益记录、交易记录等的查询功能\\r\\n2:包含用户充值、查看投资及投资、收益记录、交易记录等的查询功能\\r\\n3:包含用户充值、查看投资及投资、收益记录、交易记录等的查询功能\\r\\n4:包含用户充值、查看投资及投资、收益记录、交易记录等的查询功能\"}","code":200}

    下面涉及的几个类库这里进行下说明:Alamofire用于向服务端发送请求并处理响应、SwiftyJson是用于json格式数据的处理、JLToast类似于android里面的Toast(显示一些提示信息)、SweetAlert是以弹出框的形式显示一些信息(android、web里面都有类似的组件,主要是好看),完整的didSelectRowAtIndexPath方法代码如下:

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        switch indexPath.section {
        case 0:
            if indexPath.row == 1 {
                //第一部分第二行,就是检测更新的单元格
                let url = "http://192.168.1.211:8080/EnuoAppServer/download/checkIOSVersion"
                //responseSwiftyJSON是AlamofireSwiftyJSON对SwiftyJSON的一个扩展,更好用一些
                Alamofire.request(.GET, url).responseSwiftyJSON{ response in
                    let code = response.result.value?["code"]
                    if code?.int == 200 {//返回成功才处理
                        let content = response.result.value!["content"]
                        let jsonStr:NSString = content.stringValue
                        //这里需要对json格式的字符串再次包装成JSON对象
                        let dict = JSON(data:jsonStr.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!)
                        
                        // print("\(dict["VERSION_DESC"])")
                        if self.version == "\(dict["VERSION_NAME"])" {
                            //这里先判断服务器上的最新版本与本地的版本是否一致
                            JLToast.makeText("已是最新版本",duration: JLToastDelay.ShortDelay).show()
                        } else {
                            SweetAlert().showAlert("发现新版本(\(dict["VERSION_NAME"]))",subTitle: "\(dict["VERSION_DESC"])",style:AlertStyle.None,buttonTitle:"取消",buttonColor:UIColor.colorFromRGB(0xD0D0D0),otherButtonTitle : "立即更新",otherButtonColor:UIColor.colorFromRGB(0xDD6B55)){
                                (isOtherButton) -> Void in
                                if !isOtherButton {
                                    let urlStr = "\(dict["DOWNLOAD_URL"])"
                                    //点击立即更新时,去appstore里面打开下载地址
                                    UIApplication.sharedApplication().openURL(NSURL(string: urlStr)!)
                                }
                            }
                        }
                        
                    }
                }
            }
        default:
            break
        }
    }

    这时候,我们就可以运行我们的项目了,第一次点击的时候可能会发现没有效果,工程中也会伴随如下的日志信息:

App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file.

    这是ios9中新增的App Transport Security特性,意思是不允许我们直接使用http请求,苹果默认强制使用https请求,这时候我们需要修改info.plist文件,增加App Transport Security Settings,将Allow Arbitrary Loads设置为YES,如下:

   IOS开发笔记(Swift):利用开源类库实现检测更新功能

    然后再次运行来看一下最终的效果,你可可以通过修改服务端的响应数据,来比较一下不同的效果:

IOS开发笔记(Swift):利用开源类库实现检测更新功能
    这里面为大家介绍的几个类库都是很优秀和常用的类库,更多的用法请大家自行搜索。检测更新功能也是开发中最常用的一个功能,本篇做了整理和实现,代码粗糙, 文笔简陋,希望大家批评指正,多多交流,互相进步!

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Easter79 Easter79
3年前
swap空间的增减方法
(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
ES6 新增的数组的方法
给定一个数组letlist\//wu:武力zhi:智力{id:1,name:'张飞',wu:97,zhi:10},{id:2,name:'诸葛亮',wu:55,zhi:99},{id:3,name:'赵云',wu:97,zhi:66},{id:4,na
Stella981 Stella981
3年前
IOS开发笔记(Swift):通过ShareSDK和TYAlertController实现分享功能
  上一篇《IOS开发笔记(Swift):利用开源类库实现检测更新功能(http://my.oschina.net/realfighter/blog/704612)》中,我们简单的实现了更多功能中的检测更新功能,本篇我们继续在原有代码的基础上,实现应用的分享功能,这里我们会使用ShareSDK和TYAlertController。   Shar
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这