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

如何不使用PKAddPassesViewController可视化展示PKPass?

在SwiftUI中不依赖PKAddPassesViewController展示PKPass的方案

原生方法的限制

苹果没有提供官方原生组件可以直接渲染PKPass为Apple Wallet样式,同时避免弹出添加到钱包的提示。唯一官方提供的预览组件PKAddPassesViewController,核心功能就是引导用户将通行证添加到钱包,无法移除添加提示或仅用作纯预览用途。

可行的替代方案

1. 自定义提取PKPass内容,手动构建UI

PKPass本质是包含图片、结构化文本的数据包,你可以通过PKPass类的公开API提取所有需要的信息,然后用SwiftUI组件手动复刻Wallet的卡片样式:

  • 提取通行证类型(登机牌、优惠券等)
  • 通过image(for:)获取背景图、logo、图标等资源
  • 用localizedValue(forKey:)读取各类字段文本(持卡人信息、有效期、优惠码等)
  • 用SwiftUI的ZStack、VStack、RoundedRectangle等组件搭建卡片布局,加上阴影、圆角、渐变效果还原Wallet风格

示例代码片段:

import SwiftUI
import PassKit
import CoreImage

struct PassPreviewView: View {
    let pass: PKPass
    
    var body: some View {
        ZStack {
            // 渲染背景图
            if let bgImage = pass.image(for: .background) {
                Image(uiImage: bgImage)
                    .resizable()
                    .scaledToFill()
                    .clipShape(RoundedRectangle(cornerRadius: 16))
            }
            
            VStack(alignment: .leading, spacing: 8) {
                // 显示Logo
                if let logo = pass.image(for: .logo) {
                    Image(uiImage: logo)
                        .resizable()
                        .scaledToFit()
                        .frame(height: 40)
                        .padding(.horizontal, 16)
                        .padding(.top, 12)
                }
                
                Spacer()
                
                // 主信息字段
                Text(pass.localizedValue(forKey: "primaryFields.0.value") ?? "")
                    .font(.title.bold())
                    .foregroundColor(.white)
                    .padding(.horizontal, 16)
                
                // 次要信息字段
                Text(pass.localizedValue(forKey: "secondaryFields.0.value") ?? "")
                    .font(.subheadline)
                    .foregroundColor(.white.opacity(0.9))
                    .padding(.horizontal, 16)
                
                // 条形码/二维码区域
                if let barcode = pass.barcodes?.first {
                    BarcodeRenderer(barcode: barcode)
                        .padding(.horizontal, 16)
                        .padding(.bottom, 12)
                }
            }
        }
        .frame(height: 220)
        .shadow(color: .black.opacity(0.2), radius: 8, x: 0, y: 2)
    }
}

// 自定义条形码渲染视图
struct BarcodeRenderer: UIViewRepresentable {
    let barcode: PKBarcode
    
    func makeUIView(context: Context) -> UIImageView {
        let imageView = UIImageView()
        imageView.contentMode = .scaleAspectFit
        imageView.image = generateBarcodeImage(from: barcode.message, format: barcode.format)
        return imageView
    }
    
    func updateUIView(_ uiView: UIImageView, context: Context) {}
    
    private func generateBarcodeImage(from message: String, format: PKBarcodeFormat) -> UIImage? {
        guard let data = message.data(using: .utf8) else { return nil }
        let filterName: String
        
        // 根据条形码格式选择对应的CoreImage滤镜
        switch format {
        case .QR:
            filterName = "CIQRCodeGenerator"
        case .code128:
            filterName = "CICode128BarcodeGenerator"
        default:
            filterName = "CICode128BarcodeGenerator"
        }
        
        guard let filter = CIFilter(name: filterName) else { return nil }
        filter.setValue(data, forKey: "inputMessage")
        
        if format == .QR {
            filter.setValue("H", forKey: "inputCorrectionLevel")
        }
        
        guard let ciImage = filter.outputImage else { return nil }
        // 放大图片避免模糊
        let scaledImage = ciImage.transformed(by: CGAffineTransform(scaleX: 3, y: 3))
        return UIImage(ciImage: scaledImage)
    }
}

2. 借助第三方库简化开发

有一些第三方库可以帮你解析PKPass结构并提供预定义的Wallet风格UI组件,核心逻辑还是提取通行证数据后自定义渲染,这类库能减少你手动布局的工作量,但要注意选择维护活跃的库,避免依赖风险。

3. 私有API(绝对不推荐)

苹果内部可能存在直接渲染PKPass的私有组件,但使用私有API会导致应用无法通过App Store审核,仅适合个人测试,完全不建议用于正式发布的应用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 01:50:10