From cf33276e647e83fdadf3606cd512611a6f58d404 Mon Sep 17 00:00:00 2001 From: Leo Mehlig Date: Wed, 25 Sep 2024 12:08:20 +0200 Subject: [PATCH] Fix crash in withCheckedContinuation on iOS 18.0 (#46) --- Sources/ConfigCat/ConfigCatClient.swift | 3 ++- Sources/ConfigCat/Extensions.swift | 18 +++++++++--------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/Sources/ConfigCat/ConfigCatClient.swift b/Sources/ConfigCat/ConfigCatClient.swift index 98f3ed3..c7f12a0 100755 --- a/Sources/ConfigCat/ConfigCatClient.swift +++ b/Sources/ConfigCat/ConfigCatClient.swift @@ -351,7 +351,8 @@ public final class ConfigCatClient: NSObject, ConfigCatClientProtocol { @available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *) @discardableResult public func waitForReady() async -> ClientReadyState { - await withCheckedContinuation { continuation in + // withCheckedContinuation sometimes crashes on iOS 18.0. See https://github.com/RevenueCat/purchases-ios/pull/4286 + await withUnsafeContinuation { continuation in guard let configService = self.configService else { continuation.resume(returning: .hasLocalOverrideFlagDataOnly) return diff --git a/Sources/ConfigCat/Extensions.swift b/Sources/ConfigCat/Extensions.swift index 40587fb..587ef63 100644 --- a/Sources/ConfigCat/Extensions.swift +++ b/Sources/ConfigCat/Extensions.swift @@ -62,7 +62,7 @@ extension ConfigCatClient { #if compiler(>=5.5) && canImport(_Concurrency) @available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *) public func getValue(for key: String, defaultValue: Value, user: ConfigCatUser? = nil) async -> Value { - await withCheckedContinuation { continuation in + await withUnsafeContinuation { continuation in getValue(for: key, defaultValue: defaultValue, user: user) { value in continuation.resume(returning: value) } @@ -71,7 +71,7 @@ extension ConfigCatClient { @available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *) public func getAnyValue(for key: String, defaultValue: Any?, user: ConfigCatUser? = nil) async -> Any? { - await withCheckedContinuation { continuation in + await withUnsafeContinuation { continuation in getValue(for: key, defaultValue: defaultValue, user: user) { value in continuation.resume(returning: value) } @@ -80,7 +80,7 @@ extension ConfigCatClient { @available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *) public func getValueDetails(for key: String, defaultValue: Value, user: ConfigCatUser? = nil) async -> TypedEvaluationDetails { - await withCheckedContinuation { continuation in + await withUnsafeContinuation { continuation in getValueDetails(for: key, defaultValue: defaultValue, user: user) { details in continuation.resume(returning: details) } @@ -89,7 +89,7 @@ extension ConfigCatClient { @available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *) public func getAnyValueDetails(for key: String, defaultValue: Any?, user: ConfigCatUser? = nil) async -> TypedEvaluationDetails { - await withCheckedContinuation { continuation in + await withUnsafeContinuation { continuation in getValueDetails(for: key, defaultValue: defaultValue, user: user) { details in continuation.resume(returning: details) } @@ -98,7 +98,7 @@ extension ConfigCatClient { @available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *) public func getAllValueDetails(user: ConfigCatUser? = nil) async -> [EvaluationDetails] { - await withCheckedContinuation { continuation in + await withUnsafeContinuation { continuation in getAllValueDetails(user: user) { details in continuation.resume(returning: details) } @@ -107,7 +107,7 @@ extension ConfigCatClient { @available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *) public func getAllKeys() async -> [String] { - await withCheckedContinuation { continuation in + await withUnsafeContinuation { continuation in getAllKeys { keys in continuation.resume(returning: keys) } @@ -116,7 +116,7 @@ extension ConfigCatClient { @available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *) public func getKeyAndValue(for variationId: String) async -> KeyValue? { - await withCheckedContinuation { continuation in + await withUnsafeContinuation { continuation in getKeyAndValue(for: variationId) { value in continuation.resume(returning: value) } @@ -125,7 +125,7 @@ extension ConfigCatClient { @available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *) public func getAllValues(user: ConfigCatUser? = nil) async -> [String: Any] { - await withCheckedContinuation { continuation in + await withUnsafeContinuation { continuation in getAllValues(user: user) { values in continuation.resume(returning: values) } @@ -135,7 +135,7 @@ extension ConfigCatClient { @available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *) @discardableResult public func forceRefresh() async -> RefreshResult { - await withCheckedContinuation { continuation in + await withUnsafeContinuation { continuation in forceRefresh { result in continuation.resume(returning: result) }