【Swift3】 최신 버전의 설치를 촉구하는 경고 표시

4691 단어 iOSSwiftswift3


단말기에 인스톨 하고 있는 version보다 새로운 version가 릴리스 되고 있었을 경우에 인스톨을 촉구하는 경고를 표시시키는 코드입니다.
이전, Objective-C로 작성 Qiita에 들었습니다만, 이번은 Swift3로 재작성했습니다.

코드


import UIKit

/************変更箇所*************/

private let appId = ""
private let title = "アップデート"
private let message = "新しいVersionのインストール準備ができています。"
private let okBtnTitle = "今すぐインストール"
private let cancelBtnTitle = "後で"

/*******************************/

private var topViewController: UIViewController? {
    guard var topViewController = UIApplication.shared.keyWindow?.rootViewController else { return nil }
    while let presentedViewController = topViewController.presentedViewController {
        topViewController = presentedViewController
    }
    return topViewController
}

enum UpdateType {
    case normal
    case force
}

class UpdateChecker {

    static func run(updateType: UpdateType) {
        guard let url = URL(string: "https://itunes.apple.com/jp/lookup?id=\(appId)") else { return }
        let request = URLRequest(url: url)
        let session = URLSession(configuration: .default)

        let task = session.dataTask(with: request, completionHandler: {
            (data, _, _) in
            guard let d = data else { return }
            do {
                guard let results = try JSONSerialization.jsonObject(with: d, options: .allowFragments) as? NSDictionary else { return }
                guard let resultsArray = results.value(forKey: "results") as? NSArray else { return }
                guard let storeVersion = (resultsArray[0] as? NSDictionary)?.value(forKey: "version") as? String else { return }
                guard let installVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String else { return }
                guard installVersion.compare(storeVersion) == .orderedAscending else { return }
                showAlert(updateType: updateType)
            } catch {
                print("Serialization error")
            }
        })
        task.resume()
    }

    private static func showAlert(updateType: UpdateType) {
        let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
        let okAction = UIAlertAction(title: okBtnTitle, style: .default, handler: { Void in
            guard let url = URL(string: "itms-apps://itunes.apple.com/app/id\(appId)") else { return }
            UIApplication.shared.open(url, options: [:], completionHandler: nil)
        })
        alert.addAction(okAction)

        if updateType == .normal {
            let cancelAction = UIAlertAction(title: cancelBtnTitle, style: .cancel, handler: nil)
            alert.addAction(cancelAction)
        }

        topViewController?.present(alert, animated: true, completion: nil)
    }
}

사용법



알림을 표시하고자 하는 시점에
UpdateChecker.run(updateType: .normal)

강제 업데이트 하고 싶은 경우는 아래의 코드를 applicationDidBecomeActive에 쓰면 좋다고 생각합니다.
UpdateChecker.run(updateType: .force)

코드상에서 아래와 같이 묶어 있는 부분은 적절히 변경해 주세요.
/************変更箇所*************/
/*******************************/

간략한 설명



아래 URL을 두드리면 앱의 정보를 json으로 얻을 수 있으므로,
"https://itunes.apple.com/jp/lookup?id=\(appId)"

퍼스하고, 단말에 인스톨 하고 있는 앱의 version과 비교해, 새로운 것이라면 showAlert 메소드에 날리도록(듯이) 하고 있습니다.
do {
    guard let results = try JSONSerialization.jsonObject(with: d, options: .allowFragments) as? NSDictionary else { return }
    guard let resultsArray = results.value(forKey: "results") as? NSArray else { return }
    guard let storeVersion = (resultsArray[0] as? NSDictionary)?.value(forKey: "version") as? String else { return }
    guard let installVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String else { return }
    guard installVersion.compare(storeVersion) == .orderedAscending else { return }
    showAlert(updateType: updateType)
}

전환 버튼을 탭하면 URL 스키마를 두드려 AppStore로 날아갑니다.
guard let url = URL(string: "itms-apps://itunes.apple.com/app/id\(appId)") else { return }
UIApplication.shared.open(url, options: [:], completionHandler: nil)

좋은 웹페이지 즐겨찾기