Support product_plan_identifier for purchased subscriptions from Google Play#2654
Conversation
|
Ooooh this makes a lot of sense 👍🏻 |
1cd4b48 to
ba179d2
Compare
Codecov Report
@@ Coverage Diff @@
## main #2654 +/- ##
==========================================
+ Coverage 86.37% 86.39% +0.01%
==========================================
Files 207 207
Lines 14632 14652 +20
==========================================
+ Hits 12639 12658 +19
- Misses 1993 1994 +1
|
NachoSoto
left a comment
There was a problem hiding this comment.
I think this makes sense. My only important question is regarding the need to expose EntitlementInfo.productPlanIdentifier.
There was a problem hiding this comment.
Can you add a note that this is just for Android? In fact I wonder if this even needs to be exposed?
There was a problem hiding this comment.
Note that if we do need to expose it you need to change this from fix to feat and add this new method to the API testers.
There was a problem hiding this comment.
I made it internal! Doesn't need to be public at all yet (unless some users think it should be 🤷♂️)
There was a problem hiding this comment.
But the more I think about it, I do worry about breaking the semantics of activeSubscriptions and allPurchasedProductIdentifiers. They'd no longer be "product identifiers" as their documented to be.
There was a problem hiding this comment.
So I wonder if the solution would be to have a separate property instead that combines both. At the end of the day this is something that users of the iOS SDK won't care about, only hybrids, right?
There was a problem hiding this comment.
Yeah yeah, this is generally something that hybrids or people using native iOS and Android will care about. I'd ideally like this to be modeled in a new way in somehow in a future version of the SDK because I don't really love this 😛 But 🤷♂️
There was a problem hiding this comment.
Okay I think I'm okay with this implementation then since it only affects Android products, and those can't be fetched on iOS anyway.
But can you add a comment here explaining that? 🙏🏻
product_plan_identifier for purchased subscriptions from Google Play
2fcc0d9 to
e1785c7
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)
### Description Reported in RevenueCat/purchases-flutter#738. After #2654, we were using the new Google Play identifiers that include the plan id in expiration dates, but we didn't change the system that parses purchase dates. Later on, when we map purchases, we iterate over the expiration dates map, and since that id wasn't found in the purchase dates, it was null, causing the issue in flutter. This makes the purchase date calculation use the same algorithm that we use for expiration dates to get the new google play product identifiers.
Motivation
Addresses RevenueCat/purchases-flutter#692
Description
Shows the product id as
<product>:<base_plan>if the subscription was purchased from Google Play. This uses theproduct_plan_identifierthat is returned with the subscription.