2016-11-18 10:26:12 Riven_wn 阅读数 3490

检查App Store版本,提示更新

 //MARK: - 检查更新
    fileprivate func checkUpdate() {
        let path = NSString(format: "http://itunes.apple.com/cn/lookup?id=你的AppId") as String
        let url = URL(string: path)
        let request = NSMutableURLRequest(url: url!, cachePolicy: URLRequest.CachePolicy.reloadIgnoringLocalAndRemoteCacheData, timeoutInterval: 10.0)
        request.httpMethod = "POST"
        NSURLConnection.sendAsynchronousRequest(request as URLRequest, queue: OperationQueue()) { (response, data, error) in

            let receiveStatusDic = NSMutableDictionary()
            if data != nil {
                do {
                    let dic:NSDictionary = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers) as! NSDictionary
                    if let resultCount = dic["resultCount"] as? NSNumber {
                        print("???:\(response) &&版本信息: \(dic)")
                        if resultCount.intValue > 0 {
                            receiveStatusDic.setValue("1", forKey: "status")
                            if let arr = dic["results"] as? NSArray {
                                if let dict = arr.firstObject as? NSDictionary {
                                    if let version = dict["version"] as? String {
                                        receiveStatusDic.setValue(version, forKey: "version")
                                        UserDefaults.standard.set(version, forKey: "Version")
                                        UserDefaults.standard.synchronize()
                                    }
                                    //更新内容
                                    if let releaseNotes = dict["releaseNotes"] as? String {
                                        UserDefaults.standard.set(releaseNotes, forKey: "releaseNotes")
                                        UserDefaults.standard.synchronize()
                                    }
                                }

                            }
                        }
                    }
                }catch let error {
                    log.debug("checkUpdate -------- \(error)")
                    receiveStatusDic.setValue("0", forKey: "status")
                }
            }else {
                receiveStatusDic.setValue("0", forKey: "status")
            }
            self.performSelector(onMainThread: #selector(SplashViewController.checkUpdateWithData(_:)), with: receiveStatusDic, waitUntilDone: false)
        }
    }

    @objc fileprivate func checkUpdateWithData(_ data: NSDictionary) {
        let status = data["status"] as? String
        if status == "1" {

            if let storeVersion = UserDefaults.standard.object(forKey: "Version") as? String {
                if let releaseNotes = UserDefaults.standard.object(forKey: "releaseNotes") as? String {
                    self.compareVersion(LOCAL_VERSION, storeVersion: storeVersion,note:releaseNotes)
                    return
                }
            }
        }
    }

    fileprivate func compareVersion(_ localVersion: String, storeVersion: String,note:String) {
        let message = "本次更新内容:\n\(note)"
        if localVersion.compare(storeVersion) == ComparisonResult.orderedAscending {
            let alertView = UIAlertView(title: "发现新版本",message: message,delegate: self,cancelButtonTitle: nil,otherButtonTitles: "马上更新","下次再说")
            alertView.delegate = self
            alertView.tag = 10086
            alertView.show()
        }
    }

    override func alertView(_ alertView:UIAlertView, clickedButtonAt buttonIndex: Int){
        if(alertView.tag == 10086) {
            if(buttonIndex == 0){
                UIApplication.shared.openURL(URL(string:"itms-apps://itunes.apple.com/cn/app/xing-rui-yu-le/id你的AppId?mt=8")!)
            }else{
                //下次再说
            }
        }
    }

效果




获取本地版本
let LOCAL_VERSION:String = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") as! String


弹出评价app的的提示

1.判断是否是新安装或刚升级应用(也可用于设置引导页时的判断)

    //MARK: 判断是否是新安装或刚升级应用
    func isNewVersion() -> Bool{
        
        if(OLD_VERSION != nil){
            let oldVersion = OLD_VERSION as! String
            if(LOCAL_VERSION != oldVersion){//刚更新
                NSUserDefaults.standardUserDefaults().setObject(LOCAL_VERSION, forKey:"oldVersion")
                NSUserDefaults.standardUserDefaults().synchronize()
                return true
            }
        }else{//新安装
            NSUserDefaults.standardUserDefaults().setObject(LOCAL_VERSION, forKey:"oldVersion")
            NSUserDefaults.standardUserDefaults().synchronize()
            return true
        }
        return false
    }

其中
let OLD_VERSION = NSUserDefaults.standardUserDefaults().valueForKey("oldVersion")

2.下面的代码可以放在弹出提示的视图控制器或父类里
//评价App
    func judgeApp(){
        let alert = UIAlertView(title: "评价XX",message: "预祝您观演愉快,您的评价可以帮我们做得更好哦!",delegate: self,cancelButtonTitle: "满足下你",otherButtonTitles: "别再烦我","下次再说")
        alert.cancelButtonIndex = 0
        alert.delegate = self
        alert.show()
        
    }
    
    func alertView(alertView:UIAlertView, clickedButtonAtIndex buttonIndex: Int){
        if(buttonIndex == 0) {//去评价
            UIApplication.sharedApplication().openURL(NSURL(string:"itms-apps://itunes.apple.com/cn/app/xing-rui-yu-le/id你的APPId?mt=8")!)
        }
        if(buttonIndex == 1) {//不再提示
            NSUserDefaults.standardUserDefaults().setObject(true, forKey:"NeverShow")
            NSUserDefaults.standardUserDefaults().synchronize()
        }
        if(buttonIndex == 2) {
            //do nothing
        }
        
    }

3.调用的地方(放在你需要的地方弹出)
if let willJudge = NSUserDefaults.standardUserDefaults().valueForKey("NeverShow"){
                if(willJudge as! Bool == true){//不再提示为 true ,但是新版本,弹出提示且关闭不再提示
                    let delegate:AppDelegate = SHARE_APPLICATION.delegate as! AppDelegate
                    if(delegate.isNewVersion() == true){//刚更新过
                        judgeApp()
                        NSUserDefaults.standardUserDefaults().setObject(false, forKey:"NeverShow")
                        NSUserDefaults.standardUserDefaults().synchronize()
                    }else{//不再提示值为 true ,且不是新版本,不弹出提示
                        //不弹出
                    }
                }else{//不再提示值为 false ,弹出提示
                    judgeApp()
                }
            }else{ //不再提示值为 nil ,弹出提示
                judgeApp()
            }



2017-11-08 15:03:37 luolianxi 阅读数 1652
Swift有对应的版本更新库(Siren),有需要的可以参考和使用。

iOS开发中,有时会有这种需求,在AppStore上出现新版本时,应用内弹窗提示用户更新.自动提示更新的实现方案分为两种:

第一种,自己服务器提供一个接口,通过请求,获取app的相关的版本信息,如:是否需要更新,以及更新的地址等信息
第二种,就是利用苹果的appstore 提供的相关api进行查询更新.http://itunes.apple.com/cn/lookup?id=你的APPId

采用方案1,实现逻辑:

1: 向自己服务器请求当前版本信息
2: 和App当前版本进行比较,如果返回的版本比当前本地版本新,弹窗并显示更新日志,根据点击的按钮,控制用户跳转到AppStore更新

简单实现
效果图:



具体代码实现

[javascript] view plain copy
  1. struct VersionInfo {  
  2.     var url: String        //下载应用URL  
  3.     var title: String       //title  
  4.     var message: String       //提示内容  
  5.     var must_update: Bool  //是否强制更新  
  6.     var version: String     //版本  
  7. }  
  8.       
  9. class VersionManager: NSObject {  
  10.       
  11.     //本地版本  
  12.    private static func localVersion() -> String? {  
  13.         return Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String  
  14.     }  
  15.       
  16.     static func versionUpdate() {  
  17.         //1 请求服务端数据,并进行解析,得到需要的数据  
  18.         //2 版本更新  
  19.         handleUpdate(VersionInfo(url: "应用下载地址", title: "有新版本啦!", message: "提示更新内容,解决了xxx等一系列问题,新增了xxx等功能!", must_update: false, version: "3.5"))  
  20.     }  
  21.       
  22.     /// 版本更新  
  23.    private static func handleUpdate(_ info: VersionInfo) {  
  24.         guard let localVersion = localVersion()else { return }  
  25.         if isIgnoreCurrentVersionUpdate(info.version) { return }  
  26.         if versionCompare(localVersion: localVersion, serverVersion: info.version) {  
  27.             let alert = UIAlertController(title: info.title, message: info.message, preferredStyle: .alert)  
  28.             let update = UIAlertAction(title: "立即更新", style: .default, handler: { action in  
  29.                 UIApplication.shared.open(URL(string: info.url)!)  
  30.             })  
  31.             alert.addAction(update)  
  32.             if !info.must_update { //是否强制更新  
  33.                 let cancel = UIAlertAction(title: "忽略此版本", style: .cancel, handler: { action in  
  34.                     UserDefaults.standard.set(info.version, forKey: "IgnoreCurrentVersionUpdate")  
  35.                 })  
  36.                 alert.addAction(cancel)  
  37.             }  
  38.             if let vc = UIApplication.shared.keyWindow?.rootViewController {  
  39.                 vc.present(alert, animated: true, completion: nil)  
  40.             }  
  41.         }  
  42.     }  
  43.       
  44.    // 版本比较  
  45.    private static func versionCompare(localVersion: String, serverVersion: String) -> Bool {  
  46.         let result = localVersion.compare(serverVersion, options: .numeric, range: nil, locale: nil)  
  47.         if result == .orderedDescending || result == .orderedSame{  
  48.             return false  
  49.         }  
  50.             return true  
  51.     }  
  52.       
  53.     // 是否忽略当前版本更新  
  54.     private static func isIgnoreCurrentVersionUpdate(_ version: String) -> Bool {  
  55.         return UserDefaults.standard.string(forKey: "IgnoreCurrentVersionUpdate") == version  
  56.     }  
  57. }  

简单说明:
1 代码的实现很简单,上面只是简单写了一个测试数据,真正的数据需要自己在每次程序启动之后向服务端请求数据。
2 提供了获取本地版本、版本更新、版本比较、是否忽略当前版本更新等4个方法。isIgnoreCurrentVersionUpdate方法是表示当用户选择忽略版本之后下次启动程序,对于当前版本不再进行更新提示


Swift有对应的版本更新库(Siren),有需要的可以参考和使用。


2016-09-27 09:41:27 wei_chong_chong 阅读数 1006

参考:https://my.oschina.net/realfighter/blog/704612

审核不允许有自动更新的功能按钮。不然审核通不过。

但是我们可以把更新功能做成一个隐含的。不带更新界面不就ok了

(其实还有一个更狠的,审核的时候把更新按钮隐藏,审核通过后再显示更新按钮):审核通过后由服务端发送一个信号显示更新按钮就行了。6不6


今天要做的是检测更新,提醒用户有新版本就行了。

获取当前app版本号

let currentVersion = NSBundle.mainBundle().infoDictionary!["CFBundleShortVersionString"]as!String

获取历史版本号,如果没有就为“”

let sandboxVersion =  NSUserDefaults.standardUserDefaults().objectForKey("CFBundleShortVersionString")as? String ??""

比较当前版本和以前版本

if currentVersion.compare(sandboxVersion) == NSComparisonResult.OrderedDescending {

存储当前的版本到沙盒

NSUserDefaults.standardUserDefaults().setObject(currentVersion, forKey:"CFBundleShortVersionString")

获取到的当前版本 > 之前的版本 =有新版本

     returntrue

}

//获取到的当前版本 <=之前的版本 = 没有新版本

return false




2016-04-11 23:32:25 feng2qing 阅读数 9969

获取当前版本号(版本号是字符串)

Swift2.3:
let currentVersion = NSBundle.mainBundle().infoDictionary!["CFBundleShortVersionString"] as! String

Swift3.0:
let currentVersion = Bundle.main.infoDictionary!["CFBundleShortVersionString"] as! String

获取历史的版本号(从沙盒中获取)

?? : 如果没有值,就让他等于空(“”)

Swift2.3:
let sandboxVersion =  NSUserDefaults.standardUserDefaults().objectForKey("CFBundleShortVersionString") as? String ?? ""
Swift3.0:
let sandboxVersion = UserDefaults.standard.object(forKey: "CFBundleShortVersionString") as? String ?? ""

比较当前版本号和以前版本号

Swift2.3:
if currentVersion.compare(sandboxVersion) == NSComparisonResult.OrderedDescending {

        //存储当前的版本到沙盒
        NSUserDefaults.standardUserDefaults().setObject(currentVersion, forKey: "CFBundleShortVersionString")
        //获取到的当前版本 > 之前的版本 = 有新版本
        return true
    }
    //获取到的当前版本 <= 之前的版本 = 没有新版本
    return false
}

Swift3.0:
if currentVersion.compare(sandboxVersion) == ComparisonResult.orderedDescending {

        //存储当前的版本到沙盒
        UserDefaults.standard.set(currentVersion, forKey: "CFBundleShortVersionString")
        //获取到的当前版本 > 之前的版本 = 有新版本
        return true
    }
    //获取到的当前版本 <= 之前的版本 = 没有新版本
    return false
}
2017-04-20 17:40:10 longshihua 阅读数 1380
iOS开发中,有时会有这种需求,在AppStore上出现新版本时,应用内弹窗提示用户更新.自动提示更新的实现方案分为两种:

第一种,自己服务器提供一个接口,通过请求,获取app的相关的版本信息,如:是否需要更新,以及更新的地址等信息
第二种,就是利用苹果的appstore 提供的相关api进行查询更新.http://itunes.apple.com/cn/lookup?id=你的APPId

采用方案1,实现逻辑:

1: 向自己服务器请求当前版本信息
2: 和App当前版本进行比较,如果返回的版本比当前本地版本新,弹窗并显示更新日志,根据点击的按钮,控制用户跳转到AppStore更新

简单实现
效果图:


具体代码实现

struct VersionInfo {
    var url: String        //下载应用URL
    var title: String       //title
    var message: String       //提示内容
    var must_update: Bool  //是否强制更新
    var version: String     //版本
}
    
class VersionManager: NSObject {
    
    //本地版本
   private static func localVersion() -> String? {
        return Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String
    }
    
    static func versionUpdate() {
        //1 请求服务端数据,并进行解析,得到需要的数据
        //2 版本更新
        handleUpdate(VersionInfo(url: "应用下载地址", title: "有新版本啦!", message: "提示更新内容,解决了xxx等一系列问题,新增了xxx等功能!", must_update: false, version: "3.5"))
    }
    
    /// 版本更新
   private static func handleUpdate(_ info: VersionInfo) {
        guard let localVersion = localVersion()else { return }
        if isIgnoreCurrentVersionUpdate(info.version) { return }
        if versionCompare(localVersion: localVersion, serverVersion: info.version) {
            let alert = UIAlertController(title: info.title, message: info.message, preferredStyle: .alert)
            let update = UIAlertAction(title: "立即更新", style: .default, handler: { action in
                UIApplication.shared.open(URL(string: info.url)!)
            })
            alert.addAction(update)
            if !info.must_update { //是否强制更新
                let cancel = UIAlertAction(title: "忽略此版本", style: .cancel, handler: { action in
                    UserDefaults.standard.set(info.version, forKey: "IgnoreCurrentVersionUpdate")
                })
                alert.addAction(cancel)
            }
            if let vc = UIApplication.shared.keyWindow?.rootViewController {
                vc.present(alert, animated: true, completion: nil)
            }
        }
    }
    
   // 版本比较
   private static func versionCompare(localVersion: String, serverVersion: String) -> Bool {
        let result = localVersion.compare(serverVersion, options: .numeric, range: nil, locale: nil)
        if result == .orderedDescending || result == .orderedSame{
            return false
        }
            return true
    }
    
    // 是否忽略当前版本更新
    private static func isIgnoreCurrentVersionUpdate(_ version: String) -> Bool {
        return UserDefaults.standard.string(forKey: "IgnoreCurrentVersionUpdate") == version
    }
}

简单说明:
1 代码的实现很简单,上面只是简单写了一个测试数据,真正的数据需要自己在每次程序启动之后向服务端请求数据。
2 提供了获取本地版本、版本更新、版本比较、是否忽略当前版本更新等4个方法。isIgnoreCurrentVersionUpdate方法是表示当用户选择忽略版本之后下次启动程序,对于当前版本不再进行更新提示


Swift有对应的版本更新库(Siren),有需要的可以参考和使用。