当我测试订阅类型的应用内购买时,我遇到了奇怪的行为

问题描述 投票:0回答:1

我试图在 SwiftUI 应用程序中添加我的第一个

in-app purchase
类型
renewable subscription
,但我得到了一个奇怪的行为。我实际上不知道这是我的问题还是只是正常/奇怪的行为。让我解释一下这个问题。

我做的第一件事是初始化

StoreManager class
,然后将其注入到环境中:

import SwiftUI

@main
struct BootcampApp: App {
    @StateObject private var storeManager = StoreManager()

    var body: some Scene {
        WindowGroup {
            ContentView()
                .environmentObject(storeManager)
        }
    }
}

然后,我做的第二件事是使用

load() function
检查用户是否是高级(付费)用户:

import SwiftUI

struct ContentView: View {
    @EnvironmentObject private var storeManager: StoreManager
    @AppStorage("isPremium") private var isPremium = false

    var body: some View {
        TabView {
            FirstView()
            SecondView()
        }
        .task { await load() }
    }

    private func load() async {
        guard let subscription = storeManager.subscriptions.first else { return }
        isPremium = (try? await storeManager.isPurchased(subscription)) ?? isPremium
    }
}

郑重声明,我实际上在链接到

storekit file
的 Xcode 项目上使用了
StoreKit Configuration in the Scheme

并且,一切都运行得很好,除了有时

isPremium
毫无理由地变成
false
。所以,我不知道这是我的
load() function
还是当我们使用
storekit file
而不是 App Store Connect 的真实产品时很常见的东西。

另外,这是

isPurchased function
。这是非常基本的,因为我不检查他的状态,而只检查他在
purchasedSubscription
上的存在。

func isPurchased(_ product: Product) async throws -> Bool {
    return purchasedSubscriptions.contains(product)
}

你知道发生了什么事吗?

提前谢谢!

swift swiftui in-app-purchase storekit
1个回答
0
投票

而不是

.task { await load() }

使用

 .task(id: storeManager.subscriptions) { await load() }

当然这取决于

storeManager.subscriptions

设置正确。它不会只运行

onAppear
,而是运行
onAppear
onChange

Apple 有一个很好的例子,一切 g 总是在倾听变化并做出反应。

https://developer.apple.com/documentation/storekit/in-app_purchase/implementing_a_store_in_your_app_using_the_storekit_api

© www.soinside.com 2019 - 2024. All rights reserved.