Skip to content

ErrorUtils.purchasesError(withUntypedError:): handle PublicErrors#2165

Merged
NachoSoto merged 1 commit into
mainfrom
error-utils-from-untyped-public-error
Dec 21, 2022
Merged

ErrorUtils.purchasesError(withUntypedError:): handle PublicErrors#2165
NachoSoto merged 1 commit into
mainfrom
error-utils-from-untyped-public-error

Conversation

@NachoSoto

Copy link
Copy Markdown
Contributor

See RevenueCat/purchases-hybrid-common#278.
A valid error ended up as:

failed: caught error: "Unknown error."

This change ensures that calling this method with an NSError does not return ErrorCode.unknownError, and instead we extract the correct error.

See RevenueCat/purchases-hybrid-common#278.
A valid error ended up as:
> failed: caught error: "Unknown error."

This change ensures that calling this method with an `NSError` does not return `ErrorCode.unknownError`, and instead we extract the correct error.
) -> PurchasesError {
func handlePublicError(_ error: PublicError) -> PurchasesError {
if let errorCode = ErrorCode(rawValue: error.code) {
return .init(error: errorCode, userInfo: error.userInfo)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I might be wrong but when we convert this in purchases-hybrid-common https://github.com/RevenueCat/purchases-hybrid-common/blob/main/ios/PurchasesHybridCommon/PurchasesHybridCommon/ErrorContainer.swift#L23 the nsError.code code will be the backend's returned error code?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This isn’t changing the code though.
This method is used because Swift doesn’t have typed throws, so we need a way to convert from Error to a typed PurchasesError. But this method won’t change the error at all. You can see that in the tests.

return backendError.asPurchasesError
case let networkError as NetworkError:
return networkError.asPurchasesError
case let error as PublicError where error.domain == ErrorCode.errorDomain:

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This might be a stupid question but where do we define our errorDomain? I couldn't find it 😆

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not a stupid question 😅 It’s Swift magic for Swift.Error conformances.
See also #1275.

@NachoSoto NachoSoto requested a review from vegaro December 21, 2022 16:37
@NachoSoto NachoSoto merged commit 15bd243 into main Dec 21, 2022
@NachoSoto NachoSoto deleted the error-utils-from-untyped-public-error branch December 21, 2022 16:47
NachoSoto pushed a commit that referenced this pull request Dec 21, 2022
**This is an automatic release.**

### Bugfixes
* `ErrorUtils.purchasesError(withUntypedError:)`: handle `PublicError`s
(#2165) via NachoSoto (@NachoSoto)
* Fixed race condition finishing `SK1` transactions (#2148) via
NachoSoto (@NachoSoto)
* `IntroEligibilityStatus`: added `CustomStringConvertible`
implementation (#2182) via NachoSoto (@NachoSoto)
* `BundleSandboxEnvironmentDetector`: fixed logic for `macOS` (#2176)
via NachoSoto (@NachoSoto)
* Fixed `AttributionFetcher.adServicesToken` hanging when called in
simulator (#2157) via NachoSoto (@NachoSoto)
### Other Changes
* `Purchase Tester`: added ability to purchase products directly with
`StoreKit` (#2172) via NachoSoto (@NachoSoto)
* `DNSChecker`: simplified `NetworkError` initialization (#2166) via
NachoSoto (@NachoSoto)
* `Purchases` initialization: refactor to avoid multiple concurrent
instances in memory (#2180) via NachoSoto (@NachoSoto)
* `Purchase Tester`: added button to clear messages on logger view
(#2179) via NachoSoto (@NachoSoto)
* `NetworkOperation`: added assertion to ensure that subclasses call
completion (#2138) via NachoSoto (@NachoSoto)
* `CacheableNetworkOperation`: avoid unnecessarily creating operations
for cache hits (#2135) via NachoSoto (@NachoSoto)
* `PurchaseTester`: fixed `macOS` support (#2175) via NachoSoto
(@NachoSoto)
* `IntroEligibilityCalculator`: added log including `AppleReceipt`
(#2181) via NachoSoto (@NachoSoto)
* `Purchase Tester`: fixed scene manifest (#2170) via NachoSoto
(@NachoSoto)
* `HTTPClientTests`: refactored to use `waitUntil` (#2168) via NachoSoto
(@NachoSoto)
* `Integration Tests`: split up tests in smaller files (#2158) via
NachoSoto (@NachoSoto)
* `StoreKitRequestFetcher`: removed unnecessary dispatch (#2152) via
NachoSoto (@NachoSoto)
* `Purchase Tester`: added companion `watchOS` app (#2140) via NachoSoto
(@NachoSoto)
* `StoreKit1Wrapper`: added warning if receiving too many updated
transactions (#2117) via NachoSoto (@NachoSoto)
* `StoreKitTestHelpers`: cleaned up unnecessary log (#2177) via
NachoSoto (@NachoSoto)
* `TrialOrIntroPriceEligibilityCheckerSK1Tests`: use `waitUntilValue`
(#2173) via NachoSoto (@NachoSoto)
* `DNSChecker`: added log with resolved host (#2167) via NachoSoto
(@NachoSoto)
* `MagicWeatherSwiftUI`: updated `README` to point to workspace (#2142)
via NachoSoto (@NachoSoto)
* `Purchase Tester`: fixed `.storekit` config file reference (#2171) via
NachoSoto (@NachoSoto)
* `Purchase Tester`: fixed error alerts (#2169) via NachoSoto
(@NachoSoto)
* `CI`: don't make releases until `release-checks` pass (#2162) via
NachoSoto (@NachoSoto)
* `Fastfile`: changed `match` to `readonly` (#2161) via NachoSoto
(@NachoSoto)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

pr:fix A bug fix

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants