PaywallExtensions: post purchases with Offering identifier#2645
Conversation
86a5030 to
7895859
Compare
Codecov Report
@@ Coverage Diff @@
## main #2645 +/- ##
==========================================
- Coverage 86.46% 86.43% -0.03%
==========================================
Files 207 207
Lines 14524 14515 -9
==========================================
- Hits 12558 12546 -12
- Misses 1966 1969 +3
|
There was a problem hiding this comment.
Do we need to clear the cached value on purchase cancellation?
EDIT: Though thinking about it, it's probably not needed... If the user tries to purchase again with a different offering (super uncommon scenario) it would get set again I guess.
There was a problem hiding this comment.
Yeah I thought about it but we have no good way to always remove it in all scenarios I think. If it's been presented, I think it's fine if we send it for a purchase later.
There was a problem hiding this comment.
Are you good with this then?
There was a problem hiding this comment.
Yup, sorry for the delay. I thought I had approved it 😅
7895859 to
d04da5e
Compare
- Exposed `internal`-only `Purchases.cachePresentedOfferingIdentifier` - Changed `SwiftUI` extensions to `static` methods: this is required to be able to call an instance method on them - Added integration test to verify this offering identifier is used Technically this is an API change, but these APIs are implicitly beta because they're only available in Xcode 15 beta.
d04da5e to
1db7feb
Compare
**This is an automatic release.** ### Bugfixes * `PurchasesOrchestrator`: update `CustomerInfoManager` cache after processing transactions (#2676) via NachoSoto (@NachoSoto) * `ErrorResponse`: drastically improved error messages, no more "unknown error"s (#2660) via NachoSoto (@NachoSoto) * `PaywallExtensions`: post purchases with `Offering` identifier (#2645) via NachoSoto (@NachoSoto) * Support `product_plan_identifier` for purchased subscriptions from `Google Play` (#2654) via Josh Holtz (@joshdholtz) ### Performance Improvements * `copy(with: VerificationResult)`: optimization to avoid copies (#2639) via NachoSoto (@NachoSoto) ### Other Changes * `ETagManager`: refactored e-tag creation and tests (#2671) via NachoSoto (@NachoSoto) * `getPromotionalOffer`: return `ErrorCode.ineligibleError` if receipt is not found (#2678) via NachoSoto (@NachoSoto) * `TimingUtil`: removed slow purchase logs (#2677) via NachoSoto (@NachoSoto) * `CI`: changed `Codecov` to `informational` (#2670) via NachoSoto (@NachoSoto) * `LoadShedderIntegrationTests`: verify requests are actually handled by load shedder (#2663) via NachoSoto (@NachoSoto) * `ETagManager.httpResultFromCacheOrBackend`: return response headers (#2666) via NachoSoto (@NachoSoto) * `Integration Tests`: added tests to verify 304 behavior (#2659) via NachoSoto (@NachoSoto) * `HTTPClient`: disable `URLSession` cache (#2668) via NachoSoto (@NachoSoto) * Documented `HTTPStatusCode.isSuccessfullySynced` (#2661) via NachoSoto (@NachoSoto) * `NetworkError.signatureVerificationFailed`: added status code to error `userInfo` (#2657) via NachoSoto (@NachoSoto) * `HTTPClient`: improved log for failed requests (#2669) via NachoSoto (@NachoSoto) * `ETagManager`: added new verbose logs (#2656) via NachoSoto (@NachoSoto) * `Signature Verification`: added test-only log for debugging invalid signatures (#2658) via NachoSoto (@NachoSoto) * Fixed `HTTPResponse.description` (#2664) via NachoSoto (@NachoSoto) * Changed `Logger` to use `os_log` (#2608) via NachoSoto (@NachoSoto) * `MainThreadMonitor`: increased threshold (#2662) via NachoSoto (@NachoSoto) * `debugRevenueCatOverlay`: display `receiptURL` (#2652) via NachoSoto (@NachoSoto) * `PurchaseTester`: added ability to display `debugRevenueCatOverlay` (#2653) via NachoSoto (@NachoSoto) * `debugRevenueCatOverlay`: ability to close on `macOS`/`Catalyst` (#2649) via NachoSoto (@NachoSoto) * `debugRevenueCatOverlay`: added support for `macOS` (#2648) via NachoSoto (@NachoSoto) * `LoadShedderIntegrationTests`: enable signature verification (#2655) via NachoSoto (@NachoSoto) * `ImageSnapshot`: fixed Xcode 15 compilation (#2651) via NachoSoto (@NachoSoto) * `OfferingsManager`: don't clear offerings cache timestamp when request fails (#2359) via NachoSoto (@NachoSoto) * `StoreKitObserverModeIntegrationTests`: added test for posting renewals (#2590) via NachoSoto (@NachoSoto) * Always initialize `StoreKit2TransactionListener` even on SK1 mode (#2612) via NachoSoto (@NachoSoto) * `ErrorUtils.missingReceiptFileError`: added receipt URL `userInfo` context (#2650) via NachoSoto (@NachoSoto) * Added `.xcprivacy` for Xcode 15 (#2619) via NachoSoto (@NachoSoto) * `Trusted Entitlements`: added debug log with `ResponseVerificationMode` (#2647) via NachoSoto (@NachoSoto) * `debugRevenueCatOverlay`: simplified title (#2641) via NachoSoto (@NachoSoto) * Simplified `Purchases.updateAllCachesIfNeeded` (#2626) via NachoSoto (@NachoSoto) * `HTTPResponseTests`: fixed disabled test (#2643) via NachoSoto (@NachoSoto) * Add `InternalDangerousSettings.forceSignatureFailures` (#2635) via NachoSoto (@NachoSoto) * `IntegrationTests`: explicit `StoreKit 1` mode (#2636) via NachoSoto (@NachoSoto) * `Signing`: removed API for loading key from a file (#2638) via NachoSoto (@NachoSoto)
I've moved `PaywallViewMode` from `RevenueCatUI` to `RevenueCat`. This uses the same approach as #2645. This method is `public` so it can be used from `RevenueCatUI`, but the documentation stays its purpose. The behavior is covered with integration tests and a snapshot test.
I've moved `PaywallViewMode` from `RevenueCatUI` to `RevenueCat`. This uses the same approach as #2645. This method is `public` so it can be used from `RevenueCatUI`, but the documentation stays its purpose. The behavior is covered with integration tests and a snapshot test.
I've moved `PaywallViewMode` from `RevenueCatUI` to `RevenueCat`. This uses the same approach as #2645. This method is `public` so it can be used from `RevenueCatUI`, but the documentation stays its purpose. The behavior is covered with integration tests and a snapshot test. Depends on https://github.com/RevenueCat/khepri/pull/6364.
I've moved `PaywallViewMode` from `RevenueCatUI` to `RevenueCat`. This uses the same approach as #2645. This method is `public` so it can be used from `RevenueCatUI`, but the documentation stays its purpose. The behavior is covered with integration tests and a snapshot test. Depends on https://github.com/RevenueCat/khepri/pull/6364.
I've moved `PaywallViewMode` from `RevenueCatUI` to `RevenueCat`. This uses the same approach as #2645. This method is `public` so it can be used from `RevenueCatUI`, but the documentation stays its purpose. The behavior is covered with integration tests and a snapshot test. Depends on https://github.com/RevenueCat/khepri/pull/6364.
I've moved `PaywallViewMode` from `RevenueCatUI` to `RevenueCat`. This uses the same approach as #2645. This method is `public` so it can be used from `RevenueCatUI`, but the documentation stays its purpose. The behavior is covered with integration tests and a snapshot test. Depends on https://github.com/RevenueCat/khepri/pull/6364.
I've moved `PaywallViewMode` from `RevenueCatUI` to `RevenueCat`. This uses the same approach as #2645. This method is `public` so it can be used from `RevenueCatUI`, but the documentation stays its purpose. The behavior is covered with integration tests and a snapshot test. Depends on https://github.com/RevenueCat/khepri/pull/6364.
I've moved `PaywallViewMode` from `RevenueCatUI` to `RevenueCat`. This uses the same approach as #2645. This method is `public` so it can be used from `RevenueCatUI`, but the documentation stays its purpose. The behavior is covered with integration tests and a snapshot test. Depends on https://github.com/RevenueCat/khepri/pull/6364.
I've moved `PaywallViewMode` from `RevenueCatUI` to `RevenueCat`. This uses the same approach as #2645. This method is `public` so it can be used from `RevenueCatUI`, but the documentation stays its purpose. The behavior is covered with integration tests and a snapshot test. Depends on https://github.com/RevenueCat/khepri/pull/6364.
I've moved `PaywallViewMode` from `RevenueCatUI` to `RevenueCat`. This uses the same approach as #2645. This method is `public` so it can be used from `RevenueCatUI`, but the documentation stays its purpose. The behavior is covered with integration tests and a snapshot test. Depends on https://github.com/RevenueCat/khepri/pull/6364.
I've moved `PaywallViewMode` from `RevenueCatUI` to `RevenueCat`. This uses the same approach as #2645. This method is `public` so it can be used from `RevenueCatUI`, but the documentation stays its purpose. The behavior is covered with integration tests and a snapshot test. Depends on https://github.com/RevenueCat/khepri/pull/6364.
I've moved `PaywallViewMode` from `RevenueCatUI` to `RevenueCat`. This uses the same approach as #2645. This method is `public` so it can be used from `RevenueCatUI`, but the documentation stays its purpose. The behavior is covered with integration tests and a snapshot test. Depends on https://github.com/RevenueCat/khepri/pull/6364.
I've moved `PaywallViewMode` from `RevenueCatUI` to `RevenueCat`. This uses the same approach as #2645. This method is `public` so it can be used from `RevenueCatUI`, but the documentation stays its purpose. The behavior is covered with integration tests and a snapshot test. Depends on https://github.com/RevenueCat/khepri/pull/6364.
I've moved `PaywallViewMode` from `RevenueCatUI` to `RevenueCat`. This uses the same approach as #2645. This method is `public` so it can be used from `RevenueCatUI`, but the documentation stays its purpose. The behavior is covered with integration tests and a snapshot test. Depends on https://github.com/RevenueCat/khepri/pull/6364.
I've moved `PaywallViewMode` from `RevenueCatUI` to `RevenueCat`. This uses the same approach as #2645. This method is `public` so it can be used from `RevenueCatUI`, but the documentation stays its purpose. The behavior is covered with integration tests and a snapshot test. Depends on https://github.com/RevenueCat/khepri/pull/6364.
I've moved `PaywallViewMode` from `RevenueCatUI` to `RevenueCat`. This uses the same approach as #2645. This method is `public` so it can be used from `RevenueCatUI`, but the documentation stays its purpose. The behavior is covered with integration tests and a snapshot test. Depends on https://github.com/RevenueCat/khepri/pull/6364.
I've moved `PaywallViewMode` from `RevenueCatUI` to `RevenueCat`. This uses the same approach as #2645. This method is `public` so it can be used from `RevenueCatUI`, but the documentation stays its purpose. The behavior is covered with integration tests and a snapshot test. Depends on https://github.com/RevenueCat/khepri/pull/6364.
I've moved `PaywallViewMode` from `RevenueCatUI` to `RevenueCat`. This uses the same approach as #2645. This method is `public` so it can be used from `RevenueCatUI`, but the documentation stays its purpose. The behavior is covered with integration tests and a snapshot test. Depends on https://github.com/RevenueCat/khepri/pull/6364.
I've moved `PaywallViewMode` from `RevenueCatUI` to `RevenueCat`. This uses the same approach as #2645. This method is `public` so it can be used from `RevenueCatUI`, but the documentation stays its purpose. The behavior is covered with integration tests and a snapshot test. Depends on https://github.com/RevenueCat/khepri/pull/6364.
I've moved `PaywallViewMode` from `RevenueCatUI` to `RevenueCat`. This uses the same approach as #2645. This method is `public` so it can be used from `RevenueCatUI`, but the documentation stays its purpose. The behavior is covered with integration tests and a snapshot test. Depends on https://github.com/RevenueCat/khepri/pull/6364.
Changes:
internal-onlyPurchases.cachePresentedOfferingIdentifierSwiftUIextensions tostaticmethods: this is required to be able to call an instance method on themTechnically this is an API change, but these APIs are implicitly beta because they're only available in Xcode 15 beta.