项目要上线了,产品要求跟安卓一样,一进去有一个提示框提示更新。虽然苹果在 Settings/iTunes Store & App Store 选项中有自动更新这一选项,而且添加版本号等等有被拒绝的危险。但是..总之我建议大家要据理力争。不过既然需求下来了,我们应该怎么做呢?

  按照与之前的思路,我们是获取本地的版本号,以及从AppStore下载下来最新的版本号,两者进行比较,若本地版本号较低,则跳转至AppStore进行更新。首次使用Swift语言挑战,可能会有预知不到的错误,这样我们就分步做一下。

  1.获取本地版本号

  最简单。直接上代码。 

 // 取出本地版本号
2 let localVersion = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") as! String

  通过目录列表的信息字典,取出本地版本号。

  2.获取AppStore的版本号

  这个我们需要通过特定网址,请求AppStore的版本信息并解析出来。边上代码边分析:

  

    2.1 配置网络请求

 // AppStore地址(字符串)
let path = NSString(format: "http://itunes.apple.com/cn/lookup?id=%@", appStoreId) as String // AppStore地址(URL)
let url = NSURL(string: path) // 配置网络请求参数
let request = NSMutableURLRequest(URL: url!, cachePolicy: NSURLRequestCachePolicy.ReloadIgnoringLocalCacheData, timeoutInterval: 10.0)
request.HTTPMethod = "POST"

    这里需要说明的一点是:cachePolicy的意思是缓存机制;其类型是个枚举,有以下几项:(自我感觉跑题了..)

 public enum NSURLRequestCachePolicy : UInt {

     case UseProtocolCachePolicy // 默认行为

     case ReloadIgnoringLocalCacheData //  不使用缓存
case ReloadIgnoringLocalAndRemoteCacheData // Unimplemented (未实现) // 不使用任何缓存
public static var ReloadIgnoringCacheData: NSURLRequestCachePolicy { get } case ReturnCacheDataElseLoad //  使用缓存(不管它是否过期),如果缓存中没有,那从网络加载吧
case ReturnCacheDataDontLoad //  离线模式:使用缓存(不管它是否过期),但是从网络加载 case ReloadRevalidatingCacheData // Unimplemented (未实现) // 在使用前去服务器验证 
}

    我们选择的是 ReloadIgnoringLocalCacheData ,也就是不使用缓存;毕竟版本号是随时更新的。

    2.2 请求网络

 // 开始网络请求
NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue()) { (response, data, error) in // 声明获取的数据字典
let receiveStatusDic = NSMutableDictionary() if data != nil { do {
// JSON解析data
let dic = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) // 取出版本号
// 判断是否resultCount为空
if let resultCount = dic["resultCount"] as? NSNumber { // 判断resultCount的数量是否大于0
if resultCount.integerValue > { // 设置请求状态(1代表成功,0代表失败)
receiveStatusDic.setValue("", forKey: "status") // 判断results是否为空
if let arr = dic["results"] as? NSArray { if let dict = arr.firstObject as? NSDictionary { // 取出version
if let version = dict["version"] as? String { receiveStatusDic.setValue(version, forKey: "version") // 存网络版本号到UserDefaults里面
NSUserDefaults.standardUserDefaults().setObject(version, forKey: "Version") NSUserDefaults.standardUserDefaults().synchronize()
}
}
}
}
}
}catch let error { print("checkUpdate -------- \(error)") receiveStatusDic.setValue("", forKey: "status")
}
}else { receiveStatusDic.setValue("", forKey: "status")
} // 取出版本号后(若有则status为1,若没有则status为0),执行方法
self.performSelectorOnMainThread(#selector(self.checkUpdateWithData(_:)), withObject: receiveStatusDic, waitUntilDone: false)
}

    没有使用三方库诸如AFNetWorking或者SwiftHTTP来请求网络,主要是考虑三方库的版本差异;使用的系统的 NSURLConnection 进行网络请求,不过似乎过期了,应该使用NSURLSession;使用 NSJSONSerialization 来解析JSON数据。不要看步骤多,主要用来判断数据是否为空以及添加请求结果的状态了。同时将AppStore中的版本信息缓存到NSUserDefaults中,缓存一下。最后将请求后的数据与请求状态传递至处理数据的方法中即可。

  

  3.判断版本号

 // 判断版本号
@objc private func checkUpdateWithData(data: NSDictionary) { // 判断请求网络版本号的状态
let status = data["status"] as? String // 取出本地版本号
let localVersion = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") as! String if status == "" { let storeVersion = data["version"] as! String self.compareVersion(localVersion, storeVersion: storeVersion) return
} if let storeVersion = NSUserDefaults.standardUserDefaults().objectForKey("Version") as? String { self.compareVersion(localVersion, storeVersion: storeVersion)
}
}

  没啥好说的,对比两个版本号。若本地版本号较低,则执行下面的方法(跳转AppStore更新或者单纯的提醒一下用户该更新了)。

  

  4.更新

 private func compareVersion(localVersion: String, storeVersion: String) {

         if localVersion.compare(storeVersion) == NSComparisonResult.OrderedAscending {

             //做你想做的事情
let alertController = UIAlertController.init(title: "更新可用", message: "\(NSBundle.mainBundle().infoDictionary!["CFBundleDisplayName"])的新版本可用。请立即更新至\(storeVersion)。", preferredStyle: UIAlertControllerStyle.Alert) let confirmAction = UIAlertAction.init(title: "更新", style: UIAlertActionStyle.Default, handler: { (alertAction) in }) let nextTimeAction = UIAlertAction.init(title: "下一次", style: UIAlertActionStyle.Cancel, handler: nil) alertController.addAction(confirmAction)
alertController.addAction(nextTimeAction) self.window?.rootViewController?.presentViewController(alertController, animated: true, completion: nil)
}
}

  我做的是跳转AppStore更新。就这样

iOS使用Swift语言检查并提示更新的更多相关文章

  1. IOS系列swift语言之课时二

    今天我们要讲的就是函数[对于函数,在最后面还有几道题,喜欢的博友可以看了自己做一下,和我交流一下] 当然这与我们的c语言还是有一定的共同之处的,对于有一些c语言或者是java基础的童鞋,我觉得是很容易 ...

  2. iOS之Swift语言的学习

    好久都没有来这个熟悉而又陌生的地方啦, 想想已经有两三个月了吧,不过我相信以后还是会经常来的啦,因为忙碌的学习已经过去啦,剩下的就是要好好的总结好好的复习了,好好的熟悉下我们之前学习的知识点,将他们有 ...

  3. IOS系列swift语言之课时八

    这节课需要讲的就是可选链,内存管理,引用计数,unowned解决 //: Playground - noun: a place where people can play import UIKit / ...

  4. IOS系列swift语言之课时四

    今天我们要讲的主要有:下标.可为空的类型.枚举(特殊的枚举:递归枚举).原生值.关联值 首先来分析一下这个下标,就是说我们可以通过下标找到对应的值或者是改变对应的值. 其次是可为空的类型,我们要牢记所 ...

  5. IOS系列swift语言之课时三

    今天需要掌握的内容就是:闭包.类.结构体.属性(计算属性和延迟属性) 同样里面有一些题目,有兴趣的可以做一下. 首先我们需要知道什么是闭包?所谓的闭包就是一个代码块(一般是指函数以及被它捕获的成员变量 ...

  6. IOS系列swift语言之课时七

    这下需要掌握的就是类型转换,类的构造器,判断类型,异常,异常的处理,defer,范型,约束加速刷代码 import Foundation /* 类型转换 1.利用类的构造器进行转换 2.系统可能提供一 ...

  7. IOS系列swift语言之课时六

    这节课需要讲的就是协议,方法,委托模式(依赖倒转) 代码刷起中...... // // main.swift // ExAndProtocol // // Created by David on 23 ...

  8. IOS系列swift语言之课时五

    过了几天没来理博客了,这次我们要讲的有:类,属性,初始化init(),初始化器,构造器等 直接刷代码了....... //: Playground - noun: a place where peop ...

  9. iOS - Swift Swift 语言新特性

    1.Swift 2.0 带来哪些新变化 常规变化: 1.OS X 10.11.iOS 9 和 watchOS 2 SDK 采纳了一些 Objective-C 的特性用来提高 Swift 的编程体验, ...

随机推荐

  1. [SQL基础教程] 2-1 SELECT语句基础

    [SQL基础教程] 2-1 SELECT语句基础 列的查询 Syntax SELECT<列名>,..... FROM<表名>; SELECT col_1, col_2 FROM ...

  2. checkbox批量操作

    hang=data.split("\1");//获取 查询返回的数据 处理数据 var str=""; for(var i =0;i<hang.lengt ...

  3. springmvc集成aop记录操作日志

    首先说明一下,这篇文章只做了记录日志相关事宜 具体springmvc如何集成配置aop对cotroller进行拦截,请看作者的另一篇文章 http://www.cnblogs.com/guokai87 ...

  4. vim的配置文件参数

    环境:kali linux vim的配置文件存放在/etc/vim目录中,配置文件名为vimrc set nocompatible "去掉有关vi一致性模式,避免以前版本的bug和局限&qu ...

  5. UIPickerView 创建中国地区显示 省份 市

    第一步初始化 UIPickerView *pickerview; //城市滚动表 NSDictionary *dict; //用于存储省份-城市的数据 NSArray *provinceArray; ...

  6. emmet 教程 emmet快捷键大全

    Emmet的前身是大名鼎鼎的Zen coding,如果你从事Web前端开发的话,对该插件一定不会陌生.它使用仿CSS选择器的语法来生成代码,大大提高了HTML/CSS代码编写的速度,比如下面的演示: ...

  7. mysql添加远程用户

    -- 增加一个用户test1密码为abc,让他可以在任何主机上登录,并对所有数据库有查询.插入.修改.删除的权限. -- 首先用以root用户连入MYSQL,然后键入以下命令: grant selec ...

  8. List集合对象中的排序,随机显示

    List<User> students = new ArrayList<User>(); User user1 = new User(); user1.setAge(112); ...

  9. CVE-2015-0057 POC构造 & 利用分析(2015.7)

    CVE-2015-0057 POC构造 & 利用分析 主要内容: 构造POC 利用思路 0x00 初探 从这篇文章可以获知: 1.问题出在 win32k!xxxEnableWndSBArrow ...

  10. java 垃圾回收总结(可达性分析 引用分类

    java 垃圾回收总结(1)   以前看过很多次关于垃圾回收相关的文章,都只是看过就忘记了,没有好好的整理一下,发现写文章可以强化自己的记忆. java与C,c++有很大的不同就是java语言开发者不 ...