diff --git a/ios/engine/KMEI/KeymanEngine.xcodeproj/project.pbxproj b/ios/engine/KMEI/KeymanEngine.xcodeproj/project.pbxproj index f6cbbead84..77fbed2d88 100644 --- a/ios/engine/KMEI/KeymanEngine.xcodeproj/project.pbxproj +++ b/ios/engine/KMEI/KeymanEngine.xcodeproj/project.pbxproj @@ -1698,6 +1698,8 @@ PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; PROVISIONING_PROFILE_SPECIFIER = ""; SKIP_INSTALL = YES; + STRIP_INSTALLED_PRODUCT = NO; + STRIP_SWIFT_SYMBOLS = NO; SUPPORTS_MACCATALYST = NO; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; @@ -1759,9 +1761,12 @@ isa = XCBuildConfiguration; baseConfigurationReference = F27FCAF6157FD95E00FBBA20 /* Keyman-lib.xcconfig */; buildSettings = { - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; ONLY_ACTIVE_ARCH = NO; PRODUCT_NAME = "$(TARGET_NAME)"; + STRIP_INSTALLED_PRODUCT = NO; + STRIP_STYLE = all; + STRIP_SWIFT_SYMBOLS = NO; VALID_ARCHS = "arm64 armv7s armv7 x86_64 i386"; }; name = Debug; @@ -1770,7 +1775,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = F27FCAF6157FD95E00FBBA20 /* Keyman-lib.xcconfig */; buildSettings = { - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; PRODUCT_NAME = "$(TARGET_NAME)"; VALID_ARCHS = "arm64 armv7s armv7 x86_64 i386"; }; @@ -1882,7 +1887,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; KEYMAN_ROOT = "$(SRCROOT)/../../.."; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -1944,7 +1949,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = F27FCAF6157FD95E00FBBA20 /* Keyman-lib.xcconfig */; buildSettings = { - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; ONLY_ACTIVE_ARCH = NO; PRODUCT_NAME = "$(TARGET_NAME)"; VALID_ARCHS = "arm64 armv7s armv7 x86_64 i386"; @@ -2141,8 +2146,8 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; KEYMAN_ROOT = "$(SRCROOT)/../../.."; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG NO_SENTRY"; @@ -2185,8 +2190,8 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; KEYMAN_ROOT = "$(SRCROOT)/../../.."; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; ONLY_ACTIVE_ARCH = NO; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; diff --git a/ios/keyman/Keyman/Keyman.xcodeproj/project.pbxproj b/ios/keyman/Keyman/Keyman.xcodeproj/project.pbxproj index 38f7464a16..99ccb7ef3a 100644 --- a/ios/keyman/Keyman/Keyman.xcodeproj/project.pbxproj +++ b/ios/keyman/Keyman/Keyman.xcodeproj/project.pbxproj @@ -1203,8 +1203,8 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; KEYMAN_ROOT = "$(SRCROOT)/../../.."; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; ONLY_ACTIVE_ARCH = YES; OTHER_LDFLAGS = ""; SDKROOT = iphoneos; @@ -1255,8 +1255,8 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; KEYMAN_ROOT = "$(SRCROOT)/../../.."; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; ONLY_ACTIVE_ARCH = NO; OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; OTHER_LDFLAGS = ""; @@ -1393,7 +1393,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; KEYMAN_ROOT = "$(SRCROOT)/../../.."; ONLY_ACTIVE_ARCH = YES; OTHER_LDFLAGS = ""; diff --git a/oem/firstvoices/ios/FirstVoices.xcodeproj/project.pbxproj b/oem/firstvoices/ios/FirstVoices.xcodeproj/project.pbxproj index dacfd97cce..d0f19881fc 100644 --- a/oem/firstvoices/ios/FirstVoices.xcodeproj/project.pbxproj +++ b/oem/firstvoices/ios/FirstVoices.xcodeproj/project.pbxproj @@ -147,8 +147,6 @@ buildActionMask = 2147483647; files = ( 37EA1F20228A183E003E710C /* KeymanEngine.framework in Frameworks */, - 3729344024613C9900C5428C /* ObjcExceptionBridging.framework in Frameworks */, - 3729344124613CA700C5428C /* XCGLogger.framework in Frameworks */, CECB62572463E9FA006E47B5 /* DeviceKit.framework in Frameworks */, 3729344224613CB600C5428C /* Sentry.framework in Frameworks */, 3729344324613CC200C5428C /* Zip.framework in Frameworks */, @@ -568,7 +566,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_BITCODE = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; @@ -591,7 +589,7 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = ""; - IPHONEOS_DEPLOYMENT_TARGET = 9.1; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -647,7 +645,7 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = ""; - IPHONEOS_DEPLOYMENT_TARGET = 9.1; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; @@ -664,6 +662,7 @@ CODE_SIGN_ENTITLEMENTS = FirstVoices/FirstVoices.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; CODE_SIGN_STYLE = Manual; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = D7TR486TEH; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", @@ -720,6 +719,7 @@ CODE_SIGN_ENTITLEMENTS = SWKeyboard/SWKeyboard.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; CODE_SIGN_STYLE = Manual; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = D7TR486TEH; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", diff --git a/oem/firstvoices/ios/FirstVoices/FVKeyboardList.swift b/oem/firstvoices/ios/FirstVoices/FVKeyboardList.swift index fc16b60711..39dbe4a0ea 100644 --- a/oem/firstvoices/ios/FirstVoices/FVKeyboardList.swift +++ b/oem/firstvoices/ios/FirstVoices/FVKeyboardList.swift @@ -229,7 +229,7 @@ class FVRegionStorage { let keyboard: InstallableKeyboard = InstallableKeyboard.init(id: kb.id, name: kb.name, - languageID: keyboardInfo.languages[keyboardInfo.languages.startIndex], + languageID: keyboardInfo.languages.keys[keyboardInfo.languages.startIndex], languageName: kb.name, version: keyboardInfo.version, isRTL: false, diff --git a/oem/firstvoices/ios/FirstVoices/KeyboardInfo.swift b/oem/firstvoices/ios/FirstVoices/KeyboardInfo.swift index 1a0a27d642..22a43a091a 100644 --- a/oem/firstvoices/ios/FirstVoices/KeyboardInfo.swift +++ b/oem/firstvoices/ios/FirstVoices/KeyboardInfo.swift @@ -17,12 +17,50 @@ import Foundation // display and install the keyboard into Keyman Engine. Most of the data // in the files is ignored. // +struct KeyboardInfoLanguage: Decodable { + let displayName: String + let languageName: String + let scriptName: String +} struct KeyboardInfo: Decodable { let id: String let version: String let name: String - let languages: [String] + let languages: [String:KeyboardInfoLanguage?] + + enum CodingKeys: String, CodingKey { + case id + case version + case name + case languages + } + + init(from decoder: Decoder) throws { + let values = try decoder.container(keyedBy: CodingKeys.self) + + id = try values.decode(String.self, forKey: .id) + version = try values.decode(String.self, forKey: .version) + name = try values.decode(String.self, forKey: .name) + + do { + // Ideal case - the metadata exists, giving us a dictionary of KeyboardInfoLanguage entries. + languages = try values.decode([String:KeyboardInfoLanguage].self, forKey: .languages) + } catch { + // Sometimes the metadata fails to build properly, giving us only an array of language IDs. + // If this backup fails, we deserve to crash. + let langIdArray = try values.decode([String].self, forKey: .languages) + + var dict: [String:KeyboardInfoLanguage?] = [:] + langIdArray.forEach({ id in + // Fortunately, the app doesn't actually need to know the metadata; it'll function + // fine with a nil entry. + // If this changes, we'll just need to be sure to perform guard checks on the optional value. + dict.updateValue(nil, forKey: id) + }) + languages = dict + } + } } class KeyboardInfoParser {