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

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

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

1# Uncomment this line to define a global platform for your project 2 3source 'https://github.com/CocoaPods/Specs.git' 4 5platform :ios, '9.0' 6 7target 'UITableViewDemo' do 8 9  # Comment this line if you're not using Swift and don't want to use dynamic frameworks 10 11  use_frameworks! 12 13  # Pods for UITableViewDemo 14 15  pod 'Alamofire','~> 3.4' 16 17  pod 'SwiftyJSON' 18 19  pod 'AlamofireSwiftyJSON' 20 21  pod 'JLToast','~> 1.4' 22 23  target 'UITableViewDemoTests' do 24 25    inherit! :search_paths 26 27    # Pods for testing 28 29  end 30 31  target 'UITableViewDemoUITests' do 32 33    inherit! :search_paths 34 35    # Pods for testing 36 37  end 38 39end

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

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

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

    

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

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

    

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

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

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

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

    下面,我们提前准备了一个服务端,在请求时会返回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方法代码如下:

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

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

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,如下:

   

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


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

点赞
收藏

评论区

加载中...

相关推荐

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

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

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