App版本更新(版本檢測(cè) & 引導(dǎo)更新)

注意: 蘋果審核時(shí)是不允許app內(nèi)有任何提示版本更新的內(nèi)容, 否則拒絕上架

App由于增加新功能, 優(yōu)化體驗(yàn), 修復(fù)bug等情況需要不斷更新版本, 為了給用戶提供最好的體驗(yàn), 往往希望新版本上架后所有的用戶都可以最快的速度體驗(yàn)到最新的版本, 這就與蘋果禁止App內(nèi)提示版本更新的規(guī)定相沖突, 但是以下方法可以避過(guò)蘋果的審核, 從而達(dá)到版本更新提示, 并引導(dǎo)到App Store更新.
原理: 在App啟動(dòng)的時(shí)候比較App Store中版本的版本號(hào)與本地App的版本號(hào)的大小, 如果App Store中的版本號(hào)大于本地App版本號(hào), 提示版本更新, 否則不提示版本更新; 由于開(kāi)發(fā)完一個(gè)新版本, 會(huì)修改一個(gè)版本號(hào), 提交蘋果審核的時(shí)候, 版本號(hào)一定是大于App Store中的版本號(hào)的, 所以蘋果的審核人員在審核時(shí)是不會(huì)看到版本更新提示的, 而一旦上架成功, 由于App Store中最新的版本號(hào)大于用戶已安裝的版本的版本號(hào), 自然就看得到版本更新提示, 用戶可以直接點(diǎn)擊立即更新, 然后直接跳轉(zhuǎn)到App Store中此App的詳情頁(yè)面, 點(diǎn)擊更新就ok了.
關(guān)于版本號(hào): 關(guān)于版本號(hào)的設(shè)置, 感覺(jué)跟公司和程序員本身的習(xí)慣有很大關(guān)系, 如果領(lǐng)導(dǎo)管這個(gè), 就是什么時(shí)候上什么版本, 領(lǐng)導(dǎo)都設(shè)計(jì)好了, 那你只需要聽(tīng)領(lǐng)導(dǎo)的就好了, 下面我只說(shuō)一般情況: 都是在原來(lái)的基礎(chǔ)上直接增加 1, 不過(guò)分具體情況, 一般如果只是普通的bug修復(fù)或者性能優(yōu)化, 則是小版本號(hào)更新, 例如: 前一個(gè)版本是 1.3.1, 則新版本是 1.3.2; 而如果是增加新功能,UI有重大改變(重構(gòu)), 修復(fù)重大bug等情況, 一般都是增加大版本, 例如: 前一個(gè)版本是 1.3.1, 則新版本可能是 1.4 或者 2.0 .

代碼

注1: 可以單獨(dú)將其抽離成一個(gè)工具類, 這樣其他項(xiàng)目需要的時(shí)候, 只需要將這個(gè)類直接copy過(guò)去, 然后在需要的地方直接使用: AppVersionManager.shareManager.checkAppStoreVersion(), 就可以實(shí)現(xiàn)版本更新提示了, 其余什么都不需要做, 但是如果你對(duì)提示文本有自己的想法, 你就需要自己設(shè)置了)
注2: 下面代碼中的"https://itunes.apple.com/cn/lookup?id=app對(duì)應(yīng)的id"是獲取app上架版本的信息的路徑, "id="中=號(hào)后面則需要填寫對(duì)應(yīng)app的id, 那么如何知道這個(gè)id呢? 請(qǐng)看下圖:
Apple ID.png
/// 檢查APP版本信息
    func checkAppStoreVersion() {
        // 路徑
        let checkUrlString = "https://itunes.apple.com/cn/lookup?id=app對(duì)應(yīng)的id"
        let checkUrl = URL(string: checkUrlString)
        var request = URLRequest(url: checkUrl!, cachePolicy: .reloadIgnoringLocalAndRemoteCacheData, timeoutInterval: 15.0)
        request.httpMethod = "POST"
        URLSession.shared.dataTask(with: request, completionHandler: { [weak self] (data, urlResponse, error) in
            if error == nil && data != nil {
                do {
                    let appInfo = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary
                    if appInfo != nil {
                        let resultAry = appInfo!["results"] as! NSArray
                        let resultDic = resultAry.firstObject as! NSDictionary
                        // 版本號(hào)
                        self?.version = resultDic["version"] as? String
                        // 應(yīng)用名稱
                        let appName = resultDic["trackName"] as! String
                        // 下載地址
                        self?.trackViewUrlString = resultDic["trackViewUrl"] as? String
                        if self?.hasNew() == true {
                            self?.remindUpdateVersion()
                        }
                    }
                } catch let error as NSError {
                    print(error)
                }
            }
        })
    }
判斷是否存在新版本
   fileprivate func hasNew() -> Bool {
        if version == nil {
            return false
        }
        // 獲取當(dāng)前版本號(hào)
        let infoDic = Bundle.main.infoDictionary
        let appVersion = infoDic!["CFBundleShortVersionString"] as! String
        /// NSComparisonResult: 升序:OrderedAscending, 降序:OrderedDescending, 相等:OrderedSame
        if appVersion.compare(version!, options: .numeric) == .orderedAscending {
            // 發(fā)現(xiàn)新版本
            return true
        } else {
            // 未發(fā)現(xiàn)新版本
            return false
        }
    }
如果存在新版本, 彈出提示
/// 提示有新版本
    fileprivate func remindUpdateVersion() {
        let alertController = UIAlertController.init(title: "版本更新", message: "新版本" + "(v\(version!))" + "已經(jīng)上線了,等你來(lái)體驗(yàn)哦~", preferredStyle: UIAlertControllerStyle.alert)
        let alertActionDone = UIAlertAction.init(title: "立即更新", style: UIAlertActionStyle.default) { [weak self] (action) in
            let appStoreUrl = URL(string: self?.trackViewUrlString ?? "")
            if UIApplication.shared.canOpenURL(appStoreUrl!) {
                UIApplication.shared.openURL(appStoreUrl!)
            }
        }
        
        if alertActionDone.value(forKey: "titleTextColor") == nil {
            alertActionDone.setValue(UIColor.red, forKey: "titleTextColor")
        }
        
        let alertActionCancle = UIAlertAction.init(title: "以后再說(shuō)", style: .cancel) { (action) in
            alertController.dismiss(animated: true, completion: nil)
        }
        
        alertController.addAction(alertActionDone)
        alertController.addAction(alertActionCancle)
        DispatchQueue.main.async {
              let appdelegate = UIApplication.shared.delegate as! AppDelegate
              appdelegate.window?.rootViewController?.present(alertController, animated: true, completion: nil)
        }
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市庭惜,隨后出現(xiàn)的幾起案子学少,更是在濱河造成了極大的恐慌署恍,老刑警劉巖坑资,帶你破解...
    沈念sama閱讀 211,348評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件喻喳,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡取董,警方通過(guò)查閱死者的電腦和手機(jī)棍苹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門无宿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)茵汰,“玉大人,你說(shuō)我怎么就攤上這事孽鸡□逦纾” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 156,936評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵彬碱,是天一觀的道長(zhǎng)豆胸。 經(jīng)常有香客問(wèn)我,道長(zhǎng)巷疼,這世上最難降的妖魔是什么晚胡? 我笑而不...
    開(kāi)封第一講書人閱讀 56,427評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮嚼沿,結(jié)果婚禮上估盘,老公的妹妹穿的比我還像新娘。我一直安慰自己骡尽,他們只是感情好遣妥,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,467評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著攀细,像睡著了一般箫踩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上谭贪,一...
    開(kāi)封第一講書人閱讀 49,785評(píng)論 1 290
  • 那天境钟,我揣著相機(jī)與錄音,去河邊找鬼俭识。 笑死慨削,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播理盆,決...
    沈念sama閱讀 38,931評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼痘煤,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了猿规?” 一聲冷哼從身側(cè)響起衷快,我...
    開(kāi)封第一講書人閱讀 37,696評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎姨俩,沒(méi)想到半個(gè)月后蘸拔,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,141評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡环葵,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,483評(píng)論 2 327
  • 正文 我和宋清朗相戀三年调窍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片张遭。...
    茶點(diǎn)故事閱讀 38,625評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡邓萨,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出菊卷,到底是詐尸還是另有隱情缔恳,我是刑警寧澤,帶...
    沈念sama閱讀 34,291評(píng)論 4 329
  • 正文 年R本政府宣布洁闰,位于F島的核電站歉甚,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏扑眉。R本人自食惡果不足惜纸泄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,892評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望腰素。 院中可真熱鬧聘裁,春花似錦、人聲如沸耸弄。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)计呈。三九已至砰诵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間捌显,已是汗流浹背茁彭。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留扶歪,地道東北人理肺。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓摄闸,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親妹萨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子年枕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,492評(píng)論 2 348