我在生产中拥有的功能齐全的代码在visionOS上不起作用,这是怎么回事?我得到了这个错误

‘Purchase(Options:)’在visionOS中不可用:使用@Environment(.Purchase)获取要调用的Purche eAction值.如果你的应用程序使用UIKit,使用购买(confirmIn:Options:).

如何更改代码以满足visionos的要求?

    func purchase(_ product: Product) async throws -> Transaction? {
        
        let result = try await product.purchase() //TEMPORARY JAN-23
        
        switch result {
        case .success(let verification):
            // Successful purchase

    
                //Check whether the transaction is verified. If it isn't,
                //this function rethrows the verification error.
                let transaction = try checkVerified(verification)

                //The transaction is verified. Deliver content to the user.
                await updateCustomerProductStatus()

更新:我意识到我需要做ios17的购买方式,但他们的ios16购买方式不能与ios17方式共存!!怎么了!!

我不能这么做

struct PaymentViewVoice: View {
    @Environment(\.presentationMode) var presentationMode
    @EnvironmentObject private var store: Store
    @Environment(\.purchase) var purchase // For iOS 17 payments

错误:‘购买’仅在iOS 17.0或更新版本中可用

and 我不能这么做

struct PaymentViewVoice: View {
    @Environment(\.presentationMode) var presentationMode
    @EnvironmentObject private var store: Store //for ios6 payments
    @available(iOS 17.0, *)
    @Environment(\.purchase) var purchase // For iOS 17 payments

错误:存储的属性不能用‘@Available’标记为可能不可用

推荐答案

VisionOS需要仅在iOS 17.0+上提供的SwiftUI代码.您的iOS应用程序支持iOS 16.0+.一种解决方案是使用编译器指令,这样SwiftUI/iOS 17+代码只为应用程序的visionOS版本构建,而"较旧的"、非SwiftUI的StoreKit API用于应用程序的iOS版本.

类似于以下内容:

struct PaymentViewVoice: View {
    @Environment(\.presentationMode) var presentationMode
    @EnvironmentObject private var store: Store
#if os(visionOS)
    @Environment(\.purchase) var purchase // For iOS 17 payments
#endif

如果您有任何仅适用于SwiftUI/iOS 17+/visionOS版本的代码,请将该代码包含在:

#if os(visionOS)
#endif

如果您有任何仅适用于iOS版本(iOS 16或iOS 17)的代码,请将该代码包含在:

#if os(iOS)
#endif

如果您有一节包含这两个部分的代码,请将代码包含在:

#if os(visionOS)
    // visionOS specific code
#else
    // iOS specific code
#endif

按钮处理程序中可能有一个简化的示例:

Button {
    Task {
        let purchaseResult: Product.PurchaseResult
#if os(visionOS)
        // visionOS specific code
        purchaseResult = try await purchase(product)
#else
        // iOS specific code
        purchaseResult = try await product.purchase() 
#endif
        // Process the purchase result.
        switch purchaseResult {
        }
    } 
} label: {
    Text("Purchase")
}

Swift相关问答推荐

如何在Swift 中创建移动的uil标签?

如何禁用MacOS上SwiftUI中按钮周围的聚焦环(或高亮显示)?

是否在字符串属性上搜索数组和子数组?

ARRaycast Query和前置摄像头(ARFaceTrackingConfiguration)

我可以为UIMenu设定一个固定的订单吗?

当计数大于索引时,索引超出范围崩溃

如何在SwiftUI 4+(iOS 16+)中使用新的NavigationStack进行导航

以编程方式使UIView居中,而不影响UIKit中其他UI类的位置

在SwiftUI中绘制形状的路径后填充形状

如何将多个完成处理程序转换为异步?

SwiftUI 拖放:如果没有上下文类型,则无法解析对成员‘first’的引用

如何在visionOS中将模型锚定在用户头部上方?

类型擦除`AsyncMapSequence, Element>`

URL appendPathComponent(_:) 已弃用?

Swift 并发:@MainActor 对象上的通知回调

使用 swift 运行 pod install 时出错

Swift 5.0 编译器无法导入使用 Swift 4.2.1 编译的模块

Swift 中 NSFetchRequest 的多个 NSPredicates?

如何在 Swift 中将对象归零

Swift中字节数组的NSData