上一篇《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的文字。效果如下:
我们将这个展示app版本的label与上一篇创建的MoreTableViewController建立关联,选中此Label,右键拖动到对应的ViewController,并命名为versionLabel,如下图:
在viewDidLoad方法里,我们需要将versionLabel设置为当前app的版本,但是当前app的版本怎么获取呢?其实在工程的info.plist文件中,我们可以找到应用的版本。我们将它的值简单的修改一下,默认为1.0,如下图所示:
我们知道info.plist文件是以键值对的形式保存工程的一些信息,通过自带的文本编辑器,看一下Info.plist文件,找到对应版本号的key值,如下图:
我们通过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,如下:
然后再次运行来看一下最终的效果,你可可以通过修改服务端的响应数据,来比较一下不同的效果:
这里面为大家介绍的几个类库都是很优秀和常用的类库,更多的用法请大家自行搜索。检测更新功能也是开发中最常用的一个功能,本篇做了整理和实现,代码粗糙, 文笔简陋,希望大家批评指正,多多交流,互相进步!