Hi,
I have developed an app which has two in-app purchase subscriptions. During the test, the app can successfully get the status of the subscriptions. After it's released, I downloaded it from app store and subscribed it with my apple account. I found that in most cases, the app can identify that I have subscribed it and I can use its all functions. But yesterday, when I launched it again, it showed the warning that I haven't subscribed it. I checked my subscription in my account and the subscription status hasn't been changed, that is, I have subscribed it. And after one hour, I launched it again. This time the app identified that I have subscribed it. Why? The following is the code about listening to the subscription status. Is there any wrong about it?
| HomeView() |
| .onAppear(){ |
| Task { |
| await getSubscriptionStatus() |
| } |
| } |
| func getSubscriptionStatus() async { |
| var storeProducts = [Product]() |
| do { |
| let productIds = ["6740017137","6740017138"] |
| storeProducts = try await Product.products(for: productIds) |
| } catch { |
| print("Failed product request: \(error)") |
| } |
| guard let subscription1 = storeProducts.first?.subscription else { |
| |
| return |
| } |
| do { |
| let statuses = try await subscription1.status |
| |
| for status in statuses { |
| let info = try checkVerified(status.renewalInfo) |
| switch status.state { |
| case .subscribed: |
| if info.willAutoRenew { |
| purchaseStatus1 = true |
| debugPrint("getSubscriptionStatus user subscription is active.") |
| } else { |
| purchaseStatus1 = false |
| debugPrint("getSubscriptionStatus user subscription is expiring.") |
| } |
| case .inBillingRetryPeriod: |
| debugPrint("getSubscriptionStatus user subscription is in billing retry period.") |
| purchaseStatus1 = false |
| case .inGracePeriod: |
| debugPrint("getSubscriptionStatus user subscription is in grace period.") |
| purchaseStatus1 = false |
| case .expired: |
| debugPrint("getSubscriptionStatus user subscription is expired.") |
| purchaseStatus1 = false |
| case .revoked: |
| debugPrint("getSubscriptionStatus user subscription was revoked.") |
| purchaseStatus1 = false |
| default: |
| fatalError("getSubscriptionStatus WARNING STATE NOT CONSIDERED.") |
| } |
| } |
| } catch { |
| |
| } |
| |
| guard let subscription2 = storeProducts.last?.subscription else { |
| |
| return |
| } |
| do { |
| let statuses = try await subscription2.status |
| |
| for status in statuses { |
| let info = try checkVerified(status.renewalInfo) |
| switch status.state { |
| case .subscribed: |
| if info.willAutoRenew { |
| purchaseStatus2 = true |
| debugPrint("getSubscriptionStatus user subscription is active.") |
| } else { |
| purchaseStatus2 = false |
| debugPrint("getSubscriptionStatus user subscription is expiring.") |
| } |
| case .inBillingRetryPeriod: |
| debugPrint("getSubscriptionStatus user subscription is in billing retry period.") |
| purchaseStatus2 = false |
| case .inGracePeriod: |
| debugPrint("getSubscriptionStatus user subscription is in grace period.") |
| purchaseStatus2 = false |
| case .expired: |
| debugPrint("getSubscriptionStatus user subscription is expired.") |
| purchaseStatus2 = false |
| case .revoked: |
| debugPrint("getSubscriptionStatus user subscription was revoked.") |
| purchaseStatus2 = false |
| default: |
| fatalError("getSubscriptionStatus WARNING STATE NOT CONSIDERED.") |
| } |
| } |
| } catch { |
| |
| } |
| |
| if purchaseStatus1 == true || purchaseStatus2 == true { |
| purchaseStatus = true |
| } else if purchaseStatus1 == false && purchaseStatus2 == false { |
| purchaseStatus = false |
| } |
| return |
| } |