You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

StoreKit2 subscriptionStorePolicyDestination弹窗渲染异常求助

问题

近期开始将应用部分功能适配为SwiftUI,StoreKit2的简洁易用解决了诸多问题。但在使用其默认提供的Privacy Policy和Terms of Service按钮/视图时遇到异常:创建基础SubscriptionView并调用subscriptionStorePolicyDestination(根据文档,该方法用于「配置订阅商店视图中查看对应政策的目标视图」)后,弹窗文本错位,且无标题栏及操作按钮。

异常弹窗1
异常弹窗2

尝试自定义隐私政策视图,代码如下:

struct SubscriptionView: View {
    let productIds = ["xx.xx.xx", "yy.yy.yy"]

    var body: some View {
        SubscriptionStoreView(productIDs: productIds)
        .subscriptionStoreControlStyle(.automatic)
        
        .subscriptionStorePolicyDestination(for: .privacyPolicy, destination: {
            privacyPolicy
        })
        
        .onInAppPurchaseCompletion { product, result in
            switch result {
            case .success(.success(_)):
                break
            case .failure(_):
                break
            default:
                break
            }
        }
    }
}

@ViewBuilder
private var privacyPolicy: some View {
    Text(
        "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
    )
}

点击隐私政策按钮后,弹窗无关闭按钮,示例文本无法适配弹窗边界(横竖屏均如此)。尝试跳转至URL的方式也出现同样问题:

.subscriptionStorePolicyDestination(url: URL(string: "https://www.apple.com/legal/privacy/en-ww/")!, for: .privacyPolicy)

URL跳转异常弹窗

作为SwiftUI新手,希望得到指导:是否需要为弹窗添加标题、关闭按钮及适配文本/网页视图?若需开发者自行创建视图,该如何实现?

解决方案

是的,subscriptionStorePolicyDestination提供的默认弹窗不会自动添加标题、关闭按钮或做内容适配,这些都需要开发者自行实现。以下是具体处理方式:

1. 自定义政策视图(带标题、关闭按钮和文本适配)

修改自定义视图,添加导航栏标题和关闭按钮,同时让文本可滚动适配弹窗:

struct SubscriptionView: View {
    let productIds = ["xx.xx.xx", "yy.yy.yy"]
    @Environment(\.dismiss) private var dismiss

    var body: some View {
        SubscriptionStoreView(productIDs: productIds)
            .subscriptionStoreControlStyle(.automatic)
            .subscriptionStorePolicyDestination(for: .privacyPolicy) {
                privacyPolicy
            }
            .onInAppPurchaseCompletion { product, result in
                switch result {
                case .success(.success(_)):
                    break
                case .failure(_):
                    break
                default:
                    break
                }
            }
    }

    @ViewBuilder
    private var privacyPolicy: some View {
        NavigationStack {
            ScrollView {
                Text(
                    "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
                )
                .padding()
            }
            .navigationTitle("隐私政策")
            .toolbar {
                ToolbarItem(placement: .navigationBarTrailing) {
                    Button("关闭") {
                        dismiss()
                    }
                }
            }
        }
    }
}

2. 适配网页视图跳转

如果要加载外部URL,先封装WKWebView为SwiftUI视图,再添加标题和关闭按钮:
首先导入WebKit:

import WebKit

创建WebView封装:

struct WebView: UIViewRepresentable {
    let url: URL

    func makeUIView(context: Context) -> WKWebView {
        let webView = WKWebView()
        webView.load(URLRequest(url: url))
        return webView
    }

    func updateUIView(_ uiView: WKWebView, context: Context) {}
}

然后修改政策目标:

.subscriptionStorePolicyDestination(for: .privacyPolicy) {
    NavigationStack {
        WebView(url: URL(string: "https://www.apple.com/legal/privacy/en-ww/")!)
            .navigationTitle("隐私政策")
            .toolbar {
                ToolbarItem(placement: .navigationBarTrailing) {
                    Button("关闭") {
                        dismiss()
                    }
                }
            }
    }
}

3. 补充说明

  • subscriptionStorePolicyDestination仅提供替换默认政策视图的入口,弹窗容器样式(如大小、圆角)由系统控制,但内部内容布局完全由开发者自定义。
  • 对于Terms of Service(termsOfService),可复用上述逻辑替换对应的政策类型即可。

内容的提问来源于stack exchange,提问作者Fittoburst

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 08:32:32