[SWIFT] [IOS] Implementieren Sie den halb erzwungenen Aktualisierungsmechanismus beiläufig

Einführung

In diesem Artikel zeigen wir Ihnen, wie Sie ** einen Mechanismus implementieren, der dem Benutzer mitteilt, dass beim Start der App eine neue Version veröffentlicht wurde, und zur Eingabe eines Updates auffordert (in diesem Artikel als halb erzwungenes Update bezeichnet) **.

Forced Update ist ein Mechanismus, den Sie häufig in Spiel-Apps sehen. Wenn Sie die App erst verfügbar machen, wenn Sie sie aktualisieren, können Sie sie immer mit der neuesten Version ausführen. Es ist jedoch unpraktisch, es nicht verwenden zu können, wenn Sie es sofort verwenden möchten, da Sie sich nicht immer in einer Kommunikationsumgebung befinden, in der Benutzer Aktualisierungen vornehmen können. Unter dem Gesichtspunkt einer solchen Benutzerfreundlichkeit mag ich die Halbzwanghaftigkeit, die ich beibehalten habe, bevor ich das Update veranlasst habe.

Übrigens, wenn es eine Diskrepanz in der vom Benutzer installierten Version der Anwendung gibt, wird es schwierig sein, die vorhandene Funktion zu ändern und nicht in der Lage zu sein, die neueste Funktion bereitzustellen. Wenn ich beispielsweise eine Datenbank über mehrere Generationen migriere, stoße ich manchmal auf einen unerwarteten Fehler, dass die Version fliegt.

Es ist wünschenswert, dass Benutzer immer die neueste Version verwenden, und ich denke, es ist besser, aktiv einen Mechanismus einzuführen, um Updates zu fördern.

Implementierung mit der iTunes Search API

Bei der Implementierung des halb erzwungenen Aktualisierungsmechanismus kann der folgende Ablauf berücksichtigt werden.

No Title.png

  1. Fragen Sie den Server nach der neuesten Version, wenn die App gestartet wird
  2. Vergleichen Sie die vom Server zurückgegebene Version mit der aktuellen Version
  3. Zeigen Sie eine Benutzeroberfläche an, die den Benutzer zum Upgrade auffordert, wenn es nicht die neueste ist

iTunes Search API

Sie können Ihren eigenen Server für die Rückgabe der neuesten Version vorbereiten, aber hier [iTunes Search API](https://affiliate.itunes.apple.com/resources/documentation/itunes-store-web-service-search- Verwenden Sie api /). Mit dieser API können Sie kostenlos Informationen zu Apps erhalten, die im App Store verteilt werden. Zu den App-Informationen gehören auch Versionsinformationen, die im App Store veröffentlicht wurden.

Bei Verwendung der iTunes-Such-API ** werden die Versionsinformationen der App, die abgerufen werden können, automatisch aktualisiert **, wenn die App tatsächlich aus dem App Store geliefert wird **, sodass die Lieferversion von Ihnen selbst geliefert wird. Es ist einfach zu bedienen, da kein Server zum Verwalten der Daten eingerichtet werden muss und Sie nicht vergessen werden, die neueste Version zu aktualisieren.

AppStore-Klasse

Ich habe eine AppStore-Klasse implementiert, die auf die unten stehende iTunes-Such-API trifft. (Ich verwende Alamofire v5 für die Kommunikationsbibliothek.)

import Foundation
import Alamofire

typealias LookUpResult = [String: Any]

enum AppStoreError: Error {
    case networkError
    case invalidResponseData
}

class AppStore {

    private static let lastCheckVersionDateKey = "\(Bundle.main.bundleIdentifier!).lastCheckVersionDateKey"

    static func checkVersion(completion: @escaping (_ isOlder: Bool) -> Void) {
        let lastDate = UserDefaults.standard.integer(forKey: lastCheckVersionDateKey)
        let now = currentDate

        //Überspringen, bis sich das Datum ändert
        guard lastDate < now else { return }

        UserDefaults.standard.set(now, forKey: lastCheckVersionDateKey)

        lookUp { (result: Result<LookUpResult, AppStoreError>) in
            do {
                let lookUpResult = try result.get()

                if let storeVersion = lookUpResult["version"] as? String {
                    let storeVerInt = versionToInt(storeVersion)
                    let currentVerInt = versionToInt(Bundle.version)
                    completion(storeVerInt > currentVerInt)
                }
            }
            catch {
                completion(false)
            }
        }
    }

    static func versionToInt(_ ver: String) -> Int {
        let arr = ver.split(separator: ".").map { Int($0) ?? 0 }

        switch arr.count {
            case 3:
                return arr[0] * 1000 * 1000 + arr[1] * 1000 + arr[2]
            case 2:
                return arr[0] * 1000 * 1000 + arr[1] * 1000
            case 1:
                return arr[0] * 1000 * 1000
            default:
                assertionFailure("Illegal version string.")
                return 0
        }
    }

    ///Öffnen Sie den App Store
    static func open() {
        if let url = URL(string: storeURLString), UIApplication.shared.canOpenURL(url) {
            UIApplication.shared.open(url)
        }
    }
}

private extension AppStore {

    static var iTunesID: String {
        "<YOUR_ITUNES_ID>"
    }

    ///App Store App-Seite
    static var storeURLString: String {
        "https://apps.apple.com/jp/app/XXXXXXX/id" + iTunesID
    }

    /// iTunes Search API
    static var lookUpURLString: String {
        "https://itunes.apple.com/lookup?id=" + iTunesID
    }

    ///Gibt eine Ganzzahl wie 20201116 zurück, die aus dem aktuellen Datum und der aktuellen Uhrzeit generiert wurde
    static var currentDate: Int {
        let formatter = DateFormatter()
        formatter.calendar = Calendar(identifier: .gregorian)
        formatter.locale = .current
        formatter.dateFormat = "yyyyMMdd"
        return Int(formatter.string(from: Date()))!
    }

    static func lookUp(completion: @escaping (Result<LookUpResult, AppStoreError>) -> Void) {
        AF.request(lookUpURLString).responseJSON(queue: .main, options: .allowFragments) { (response: AFDataResponse<Any>) in
            let result: Result<LookUpResult, AppStoreError>

            if let error = response.error {
                result = .failure(.networkError)
            }
            else {
                if let value = response.value as? [String: Any],
                   let results = value["results"] as? [LookUpResult],
                   let obj = results.first {
                    result = .success(obj)
                }
                else {
                    result = .failure(.invalidResponseData)
                }
            }

            completion(result)
        }
    }
}

extension Bundle {
    /// Info.Holen Sie sich die Versionsnummer in plist. Haupt.minor.Es wird davon ausgegangen, dass es sich um ein Patch-Format handelt
    static var version: String {
        return Bundle.main.infoDictionary!["CFBundleShortVersionString"] as! String
    }
}

Ersetzen Sie "<YOUR_ITUNES_ID>" durch die iTunes-ID der App, für die Sie Versionsinformationen abrufen möchten. Die iTunes ID wird in der URL angezeigt, wenn Sie die Seite der App im App Store in Ihrem Browser öffnen. Ersetzen Sie in ähnlicher Weise "storeURLString" durch die App Store-URL.

Slice.png

In der obigen Implementierung wird die Version einmal täglich auf Aktualisierungen überprüft. Der Versionsvergleich basiert auf der Versionszeichenfolge im Format * major.minor.patch *, die durch Punkte geteilt und in den Typ Int konvertiert wird (siehe die Methode versionToInt (_ :)). Mit der obigen Methode können Minor und Patch nur 1000 Schritte von 0 bis 999 ausführen, dies sollte jedoch ausreichen.

Wenn Sie die AppStore-Klasse verwenden, erstellen Sie die folgende Methode in ViewController und rufen Sie mit der beobachteten Methode viewDidAppear oder UIApplication.willEnterForegroundNotification auf.

private extension ViewController {

    func checkVersion() {
        AppStore.checkVersion { (isOlder: Bool) in
            guard isOlder else { return }

            let alertController = UIAlertController(title: "Es gibt eine neue Version!", message: "Bitte aktualisieren.", preferredStyle: .alert)
            alertController.addAction(UIAlertAction(title: "aktualisieren", style: .default) { action in
                AppStore.open()
            })
            alertController.addAction(UIAlertAction(title: "Stornieren", style: .cancel))
            self.present(alertController, animated: true)
        }
    }
}

Mit der obigen Implementierung ist es nun möglich, den Benutzer darüber zu informieren, dass eine neue Version veröffentlicht wurde.

Recommended Posts

[IOS] Implementieren Sie den halb erzwungenen Aktualisierungsmechanismus beiläufig
Implementieren Sie iOS14 UICollectionView mit dem minimal erforderlichen Code.