Giter Club home page Giter Club logo

purchases-unity's Introduction

RevenueCat
Unity in-app subscriptions made easy

openupm

What is purchases-unity?

Purchases Unity is a client for the RevenueCat subscription and purchase tracking system. It is an open source framework that provides a wrapper around StoreKit, Google Play Billing and the RevenueCat backend to make implementing in-app purchases in Unity easy.

Features

RevenueCat
Server-side receipt validation
➡️ Webhooks - enhanced server-to-server communication with events for purchases, renewals, cancellations, and more
🎯 Subscription status tracking - know whether a user is subscribed whether they're on iOS or Android
📊 Analytics - automatic calculation of metrics like conversion, mrr, and churn
📝 Online documentation up to date
🔀 Integrations - over a dozen integrations to easily send purchase data where you need it
💯 Well maintained - frequent releases
📮 Great support - Help Center

Getting Started

For more detailed information, you can view our complete documentation at docs.revenuecat.com.

Dependencies and Unity IAP

We use StoreKit for iOS and BillingClient for Android. This plugin also depends on purchases-ios, purchases-android and purchases-hybrid-common.

VERSIONS.md contains the dependencies versions for each release.

If using this plugin alongside Unity IAP, please check the specific instructions in our observer mode docs.

purchases-unity's People

Contributors

aboedo avatar alfondotnet avatar aqvinsaldanha avatar beylmk avatar codykerns avatar dependabot[bot] avatar gfaraj avatar jazminemt avatar jeiting avatar joshdholtz avatar markvillacampa avatar nachosoto avatar rcgitbot avatar rkotzy avatar taquitos avatar tiinanguyen avatar tonidero avatar vegaro avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

purchases-unity's Issues

Issue within BillingClient 4.0 - SkuDetails missing freeTrialPeriod

Google Issue Tracker 👉 https://issuetracker.google.com/issues/219799769?pli=1

There is currently an ongoing issue within BillingClient 4.0 where freeTrialPeriod is null which could cause issues within RevenueCat's Purchases Android.

This does appear to be inconsistent and fairly rare but could still happen.

We are actively working on getting finding somebody that can address this issue 💪


All updates on our end will be made here 👉 RevenueCat/purchases-android#498

Integration with Unity IAP 3.2.2

  1. Environment
    • Platform: Android
    • SDK version: 3.2
    • OS + version: 7.1.2
    • Xcode/Android Studio version: N/A
    • Unity IAP: 3.2.2 and 4.0.0 (tried both)
    • Unity version: 2020.3.11f1-
  2. Debug logs that reproduce the issue: RC-Fatal.log
  3. Steps to reproduce, with a description of expected vs. actual behavior: see below
  4. I have followed documentation to integrate RevenueCat alongside with Unity IAP and faced with fatal error on Android on startup:
FATAL EXCEPTION: Thread-8
Process: MY_PACKAGE_NAME, PID: 30996
java.lang.Error: FATAL EXCEPTION [Thread-8]
Unity version : 2020.3.11f1
Device model : samsung SM-G973N
Device fingerprint: samsung/beyond1qlteue/beyond1q:7.1.2/PPR1.190810.011/700210126:user/release-keys
Build Type : Release
Scripting Backend : Mono
ABI : armeabi-v7a
Strip Engine Code : false

Caused by: java.lang.NoSuchMethodError: No virtual method getSkus()Ljava/util/ArrayList; in class Lcom/android/billingclient/api/Purchase; or its super classes (declaration of 'com.android.billingclient.api.Purchase' appears in /data/app/MY_PACKAGE_NAME-1/base.apk)
	at com.revenuecat.purchases.google.PurchaseDetailsConversionsKt.toRevenueCatPurchaseDetails(purchaseDetailsConversions.kt:16)
	at com.revenuecat.purchases.google.BillingWrapper.toMapOfGooglePurchaseWrapper(BillingWrapper.kt:404)
	at com.revenuecat.purchases.google.BillingWrapper.access$toMapOfGooglePurchaseWrapper(BillingWrapper.kt:51)
	at com.revenuecat.purchases.google.BillingWrapper$queryPurchases$1.invoke(BillingWrapper.kt:393)
	at com.revenuecat.purchases.google.BillingWrapper$queryPurchases$1.invoke(BillingWrapper.kt:51)
	at com.revenuecat.purchases.google.BillingWrapper.withConnectedClient(BillingWrapper.kt:567)
	at com.revenuecat.purchases.google.BillingWrapper.queryPurchases(BillingWrapper.kt:366)
	at com.revenuecat.purchases.Purchases$updatePendingPurchaseQueue$1.run(Purchases.kt:1692)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:428)
	at java.util.concurrent.FutureTask.run(FutureTask.java:237)
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:272)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
	at java.lang.Thread.run(Thread.java:761)

I tried to integrate it into an empty project - only the Purchases component on scene with my Revenue Cat API Key and custom App User ID. The result is the same - fatal error. Interesting observation - I don't have this issue when I use incorrect android package name (anything else but not my real package name).
Not sure, but probably it is related to RevenueCat/purchases-android#302

Unable to distribute to App Store Connect, Invalid bundle

Starting from 2020x, Unity introduced a new standard for Unity's iOS builds wherein plugins and files are contained within UnityFramework.framework (which is where I see RevenueCat’s generated code and other files). That's why when we try to upload our binary with RevenueCat to Apple Store Connect through Xcode, we get the error: ERROR ITMS-90206: "Invalid Bundle. The bundle at 'APPNAME.app/Frameworks/UnityFramework.framework' contains disallowed file 'Frameworks'.". Before installing RevenueCat, there wasn't any problem.

  1. Environment

    1. Platform: iOS
    2. SDK version: 3.5.0
    3. OS + version: MacOS 11.3.1
    4. Xcode/Android Studio version: 12.5.1
    5. Unity version: 2020.3.25f1
    6. How widespread is the issue. Percentage of devices affected: 100%
  2. Debug logs that reproduce the issue
    None

  3. Steps to reproduce, with a description of expected vs. actual behavior

    1. Build to Xcode with Unity 2020.3.25f1 after RevenueCat installation
    2. Archive the build
    3. Try to distribute to App Store Connect
  4. Other information (e.g. stacktraces, related issues, suggestions how to fix, links for us to have context, eg. stackoverflow, etc.)
    As a workaround, one may follow the steps below:

    1. Build project to Xcode from Unity like you normally would
    2. In the project view, select the target that is your project (usually called "Unity-IPhone" from what I've seen)
    3. Click Build Phases
    4. Click that small plus sign that’s really easy to miss at the top of the build phases section of Xcode
    5. Choose New Run Script Phase
    6. Expand the newly added Run Script
    7. Paste this script in there:
      cd "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Frameworks/UnityFramework.framework/" if [[ -d "Frameworks" ]]; then rm -fr Frameworks fi

Additional context
These additional steps prevent us to use our CI/CD pipeline, that’s why an immediate fix is required.

References:
https://developer.apple.com/forums/thread/654980
https://support.wikitude.com/support/discussions/topics/5000096581

Game Crashes on Start (Android)

Describe the bug
Game crashes on start with the following exception:

2021/09/14 12:18:14.984 27870 28344 Error AndroidRuntime Process: com.veloxia.spacecolonyidle, PID: 27870
2021/09/14 12:18:14.984 27870 28344 Error AndroidRuntime java.lang.NoSuchMethodError: No virtual method getSkus()Ljava/util/ArrayList; in class Lcom/android/billingclient/api/Purchase; or its super classes (declaration of 'com.android.billingclient.api.Purchase' appears in /data/app/~~fnfgVdGI4x2J-NcOPxLRew==/com.veloxia.spacecolonyidle-mj2NueCnx7pHNpxdwK-Xuw==/base.apk)
2021/09/14 12:18:14.984 27870 28344 Error AndroidRuntime     at com.revenuecat.purchases.google.PurchaseDetailsConversionsKt.toRevenueCatPurchaseDetails(purchaseDetailsConversions.kt:16)
2021/09/14 12:18:14.984 27870 28344 Error AndroidRuntime     at com.revenuecat.purchases.google.BillingWrapper.toMapOfGooglePurchaseWrapper(BillingWrapper.kt:404)
2021/09/14 12:18:14.984 27870 28344 Error AndroidRuntime     at com.revenuecat.purchases.google.BillingWrapper.access$toMapOfGooglePurchaseWrapper(BillingWrapper.kt:51)
2021/09/14 12:18:14.984 27870 28344 Error AndroidRuntime     at com.revenuecat.purchases.google.BillingWrapper$queryPurchases$1.invoke(BillingWrapper.kt:393)
2021/09/14 12:18:14.984 27870 28344 Error AndroidRuntime     at com.revenuecat.purchases.google.BillingWrapper$queryPurchases$1.invoke(BillingWrapper.kt:51)
2021/09/14 12:18:14.984 27870 28344 Error AndroidRuntime     at com.revenuecat.purchases.google.BillingWrapper.withConnectedClient(BillingWrapper.kt:571)
2021/09/14 12:18:14.984 27870 28344 Error AndroidRuntime     at com.revenuecat.purchases.google.BillingWrapper.queryPurchases(BillingWrapper.kt:366)
2021/09/14 12:18:14.984 27870 28344 Error AndroidRuntime     at com.revenuecat.purchases.Purchases$updatePendingPurchaseQueue$1.run(Purchases.kt:1692)
2021/09/14 12:18:14.984 27870 28344 Error AndroidRuntime     at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:462)
2021/09/14 12:18:14.984 27870 28344 Error AndroidRuntime     at java.util.concurrent.FutureTask.run(FutureTask.java:266)
2021/09/14 12:18:14.984 27870 28344 Error AndroidRuntime     at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301)
2021/09/14 12:18:14.984 27870 28344 Error AndroidRuntime     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
2021/09/14 12:18:14.984 27870 28344 Error AndroidRuntime     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
2021/09/14 12:18:14.984 27870 28344 Error AndroidRuntime     at java.lang.Thread.run(Thread.java:923)
  1. Environment
    1. Platform: Android
    2. SDK version: 3.4.1
    3. OS + version: Android 11
    4. Xcode/Android Studio version:
    5. Unity version: 2020.3.18f1
    6. How widespread is the issue. Percentage of devices affected. 100%

We are using Unity Purchases with RevenueCat. RevenueCat will only be used for logging purposes.

Related:
https://community.revenuecat.com/sdks-51/android-subscription-crashes-after-test-purchase-363

Error parsing Discount objects in StoreProduct.cs

I am attempting to implement promotional offers on iOS, however I have found a blocking bug. When tracking the native code in Xcode, the constructor for StoreProduct.cs will never reach the code to parse Discounts, as it will return early when attempting to parse SubscriptionOptions, which will never exist on iOS. As a result, Discounts will never be received in the SDK, even when being visible in the _receivedProducts JSONString Debug.Log().

  1. Environment
    1. Platform: Unity
    2. SDK version: 5.1.1
    3. OS + version: iOS + 16.6
    4. Xcode/Android Studio version: 14.3.1
    5. Unity version: 2021.3.14f1
    6. How widespread is the issue. Percentage of devices affected. 100%
  2. Debug logs that reproduce the issue
  3. Steps to reproduce, with a description of expected vs. actual behavior
  4. Other information (e.g. stacktraces, related issues, suggestions how to fix, links for us to have context, eg. stackoverflow, etc.)

Suggestions how to fix:
In StoreProduct.cs, avoid returning from the function early when failing to parse "subscriptionOptions". Additional logic to parse the "subscriptionOptions" should be inside the null check for "subscriptionOptionsResponse" or excluding parsing "subscriptionOptions" entirely when on iOS.

[URGENT - LIVE VERSION] User has been charged but purchase isn't showing up

Describe the bug
When there is a billing problem with the card or user is asked for a confirmation with a password, the purchase ends up outside of the game. userCancelled becomes false but as STORE_ERROR is returned, purchase process returns on client. At the end of the process, user gets charged without having the rewards. Not reproducible on sandbox environment.
Do not remove any of the steps from the template below. If a step is not applicable to your issue, please leave that step empty.

  1. Environment
    1. Platform: iOS/Android
    2. SDK version: 3.5.0
    3. OS + version:
    4. Xcode/Android Studio version:
    5. Unity version: 2020.3.25f1
    6. How widespread is the issue. Percentage of devices affected. ~15%
  2. Debug logs that reproduce the issue
  3. Steps to reproduce, with a description of expected vs. actual behavior
    Release a bundle to stores
    Make a real purchase with a real card without required limit inside the card
    Store asks you to fill another payment method
    Complete the purchase
  4. Other information (e.g. stacktraces, related issues, suggestions how to fix, links for us to have context, eg. stackoverflow, etc.)

Additional context
Add any other context about the problem here.

Add issue templates

We don't have issue templates in this repo, we should create them to match the others

Crash by adding attribution

1. Platform: iOS
2. SDK version: 2.3.0
3. OS version: not specific - iOS 12-14
4. Xcode version: 11.7
5. More then 300 users in 2 days

Recently released on iOS with updated RevenueCat version. I was not using attribution v2 and left deprecated methods usage for the next release to upgrade.
Crashlytic reported a lot of crashes.

Fatal Exception: NSInvalidArgumentException
Attempt to insert non-property list object { adgroup = ""; "adgroup_id" = ""; adset = ""; "adset_id" = ""; "af_click_lookback" = 7d; "af_cpi" = ""; "af_siteid" = ""; "af_status" = "Non-organic"; "af_sub1" = ""; "af_sub2" = ""; "af_sub3" = ""; "af_sub4" = ""; "af_sub5" = ""; agency = ""; campaign = None; "campaign_id" = ""; "click_time" = "2020-11-11 17:12:29.165"; clickid = "{{{all_params}}}"; "cost_cents_USD" = 0; "engmnt_source" = ""; "esp_name" = ""; "http_referrer" = ""; "install_time" = "2020-11-11 17:16:00.987"; "is_branded_link" = ""; "is_first_launch" = 0; "is_universal_link" = ""; iscache = 1; "match_type" = probabilistic; "media_source" = "replaced"; "orig_cost" = "0.0"; "rc_attribution_network_id" = "replaced"; "rc_idfa" = "replaced"; "rc_idfv" = "replaced"; "redirect_response_data" = ""; "retargeting_conversion_type" = none; }
for key com.revenuecat.userdefaults.attribution.71C3B32B-E61E-4B7F-AD5D-E6B39BA0A285

Fatal Exception: NSInvalidArgumentException				
0	CoreFoundation			__exceptionPreprocess	
1	libobjc.A.dylib			objc_exception_throw	
2	CoreFoundation			-[__NSCFString characterAtIndex:].cold.1	
3	CoreFoundation			_CFPrefsValidateValueForKey	
4	CoreFoundation			createDeepCopyOfValueForKey	
5	CoreFoundation			-[CFPrefsSource setValues:forKeys:count:copyValues:removeValuesForKeys:count:from:]	
6	CoreFoundation			-[CFPrefsSource setValues:forKeys:count:copyValues:from:]	
7	CoreFoundation			-[CFPrefsSource setValue:forKey:from:]	
8	CoreFoundation			__76-[_CFXPreferences setValue:forKey:appIdentifier:container:configurationURL:]_block_invoke	
9	CoreFoundation			__108-[_CFXPreferences(SearchListAdditions) withSearchListForIdentifier:container:cloudConfigurationURL:perform:]_block_invoke	
10	CoreFoundation			normalizeQuintuplet	
11	CoreFoundation			-[_CFXPreferences withSearchListForIdentifier:container:cloudConfigurationURL:perform:]	
12	CoreFoundation			-[_CFXPreferences setValue:forKey:appIdentifier:container:configurationURL:]	
13	CoreFoundation			_CFPreferencesSetAppValueWithContainerAndConfiguration	
14	Foundation				-[NSUserDefaults(NSUserDefaults) setObject:forKey:]	
15	my_app				-[RCDeviceCache setLatestNetworkAndAdvertisingIdsSent:forAppUserID:] + 388 (RCDeviceCache.m:388)	
16	my_app				(Missing)	
17	my_app				(Missing)	
18	my_app				__69-[RCBackend postAttributionData:fromNetwork:forAppUserID:completion:]_block_invoke + 346 (RCBackend.m:346)	
19	my_app				(Missing)	
20	my_app				(Missing)	
21	CFNetwork			CFNetServiceBrowserSearchForServices	
22	CFNetwork			_CFHTTPMessageSetResponseProxyURL	
23	libdispatch.dylib		_dispatch_call_block_and_release	
24	libdispatch.dylib		_dispatch_client_callout	
25	libdispatch.dylib		_dispatch_lane_serial_drain$VARIANT$mp	
26	libdispatch.dylib		_dispatch_lane_invoke$VARIANT$mp	
27	libdispatch.dylib		_dispatch_workloop_worker_thread	
28	libsystem_pthread.dylib		_pthread_wqthread	
29	libsystem_pthread.dylib		start_wqthread	

Sorry, do not have steps, please let me know if the pasted call stack is not enough for the issue.

I assume that deprecated logic is broken.

Trying to understand entitlements - Not a bug

  1. Environment
    1. Platform: Unity
    2. SDK version: 3.4.1
    3. OS + version:
    4. Xcode/Android Studio version:
    5. Unity version: 2019.4.30
    6. How widespread is the issue. Percentage of devices affected.

So we are facing a weird edge case in the app.

Two months ago I created an entitlement "monthlysub" and assigned two products "monthlysub" from apple and "monthysub" from google play store (I know the naming convention is not ideal).
So a user purchased the subscription "monthlysub" and cancelled it later on.

Now we decided to create a new product for specific users with 30 days trial. We decided to name the new product "amplimontlysub" on both apple and google platforms.
Next, I decided to add these products under the already exiting "monthlysub" entitlement. So now " monthlysub" entitlement has a total of four products.
Now when an old user who purchased two months ago but cancelled it decide to subscribe to "amplimontlysub" product and the transactions from the apple side go thru, the transaction is done I see a pop from apple "you are all set" then I get an error from revenuecat that "there is already another active subscriber using the same receipt".

How do I handle this? we want to offer a different subscription to a few specific users who signup for the app using a promocode.

Is it because the entitlement is same for all 4 products?

Unable to resubscribe after expiration in TestFlight/sandbox environment (many related posts before without a solution)

Describe the bug

(Also posted in the community: https://community.revenuecat.com/sdks-51/unable-to-resubscribe-after-expiration-in-testflight-sandbox-environment-many-related-posts-before-without-a-solution-2006)

Hi,

I have searched and read many posts regarding my problem.

A
Unable to re-purchase a subscription in sandbox.
T
Guidance on handling expired subscriptions
P
Unable to re purchase subscription in sandbox environment of IOS.
R
resubscribes is not currently working for me

Many users encountered the same issue as mine. However, none of them received a solution or clear confirmation about this issue.

A new sandbox user works fine with the first purchase of a subscription item. But after expiration, if we want to resubscribe, it sometimes just fails.

More specifically, we are using https://github.com/RevenueCat/purchases-unity/releases/download/4.1.0/Purchases-UnityIAP.unitypackage with a Unity app.

When we click on a subscription button for a resubscription, the function PurchasePackage works fine without an error, but in the callback, we check customerInfo.Entitlements.Active.ContainsKey(entitlementId) and it is still false.

I think at least there should be a confirmation whether it only happens in TestFlight/sandbox environment or not?

Thanks!

Do not remove any of the steps from the template below. If a step is not applicable to your issue, please leave that step empty.

  1. Environment

    1. Platform: iOS
    2. SDK version: 4.1.0
    3. OS + version:
    4. Xcode/Android Studio version:
    5. Unity version: 2020.3.32f1
    6. How widespread is the issue. Percentage of devices affected.
  2. Debug logs that reproduce the issue

  • (1) This is from the first subscription:
Got all offerings!
RevenueCatPurchaseManager:InitializePurchases()

2022-09-02 15:02:10.691183+0800 PreteethAIPro[8527:584505] [Purchases] - DEBUG: ℹ️ Vending Offerings from cache
2022-09-02 15:02:10.691597+0800 PreteethAIPro[8527:584505] [Purchases] - WARN: ⚠️ This StoreProduct represents an SK1 product, the type of product cannot be determined, the value will be undefined. Use `StoreProduct.productCategory` instead.
2022-09-02 15:02:10.691896+0800 PreteethAIPro[8527:584505] [Purchases] - WARN: ⚠️ This StoreProduct represents an SK1 product, the type of product cannot be determined, the value will be undefined. Use `StoreProduct.productCategory` instead.
2022-09-02 15:02:10.692098+0800 PreteethAIPro[8527:584505] [Purchases] - WARN: ⚠️ This StoreProduct represents an SK1 product, the type of product cannot be determined, the value will be undefined. Use `StoreProduct.productCategory` instead.
2022-09-02 15:02:10.692281+0800 PreteethAIPro[8527:584505] [Purchases] - WARN: ⚠️ This StoreProduct represents an SK1 product, the type of product cannot be determined, the value will be undefined. Use `StoreProduct.productCategory` instead.
2022-09-02 15:02:10.692493+0800 PreteethAIPro[8527:584505] [Purchases] - WARN: ⚠️ This StoreProduct represents an SK1 product, the type of product cannot be determined, the value will be undefined. Use `StoreProduct.productCategory` instead.
2022-09-02 15:02:10.692675+0800 PreteethAIPro[8527:584505] [Purchases] - WARN: ⚠️ This StoreProduct represents an SK1 product, the type of product cannot be determined, the value will be undefined. Use `StoreProduct.productCategory` instead.
2022-09-02 15:02:10.692832+0800 PreteethAIPro[8527:584505] [Purchases] - WARN: ⚠️ This StoreProduct represents an SK1 product, the type of product cannot be determined, the value will be undefined. Use `StoreProduct.productCategory` instead.
2022-09-02 15:02:10.692987+0800 PreteethAIPro[8527:584505] [Purchases] - WARN: ⚠️ This StoreProduct represents an SK1 product, the type of product cannot be determined, the value will be undefined. Use `StoreProduct.productCategory` instead.
2022-09-02 15:02:10.693484+0800 PreteethAIPro[8527:584505] json = {"offerings":{"current":{"availablePackages":[{"identifier":"$rc_annual","offeringIdentifier":"default","packageType":"ANNUAL","product":{"title":"Preteeth AI Pro Annual","introPrice":{"cycles":1,"price":0,"periodUnit":"MONTH","priceString":"$0.00","periodNumberOfUnits":1,"period":"P1M"},"priceString":"$15,900.00","identifier":"com.preteethai.dentist.subscription.annual","productCategory":"SUBSCRIPTION","price":15900,"currencyCode":"TWD","discounts":[],"productType":"NON_CONSUMABLE","description":"Preteeth AI Pro Annual"}},{"packageType":"MONTHLY","product":{"discounts":[],"priceString":"$3,290.00","productType":"NON_CONSUMABLE","introPrice":{"periodUnit":"MONTH","price":0,"periodNumberOfUnits":1,"cycles":1,"priceString":"$0.00","period":"P1M"},"productCategory":"SUBSCRIPTION","price":3290,"description":"Preteeth AI Pro Monthly","identifier":"com.preteethai.dentist.subscription.monthly","currencyCode":"TWD","title":"Preteeth AI Pro Monthly"},"offeringIdentifier":"default","identifier":"$rc_monthly"}],"annual":{"offeringIdentifier":"default","identifier":"$rc_annual","product":{"discounts":[],"description":"Preteeth AI Pro Annual","productType":"NON_CONSUMABLE","currencyCode":"TWD","identifier":"com.preteethai.dentist.subscription.annual","title":"Preteeth AI Pro Annual","productCategory":"SUBSCRIPTION","price":15900,"introPrice":{"price":0,"periodUnit":"MONTH","cycles":1,"period":"P1M","priceString":"$0.00","periodNumberOfUnits":1},"priceString":"$15,900.00"},"packageType":"ANNUAL"},"serverDescription":"The standard set of packages","identifier":"default","monthly":{"product":{"description":"Preteeth AI Pro Monthly","introPrice":{"period":"P1M","price":0,"periodUnit":"MONTH","periodNumberOfUnits":1,"priceString":"$0.00","cycles":1},"discounts":[],"price":3290,"priceString":"$3,290.00","productType":"NON_CONSUMABLE","title":"Preteeth AI Pro Monthly","productCategory":"SUBSCRIPTION","currencyCode":"TWD","identifier":"com.preteethai.dentist.subscription.monthly"},"packageType":"MONTHLY","identifier":"$rc_monthly","offeringIdentifier":"default"}},"all":{"default":{"annual":{"product":{"introPrice":{"period":"P1M","cycles":1,"periodUnit":"MONTH","priceString":"$0.00","periodNumberOfUnits":1,"price":0},"priceString":"$15,900.00","currencyCode":"TWD","discounts":[],"description":"Preteeth AI Pro Annual","identifier":"com.preteethai.dentist.subscription.annual","productCategory":"SUBSCRIPTION","productType":"NON_CONSUMABLE","title":"Preteeth AI Pro Annual","price":15900},"identifier":"$rc_annual","packageType":"ANNUAL","offeringIdentifier":"default"},"availablePackages":[{"identifier":"$rc_annual","packageType":"ANNUAL","offeringIdentifier":"default","product":{"introPrice":{"priceString":"$0.00","period":"P1M","periodUnit":"MONTH","cycles":1,"price":0,"periodNumberOfUnits":1},"price":15900,"productCategory":"SUBSCRIPTION","priceString":"$15,900.00","title":"Preteeth AI Pro Annual","description":"Preteeth AI Pro Annual","productType":"NON_CONSUMABLE","discounts":[],"identifier":"com.preteethai.dentist.subscription.annual","currencyCode":"TWD"}},{"identifier":"$rc_monthly","product":{"productType":"NON_CONSUMABLE","identifier":"com.preteethai.dentist.subscription.monthly","title":"Preteeth AI Pro Monthly","discounts":[],"price":3290,"currencyCode":"TWD","productCategory":"SUBSCRIPTION","priceString":"$3,290.00","description":"Preteeth AI Pro Monthly","introPrice":{"cycles":1,"priceString":"$0.00","price":0,"period":"P1M","periodUnit":"MONTH","periodNumberOfUnits":1}},"packageType":"MONTHLY","offeringIdentifier":"default"}],"identifier":"default","serverDescription":"The standard set of packages","monthly":{"packageType":"MONTHLY","offeringIdentifier":"default","identifier":"$rc_monthly","product":{"productType":"NON_CONSUMABLE","price":3290,"identifier":"com.preteethai.dentist.subscription.monthly","introPrice":{"cycles":1,"period":"P1M","periodUnit":"MONTH","price":0,"periodNumberOfUnits":1,"priceString":"$0.00"},"title":"Preteeth AI Pro Monthly","currencyCode":"TWD","description":"Preteeth AI Pro Monthly","priceString":"$3,290.00","discounts":[],"productCategory":"SUBSCRIPTION"}}}}}}

_getOfferings {"offerings":{"current":{"availablePackages":[{"identifier":"$rc_annual","offeringIdentifier":"default","packageType":"ANNUAL","product":{"title":"Preteeth AI Pro Annual","introPrice":{"cycles":1,"price":0,"periodUnit":"MONTH","priceString":"$0.00","periodNumberOfUnits":1,"period":"P1M"},"priceString":"$15,900.00","identifier":"com.preteethai.dentist.subscription.annual","productCategory":"SUBSCRIPTION","price":15900,"currencyCode":"TWD","discounts":[],"productType":"NON_CONSUMABLE","description":"Preteeth AI Pro Annual"}},{"packageType":"MONTHLY","product":{"discounts":[],"priceString":"$3,290.00","productType":"NON_CONSUMABLE","introPrice":{"periodUnit":"MONTH","price":0,"periodNumberOfUnits":1,"cycles":1,"priceString":"$0.00","period":"P1M"},"productCategory":"SUBSCRIPTION","price":3290,"description":"Preteeth AI Pro Monthly","identifier":"com.preteethai.dentist.subscription.monthly","currencyCode":"TWD","title":"Preteeth AI Pro Monthly"},"offeringIdentifier":"default","identifier":"$rc_monthly"}],"annual":{"offeringIdentifier":"default","identifier":"$rc_annual","product":{"discounts":[],"description":"Preteeth AI Pro Annual","productType":"NON_CONSUMABLE","currencyCode":"TWD","identifier":"com.preteethai.dentist.subscription.annual","title":"Preteeth AI Pro Annual","productCategory":"SUBSCRIPTION","price":15900,"introPrice":{"price":0,"periodUnit":"MONTH","cycles":1,"period":"P1M","priceString":"$0.00","periodNumberOfUnits":1},"priceString":"$15,900.00"},"packageType":"ANNUAL"},"serverDescription":"The standard set of packages","identifier":"default","monthly":{"product":{"description":"Preteeth AI Pro Monthly","introPrice":{"period":"P1M","price":0,"periodUnit":"MONTH","periodNumberOfUnits":1,"priceString":"$0.00","cycles":1},"discounts":[],"price":3290,"priceString":"$3,290.00","productType":"NON_CONSUMABLE","title":"Preteeth AI Pro Monthly","productCategory":"SUBSCRIPTION","currencyCode":"TWD","identifier":"com.preteethai.dentist.subscription.monthly"},"packageType":"MONTHLY","identifier":"$rc_monthly","offeringIdentifier":"default"}},"all":{"default":{"annual":{"product":{"introPrice":{"period":"P1M","cycles":1,"periodUnit":"MONTH","priceString":"$0.00","periodNumberOfUnits":1,"price":0},"priceString":"$15,900.00","currencyCode":"TWD","discounts":[],"description":"Preteeth AI Pro Annual","identifier":"com.preteethai.dentist.subscription.annual","productCategory":"SUBSCRIPTION","productType":"NON_CONSUMABLE","title":"Preteeth AI Pro Annual","price":15900},"identifier":"$rc_annual","packageType":"ANNUAL","offeringIdentifier":"default"},"availablePackages":[{"identifier":"$rc_annual","packageType":"ANNUAL","offeringIdentifier":"default","product":{"introPrice":{"priceString":"$0.00","period":"P1M","periodUnit":"MONTH","cycles":1,"price":0,"periodNumberOfUnits":1},"price":15900,"productCategory":"SUBSCRIPTION","priceString":"$15,900.00","title":"Preteeth AI Pro Annual","description":"Preteeth AI Pro Annual","productType":"NON_CONSUMABLE","discounts":[],"identifier":"com.preteethai.dentist.subscription.annual","currencyCode":"TWD"}},{"identifier":"$rc_monthly","product":{"productType":"NON_CONSUMABLE","identifier":"com.preteethai.dentist.subscription.monthly","title":"Preteeth AI Pro Monthly","discounts":[],"price":3290,"currencyCode":"TWD","productCategory":"SUBSCRIPTION","priceString":"$3,290.00","description":"Preteeth AI Pro Monthly","introPrice":{"cycles":1,"priceString":"$0.00","price":0,"period":"P1M","periodUnit":"MONTH","periodNumberOfUnits":1}},"packageType":"MONTHLY","offeringIdentifier":"default"}],"identifier":"default","serverDescription":"The standard set of packages","monthly":{"packageType":"MONTHLY","offeringIdentifier":"default","identifier":"$rc_monthly","product":{"productType":"NON_CONSUMABLE","price":3290,"identifier":"com.preteethai.dentist.subscription.monthly","introPrice":{"cycles":1,"period":"P1M","periodUnit":"MONTH","price":0,"periodNumberOfUnits":1,"priceString":"$0.00"},"title":"Preteeth AI Pro Monthly","currencyCode":"TWD","description":"Preteeth AI Pro Monthly","priceString":"$3,290.00","discounts":[],"productCategory":"SUBSCRIPTION"}}}}}}
Purchases:_getOfferings(String)

Purchases GetOfferings succeeded!
RevenueCatPurchaseManager:<GetOfferingsAndSetIsSubscribedAndLogIn>b__17_0(Offerings, Error)
GetOfferingsFunc:Invoke(Offerings, Error)
Purchases:_getOfferings(String)

2022-09-02 15:02:10.703620+0800 PreteethAIPro[8527:584505] [Purchases] - DEBUG: ℹ️ Vending CustomerInfo from cache.
2022-09-02 15:02:10.704570+0800 PreteethAIPro[8527:584505] json = {"customerInfo":{"originalPurchaseDate":null,"latestExpirationDateMillis":null,"nonSubscriptionTransactions":[],"managementURL":null,"activeSubscriptions":[],"allPurchasedProductIdentifiers":[],"firstSeen":"2022-09-02T07:01:49Z","entitlements":{"active":{},"all":{}},"latestExpirationDate":null,"allExpirationDates":{},"allExpirationDatesMillis":{},"originalPurchaseDateMillis":null,"originalAppUserId":"$RCAnonymousID:63972c9ae6bd42ccb8ca9be1222ae775","requestDateMillis":1662102109000,"originalApplicationVersion":null,"requestDate":"2022-09-02T07:01:49Z","firstSeenMillis":1662102109000,"allPurchaseDates":{},"allPurchaseDatesMillis":{}}}
_getCustomerInfo {"customerInfo":{"originalPurchaseDate":null,"latestExpirationDateMillis":null,"nonSubscriptionTransactions":[],"managementURL":null,"activeSubscriptions":[],"allPurchasedProductIdentifiers":[],"firstSeen":"2022-09-02T07:01:49Z","entitlements":{"active":{},"all":{}},"latestExpirationDate":null,"allExpirationDates":{},"allExpirationDatesMillis":{},"originalPurchaseDateMillis":null,"originalAppUserId":"$RCAnonymousID:63972c9ae6bd42ccb8ca9be1222ae775","requestDateMillis":1662102109000,"originalApplicationVersion":null,"requestDate":"2022-09-02T07:01:49Z","firstSeenMillis":1662102109000,"allPurchaseDates":{},"allPurchaseDatesMillis":{}}}
Purchases:_getCustomerInfo(String)

2022-09-02 15:02:10.709135+0800 PreteethAIPro[8527:585089] [Purchases] - DEBUG: ℹ️ LogInOperation: Started
2022-09-02 15:02:10.709239+0800 PreteethAIPro[8527:585089] [Purchases] - DEBUG: ℹ️ There are no requests currently running, starting request POST subscribers/identify
2022-09-02 15:02:10.710162+0800 PreteethAIPro[8527:585089] [Purchases] - DEBUG: ℹ️ API request started: POST /v1/subscribers/identify
2022-09-02 15:02:11.379985+0800 PreteethAIPro[8527:585089] [Purchases] - DEBUG: ℹ️ API request completed: POST /v1/subscribers/identify 200
2022-09-02 15:02:11.405508+0800 PreteethAIPro[8527:585089] [Purchases] - DEBUG: 👤 Log in successful
2022-09-02 15:02:11.414482+0800 PreteethAIPro[8527:585089] [Purchases] - DEBUG: ℹ️ Sending updated CustomerInfo to delegate.
2022-09-02 15:02:11.414654+0800 PreteethAIPro[8527:585089] [Purchases] - DEBUG: ℹ️ LogInOperation: Finished
2022-09-02 15:02:11.414788+0800 PreteethAIPro[8527:585089] [Purchases] - DEBUG: ℹ️ Serial request done: POST subscribers/identify, 0 requests left in the queue
2022-09-02 15:02:11.415137+0800 PreteethAIPro[8527:584505] json = {"created":false,"customerInfo":{"allExpirationDatesMillis":{"com.preteethai.dentist.subscription.monthly":1662065629000,"com.preteethai.dentist.subscription.pro":1660673681000,"com.preteethai.dentist.subscription.month":1661325054000},"allPurchaseDates":{"com.preteethai.dentist.subscription.pro":"2022-08-16T18:09:41Z","com.preteethai.dentist.subscription.month":"2022-08-24T07:05:54Z","com.preteethai.dentist.subscription.monthly":"2022-09-01T20:48:49Z"},"firstSeen":"2022-09-01T04:16:22Z","requestDateMillis":1662102131000,"originalPurchaseDate":"2013-08-01T07:00:00Z","requestDate":"2022-09-02T07:02:11Z","originalApplicationVersion":"1.0","allPurchasedProductIdentifiers":["com.preteethai.dentist.subscription.pro","com.preteethai.dentist.subscription.monthly","com.preteethai.dentist.subscription.month"],"originalAppUserId":"$RCAnonymousID:e3b37ae862c941febc374494917cc0b0","latestExpirationDate":"2022-09-01T20:53:49Z","allPurchaseDatesMillis":{"com.preteethai.dentist.subscription.pro":1660673381000,"com.preteethai.dentist.subscription.monthly":1662065329000,"com.preteethai.dentist.subscription.month":1661324754000},"latestExpirationDateMillis":1662065629000,"entitlements":{"all":{"pro":{"originalPurchaseDate":"2022-08-31T14:01:28Z","latestPurchaseDateMillis":1662065329000,"expirationDate":"2022-09-01T20:53:49Z","store":"APP_STORE","billingIssueDetectedAtMillis":null,"productIdentifier":"com.preteethai.dentist.subscription.monthly","identifier":"pro","latestPurchaseDate":"2022-09-01T20:48:49Z","isActive":false,"periodType":"NORMAL","isSandbox":true,"billingIssueDetectedAt":null,"willRenew":false,"expirationDateMillis":1662065629000,"unsubscribedDetectedAt":"2022-09-01T20:54:01Z","ownershipType":"PURCHASED","unsubscribedDetectedAtMillis":1662065641000,"originalPurchaseDateMillis":1661954488000}},"active":{}},"activeSubscriptions":[],"firstSeenMillis":1662005782000,"originalPurchaseDateMillis":1375340400000,"nonSubscriptionTransactions":[],"allExpirationDates":{"com.preteethai.dentist.subscription.monthly":"2022-09-01T20:53:49Z","com.preteethai.dentist.subscription.pro":"2022-08-16T18:14:41Z","com.preteethai.dentist.subscription.month":"2022-08-24T07:10:54Z"},"managementURL":null}}
2022-09-02 15:02:11.415963+0800 PreteethAIPro[8527:585089] [Purchases] - DEBUG: ℹ️ GetOfferingsOperation: Started
2022-09-02 15:02:11.416045+0800 PreteethAIPro[8527:585089] [Purchases] - DEBUG: ℹ️ There are no requests currently running, starting request GET subscribers/v0kpCeNMD0UsHZIFNyDZW5uUc0x1/offerings
2022-09-02 15:02:11.417677+0800 PreteethAIPro[8527:585089] [Purchases] - DEBUG: ℹ️ API request started: GET /v1/subscribers/v0kpCeNMD0UsHZIFNyDZW5uUc0x1/offerings
_logIn {"created":false,"customerInfo":{"allExpirationDatesMillis":{"com.preteethai.dentist.subscription.monthly":1662065629000,"com.preteethai.dentist.subscription.pro":1660673681000,"com.preteethai.dentist.subscription.month":1661325054000},"allPurchaseDates":{"com.preteethai.dentist.subscription.pro":"2022-08-16T18:09:41Z","com.preteethai.dentist.subscription.month":"2022-08-24T07:05:54Z","com.preteethai.dentist.subscription.monthly":"2022-09-01T20:48:49Z"},"firstSeen":"2022-09-01T04:16:22Z","requestDateMillis":1662102131000,"originalPurchaseDate":"2013-08-01T07:00:00Z","requestDate":"2022-09-02T07:02:11Z","originalApplicationVersion":"1.0","allPurchasedProductIdentifiers":["com.preteethai.dentist.subscription.pro","com.preteethai.dentist.subscription.monthly","com.preteethai.dentist.subscription.month"],"originalAppUserId":"$RCAnonymousID:e3b37ae862c941febc374494917cc0b0","latestExpirationDate":"2022-09-01T20:53:49Z","allPurchaseDatesMillis":{"com.preteethai.dentist.subscription.pro":1660673381000,"com.preteethai.dentist.subscription.monthly":1662065329000,"com.preteethai.dentist.subscription.month":1661324754000},"latestExpirationDateMillis":1662065629000,"entitlements":{"all":{"pro":{"originalPurchaseDate":"2022-08-31T14:01:28Z","latestPurchaseDateMillis":1662065329000,"expirationDate":"2022-09-01T20:53:49Z","store":"APP_STORE","billingIssueDetectedAtMillis":null,"productIdentifier":"com.preteethai.dentist.subscription.monthly","identifier":"pro","latestPurchaseDate":"2022-09-01T20:48:49Z","isActive":false,"periodType":"NORMAL","isSandbox":true,"billingIssueDetectedAt":null,"willRenew":false,"expirationDateMillis":1662065629000,"unsubscribedDetectedAt":"2022-09-01T20:54:01Z","ownershipType":"PURCHASED","unsubscribedDetectedAtMillis":1662065641000,"originalPurchaseDateMillis":1661954488000}},"active":{}},"activeSubscriptions":[],"firstSeenMillis":1662005782000,"originalPurchaseDateMillis":1375340400000,"nonSubscriptionTransactions":[],"allExpirationDates":{"com.preteethai.dentist.subscription.monthly":"2022-09-01T20:53:49Z","com.preteethai.dentist.subscription.pro":"2022-08-16T18:14:41Z","com.preteethai.dentist.subscription.month":"2022-08-24T07:10:54Z"},"managementURL":null}}
Purchases:_logIn(String)

Updated UI: isSubscribed = false
RevenueCatPurchaseManager:UpdateUI()
RevenueCatPurchaseManager:<LogIn>b__19_0(CustomerInfo, Boolean, Error)
LogInFunc:Invoke(CustomerInfo, Boolean, Error)
Purchases:_logIn(String)

2022-09-02 15:02:11.685750+0800 PreteethAIPro[8527:585090] [Purchases] - DEBUG: ℹ️ API request completed: GET /v1/subscribers/v0kpCeNMD0UsHZIFNyDZW5uUc0x1/offerings 200
2022-09-02 15:02:11.693256+0800 PreteethAIPro[8527:585090] [Purchases] - DEBUG: ℹ️ GetOfferingsOperation: Finished
2022-09-02 15:02:11.693660+0800 PreteethAIPro[8527:584991] [Purchases] - DEBUG: ℹ️ Skipping products request because products were already cached. products: ["com.preteethai.dentist.subscription.monthly", "com.preteethai.dentist.subscription.annual"]
2022-09-02 15:02:11.693850+0800 PreteethAIPro[8527:585090] [Purchases] - DEBUG: ℹ️ Serial request done: GET subscribers/v0kpCeNMD0UsHZIFNyDZW5uUc0x1/offerings, 0 requests left in the queue
2022-09-02 15:02:30.014053+0800 PreteethAIPro[8527:584505] Could not signal service com.apple.WebKit.WebContent: 113: Could not find specified service

2022-09-02 15:02:39.338844+0800 PreteethAIPro[8527:584505] [Purchases] - DEBUG: ℹ️ Vending Offerings from cache
2022-09-02 15:02:39.339170+0800 PreteethAIPro[8527:584505] [Purchases] - INFO: 💰 Purchasing Product 'com.preteethai.dentist.subscription.monthly' from package in Offering 'default'
2022-09-02 15:02:39.356072+0800 PreteethAIPro[8527:584505] [Purchases] - DEBUG: ℹ️ PaymentQueue updatedTransaction: com.preteethai.dentist.subscription.monthly 0
2022-09-02 15:02:39.356276+0800 PreteethAIPro[8527:584505] [Purchases] - WARN: 🍎‼️ There is a problem with the SKPaymentTransaction missing a transaction date - this is an issue with the App Store. Unix Epoch will be used instead.
Transactions in the backend and in webhooks are unaffected and will have the correct timestamps. This is a bug in StoreKit 1. To prevent running into this issue on devices running iOS 15+, watchOS 8+, macOS 12+, and tvOS 15+, you can set `usesStoreKit2IfAvailable` to true when calling `configure`.
2022-09-02 15:02:39.356392+0800 PreteethAIPro[8527:584505] [Purchases] - WARN: 🍎‼️ There is a problem with the SKPaymentTransaction missing a transaction identifier - this is an issue with the App Store.Transactions in the backend and in webhooks are unaffected and will have the correct identifier. This is a bug in StoreKit 1. To prevent running into this issue on devices running iOS 15+, watchOS 8+, macOS 12+, and tvOS 15+, you can set `usesStoreKit2IfAvailable` to true when calling `configure`.
2022-09-02 15:02:41.991024+0800 PreteethAIPro[8527:585090] [tcp] tcp_input [C2.1.1:3] flags=[R] seq=770651323, ack=0, win=0 state=LAST_ACK rcv_nxt=770651323, snd_una=145395136
2022-09-02 15:02:41.992037+0800 PreteethAIPro[8527:585090] [tcp] tcp_input [C2.1.1:3] flags=[R] seq=770651323, ack=0, win=0 state=CLOSED rcv_nxt=770651323, snd_una=145395136
-> applicationWillResignActive()
-> applicationDidBecomeActive()
2022-09-02 15:03:08.034896+0800 PreteethAIPro[8527:584505] [Purchases] - DEBUG: ℹ️ applicationDidBecomeActive
-> applicationWillResignActive()
-> applicationDidBecomeActive()
2022-09-02 15:03:20.394589+0800 PreteethAIPro[8527:584505] [Purchases] - DEBUG: ℹ️ applicationDidBecomeActive
2022-09-02 15:03:20.558321+0800 PreteethAIPro[8527:584505] [Purchases] - DEBUG: ℹ️ PaymentQueue updatedTransaction: com.preteethai.dentist.subscription.monthly 2000000144938720 2000000143341334 1
2022-09-02 15:03:20.559361+0800 PreteethAIPro[8527:584505] [Purchases] - DEBUG: ℹ️ Force refreshing the receipt to get latest transactions from Apple.
2022-09-02 15:03:22.177476+0800 PreteethAIPro[8527:585552] [Purchases] - DEBUG: ℹ️ Loaded receipt from url file:///private/var/mobile/Containers/Data/Application/DED4A1FD-D7DC-439E-B212-40B66F9BB70B/StoreKit/sandboxReceipt
2022-09-02 15:03:22.177612+0800 PreteethAIPro[8527:585344] [Purchases] - DEBUG: ℹ️ Skipping products request because products were already cached. products: ["com.preteethai.dentist.subscription.monthly"]
2022-09-02 15:03:22.177876+0800 PreteethAIPro[8527:584505] [Purchases] - DEBUG: ℹ️ Found 0 unsynced attributes for App User ID: v0kpCeNMD0UsHZIFNyDZW5uUc0x1
2022-09-02 15:03:22.188387+0800 PreteethAIPro[8527:585344] [Purchases] - DEBUG: ℹ️ PostReceiptDataOperation: Started
2022-09-02 15:03:22.188455+0800 PreteethAIPro[8527:585344] [Purchases] - DEBUG: ℹ️ There are no requests currently running, starting request POST receipts
2022-09-02 15:03:22.190839+0800 PreteethAIPro[8527:585344] [Purchases] - DEBUG: ℹ️ API request started: POST /v1/receipts
2022-09-02 15:03:24.999318+0800 PreteethAIPro[8527:585344] [Purchases] - DEBUG: ℹ️ API request completed: POST /v1/receipts 200
2022-09-02 15:03:25.024815+0800 PreteethAIPro[8527:585344] [Purchases] - DEBUG: ℹ️ PostReceiptDataOperation: Finished
2022-09-02 15:03:25.025304+0800 PreteethAIPro[8527:585344] [Purchases] - DEBUG: ℹ️ Serial request done: POST receipts, 0 requests left in the queue
2022-09-02 15:03:25.030774+0800 PreteethAIPro[8527:584505] [Purchases] - DEBUG: ℹ️ Sending updated CustomerInfo to delegate.
2022-09-02 15:03:25.031144+0800 PreteethAIPro[8527:584505] [Purchases] - INFO: 😻💰 Purchased product - 'com.preteethai.dentist.subscription.monthly'
2022-09-02 15:03:25.031974+0800 PreteethAIPro[8527:584505] json = {"productIdentifier":"com.preteethai.dentist.subscription.monthly","userCancelled":false,"customerInfo":{"originalPurchaseDateMillis":1375340400000,"latestExpirationDate":"2022-09-02T07:08:11Z","activeSubscriptions":["com.preteethai.dentist.subscription.monthly"],"firstSeen":"2022-09-01T04:16:22Z","allExpirationDates":{"com.preteethai.dentist.subscription.month":"2022-08-24T07:10:54Z","com.preteethai.dentist.subscription.pro":"2022-08-16T18:14:41Z","com.preteethai.dentist.subscription.monthly":"2022-09-02T07:08:11Z"},"managementURL":"https:\/\/apps.apple.com\/account\/subscriptions","requestDate":"2022-09-02T07:03:24Z","originalApplicationVersion":"1.0","allPurchaseDates":{"com.preteethai.dentist.subscription.pro":"2022-08-16T18:09:41Z","com.preteethai.dentist.subscription.month":"2022-08-24T07:05:54Z","com.preteethai.dentist.subscription.monthly":"2022-09-02T07:03:11Z"},"allPurchasedProductIdentifiers":["com.preteethai.dentist.subscription.monthly","com.preteethai.dentist.subscription.pro","com.preteethai.dentist.subscription.month"],"allPurchaseDatesMillis":{"com.preteethai.dentist.subscription.month":1661324754000,"com.preteethai.dentist.subscription.monthly":1662102191000,"com.preteethai.dentist.subscription.pro":1660673381000},"nonSubscriptionTransactions":[],"requestDateMillis":1662102204000,"entitlements":{"all":{"pro":{"productIdentifier":"com.preteethai.dentist.subscription.monthly","periodType":"NORMAL","latestPurchaseDate":"2022-09-02T07:03:11Z","originalPurchaseDate":"2022-08-31T14:01:28Z","store":"APP_STORE","unsubscribedDetectedAt":null,"originalPurchaseDateMillis":1661954488000,"latestPurchaseDateMillis":1662102191000,"expirationDateMillis":1662102491000,"willRenew":true,"expirationDate":"2022-09-02T07:08:11Z","billingIssueDetectedAt":null,"isSandbox":true,"unsubscribedDetectedAtMillis":null,"billingIssueDetectedAtMillis":null,"ownershipType":"PURCHASED","identifier":"pro","isActive":true}},"active":{"pro":{"isActive":true,"latestPurchaseDateMillis":1662102191000,"periodType":"NORMAL","willRenew":true,"unsubscribedDetectedAtMillis":null,"originalPurchaseDateMillis":1661954488000,"expirationDateMillis":1662102491000,"identifier":"pro","productIdentifier":"com.preteethai.dentist.subscription.monthly","unsubscribedDetectedAt":null,"ownershipType":"PURCHASED","originalPurchaseDate":"2022-08-31T14:01:28Z","store":"APP_STORE","isSandbox":true,"latestPurchaseDate":"2022-09-02T07:03:11Z","billingIssueDetectedAt":null,"billingIssueDetectedAtMillis":null,"expirationDate":"2022-09-02T07:08:11Z"}}},"firstSeenMillis":1662005782000,"originalPurchaseDate":"2013-08-01T07:00:00Z","latestExpirationDateMillis":1662102491000,"originalAppUserId":"$RCAnonymousID:e3b37ae862c941febc374494917cc0b0","allExpirationDatesMillis":{"com.preteethai.dentist.subscription.monthly":1662102491000,"com.preteethai.dentist.subscription.pro":1660673681000,"com.preteethai.dentist.subscription.month":1661325054000}}}
2022-09-02 15:03:25.032486+0800 PreteethAIPro[8527:584505] [Purchases] - INFO: 💰 Finishing transaction com.preteethai.dentist.subscription.monthly 2000000144938720 (2000000143341334)
_makePurchase {"productIdentifier":"com.preteethai.dentist.subscription.monthly","userCancelled":false,"customerInfo":{"originalPurchaseDateMillis":1375340400000,"latestExpirationDate":"2022-09-02T07:08:11Z","activeSubscriptions":["com.preteethai.dentist.subscription.monthly"],"firstSeen":"2022-09-01T04:16:22Z","allExpirationDates":{"com.preteethai.dentist.subscription.month":"2022-08-24T07:10:54Z","com.preteethai.dentist.subscription.pro":"2022-08-16T18:14:41Z","com.preteethai.dentist.subscription.monthly":"2022-09-02T07:08:11Z"},"managementURL":"https:\/\/apps.apple.com\/account\/subscriptions","requestDate":"2022-09-02T07:03:24Z","originalApplicationVersion":"1.0","allPurchaseDates":{"com.preteethai.dentist.subscription.pro":"2022-08-16T18:09:41Z","com.preteethai.dentist.subscription.month":"2022-08-24T07:05:54Z","com.preteethai.dentist.subscription.monthly":"2022-09-02T07:03:11Z"},"allPurchasedProductIdentifiers":["com.preteethai.dentist.subscription.monthly","com.preteethai.dentist.subscription.pro","com.preteethai.dentist.subscription.month"],"allPurchaseDatesMillis":{"com.preteethai.dentist.subscription.month":1661324754000,"com.preteethai.dentist.subscription.monthly":1662102191000,"com.preteethai.dentist.subscription.pro":1660673381000},"nonSubscriptionTransactions":[],"requestDateMillis":1662102204000,"entitlements":{"all":{"pro":{"productIdentifier":"com.preteethai.dentist.subscription.monthly","periodType":"NORMAL","latestPurchaseDate":"2022-09-02T07:03:11Z","originalPurchaseDate":"2022-08-31T14:01:28Z","store":"APP_STORE","unsubscribedDetectedAt":null,"originalPurchaseDateMillis":1661954488000,"latestPurchaseDateMillis":1662102191000,"expirationDateMillis":1662102491000,"willRenew":true,"expirationDate":"2022-09-02T07:08:11Z","billingIssueDetectedAt":null,"isSandbox":true,"unsubscribedDetectedAtMillis":null,"billingIssueDetectedAtMillis":null,"ownershipType":"PURCHASED","identifier":"pro","isActive":true}},"active":{"pro":{"isActive":true,"latestPurchaseDateMillis":1662102191000,"periodType":"NORMAL","willRenew":true,"unsubscribedDetectedAtMillis":null,"originalPurchaseDateMillis":1661954488000,"expirationDateMillis":1662102491000,"identifier":"pro","productIdentifier":"com.preteethai.dentist.subscription.monthly","unsubscribedDetectedAt":null,"ownershipType":"PURCHASED","originalPurchaseDate":"2022-08-31T14:01:28Z","store":"APP_STORE","isSandbox":true,"latestPurchaseDate":"2022-09-02T07:03:11Z","billingIssueDetectedAt":null,"billingIssueDetectedAtMillis":null,"expirationDate":"2022-09-02T07:08:11Z"}}},"firstSeenMillis":1662005782000,"originalPurchaseDate":"2013-08-01T07:00:00Z","latestExpirationDateMillis":1662102491000,"originalAppUserId":"$RCAnonymousID:e3b37ae862c941febc374494917cc0b0","allExpirationDatesMillis":{"com.preteethai.dentist.subscription.monthly":1662102491000,"com.preteethai.dentist.subscription.pro":1660673681000,"com.preteethai.dentist.subscription.month":1661325054000}}}
Purchases:_makePurchase(String)

Finished purchase com.preteethai.dentist.subscription.monthly!
RevenueCatPurchaseManager:<BeginPurchase>b__25_0(String, CustomerInfo, Boolean, Error)
MakePurchaseFunc:Invoke(String, CustomerInfo, Boolean, Error)
Purchases:_makePurchase(String)

Updated UI: isSubscribed = true
RevenueCatPurchaseManager:UpdateUI()
MakePurchaseFunc:Invoke(String, CustomerInfo, Boolean, Error)
Purchases:_makePurchase(String)

2022-09-02 15:03:26.352222+0800 PreteethAIPro[8527:584505] [Purchases] - DEBUG: ℹ️ PaymentQueue removedTransaction: com.preteethai.dentist.subscription.monthly 2000000144938720 2000000143341334 1
  • (2) This is from the resubscription:
Got all offerings!
RevenueCatPurchaseManager:InitializePurchases()

2022-09-02 15:51:09.439711+0800 PreteethAIPro[8912:601870] [Purchases] - DEBUG: ℹ️ Vending Offerings from cache
2022-09-02 15:51:09.440008+0800 PreteethAIPro[8912:601870] [Purchases] - WARN: ⚠️ This StoreProduct represents an SK1 product, the type of product cannot be determined, the value will be undefined. Use `StoreProduct.productCategory` instead.
2022-09-02 15:51:09.440218+0800 PreteethAIPro[8912:601870] [Purchases] - WARN: ⚠️ This StoreProduct represents an SK1 product, the type of product cannot be determined, the value will be undefined. Use `StoreProduct.productCategory` instead.
2022-09-02 15:51:09.440379+0800 PreteethAIPro[8912:601870] [Purchases] - WARN: ⚠️ This StoreProduct represents an SK1 product, the type of product cannot be determined, the value will be undefined. Use `StoreProduct.productCategory` instead.
2022-09-02 15:51:09.440506+0800 PreteethAIPro[8912:601870] [Purchases] - WARN: ⚠️ This StoreProduct represents an SK1 product, the type of product cannot be determined, the value will be undefined. Use `StoreProduct.productCategory` instead.
2022-09-02 15:51:09.440649+0800 PreteethAIPro[8912:601870] [Purchases] - WARN: ⚠️ This StoreProduct represents an SK1 product, the type of product cannot be determined, the value will be undefined. Use `StoreProduct.productCategory` instead.
2022-09-02 15:51:09.440776+0800 PreteethAIPro[8912:601870] [Purchases] - WARN: ⚠️ This StoreProduct represents an SK1 product, the type of product cannot be determined, the value will be undefined. Use `StoreProduct.productCategory` instead.
2022-09-02 15:51:09.440884+0800 PreteethAIPro[8912:601870] [Purchases] - WARN: ⚠️ This StoreProduct represents an SK1 product, the type of product cannot be determined, the value will be undefined. Use `StoreProduct.productCategory` instead.
2022-09-02 15:51:09.440993+0800 PreteethAIPro[8912:601870] [Purchases] - WARN: ⚠️ This StoreProduct represents an SK1 product, the type of product cannot be determined, the value will be undefined. Use `StoreProduct.productCategory` instead.
2022-09-02 15:51:09.441342+0800 PreteethAIPro[8912:601870] json = {"offerings":{"current":{"annual":{"identifier":"$rc_annual","packageType":"ANNUAL","offeringIdentifier":"default","product":{"currencyCode":"TWD","identifier":"com.preteethai.dentist.subscription.annual","productCategory":"SUBSCRIPTION","introPrice":{"cycles":1,"price":0,"periodNumberOfUnits":1,"periodUnit":"MONTH","priceString":"$0.00","period":"P1M"},"description":"Preteeth AI Pro Annual","price":15900,"productType":"NON_CONSUMABLE","discounts":[],"priceString":"$15,900.00","title":"Preteeth AI Pro Annual"}},"serverDescription":"The standard set of packages","availablePackages":[{"identifier":"$rc_annual","product":{"price":15900,"priceString":"$15,900.00","currencyCode":"TWD","discounts":[],"identifier":"com.preteethai.dentist.subscription.annual","description":"Preteeth AI Pro Annual","productCategory":"SUBSCRIPTION","productType":"NON_CONSUMABLE","title":"Preteeth AI Pro Annual","introPrice":{"priceString":"$0.00","cycles":1,"period":"P1M","price":0,"periodUnit":"MONTH","periodNumberOfUnits":1}},"offeringIdentifier":"default","packageType":"ANNUAL"},{"offeringIdentifier":"default","packageType":"MONTHLY","identifier":"$rc_monthly","product":{"title":"Preteeth AI Pro Monthly","productType":"NON_CONSUMABLE","identifier":"com.preteethai.dentist.subscription.monthly","priceString":"$3,290.00","description":"Preteeth AI Pro Monthly","currencyCode":"TWD","productCategory":"SUBSCRIPTION","discounts":[],"introPrice":{"periodNumberOfUnits":1,"cycles":1,"priceString":"$0.00","price":0,"period":"P1M","periodUnit":"MONTH"},"price":3290}}],"identifier":"default","monthly":{"identifier":"$rc_monthly","product":{"price":3290,"productType":"NON_CONSUMABLE","title":"Preteeth AI Pro Monthly","discounts":[],"description":"Preteeth AI Pro Monthly","introPrice":{"priceString":"$0.00","period":"P1M","periodUnit":"MONTH","price":0,"periodNumberOfUnits":1,"cycles":1},"priceString":"$3,290.00","currencyCode":"TWD","productCategory":"SUBSCRIPTION","identifier":"com.preteethai.dentist.subscription.monthly"},"offeringIdentifier":"default","packageType":"MONTHLY"}},"all":{"default":{"annual":{"product":{"title":"Preteeth AI Pro Annual","productCategory":"SUBSCRIPTION","currencyCode":"TWD","description":"Preteeth AI Pro Annual","introPrice":{"period":"P1M","cycles":1,"price":0,"periodUnit":"MONTH","periodNumberOfUnits":1,"priceString":"$0.00"},"productType":"NON_CONSUMABLE","price":15900,"identifier":"com.preteethai.dentist.subscription.annual","discounts":[],"priceString":"$15,900.00"},"offeringIdentifier":"default","packageType":"ANNUAL","identifier":"$rc_annual"},"identifier":"default","availablePackages":[{"identifier":"$rc_annual","packageType":"ANNUAL","offeringIdentifier":"default","product":{"identifier":"com.preteethai.dentist.subscription.annual","introPrice":{"priceString":"$0.00","periodNumberOfUnits":1,"periodUnit":"MONTH","period":"P1M","cycles":1,"price":0},"price":15900,"description":"Preteeth AI Pro Annual","productType":"NON_CONSUMABLE","title":"Preteeth AI Pro Annual","productCategory":"SUBSCRIPTION","priceString":"$15,900.00","currencyCode":"TWD","discounts":[]}},{"packageType":"MONTHLY","product":{"productType":"NON_CONSUMABLE","priceString":"$3,290.00","currencyCode":"TWD","introPrice":{"cycles":1,"period":"P1M","periodNumberOfUnits":1,"periodUnit":"MONTH","price":0,"priceString":"$0.00"},"productCategory":"SUBSCRIPTION","title":"Preteeth AI Pro Monthly","identifier":"com.preteethai.dentist.subscription.monthly","description":"Preteeth AI Pro Monthly","price":3290,"discounts":[]},"identifier":"$rc_monthly","offeringIdentifier":"default"}],"monthly":{"identifier":"$rc_monthly","packageType":"MONTHLY","product":{"title":"Preteeth AI Pro Monthly","discounts":[],"identifier":"com.preteethai.dentist.subscription.monthly","priceString":"$3,290.00","price":3290,"introPrice":{"price":0,"periodNumberOfUnits":1,"periodUnit":"MONTH","priceString":"$0.00","period":"P1M","cycles":1},"productCategory":"SUBSCRIPTION","currencyCode":"TWD","description":"Preteeth AI Pro Monthly","productType":"NON_CONSUMABLE"},"offeringIdentifier":"default"},"serverDescription":"The standard set of packages"}}}}

_getOfferings {"offerings":{"current":{"annual":{"identifier":"$rc_annual","packageType":"ANNUAL","offeringIdentifier":"default","product":{"currencyCode":"TWD","identifier":"com.preteethai.dentist.subscription.annual","productCategory":"SUBSCRIPTION","introPrice":{"cycles":1,"price":0,"periodNumberOfUnits":1,"periodUnit":"MONTH","priceString":"$0.00","period":"P1M"},"description":"Preteeth AI Pro Annual","price":15900,"productType":"NON_CONSUMABLE","discounts":[],"priceString":"$15,900.00","title":"Preteeth AI Pro Annual"}},"serverDescription":"The standard set of packages","availablePackages":[{"identifier":"$rc_annual","product":{"price":15900,"priceString":"$15,900.00","currencyCode":"TWD","discounts":[],"identifier":"com.preteethai.dentist.subscription.annual","description":"Preteeth AI Pro Annual","productCategory":"SUBSCRIPTION","productType":"NON_CONSUMABLE","title":"Preteeth AI Pro Annual","introPrice":{"priceString":"$0.00","cycles":1,"period":"P1M","price":0,"periodUnit":"MONTH","periodNumberOfUnits":1}},"offeringIdentifier":"default","packageType":"ANNUAL"},{"offeringIdentifier":"default","packageType":"MONTHLY","identifier":"$rc_monthly","product":{"title":"Preteeth AI Pro Monthly","productType":"NON_CONSUMABLE","identifier":"com.preteethai.dentist.subscription.monthly","priceString":"$3,290.00","description":"Preteeth AI Pro Monthly","currencyCode":"TWD","productCategory":"SUBSCRIPTION","discounts":[],"introPrice":{"periodNumberOfUnits":1,"cycles":1,"priceString":"$0.00","price":0,"period":"P1M","periodUnit":"MONTH"},"price":3290}}],"identifier":"default","monthly":{"identifier":"$rc_monthly","product":{"price":3290,"productType":"NON_CONSUMABLE","title":"Preteeth AI Pro Monthly","discounts":[],"description":"Preteeth AI Pro Monthly","introPrice":{"priceString":"$0.00","period":"P1M","periodUnit":"MONTH","price":0,"periodNumberOfUnits":1,"cycles":1},"priceString":"$3,290.00","currencyCode":"TWD","productCategory":"SUBSCRIPTION","identifier":"com.preteethai.dentist.subscription.monthly"},"offeringIdentifier":"default","packageType":"MONTHLY"}},"all":{"default":{"annual":{"product":{"title":"Preteeth AI Pro Annual","productCategory":"SUBSCRIPTION","currencyCode":"TWD","description":"Preteeth AI Pro Annual","introPrice":{"period":"P1M","cycles":1,"price":0,"periodUnit":"MONTH","periodNumberOfUnits":1,"priceString":"$0.00"},"productType":"NON_CONSUMABLE","price":15900,"identifier":"com.preteethai.dentist.subscription.annual","discounts":[],"priceString":"$15,900.00"},"offeringIdentifier":"default","packageType":"ANNUAL","identifier":"$rc_annual"},"identifier":"default","availablePackages":[{"identifier":"$rc_annual","packageType":"ANNUAL","offeringIdentifier":"default","product":{"identifier":"com.preteethai.dentist.subscription.annual","introPrice":{"priceString":"$0.00","periodNumberOfUnits":1,"periodUnit":"MONTH","period":"P1M","cycles":1,"price":0},"price":15900,"description":"Preteeth AI Pro Annual","productType":"NON_CONSUMABLE","title":"Preteeth AI Pro Annual","productCategory":"SUBSCRIPTION","priceString":"$15,900.00","currencyCode":"TWD","discounts":[]}},{"packageType":"MONTHLY","product":{"productType":"NON_CONSUMABLE","priceString":"$3,290.00","currencyCode":"TWD","introPrice":{"cycles":1,"period":"P1M","periodNumberOfUnits":1,"periodUnit":"MONTH","price":0,"priceString":"$0.00"},"productCategory":"SUBSCRIPTION","title":"Preteeth AI Pro Monthly","identifier":"com.preteethai.dentist.subscription.monthly","description":"Preteeth AI Pro Monthly","price":3290,"discounts":[]},"identifier":"$rc_monthly","offeringIdentifier":"default"}],"monthly":{"identifier":"$rc_monthly","packageType":"MONTHLY","product":{"title":"Preteeth AI Pro Monthly","discounts":[],"identifier":"com.preteethai.dentist.subscription.monthly","priceString":"$3,290.00","price":3290,"introPrice":{"price":0,"periodNumberOfUnits":1,"periodUnit":"MONTH","priceString":"$0.00","period":"P1M","cycles":1},"productCategory":"SUBSCRIPTION","currencyCode":"TWD","description":"Preteeth AI Pro Monthly","productType":"NON_CONSUMABLE"},"offeringIdentifier":"default"},"serverDescription":"The standard set of packages"}}}}
Purchases:_getOfferings(String)

Purchases GetOfferings succeeded!
RevenueCatPurchaseManager:<GetOfferingsAndSetIsSubscribedAndLogIn>b__17_0(Offerings, Error)
GetOfferingsFunc:Invoke(Offerings, Error)
Purchases:_getOfferings(String)

2022-09-02 15:51:09.449966+0800 PreteethAIPro[8912:601870] [Purchases] - DEBUG: ℹ️ Vending CustomerInfo from cache.
2022-09-02 15:51:09.450790+0800 PreteethAIPro[8912:601870] json = {"customerInfo":{"firstSeen":"2022-09-01T04:16:22Z","originalPurchaseDate":"2013-08-01T07:00:00Z","originalApplicationVersion":"1.0","nonSubscriptionTransactions":[],"requestDate":"2022-09-02T07:50:21Z","allExpirationDatesMillis":{"com.preteethai.dentist.subscription.monthly":1662105008000,"com.preteethai.dentist.subscription.month":1661325054000,"com.preteethai.dentist.subscription.pro":1660673681000},"allPurchasedProductIdentifiers":["com.preteethai.dentist.subscription.month","com.preteethai.dentist.subscription.monthly","com.preteethai.dentist.subscription.pro"],"originalAppUserId":"$RCAnonymousID:e3b37ae862c941febc374494917cc0b0","activeSubscriptions":[],"allPurchaseDates":{"com.preteethai.dentist.subscription.month":"2022-08-24T07:05:54Z","com.preteethai.dentist.subscription.monthly":"2022-09-02T07:45:08Z","com.preteethai.dentist.subscription.pro":"2022-08-16T18:09:41Z"},"firstSeenMillis":1662005782000,"originalPurchaseDateMillis":1375340400000,"requestDateMillis":1662105021000,"latestExpirationDateMillis":1662105008000,"entitlements":{"active":{},"all":{"pro":{"expirationDate":"2022-09-02T07:50:08Z","expirationDateMillis":1662105008000,"originalPurchaseDateMillis":1661954488000,"ownershipType":"PURCHASED","latestPurchaseDate":"2022-09-02T07:45:08Z","unsubscribedDetectedAt":"2022-09-02T07:45:00Z","billingIssueDetectedAtMillis":null,"billingIssueDetectedAt":null,"productIdentifier":"com.preteethai.dentist.subscription.monthly","willRenew":false,"store":"APP_STORE","isSandbox":true,"latestPurchaseDateMillis":1662104708000,"periodType":"NORMAL","isActive":false,"unsubscribedDetectedAtMillis":1662104700000,"identifier":"pro","originalPurchaseDate":"2022-08-31T14:01:28Z"}}},"latestExpirationDate":"2022-09-02T07:50:08Z","allExpirationDates":{"com.preteethai.dentist.subscription.monthly":"2022-09-02T07:50:08Z","com.preteethai.dentist.subscription.month":"2022-08-24T07:10:54Z","com.preteethai.dentist.subscription.pro":"2022-08-16T18:14:41Z"},"allPurchaseDatesMillis":{"com.preteethai.dentist.subscription.month":1661324754000,"com.preteethai.dentist.subscription.monthly":1662104708000,"com.preteethai.dentist.subscription.pro":1660673381000},"managementURL":null}}
_getCustomerInfo {"customerInfo":{"firstSeen":"2022-09-01T04:16:22Z","originalPurchaseDate":"2013-08-01T07:00:00Z","originalApplicationVersion":"1.0","nonSubscriptionTransactions":[],"requestDate":"2022-09-02T07:50:21Z","allExpirationDatesMillis":{"com.preteethai.dentist.subscription.monthly":1662105008000,"com.preteethai.dentist.subscription.month":1661325054000,"com.preteethai.dentist.subscription.pro":1660673681000},"allPurchasedProductIdentifiers":["com.preteethai.dentist.subscription.month","com.preteethai.dentist.subscription.monthly","com.preteethai.dentist.subscription.pro"],"originalAppUserId":"$RCAnonymousID:e3b37ae862c941febc374494917cc0b0","activeSubscriptions":[],"allPurchaseDates":{"com.preteethai.dentist.subscription.month":"2022-08-24T07:05:54Z","com.preteethai.dentist.subscription.monthly":"2022-09-02T07:45:08Z","com.preteethai.dentist.subscription.pro":"2022-08-16T18:09:41Z"},"firstSeenMillis":1662005782000,"originalPurchaseDateMillis":1375340400000,"requestDateMillis":1662105021000,"latestExpirationDateMillis":1662105008000,"entitlements":{"active":{},"all":{"pro":{"expirationDate":"2022-09-02T07:50:08Z","expirationDateMillis":1662105008000,"originalPurchaseDateMillis":1661954488000,"ownershipType":"PURCHASED","latestPurchaseDate":"2022-09-02T07:45:08Z","unsubscribedDetectedAt":"2022-09-02T07:45:00Z","billingIssueDetectedAtMillis":null,"billingIssueDetectedAt":null,"productIdentifier":"com.preteethai.dentist.subscription.monthly","willRenew":false,"store":"APP_STORE","isSandbox":true,"latestPurchaseDateMillis":1662104708000,"periodType":"NORMAL","isActive":false,"unsubscribedDetectedAtMillis":1662104700000,"identifier":"pro","originalPurchaseDate":"2022-08-31T14:01:28Z"}}},"latestExpirationDate":"2022-09-02T07:50:08Z","allExpirationDates":{"com.preteethai.dentist.subscription.monthly":"2022-09-02T07:50:08Z","com.preteethai.dentist.subscription.month":"2022-08-24T07:10:54Z","com.preteethai.dentist.subscription.pro":"2022-08-16T18:14:41Z"},"allPurchaseDatesMillis":{"com.preteethai.dentist.subscription.month":1661324754000,"com.preteethai.dentist.subscription.monthly":1662104708000,"com.preteethai.dentist.subscription.pro":1660673381000},"managementURL":null}}
Purchases:_getCustomerInfo(String)

2022-09-02 15:51:09.455865+0800 PreteethAIPro[8912:602178] [Purchases] - WARN: ⚠️ The appUserID passed to logIn is the same as the one already cached. No action will be taken.
2022-09-02 15:51:09.458551+0800 PreteethAIPro[8912:602178] [Purchases] - DEBUG: ℹ️ Vending CustomerInfo from cache.
2022-09-02 15:51:09.458830+0800 PreteethAIPro[8912:601870] json = {"created":false,"customerInfo":{"latestExpirationDateMillis":1662105008000,"allPurchaseDates":{"com.preteethai.dentist.subscription.pro":"2022-08-16T18:09:41Z","com.preteethai.dentist.subscription.monthly":"2022-09-02T07:45:08Z","com.preteethai.dentist.subscription.month":"2022-08-24T07:05:54Z"},"originalPurchaseDate":"2013-08-01T07:00:00Z","entitlements":{"all":{"pro":{"periodType":"NORMAL","latestPurchaseDate":"2022-09-02T07:45:08Z","originalPurchaseDateMillis":1661954488000,"ownershipType":"PURCHASED","store":"APP_STORE","isSandbox":true,"unsubscribedDetectedAt":"2022-09-02T07:45:00Z","billingIssueDetectedAt":null,"unsubscribedDetectedAtMillis":1662104700000,"expirationDate":"2022-09-02T07:50:08Z","billingIssueDetectedAtMillis":null,"willRenew":false,"latestPurchaseDateMillis":1662104708000,"originalPurchaseDate":"2022-08-31T14:01:28Z","expirationDateMillis":1662105008000,"identifier":"pro","productIdentifier":"com.preteethai.dentist.subscription.monthly","isActive":false}},"active":{}},"originalPurchaseDateMillis":1375340400000,"nonSubscriptionTransactions":[],"firstSeenMillis":1662005782000,"originalAppUserId":"$RCAnonymousID:e3b37ae862c941febc374494917cc0b0","activeSubscriptions":[],"managementURL":null,"requestDate":"2022-09-02T07:50:21Z","allPurchasedProductIdentifiers":["com.preteethai.dentist.subscription.month","com.preteethai.dentist.subscription.monthly","com.preteethai.dentist.subscription.pro"],"latestExpirationDate":"2022-09-02T07:50:08Z","firstSeen":"2022-09-01T04:16:22Z","allPurchaseDatesMillis":{"com.preteethai.dentist.subscription.pro":1660673381000,"com.preteethai.dentist.subscription.month":1661324754000,"com.preteethai.dentist.subscription.monthly":1662104708000},"originalApplicationVersion":"1.0","allExpirationDatesMillis":{"com.preteethai.dentist.subscription.pro":1660673681000,"com.preteethai.dentist.subscription.monthly":1662105008000,"com.preteethai.dentist.subscription.month":1661325054000},"requestDateMillis":1662105021000,"allExpirationDates":{"com.preteethai.dentist.subscription.month":"2022-08-24T07:10:54Z","com.preteethai.dentist.subscription.pro":"2022-08-16T18:14:41Z","com.preteethai.dentist.subscription.monthly":"2022-09-02T07:50:08Z"}}}
2022-09-02 15:51:09.459761+0800 PreteethAIPro[8912:602178] [Purchases] - DEBUG: ℹ️ GetOfferingsOperation: Started
2022-09-02 15:51:09.459816+0800 PreteethAIPro[8912:602178] [Purchases] - DEBUG: ℹ️ There are no requests currently running, starting request GET subscribers/v0kpCeNMD0UsHZIFNyDZW5uUc0x1/offerings
2022-09-02 15:51:09.460579+0800 PreteethAIPro[8912:602178] [Purchases] - DEBUG: ℹ️ API request started: GET /v1/subscribers/v0kpCeNMD0UsHZIFNyDZW5uUc0x1/offerings
_logIn {"created":false,"customerInfo":{"latestExpirationDateMillis":1662105008000,"allPurchaseDates":{"com.preteethai.dentist.subscription.pro":"2022-08-16T18:09:41Z","com.preteethai.dentist.subscription.monthly":"2022-09-02T07:45:08Z","com.preteethai.dentist.subscription.month":"2022-08-24T07:05:54Z"},"originalPurchaseDate":"2013-08-01T07:00:00Z","entitlements":{"all":{"pro":{"periodType":"NORMAL","latestPurchaseDate":"2022-09-02T07:45:08Z","originalPurchaseDateMillis":1661954488000,"ownershipType":"PURCHASED","store":"APP_STORE","isSandbox":true,"unsubscribedDetectedAt":"2022-09-02T07:45:00Z","billingIssueDetectedAt":null,"unsubscribedDetectedAtMillis":1662104700000,"expirationDate":"2022-09-02T07:50:08Z","billingIssueDetectedAtMillis":null,"willRenew":false,"latestPurchaseDateMillis":1662104708000,"originalPurchaseDate":"2022-08-31T14:01:28Z","expirationDateMillis":1662105008000,"identifier":"pro","productIdentifier":"com.preteethai.dentist.subscription.monthly","isActive":false}},"active":{}},"originalPurchaseDateMillis":1375340400000,"nonSubscriptionTransactions":[],"firstSeenMillis":1662005782000,"originalAppUserId":"$RCAnonymousID:e3b37ae862c941febc374494917cc0b0","activeSubscriptions":[],"managementURL":null,"requestDate":"2022-09-02T07:50:21Z","allPurchasedProductIdentifiers":["com.preteethai.dentist.subscription.month","com.preteethai.dentist.subscription.monthly","com.preteethai.dentist.subscription.pro"],"latestExpirationDate":"2022-09-02T07:50:08Z","firstSeen":"2022-09-01T04:16:22Z","allPurchaseDatesMillis":{"com.preteethai.dentist.subscription.pro":1660673381000,"com.preteethai.dentist.subscription.month":1661324754000,"com.preteethai.dentist.subscription.monthly":1662104708000},"originalApplicationVersion":"1.0","allExpirationDatesMillis":{"com.preteethai.dentist.subscription.pro":1660673681000,"com.preteethai.dentist.subscription.monthly":1662105008000,"com.preteethai.dentist.subscription.month":1661325054000},"requestDateMillis":1662105021000,"allExpirationDates":{"com.preteethai.dentist.subscription.month":"2022-08-24T07:10:54Z","com.preteethai.dentist.subscription.pro":"2022-08-16T18:14:41Z","com.preteethai.dentist.subscription.monthly":"2022-09-02T07:50:08Z"}}}
Purchases:_logIn(String)

Successfully set user id v0kpCeNMD0UsHZIFNyDZW5uUc0x1 for revenue cat purchase manager!
RevenueCatPurchaseManager:<LogIn>b__19_0(CustomerInfo, Boolean, Error)
LogInFunc:Invoke(CustomerInfo, Boolean, Error)
Purchases:_logIn(String)

Updated UI: isSubscribed = false
RevenueCatPurchaseManager:UpdateUI()
RevenueCatPurchaseManager:<LogIn>b__19_0(CustomerInfo, Boolean, Error)
LogInFunc:Invoke(CustomerInfo, Boolean, Error)
Purchases:_logIn(String)

2022-09-02 15:51:10.129313+0800 PreteethAIPro[8912:602179] [Purchases] - DEBUG: ℹ️ API request completed: GET /v1/subscribers/v0kpCeNMD0UsHZIFNyDZW5uUc0x1/offerings 304
2022-09-02 15:51:10.131973+0800 PreteethAIPro[8912:602179] [Purchases] - DEBUG: ℹ️ GetOfferingsOperation: Finished
2022-09-02 15:51:10.132483+0800 PreteethAIPro[8912:602229] [Purchases] - DEBUG: ℹ️ Skipping products request because products were already cached. products: ["com.preteethai.dentist.subscription.monthly", "com.preteethai.dentist.subscription.annual"]
2022-09-02 15:51:10.132772+0800 PreteethAIPro[8912:602179] [Purchases] - DEBUG: ℹ️ Serial request done: GET subscribers/v0kpCeNMD0UsHZIFNyDZW5uUc0x1/offerings, 0 requests left in the queue

2022-09-02 15:51:18.396275+0800 PreteethAIPro[8912:601870] [Purchases] - DEBUG: ℹ️ Vending Offerings from cache
2022-09-02 15:51:18.396772+0800 PreteethAIPro[8912:601870] [Purchases] - INFO: 💰 Purchasing Product 'com.preteethai.dentist.subscription.monthly' from package in Offering 'default'
2022-09-02 15:51:18.412241+0800 PreteethAIPro[8912:601870] [Purchases] - DEBUG: ℹ️ PaymentQueue updatedTransaction: com.preteethai.dentist.subscription.monthly 2000000144947383 2000000143341334 1
2022-09-02 15:51:18.413108+0800 PreteethAIPro[8912:601870] [Purchases] - DEBUG: ℹ️ Force refreshing the receipt to get latest transactions from Apple.
2022-09-02 15:51:20.456394+0800 PreteethAIPro[8912:602312] [Purchases] - DEBUG: ℹ️ Loaded receipt from url file:///private/var/mobile/Containers/Data/Application/6BAFF1CD-B58D-43A9-8330-629F3CD38B18/StoreKit/sandboxReceipt
2022-09-02 15:51:20.456510+0800 PreteethAIPro[8912:602227] [Purchases] - DEBUG: ℹ️ Skipping products request because products were already cached. products: ["com.preteethai.dentist.subscription.monthly"]
2022-09-02 15:51:20.456812+0800 PreteethAIPro[8912:601870] [Purchases] - DEBUG: ℹ️ Found 0 unsynced attributes for App User ID: v0kpCeNMD0UsHZIFNyDZW5uUc0x1
2022-09-02 15:51:20.466014+0800 PreteethAIPro[8912:602227] [Purchases] - DEBUG: ℹ️ PostReceiptDataOperation: Started
2022-09-02 15:51:20.466090+0800 PreteethAIPro[8912:602227] [Purchases] - DEBUG: ℹ️ There are no requests currently running, starting request POST receipts
2022-09-02 15:51:20.468089+0800 PreteethAIPro[8912:602227] [Purchases] - DEBUG: ℹ️ API request started: POST /v1/receipts
2022-09-02 15:51:22.626768+0800 PreteethAIPro[8912:602312] [Purchases] - DEBUG: ℹ️ API request completed: POST /v1/receipts 200
2022-09-02 15:51:22.650127+0800 PreteethAIPro[8912:602312] [Purchases] - DEBUG: ℹ️ PostReceiptDataOperation: Finished
2022-09-02 15:51:22.650682+0800 PreteethAIPro[8912:602312] [Purchases] - DEBUG: ℹ️ Serial request done: POST receipts, 0 requests left in the queue
2022-09-02 15:51:22.655195+0800 PreteethAIPro[8912:601870] [Purchases] - INFO: 😻💰 Purchased product - 'com.preteethai.dentist.subscription.monthly'
2022-09-02 15:51:22.656296+0800 PreteethAIPro[8912:601870] json = {"productIdentifier":"com.preteethai.dentist.subscription.monthly","userCancelled":false,"customerInfo":{"latestExpirationDate":"2022-09-02T07:50:08Z","firstSeenMillis":1662005782000,"originalAppUserId":"$RCAnonymousID:e3b37ae862c941febc374494917cc0b0","allPurchaseDatesMillis":{"com.preteethai.dentist.subscription.pro":1660673381000,"com.preteethai.dentist.subscription.monthly":1662104708000,"com.preteethai.dentist.subscription.month":1661324754000},"firstSeen":"2022-09-01T04:16:22Z","allPurchasedProductIdentifiers":["com.preteethai.dentist.subscription.pro","com.preteethai.dentist.subscription.month","com.preteethai.dentist.subscription.monthly"],"originalPurchaseDateMillis":1375340400000,"nonSubscriptionTransactions":[],"entitlements":{"active":{},"all":{"pro":{"originalPurchaseDateMillis":1661954488000,"expirationDate":"2022-09-02T07:50:08Z","originalPurchaseDate":"2022-08-31T14:01:28Z","productIdentifier":"com.preteethai.dentist.subscription.monthly","unsubscribedDetectedAtMillis":1662104700000,"ownershipType":"PURCHASED","identifier":"pro","isActive":false,"latestPurchaseDateMillis":1662104708000,"periodType":"NORMAL","billingIssueDetectedAt":null,"unsubscribedDetectedAt":"2022-09-02T07:45:00Z","store":"APP_STORE","isSandbox":true,"billingIssueDetectedAtMillis":null,"expirationDateMillis":1662105008000,"willRenew":false,"latestPurchaseDate":"2022-09-02T07:45:08Z"}}},"originalApplicationVersion":"1.0","latestExpirationDateMillis":1662105008000,"originalPurchaseDate":"2013-08-01T07:00:00Z","allPurchaseDates":{"com.preteethai.dentist.subscription.monthly":"2022-09-02T07:45:08Z","com.preteethai.dentist.subscription.month":"2022-08-24T07:05:54Z","com.preteethai.dentist.subscription.pro":"2022-08-16T18:09:41Z"},"requestDateMillis":1662105082000,"activeSubscriptions":[],"allExpirationDatesMillis":{"com.preteethai.dentist.subscription.month":1661325054000,"com.preteethai.dentist.subscription.monthly":1662105008000,"com.preteethai.dentist.subscription.pro":1660673681000},"allExpirationDates":{"com.preteethai.dentist.subscription.monthly":"2022-09-02T07:50:08Z","com.preteethai.dentist.subscription.pro":"2022-08-16T18:14:41Z","com.preteethai.dentist.subscription.month":"2022-08-24T07:10:54Z"},"managementURL":null,"requestDate":"2022-09-02T07:51:22Z"}}
2022-09-02 15:51:22.657282+0800 PreteethAIPro[8912:601870] [Purchases] - INFO: 💰 Finishing transaction com.preteethai.dentist.subscription.monthly 2000000144947383 (2000000143341334)
_makePurchase {"productIdentifier":"com.preteethai.dentist.subscription.monthly","userCancelled":false,"customerInfo":{"latestExpirationDate":"2022-09-02T07:50:08Z","firstSeenMillis":1662005782000,"originalAppUserId":"$RCAnonymousID:e3b37ae862c941febc374494917cc0b0","allPurchaseDatesMillis":{"com.preteethai.dentist.subscription.pro":1660673381000,"com.preteethai.dentist.subscription.monthly":1662104708000,"com.preteethai.dentist.subscription.month":1661324754000},"firstSeen":"2022-09-01T04:16:22Z","allPurchasedProductIdentifiers":["com.preteethai.dentist.subscription.pro","com.preteethai.dentist.subscription.month","com.preteethai.dentist.subscription.monthly"],"originalPurchaseDateMillis":1375340400000,"nonSubscriptionTransactions":[],"entitlements":{"active":{},"all":{"pro":{"originalPurchaseDateMillis":1661954488000,"expirationDate":"2022-09-02T07:50:08Z","originalPurchaseDate":"2022-08-31T14:01:28Z","productIdentifier":"com.preteethai.dentist.subscription.monthly","unsubscribedDetectedAtMillis":1662104700000,"ownershipType":"PURCHASED","identifier":"pro","isActive":false,"latestPurchaseDateMillis":1662104708000,"periodType":"NORMAL","billingIssueDetectedAt":null,"unsubscribedDetectedAt":"2022-09-02T07:45:00Z","store":"APP_STORE","isSandbox":true,"billingIssueDetectedAtMillis":null,"expirationDateMillis":1662105008000,"willRenew":false,"latestPurchaseDate":"2022-09-02T07:45:08Z"}}},"originalApplicationVersion":"1.0","latestExpirationDateMillis":1662105008000,"originalPurchaseDate":"2013-08-01T07:00:00Z","allPurchaseDates":{"com.preteethai.dentist.subscription.monthly":"2022-09-02T07:45:08Z","com.preteethai.dentist.subscription.month":"2022-08-24T07:05:54Z","com.preteethai.dentist.subscription.pro":"2022-08-16T18:09:41Z"},"requestDateMillis":1662105082000,"activeSubscriptions":[],"allExpirationDatesMillis":{"com.preteethai.dentist.subscription.month":1661325054000,"com.preteethai.dentist.subscription.monthly":1662105008000,"com.preteethai.dentist.subscription.pro":1660673681000},"allExpirationDates":{"com.preteethai.dentist.subscription.monthly":"2022-09-02T07:50:08Z","com.preteethai.dentist.subscription.pro":"2022-08-16T18:14:41Z","com.preteethai.dentist.subscription.month":"2022-08-24T07:10:54Z"},"managementURL":null,"requestDate":"2022-09-02T07:51:22Z"}}
Purchases:_makePurchase(String)

Finished purchase com.preteethai.dentist.subscription.monthly!
RevenueCatPurchaseManager:<BeginPurchase>b__25_0(String, CustomerInfo, Boolean, Error)
MakePurchaseFunc:Invoke(String, CustomerInfo, Boolean, Error)
Purchases:_makePurchase(String)

Updated UI: isSubscribed = false
RevenueCatPurchaseManager:UpdateUI()
MakePurchaseFunc:Invoke(String, CustomerInfo, Boolean, Error)
Purchases:_makePurchase(String)

2022-09-02 15:51:24.192104+0800 PreteethAIPro[8912:601870] [Purchases] - DEBUG: ℹ️ PaymentQueue removedTransaction: com.preteethai.dentist.subscription.monthly 2000000144947383 2000000143341334 1
  1. Steps to reproduce, with a description of expected vs. actual behavior
    Described above.

  2. Other information (e.g. stacktraces, related issues, suggestions how to fix, links for us to have context, eg. stackoverflow, etc.)
    https://community.revenuecat.com/sdks-51/unable-to-resubscribe-after-expiration-in-testflight-sandbox-environment-many-related-posts-before-without-a-solution-2006

Additional context
Add any other context about the problem here.

AmazonStore: "There as a problem with store. Code 2, UnderlyiningErrorMessage: Failed to get user data."

Describe the bug

I followed all steps from your documentation to integrate revenuecat with amazon but when I launched my build on amazon fire device and the callback of Purchase.GetOfferings method is called, an error is showed:
"There as a problem with store. Code 2, UnderlyiningErrorMessage: Failed to get user data. Make sure sandbox mode is enabled if using App Tester. https://www.rev.cat/enter-amazon-sandbox, ReadableErrorCode: StoreProblemError"
I've same error when I called the method Purchases.GetProducts

I've already tried to enable sandbox on device amazon and have install amazon test app but the error is always showing.

Anyway the sdk works correctly on ios and google play.

You can download this repository to reproduce my issue. I have created a scene test and I included my api amazon key revenuecat for testing purposes only:
https://github.com/gtoto007/amazon-revenuecat-issue
Below are the various steps I have performed

Environment

  1. Platform: Android Amazon
  2. SDK version: Revenue Cat 4.0
  3. OS + version: Macbook pro M1 - Monterey
  4. Xcode/Android Studio version:
  5. Unity version: Unity 2020.3.8f1

My steps

  1. I created an iap on amazon store

Screenshot 2022-08-10 at 15 43 18

  1. I linked the amazon shared key on revenuecat dashboard

Screenshot 2022-08-10 at 15 43 18

3.I linked iap in sections Entitlements,Offerings,Products of Revenuecat Dashboard

Screenshot 2022-08-10 at 15 43 18

Screenshot 2022-08-10 at 15 43 18

Screenshot 2022-08-10 at 15 43 18

  1. I've created a project empty with Unity 2020.3.8f1
  2. I've integrated the release RevenueCat 4 in unity project.
  3. Create an empty scene with PurchasesListener and Purchases script. I've added the amazon key, enable useAmazon and add my product identifiers example created on store amazon

Screenshot 2022-08-10 at 15 39 36

  1. I've built apk and launched it on device but when the callback of Purchase.GetOfferings method is called, on error is showed:

"There as a problem with store. Code 2, UnderlyiningErrorMessage: Failed to get user data. Make sure sandbox mode is enabled if using App Tester. https://www.rev.cat/enter-amazon-sandbox, ReadableErrorCode: StoreProblemError"

Screenshot 2022-08-10 at 15 39 36

  1. I've already tried to enable sandbox on device amazon and have install amazon test app but the error is always showing.

Debug Log

08-10 16:29:58.418  5104  5326 E AmazonAppstore.CheckSecurityAction: Content metadata not available for package name: com.marshmallowgames.amaztest
08-10 16:29:58.423 12194 12267 D Kiwi    : CommandServiceClient: Blocking for result from service
08-10 16:29:58.423 12194 12267 D Kiwi    : CommandServiceClient: Received result from service
08-10 16:29:58.423 12194 12267 D Kiwi    : AbstractCommandTask: Received result from CommandService: CommandResult: [CallingUid: 10070, SuccessResult: null, FailureResult: com.amazon.d.a.h$a$a@8f9484f, DecisionResult: null, ExceptionResult: null]
08-10 16:29:58.423 12194 12267 D Kiwi    : CommandResultVerifier: Verifying auth token: com.marshmallowgames.amaztest
08-10 16:29:58.440 12194 12267 D Kiwi    : DataAuthenticationKeyLoaderV3: Loading data authentication key...
08-10 16:29:58.440 12194 12267 D Kiwi    : DataAuthenticationKeyLoaderV3: Checking KiwiDataStore for key...
08-10 16:29:58.440 12194 12267 D Kiwi    : ExpirableValueDataStore: Fetching value: DATA_AUTHENTICATION_KEY
08-10 16:29:58.440 12194 12267 D Kiwi    : DataAuthenticationKeyLoaderV3: Key was cached: true
08-10 16:29:58.440 12194 12267 D Kiwi    : SignatureVerifier: Verifying signature of data: 'UMnMxqPqVAul56Dpcj4ektTiUO3TKzO1azQAubOpZIwqgw35kEAibdIj1k9oCIGSGI95DgpE2zIfSHd08RnOn3JSjlezhFaxfe86WTUyEfo+NRBQA1nnh+B1AH9S7fOaRc03anuJiJEOvvubCcKmrOVFJqVAq1C6xFflpF4/F6zCfC/3vu1pfEA/3KZDlgV+TDeA4h/0fNuhy3V573KsbAkX2NrRMIPWZIukKhr43FF2JY6iZfeqJVc4pCnqakNjypMYX7iuF3RoTDYzpnYrIvBYL4RPz0y2/iZuuYairAKOX3/Iz5nZGsNqVWpL6eolD6RAqVjixPmgU4ezM7lHrnpA4Qeo2d0osyfFZF9eX73RFPA3cJcPbCiLt8TOaQIJscROaDnEM8LDzOubKjLJijMUTtPTI6dJ3sHQ7Nc+DxvcN//8uJ7iwZtBP4RCrq8qqqInL1TOiGU73NXIEHPzLQeQd1DudbCSRMO7sWUwIVdCiRB/s5q+IiJ7iCXLT75Gm3rKAHtJ4/V3FsyW8PiXcCVCM8tO+Gs8nXanngQBgW7ZaVxbRyi+LfOEVQUAkaMYKWi/AqfNen0WmVokYxFsK3bqciy1UIZBRsUr6+qjnZrTKi2hVW3FTnnXxqPRZ1a/JsfrSZ5uNpFwtzLGfS7iN3044Vf0QOfGNkLVgepl3R4=', signature: 'com.marshmallowgames.amaztest', with key: 'OpenSSLRSAPublicKey{modulus=e2861e68c541b8977605122eceba2ba09d949be5ae4930086497d98eff1ec50cfc9ced54c66628d8142438a1d8fd049605be738e119367a8ae6a27993df32bd04832acba04651842037f08cac97bf37f390e64be9d224152dfd9fc0f60e4cc13d0e387f17254f1f94b2a0804917b1be0f1faf08d17643bedaebb0ef2c3c36eaccaae93202df8e7ec80a2f79ae2816f506221debcf50f7a840ae09493c60f483c0caa65db5d30e7f14f6dfbf8521af8423e0daea7690cc5ad5ea2296a00429973907ea1936eb549361d21e3ae295e5b0b2464cb9c2fd86b8aaf02e43e5fe47b7048559fa48ea42bd9abbe3436ff5d0300f2d8cfac55910d60c0cad9b30216407b,publicExponent=10001}
08-10 16:29:58.441 12194 12267 D Kiwi    : AbstractCommandTask: Exception occurred while processing task: com.amazon.a.a.n.a.a.a: AUTH_TOKEN_VERIFICATION_FAILURE: null: null
08-10 16:29:58.441 12194 12267 D Kiwi    : com.amazon.a.a.n.a.a.a: AUTH_TOKEN_VERIFICATION_FAILURE: null: null
08-10 16:29:58.441 12194 12267 D Kiwi    : 	at com.amazon.a.a.n.a.b.a(AuthenticationTokenVerifier.java:94)
08-10 16:29:58.441 12194 12267 D Kiwi    : 	at com.amazon.a.a.n.a.a.a(AbstractCommandTask.java:204)
08-10 16:29:58.441 12194 12267 D Kiwi    : 	at com.amazon.a.a.n.a.a.a(AbstractCommandTask.java:131)
08-10 16:29:58.441 12194 12267 D Kiwi    : 	at com.amazon.a.a.n.b.b$1.run(SimpleTaskPipeline.java:179)
08-10 16:29:58.441 12194 12267 D Kiwi    : 	at android.os.Handler.handleCallback(Handler.java:873)
08-10 16:29:58.441 12194 12267 D Kiwi    : 	at android.os.Handler.dispatchMessage(Handler.java:99)
08-10 16:29:58.441 12194 12267 D Kiwi    : 	at android.os.Looper.loop(Looper.java:211)
08-10 16:29:58.441 12194 12267 D Kiwi    : 	at android.os.HandlerThread.run(HandlerThread.java:65)
08-10 16:29:58.445 12194 12267 D Kiwi    : Prompt: Creating Prompt: 1013129288
08-10 16:29:58.445 12194 12267 D Kiwi    : SimplePrompt: created SimplePrompt with mode LEGACY
08-10 16:29:58.446 12194 12267 D Kiwi    : PromptManagerImpl: Scheduling presentation: a
08-10 16:29:58.446 12194 12267 D Kiwi    : ResourceManagerImpl: Populating: a
08-10 16:29:58.446 12194 12267 D Kiwi    : RelativeExpirable: RelativeExpiration duration: 31536000, expirable: a
08-10 16:29:58.446 12194 12267 D Kiwi    : RelativeExpirable: Expiration should occur at time: Thu Aug 10 16:29:58 GMT+02:00 2023
08-10 16:29:58.447 12194 12267 D Kiwi    : TaskManagerImpl: Populating Task: Expire: a
08-10 16:29:58.447 12194 12267 D Kiwi    : ResourceManagerImpl: Populating: Expire: a
08-10 16:29:58.447 12194 12267 D Kiwi    : SimpleTaskPipeline: KIWI_BACKGROUND: Scheduling task: Expire: a, at time: Thu Aug 10 16:29:58 GMT+02:00 2023, System uptimeMillis: 1660141798447, uptimeMillis: 31548329427
08-10 16:29:58.447 12194 12267 D Kiwi    : TaskManagerImpl: Enqueue task on pipeline id: FOREGROUND
08-10 16:29:58.447 12194 12267 D Kiwi    : RelativeExpirable: RelativeExpiration duration: 31536000, expirable: a
08-10 16:29:58.447 12194 12267 D Kiwi    : RelativeExpirable: Expiration should occur at time: Thu Aug 10 16:29:58 GMT+02:00 2023
08-10 16:29:58.448 12194 12267 D Kiwi    : TaskManagerImpl: Populating Task: Prompt Presentation on Main Thread: a, Thu Aug 10 16:29:58 GMT+02:00 2023
08-10 16:29:58.448 12194 12267 D Kiwi    : RelativeExpirable: RelativeExpiration duration: 31536000, expirable: a
08-10 16:29:58.448 12194 12267 D Kiwi    : RelativeExpirable: Expiration should occur at time: Thu Aug 10 16:29:58 GMT+02:00 2023
08-10 16:29:58.448 12194 12267 D Kiwi    : ResourceManagerImpl: Populating: Prompt Presentation on Main Thread: a, Thu Aug 10 16:29:58 GMT+02:00 2023
08-10 16:29:58.448 12194 12267 D Kiwi    : RelativeExpirable: RelativeExpiration duration: 31536000, expirable: a
08-10 16:29:58.448 12194 12267 D Kiwi    : RelativeExpirable: Expiration should occur at time: Thu Aug 10 16:29:58 GMT+02:00 2023
08-10 16:29:58.448 12194 12267 D Kiwi    : ForegroundTaskPipeline: No UI visible to execute task: Prompt Presentation on Main Thread: a, Thu Aug 10 16:29:58 GMT+02:00 2023, placing into pending queue until task is visible
08-10 16:29:58.449 12194 12267 D Kiwi    : MetricsManagerImpl: Recording Metric: Metric: [{reason=null, name=get_userId_failure, context=null, subType=AUTH_TOKEN_VERIFICATION_FAILURE, time=1660141798449}]
08-10 16:29:58.449 12194 12194 D [Purchases] - DEBUG: ℹ️ User data request finished with result FAILED
08-10 16:29:58.449 12194 12267 D Kiwi    : AbstractCommandTask: Task finished
08-10 16:29:58.449 12194 12267 D Kiwi    : CommandServiceClient: Finishing CommandServiceClient, unbinding service: true
08-10 16:29:58.449 12194 12194 E [Purchases] - ERROR: 🤖‼️ Error fetching offerings - PurchasesError(code=StoreProblemError, underlyingErrorMessage=Failed to get user data. Make sure sandbox mode is enabled if using App Tester. https://rev.cat/enter-amazon-sandbox, message='There was a problem with the store.')
08-10 16:29:58.450 12194 12194 E Purchases: {"error":{"code":2,"message":"There was a problem with the store.","readableErrorCode":"StoreProblemError","readable_error_code":"StoreProblemError","underlyingErrorMessage":"Failed to get user data. Make sure sandbox mode is enabled if using App Tester. https:\/\/rev.cat\/enter-amazon-sandbox"}}
08-10 16:29:58.458 12194 12267 D Kiwi    : SimpleTaskPipeline: KIWI_COMMAND: Task finished executing: com.amazon.device.iap.internal.a.c.d@79f1c7b
08-10 16:29:58.467 12194 12210 I Unity   : _getOfferings {"error":{"code":2,"message":"There was a problem with the store.","readableErrorCode":"StoreProblemError","readable_error_code":"StoreProblemError","underlyingErrorMessage":"Failed to get user data. Make sure sandbox mode is enabled if using App Tester. https:\/\/rev.cat\/enter-amazon-sandbox"}}
08-10 16:29:58.467 12194 12210 I Unity   : 
08-10 16:29:58.483 12194 12210 I Unity   : Subtester: Message: There was a problem with the store., Code: 2, UnderlyingErrorMessage: Failed to get user data. Make sure sandbox mode is enabled if using App Tester. https://rev.cat/enter-amazon-sandbox, ReadableErrorCode: StoreProblemError
08-10 16:29:58.483 12194 12210 I Unity   : 

Random login errors

few of users are getting login errors on different devices and platforms. if there a way to avoid that or get more information about the error

  1. Environment
    1. Platform: Android/IOS
    2. SDK version: 3.4.1
    3. OS + version: Android OS 8.0.0 / API-26 (HUAWEIRNE-L21/348(C185)) // iOS 14.6
    4. Xcode/Android Studio version:
    5. Unity version: 2019.4.30
    6. How widespread is the issue. Percentage of devices affected. Not a widespread issue but this regression popups after every few days on my Sentry tracking

Capture

iOS: SetMixpanelDistinctID Incorrectly Sets $appsflyerId Instead of $mixpanelDistinctId in Purchases SDK v4.12.0


Describe the bug
SetMixpanelDistinctID sets $appsflyerId instead of setting $mixpanelDistinctId, on iOS.

The buggy method: https://github.com/RevenueCat/purchases-unity/blob/main/RevenueCat/Plugins/iOS/PurchasesUnityHelper.m#L356-L358

  • Platform: Sonoma 14.3
  • SDK version: 4.12.0
  • OS + version: iOS 17.3.1
  • Xcode/Android Studio version: Xcode Version 15.2 (15C500b)
  • Unity version: 2021.3.4f1
  • The percentage of devices affected is %100 of all the iOS devices

Cannot build in xcode 10.1,

Unity build without errors, but in xcode i have this error:
photo_2019-04-18_18-02-55

StoreKit is added.
unity 2018.3.10
No problem on xcode 10.2.

Unity IAP & RevenueCat conflict ( when building to Android )

Hello

I would like to use RevenueCat in observer mode, so I don't want to stop using Unity IAP for processing purchases.

But once I build to Android, I got this issue:
Duplicate class com.android.vending.billing.IInAppBillingService found in modules classes.jar (:GoogleAIDL:) and classes.jar (com.android.billingclient:billing:2.0.3)
Duplicate class com.android.vending.billing.IInAppBillingService$Stub found in modules classes.jar (:GoogleAIDL:) and classes.jar (com.android.billingclient:billing:2.0.3)
Duplicate class com.android.vending.billing.IInAppBillingService$Stub$Proxy found in modules classes.jar (:GoogleAIDL:) and classes.jar (com.android.billingclient:billing:2.0.3)

due to a duplicate class: com.android.billingclient
I think it can be easily fixed by editing the Gradle file, but if there is an option to do it from RevenueCat itself, it will be much cleaner.

Thanks

MacOS Standalone Incompatibility. GetOfferings() does not return

Hello,
Trying to get RevenueCat up and running in the Unity Editor on MacOS 10.15.

I'm running the sample files exactly as described in the Documentation, on two singleton GameObjects - with all my API key and identifiers correctly entered in Properties.

  • The GetOfferings() function called from PurchasesListener on Line 26 never returns a value.

When I look over in PurchasesListener, I can see that the GetOfferings() function being called on MacOS is inside PurchasesWrapperNoop, and it is an empty function - Line 151. (So it makes some sense that nothing is happening.)

How can I get this to work? Does the GetOfferings() function inside the wrapper in Purchases.cs need to be filled out?

Thank you

productIdentifier null or empty in Purchases.PurchasePackage callback

Describe the bug
SDK version 3.3 and 3.4 returns null or an empty string for productIdentifier in the Purchases.PurchasePackage callback.
Version 3.2 is working as expected.

  1. Environment
    1. Platform: Unity
    2. SDK version: 3.3 & 3.4
    3. OS + version: Android
    4. Xcode/Android Studio version: Unity
    5. Unity version: 2020.3.9f1
    6. How widespread is the issue. Percentage of devices affected. 100%
  2. Debug logs that reproduce the issue
  3. Steps to reproduce, with a description of expected vs. actual behavior
  4. Other information (e.g. stacktraces, related issues, suggestions how to fix, links for us to have context, eg. stackoverflow, etc.)

Additional context
Add any other context about the problem here.

Integration with Unity IAP 2.2.5

Looks like the integration with Unity IAP 2.2.5 is broken and/or cannot be fixed by just following the instructions here: https://docs.revenuecat.com/v3.0/docs/unity#installation-with-unity-iap-side-by-side

After I setup the project as suggested, modifying the gradle file, I get the following:

Gradle Error: Colliding Attributes
The attribute meta-data#com.google.android.play.billingclient.version@value=3.0.1 in :com.android.billingclient.billing-no-service: collides with another value
(See the Console for details)

Attribute meta-data#com.google.android.play.billingclient.version@value value=(3.0.1) from [:billing-3.0.1:] AndroidManifest.xml:15:13-34 is also present at [:com.android.billingclient.billing-no-service:] AndroidManifest.xml:15:13-34 value=(2.0.3). Suggestion: add 'tools:replace="android:value"' to element at AndroidManifest.xml:13:9-15:37 to override.

Among other 186+ errors that might just be cascading from this one.

Did something change with the latest Unity IAP and or Android billing libraries that made your guide for Unity IAP and RevenueCat integration obsolete?

RevenueCat Purchases SDK doesn't get initialized

Describe the bug
RevenueCat doesn't get initialized because it can't find com/revenuecat/purchases/google/BillingWrapper class

  1. Environment
    1. Platform: Android
    2. SDK version: 3.5.0
    3. OS + version: Android 11
    4. Xcode/Android Studio version:
    5. Unity version: Unity 2020.3.25f1
    6. How widespread is the issue. Percentage of devices affected. 100%
  2. Debug logs that reproduce the issue
2022/02/03 15:02:44.221 9309 14594 Error Unity java.lang.NoClassDefFoundError: Failed resolution of: Lcom/revenuecat/purchases/google/BillingWrapper;
2022/02/03 15:02:44.221 9309 14594 Error Unity     at com.revenuecat.purchases.BillingFactory.createBilling(BillingFactory.kt:22)
2022/02/03 15:02:44.221 9309 14594 Error Unity     at com.revenuecat.purchases.Purchases$Companion.configure$purchases_release(Purchases.kt:1874)
2022/02/03 15:02:44.221 9309 14594 Error Unity     at com.revenuecat.purchases.Purchases$Companion.configure(Purchases.kt:1828)
2022/02/03 15:02:44.221 9309 14594 Error Unity     at com.revenuecat.purchases.Purchases$Companion.configure$default(Purchases.kt:1821)
2022/02/03 15:02:44.221 9309 14594 Error Unity     at com.revenuecat.purchases.hybridcommon.CommonKt.configure(common.kt:329)
2022/02/03 15:02:44.221 9309 14594 Error Unity     at com.revenuecat.purchasesunity.PurchasesWrapper.setup(PurchasesWrapper.java:66)
2022/02/03 15:02:44.221 9309 14594 Error Unity     at com.unity3d.player.UnityPlayer.nativeRender(Native Method)
2022/02/03 15:02:44.221 9309 14594 Error Unity     at com.unity3d.player.UnityPlayer.access$300(Unknown Source:0)
2022/02/03 15:02:44.221 9309 14594 Error Unity     at com.unity3d.player.UnityPlayer$e$1.handleMessage(Unknown Source:95)
2022/02/03 15:02:44.221 9309 14594 Error Unity     at android.os.Handler.dispatchMessage(Handler.java:102)
2022/02/03 15:02:44.221 9309 14594 Error Unity     at android.os.Looper.loopOnce(Looper.ja
2022/02/03 15:02:44.229 9309 14594 Error Unity AndroidJavaException: kotlin.UninitializedPropertyAccessException: There is no singleton instance. Make sure you configure Purchases before trying to get the default instance. More info here: https://errors.rev.cat/configuring-sdk
2022/02/03 15:02:44.229 9309 14594 Error Unity kotlin.UninitializedPropertyAccessException: There is no singleton instance. Make sure you configure Purchases before trying to get the default instance. More info here: https://errors.rev.cat/configuring-sdk
2022/02/03 15:02:44.229 9309 14594 Error Unity     at com.revenuecat.purchases.Purchases$Companion.getSharedInstance(Purchases.kt:1775)
2022/02/03 15:02:44.229 9309 14594 Error Unity     at com.revenuecat.purchases.hybridcommon.CommonKt.getOfferings(common.kt:44)
2022/02/03 15:02:44.229 9309 14594 Error Unity     at com.revenuecat.purchasesunity.PurchasesWrapper.getOfferings(PurchasesWrapper.java:199)
2022/02/03 15:02:44.229 9309 14594 Error Unity     at com.unity3d.player.UnityPlayer.nativeRender(Native Method)
2022/02/03 15:02:44.229 9309 14594 Error Unity     at com.unity3d.player.UnityPlayer.access$300(Unknown Source:0)
2022/02/03 15:02:44.229 9309 14594 Error Unity     at com.unity3d.player.UnityPlayer$e$1.handleMessage(Unknown Source:95)
2022/02/03 15:02:44.229 9309 14594 Error Unity     at android.os.Handler.dispatchMessage(Handler.java:102)
2022/02/03 15:02:44.229 9309 14594 Error Unity     at android.os.Looper.loopOnce(Looper.java:226)
2022/02/03 15:02:44.229 9309 14594 Error Unity     at android.os.Looper.lo
  1. Steps to reproduce, with a description of expected vs. actual behavior
    Just install the SDK and build for an Android device.

  2. Other information (e.g. stacktraces, related issues, suggestions how to fix, links for us to have context, eg. stackoverflow, etc.)
    We don't use Unity IAP package. Only RevenueCat is on the project currently.

Additional context
Add any other context about the problem here.

📣 Have a question? Please use https://community.revenuecat.com 😁

👋 Hello, RevenueCat community!

We've just recently released a new site to assist you all getting better and faster answers to your questions.

Head over to https://community.revenuecat.com to get started!

The Community

GitHub issues are great for bug reports specific to an SDK but might not be the best place to look for answers to support questions. Our new community site puts all the questions and answers in one place. This is great if you have a question that spans multiple platforms so you won't have to search multiple GitHub repositories.

✅ Search for already asked and answered questions
✅ Ask a new question about one or multiple platforms
✅ Get responses from dedicated support engineers
✅ Find hand-picked content that highlight new features or common questions

Search the community for questions

Screen Shot 2021-12-14 at 6 03 39 PM

Response from dedicated support engineers

Screen Shot 2021-12-14 at 6 36 12 PM

Hand-picked content

Screen Shot 2021-12-14 at 6 35 16 PM

Receive Customer Info Bug

I had issues to receive Customer info from the CustomerInfoReceived listener. Never got any information on, e.g start up and applicationDidBecomeActive().

Did some digging and realized that _receiveCustomerInfo(string customerInfoJson) in Purchases.cs never was called from the pluggin.

Continued to trace into the native code and found that PurchasesUnityHelper.m does not implement the optional protocol method receivedUpdatedCustomerInfo from protocol PurchasesDelegate. Instead it implements the method didReceiveUpdatedCustomerInfo which is never called.

If we update the method name from didReceiveUpdatedCustomerInfo to receivedUpdatedCustomerInfo (to match the protocol) it works as expected.

  1. Environment
    1. Platform: Unity
    2. SDK version: 4.3.0
    3. OS + version: iOS 15.5
    4. Xcode/Android Studio version: Xcode 13.4.1
    5. Unity version: 2020.3.26f1
    6. How widespread is the issue. Percentage of devices affected. iOS: 100%
  2. Debug logs that reproduce the issue
  3. Steps to reproduce, with a description of expected vs. actual behavior
  4. Other information (e.g. stacktraces, related issues, suggestions how to fix, links for us to have context, eg. stackoverflow, etc.)

Suggestions how to fix:
In line 211: Assets/RevenueCat/Plugins/iOS/PurchasesUnityHelper.m:
didReceiveUpdatedCustomerInfo -> receivedUpdatedCustomerInfo.

Additional context
Add any other context about the problem here.

XCode build issue: Value for swift_version cannot be empty

After update to the latest RevenuCat SDK (2.3.0) started receiving a warning on the XCode project opening and build error.
Value for swift_version cannot be empty
Since the only swift file used in the project is Dummy.swift, assume this inconvenience is connected with the last update.

Build Platform: iOS
SDK version: 2.3.0
Xcode version: 11.7

The workaround for that is to specify Swift Compiler - Language -> Swift Language Version in Build Settings of the XCode project. But it's required to be done with each new build.

Purchases framework causes crash on older iOS devices

Describe the bug
We had recently updated this framework from 2.0.1 to version 4.14.1. However, we've started getting crashes on older iOS devices. The crash happens right after our splash screen is finished displaying -- right when our first scene is loaded in. The stack trace for this issue is here:

Date/Time:           2023-04-26 21:45:28.2987 -0500
Launch Time:         2023-04-26 21:45:15.3798 -0500
OS Version:          iPhone OS 12.5.7 (16H81)
Baseband Version:    10.80.02
Report Version:      104

Exception Type:  EXC_CRASH (SIGABRT)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Exception Note:  EXC_CORPSE_NOTIFY
Triggered by Thread:  0

Thread 0 name:
Thread 0 Crashed:
0   dyld                          	0x00000001001ae418 __abort_with_payload + 8
1   dyld                          	0x00000001001ada58 abort_with_payload_wrapper_internal + 100 (terminate_with_reason.c:72)
2   dyld                          	0x00000001001ada88 abort_with_payload + 12 (terminate_with_reason.c:94)
3   dyld                          	0x00000001001708f8 dyld::halt(char const*) + 304 (dyld.cpp:4024)
4   dyld                          	0x0000000100170a14 dyld::fastBindLazySymbol(ImageLoader**, unsigned long) + 284 (dyld.cpp:4112)
5   libdyld.dylib                 	0x00000001d7353848 dyld_stub_binder + 60
6   UnityFramework                	0x0000000102346a38 type metadata completion function for SK2StoreProduct + 24 (<compiler-generated>:0)
7   libswiftCore.dylib            	0x0000000205128820 swift_getSingletonMetadata + 636 (MetadataCache.h:920)
8   UnityFramework                	0x0000000102346a18 type metadata accessor for SK2StoreProduct + 48 (<compiler-generated>:0)
9   libswiftCore.dylib            	0x000000020513f098 swift_conformsToSwiftProtocolImpl(swift::TargetMetadata<swift::InProcess> const*, swift::TargetProtocolDescriptor<swift::InProcess> const*, llvm::StringRef) + 312 (ProtocolConformance.cpp:478)
10  libswiftCore.dylib            	0x000000020513ee38 swift_conformsToProtocol + 188 (CompatibilityOverride.def:137)
11  libswiftCore.dylib            	0x0000000205118a58 swift::_conformsToProtocol(swift::OpaqueValue const*, swift::TargetMetadata<swift::InProcess> const*, swift::TargetProtocolDescriptorRef<swift::InProcess>, swift::TargetWitnessTable<swift::InProces... + 44 (Casting.cpp:320)
12  libswiftCore.dylib            	0x000000020513e6fc swift::_checkGenericRequirements(llvm::ArrayRef<swift::TargetGenericRequirementDescriptor<swift::InProcess> >, std::__1::vector<void const*, std::__1::allocator<void const*> >&, std::__1::function<... + 1160 (ProtocolConformance.cpp:648)
13  libswiftCore.dylib            	0x000000020513b740 (anonymous namespace)::DecodedMetadataBuilder::createBoundGenericType(swift::TargetContextDescriptor<swift::InProcess> const*, llvm::ArrayRef<swift::TargetMetadata<swift::InProcess> const*>, swift:... + 584 (MetadataLookup.cpp:1083)
14  libswiftCore.dylib            	0x000000020513adec swift::Demangle::TypeDecoder<(anonymous namespace)::DecodedMetadataBuilder>::decodeMangledType(swift::Demangle::Node* const&) + 2832 (TypeDecoder.h:201)
15  libswiftCore.dylib            	0x000000020513a428 swift::Demangle::TypeDecoder<(anonymous namespace)::DecodedMetadataBuilder>::decodeMangledType(swift::Demangle::Node* const&) + 332 (Demangle.h:0)
16  libswiftCore.dylib            	0x0000000205139d10 swift_getTypeByMangledNodeImpl(swift::MetadataRequest, swift::Demangle::Demangler&, swift::Demangle::Node*, std::__1::function<swift::TargetMetadata<swift::InProcess> const* (unsigned int, unsigned... + 460 (TypeDecoder.h:700)
17  libswiftCore.dylib            	0x0000000205139ad0 swift::swift_getTypeByMangledNode(swift::MetadataRequest, swift::Demangle::Demangler&, swift::Demangle::Node*, std::__1::function<swift::TargetMetadata<swift::InProcess> const* (unsigned int, unsig... + 520 (CompatibilityOverride.def:148)
18  libswiftCore.dylib            	0x000000020513a044 swift_getTypeByMangledNameImpl(swift::MetadataRequest, llvm::StringRef, std::__1::function<swift::TargetMetadata<swift::InProcess> const* (unsigned int, unsigned int)>, std::__1::function<swift::Ta... + 652 (MetadataLookup.cpp:1300)
19  libswiftCore.dylib            	0x0000000205138450 swift::swift_getTypeByMangledName(swift::MetadataRequest, llvm::StringRef, std::__1::function<swift::TargetMetadata<swift::InProcess> const* (unsigned int, unsigned int)>, std::__1::function<swift:... + 520 (CompatibilityOverride.def:155)
20  libswiftCore.dylib            	0x000000020513859c swift_getTypeByMangledNameInContext + 216 (MetadataLookup.cpp:1326)
21  UnityFramework                	0x0000000102112694 __swift_instantiateConcreteTypeFromMangledName + 52 (<compiler-generated>:0)
22  UnityFramework                	0x00000001022d14d0 specialized _NativeDictionary.resize(capacity:) + 12 (<compiler-generated>:0)
23  UnityFramework                	0x00000001022d14d0 specialized _NativeDictionary.ensureUnique(isUnique:capacity:) + 24 (<compiler-generated>:0)
24  UnityFramework                	0x00000001022d14d0 specialized _NativeDictionary.mutatingFind(_:isUnique:) + 64 (<compiler-generated>:0)
25  UnityFramework                	0x00000001022d14d0 specialized _NativeDictionary.merge<A>(_:isUnique:uniquingKeysWith:) + 196
26  UnityFramework                	0x00000001022d1368 specialized protocol witness for Sequence.underestimatedCount.getter in conformance LazyMapSequence<A, B> + 32 (<compiler-generated>:0)
27  UnityFramework                	0x00000001022d1368 specialized Dictionary.init<A>(uniqueKeysWithValues:) + 32 (Logger.swift:267)
28  UnityFramework                	0x00000001022d1368 one-time initialization function for order + 108
29  libdispatch.dylib             	0x00000001d73407d4 _dispatch_client_callout + 16 (object.m:511)
30  libdispatch.dylib             	0x00000001d72e3eb8 _dispatch_once_callout + 28 (once.c:52)
31  libswiftCore.dylib            	0x000000020513de40 swift_once + 40 (once.h:111)
32  UnityFramework                	0x00000001022da794 specialized static Logger.log(level:intent:message:fileName:functionName:line:) + 700
33  UnityFramework                	0x00000001022d9888 specialized static Logger.log(level:intent:message:fileName:functionName:line:) + 64
34  UnityFramework                	0x000000010231b630 specialized static Logger.log(level:intent:message:fileName:functionName:line:) + 60 (Logger.swift:127)
35  UnityFramework                	0x000000010231b630 static Logger.debug(_:fileName:functionName:line:) + 60 (Purchases.swift:0)
36  UnityFramework                	0x000000010231b630 specialized Purchases.__allocating_init(apiKey:appUserID:userDefaults:observerMode:platformInfo:responseVerificationLevel:storeKit2Setting:storeKitTimeout:networkTimeout:dangerousSettings:) + 172
37  UnityFramework                	0x000000010231dd0c Purchases.__allocating_init(apiKey:appUserID:userDefaults:observerMode:platformInfo:responseVerificationLevel:storeKit2Setting:storeKitTimeout:networkTimeout:dangerousSettings:) + 52 (<compiler-generated>:1038)
38  UnityFramework                	0x000000010231dd0c implicit closure #1 in static Purchases.configure(withAPIKey:appUserID:observerMode:userDefaults:platformInfo:responseVerificationLevel:storeKit2Setting:storeKitTimeout:networkTimeout:dangerousSett... + 104 (<compiler-generated>:0)
39  UnityFramework                	0x000000010231dd0c partial apply for implicit closure #1 in static Purchases.configure(withAPIKey:appUserID:observerMode:userDefaults:platformInfo:responseVerificationLevel:storeKit2Setting:storeKitTimeout:networkTim... + 172
40  UnityFramework                	0x00000001023191d4 closure #1 in static Purchases.setDefaultInstance(_:) + 4 (Purchases.swift:517)
41  UnityFramework                	0x00000001023191d4 specialized closure #1 in Atomic.modify<A>(_:) + 4 (Atomic.swift:64)
42  UnityFramework                	0x00000001023191d4 specialized closure #1 in Atomic.modify<A>(_:) + 4 (<compiler-generated>:0)
43  UnityFramework                	0x00000001023191d4 specialized Lock.perform<A>(_:) + 4 (Lock.swift:49)
44  UnityFramework                	0x00000001023191d4 specialized Atomic.modify<A>(_:) + 4 (Atomic.swift:63)
45  UnityFramework                	0x00000001023191d4 specialized static Purchases.setDefaultInstance(_:) + 192 (Purchases.swift:504)
46  UnityFramework                	0x000000010231d340 static Purchases.setDefaultInstance(_:) + 16 (<compiler-generated>:0)
47  UnityFramework                	0x000000010231d340 static Purchases.configure(withAPIKey:appUserID:observerMode:userDefaults:platformInfo:responseVerificationLevel:storeKit2Setting:storeKitTimeout:networkTimeout:dangerousSettings:) + 48 (Purchases.swift:909)
48  UnityFramework                	0x000000010231d340 specialized static Purchases.configure(with:) + 224
49  UnityFramework                	0x0000000102248750 static Purchases.configure(apiKey:appUserID:observerMode:userDefaultsSuiteName:platformFlavor:platformFlavorVersion:usesStoreKit2IfAvailable:dangerousSettings:) + 880 (Purchases+HybridAdditions.swift:49)
50  UnityFramework                	0x0000000102248914 @objc static Purchases.configure(apiKey:appUserID:observerMode:userDefaultsSuiteName:platformFlavor:platformFlavorVersion:usesStoreKit2IfAvailable:dangerousSettings:) + 304 (<compiler-generated>:0)
51  UnityFramework                	0x00000001020fae2c -[RCUnityHelperDelegate setupPurchases:appUserID:gameObject:observerMode:usesStoreKit2IfAvailable:userDefaultsSuiteName:dangerousSettingsJson:] + 448 (PurchasesUnityHelper.m:83)
52  UnityFramework                	0x00000001020fc22c _RCSetupPurchases + 208 (PurchasesUnityHelper.m:454)
53  UnityFramework                	0x0000000104bb2c00 PurchasesWrapperiOS__RCSetupPurchases_mD3D94F7356E6ACB5DC9D4144B05271890B674AC9 + 136 (revenuecat.purchases-unity.cpp:12676)
54  UnityFramework                	0x0000000104ba6b14 InterfaceActionInvoker8<String_t*, String_t*, String_t*, bool, bool, String_t*, bool, String_t*>::Invoke(unsigned short, Il2CppClass*, Il2CppObject*, String_t*, String_t*, String_t*, bool, bool, St... + 32 (revenuecat.purchases-unity.cpp:186)
55  UnityFramework                	0x0000000104ba6b14 Purchases_Configure_mB6B15274DFB7B7FFCB1D96E626D7C6DE2A9A3FF0 + 304 (revenuecat.purchases-unity.cpp:4534)
56  UnityFramework                	0x0000000104ba63d8 Purchases_Start_m879CBCF4317AB1B0233FBD048C48D5B99E5C382B + 316 (revenuecat.purchases-unity.cpp:4297)
57  UnityFramework                	0x00000001030975f8 il2cpp::vm::Runtime::InvokeWithThrow(MethodInfo const*, void*, void**) + 100 (Runtime.cpp:567)
58  UnityFramework                	0x0000000103097458 il2cpp::vm::Runtime::Invoke(MethodInfo const*, void*, void**, Il2CppException**) + 84 (Runtime.cpp:553)
59  UnityFramework                	0x00000001025e2094 scripting_method_invoke(ScriptingMethodPtr, ScriptingObjectPtr, ScriptingArguments&, ScriptingExceptionPtr*, bool) + 112 (ScriptingApi_Il2Cpp.cpp:292)
60  UnityFramework                	0x00000001025ede3c ScriptingInvocation::Invoke(ScriptingExceptionPtr*, bool) + 120 (ScriptingInvocation.cpp:298)
61  UnityFramework                	0x00000001025fdf14 MonoBehaviour::InvokeMethodOrCoroutineChecked(ScriptingMethodPtr, ScriptingObjectPtr, ScriptingExceptionPtr*) + 2012 (MonoBehaviour.cpp:0)
62  UnityFramework                	0x00000001025fe098 MonoBehaviour::InvokeMethodOrCoroutineChecked(ScriptingMethodPtr, ScriptingObjectPtr) + 84 (MonoBehaviour.cpp:860)
63  UnityFramework                	0x00000001025fe880 Start + 40 (MonoBehaviour.cpp:465)
64  UnityFramework                	0x00000001025fe880 MonoBehaviour::DelayedStartCall(Object*, void*) + 56 (MonoBehaviour.cpp:1239)
65  UnityFramework                	0x0000000102448f54 DelayedCallManager::Update(int) + 536 (CallDelayed.cpp:185)
66  UnityFramework                	0x000000010250b34c ExecutePlayerLoop(NativePlayerLoopSystem*) + 100 (PlayerLoop.cpp:383)
67  UnityFramework                	0x000000010250b38c ExecutePlayerLoop(NativePlayerLoopSystem*) + 164 (PlayerLoop.cpp:404)
68  UnityFramework                	0x000000010250b5e8 PlayerLoop() + 272 (PlayerLoop.cpp:508)
69  UnityFramework                	0x0000000102af5fc4 UnityPlayerLoopImpl(bool) + 112 (LibEntryPoint.mm:327)
70  UnityFramework                	0x0000000101ebfdb4 UnityRepaint + 12 (UnityAppController+Rendering.mm:236)
71  UnityFramework                	0x0000000101ebfdb4 -[UnityAppController(Rendering) repaint] + 84 (UnityAppController+Rendering.mm:90)
72  UnityFramework                	0x0000000101ebfd44 -[UnityAppController(Rendering) repaintDisplayLink] + 76 (UnityAppController+Rendering.mm:71)
73  QuartzCore                    	0x00000001dbd13ff0 CA::Display::DisplayLink::dispatch_items(unsigned long long, unsigned long long, unsigned long long) + 636 (CADisplay.mm:2349)
74  IOKit                         	0x00000001d7b5f4b0 IODispatchCalloutFromCFMessage + 488 (IOKitLib.c:1216)
75  CoreFoundation                	0x00000001d786d990 __CFMachPortPerform + 188 (CFMachPort.c:522)
76  CoreFoundation                	0x00000001d7894594 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 56 (CFRunLoop.c:1996)
77  CoreFoundation                	0x00000001d7893ce0 __CFRunLoopDoSource1 + 440 (CFRunLoop.c:2133)
78  CoreFoundation                	0x00000001d788eb04 __CFRunLoopRun + 2096 (CFRunLoop.c:3152)
79  CoreFoundation                	0x00000001d788dfb4 CFRunLoopRunSpecific + 436 (CFRunLoop.c:3247)
80  GraphicsServices              	0x00000001d9a9079c GSEventRunModal + 104 (GSEvent.c:2245)
81  UIKitCore                     	0x0000000203d56c38 UIApplicationMain + 212 (UIApplication.m:4353)
82  UnityFramework                	0x0000000101ebf8ec -[UnityFramework runUIApplicationMainWithArgc:argv:] + 92 (main.mm:96)
83  JoonPetGame                   	0x00000001000bb978 main + 744 (main.mm:34)
84  libdyld.dylib                 	0x00000001d73518e0 start + 4

Here's a Sentry error of what's happening:
Screenshot 2023-04-28 at 11 59 55 AM

Do not remove any of the steps from the template below. If a step is not applicable to your issue, please leave that step empty.

  1. Environment
    1. Platform: Unity iOS
    2. SDK version: v4.14.1
    3. OS + version: iOS v12.5.7
    4. Xcode/Android Studio version: Xcode 13 and Xcode 14 (tried both)
    5. Unity version: 2021.3.16f1
    6. How widespread is the issue. Percentage of devices affected. Just affecting users with old iOS devices. About 5
  2. Debug logs that reproduce the issue
  3. Steps to reproduce, with a description of expected vs. actual behavior
  4. Other information (e.g. stacktraces, related issues, suggestions how to fix, links for us to have context, eg. stackoverflow, etc.)

Additional context
Here is our UpdatedCustomerInfoListener class:

using System.Collections.Generic;
using UnityEngine;

// TODO: Since the parent class is not utilized in anyway. I figured it would be safe to just make this a standard
// TODO: Singleton. If there are any issues, I can happily revert it.
public class SubscriptionManager : Purchases.UpdatedCustomerInfoListener
{
    public static SubscriptionManager Instance;
    
    public delegate void SubscriptionStatusCallback(bool isSubscribed, bool isInTrialMode);

    private Purchases Purchases => transform.parent.GetComponentInChildren<Purchases>();

    public void UserLoggedIn(Parent parent)
    {
        // TODO: Created and error are never used. Should we make a use case for them or remove them?
        Purchases.LogIn(appUserId: $"{parent.FamilyId}", callback: (info, _, _) =>
        {
            Purchases.SetEmail(email: parent.Email);
            Purchases.SetAttributes(attributes: new Dictionary<string, string>
            {
                { JoonConsts.PARENT_ID, $"{parent.Id}" },
                { JoonConsts.NAME, parent.Name },
                { JoonConsts.EMAIL, parent.Email }
            });
        });
    }

    public void UserLoggedOut()
    {
        Purchases.LogOut(callback: null);
    }

    public void SubscriptionStatus(SubscriptionStatusCallback callback)
    {
        // Purchases will only return a callback if it actually is on Android or iOS. This check allows us to
        // callback the caller of this function when running on Unity.
        if (Application.platform is RuntimePlatform.Android or RuntimePlatform.IPhonePlayer)
        {
            Purchases.GetCustomerInfo(callback: (info, error) =>
            {
                if (error != null)
                {
                    callback(isSubscribed: false, isInTrialMode: false);
                    return;
                }

                bool isUserSubscribed = info.Entitlements.Active.Count > 0;
                Parent parent = AuthenticationManager.GetParent();
                bool isInTrialMode = parent.NumQuestsVerified < parent.MaxFreeVerified;
                callback(isUserSubscribed, isInTrialMode);
            });
        }
        else
        {
            // Default callback if it isn't iOS or Android.
            callback(true, true);
        }
    }

    // Old Singleton set up for now since this uses an inherited class.
    private void Awake()
    {
        if (Instance != null && Instance != this)
        {
            Destroy(transform.root.gameObject);
        }
        else
        {
            Instance = this;
            DontDestroyOnLoad(transform.root.gameObject);
        }
    }

    // No-op
    public override void CustomerInfoReceived(Purchases.CustomerInfo customerInfo) { }
}

3.5.0 Version NoSuchMethodError getSkus()

Hello, we have a trouble with the latest version 3.5.0 when starting app
Unity version

  1. Environment
    1. Platform: Android
    2. SDK version: 3.5.0
    3. OS + version: any android
    4. Xcode/Android Studio version:
    5. Unity version: 2020.3.24f1
    6. How widespread is the issue. Percentage of devices affected. 100% when no ads was bought
  2. Debug logs that reproduce the issue
    /AndroidRuntime: FATAL EXCEPTION: Thread-35
    Process: tower.defence.merge.game, PID: 6756
    java.lang.NoSuchMethodError: No virtual method getSkus()Ljava/util/ArrayList; in class Lcom/android/billingclient/api/Purchase; or its super classes (declaration of 'com.android.billingclient.api.Purchase' appears in /data/app/~~DnMFn1uQiR_J7Wpdy2btBw==/tower.defence.merge.game-fDY9Su4YPJeSDype-6AO0g==/base.apk)
    at com.revenuecat.purchases.google.PurchaseDetailsConversionsKt.toRevenueCatPurchaseDetails(purchaseDetailsConversions.kt:16)
    at com.revenuecat.purchases.google.BillingWrapper.toMapOfGooglePurchaseWrapper(BillingWrapper.kt:418)
    at com.revenuecat.purchases.google.BillingWrapper.access$toMapOfGooglePurchaseWrapper(BillingWrapper.kt:53)
    at com.revenuecat.purchases.google.BillingWrapper$queryPurchases$1.invoke(BillingWrapper.kt:407)
    at com.revenuecat.purchases.google.BillingWrapper$queryPurchases$1.invoke(BillingWrapper.kt:53)
    at com.revenuecat.purchases.google.BillingWrapper.withConnectedClient(BillingWrapper.kt:593)
    at com.revenuecat.purchases.google.BillingWrapper.queryPurchases(BillingWrapper.kt:380)
    at com.revenuecat.purchases.Purchases$updatePendingPurchaseQueue$1.run(Purchases.kt:1707)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:462)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
    at java.lang.Thread.run(Thread.java:923)
  3. Launch the app

Can u help ? :)

Thanks

Null error when i am setting a app user ID

I am setting the app user id by calling the login function from the purchaser class. It gives me a null exception. I am attaching the screenshot of the error as well as the code I am calling .

I made sure purchases variable is not null

  1. Environment
    1. Platform: Android
    2. SDK version: I don't know, i downloaded it from here https://docs.revenuecat.com/docs/unity
    3. OS + version: 11
    4. Xcode/Android Studio version:
    5. Unity version: 2019.4.28f1
    6. How widespread is the issue. Percentage of devices affected.

Capture

Capture2

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.