From 46efbbc5c8c9666e86b00aee2b540e2aff7ddf71 Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Wed, 13 Jun 2018 13:12:43 +0700 Subject: [PATCH] Fixes #510. If a keyboard.json has no timezone in the last modified date string, then it will still install --- ...der.DateDecodingStrategy+ISO8601Fallback.swift | 6 ++++++ .../KMEI/KeymanEngine/Classes/Manager.swift | 15 ++++++++++----- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/ios/engine/KMEI/KeymanEngine/Classes/Extension/JSONDecoder.DateDecodingStrategy+ISO8601Fallback.swift b/ios/engine/KMEI/KeymanEngine/Classes/Extension/JSONDecoder.DateDecodingStrategy+ISO8601Fallback.swift index 5d4274bf07..ed187adfbb 100644 --- a/ios/engine/KMEI/KeymanEngine/Classes/Extension/JSONDecoder.DateDecodingStrategy+ISO8601Fallback.swift +++ b/ios/engine/KMEI/KeymanEngine/Classes/Extension/JSONDecoder.DateDecodingStrategy+ISO8601Fallback.swift @@ -9,6 +9,12 @@ import Foundation extension JSONDecoder.DateDecodingStrategy { + static var iso8601WithoutTimezone: JSONDecoder.DateDecodingStrategy { + let formatter = DateFormatter() + formatter.locale = Locale(identifier: "en_US_POSIX") + formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss" + return .formatted(formatter) + } static var ios8601WithFallback: JSONDecoder.DateDecodingStrategy { if #available(iOS 10.0, *) { return .iso8601 diff --git a/ios/engine/KMEI/KeymanEngine/Classes/Manager.swift b/ios/engine/KMEI/KeymanEngine/Classes/Manager.swift index da3f542801..a8bf290877 100644 --- a/ios/engine/KMEI/KeymanEngine/Classes/Manager.swift +++ b/ios/engine/KMEI/KeymanEngine/Classes/Manager.swift @@ -595,12 +595,17 @@ public class Manager: NSObject, HTTPDownloadDelegate, UIGestureRecognizerDelegat if let keyboard = try? decoder.decode(KeyboardAPICall.self, from: data) { downloadKeyboard(keyboard) } else { - decoder.dateDecodingStrategy = .ios8601WithMilliseconds - do { - let keyboard = try decoder.decode(KeyboardAPICall.self, from: data) + decoder.dateDecodingStrategy = .iso8601WithoutTimezone + if let keyboard = try? decoder.decode(KeyboardAPICall.self, from: data) { downloadKeyboard(keyboard) - } catch { - downloadFailed(forKeyboards: [], error: error) + } else { + decoder.dateDecodingStrategy = .ios8601WithMilliseconds + do { + let keyboard = try decoder.decode(KeyboardAPICall.self, from: data) + downloadKeyboard(keyboard) + } catch { + downloadFailed(forKeyboards: [], error: error) + } } } }