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.
Bei der Implementierung des halb erzwungenen Aktualisierungsmechanismus kann der folgende Ablauf berücksichtigt werden.
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.
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.
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.