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

Apple Wallet卡片未到设定有效期提前过期问题求助

Apple Wallet卡片提前过期问题排查与解决

我们的应用支持生成联系人卡并添加至Apple Wallet,PHP代码中已将expirationDate设为2030-01-01T23:00:00Z,但用户添加卡片仅2天后,卡片就进入过期栏目,不符合预期有效期。

相关代码

生成Wallet卡片的PHP代码

$data = [
    'description' => 'MyApp',
    'formatVersion' => 1,
    'organizationName' => 'My app',
    'passTypeIdentifier' => 'pass.test.test',
    'serialNumber' => '12345678',
    'teamIdentifier' => '*********',
    'storeCard' => [
        "headerFields" => [
            [
                "key" => "header-text",
                "label" => "Let's connect",
                "value" => "Together"
            ]
        ],
        "auxiliaryFields" => [
            [
                "key" => "aux-text-two",
                "label" => "",
                "value" => ""
            ],
            [
                "key" => "aux-text-one",
                "label" => "www.abc.com",
                "value" => ""
            ]
        ],
        "primaryFields" => [],
        'secondaryFields' => [],
        'backFields' => [],
    ],
    'barcode' => [
        'format' => 'PKBarcodeFormatQR',
        'message' => 'https://abc.1-2-3-4-5.xyz/public/myapp/?id='.$userData->token.'',
        'messageEncoding' => 'iso-8859-1',
    ],
    "backgroundColor"   => "rgb(255,255,255)",
    'logoText' => '',
    'relevantDate' => date('Y-m-d\TH:i:sP'),
    "expirationDate" => "2030-01-01T23:00:00Z",
];

iOS端添加卡片代码

if PKPassLibrary.isPassLibraryAvailable(){
    if let data = try? Data(contentsOf: url){
        if let pass = try? PKPass(data: data){
            let passLibrary = PKPassLibrary()
            if !passLibrary.containsPass(pass),
               let passController = PKAddPassesViewController(pass: pass){
                
                passController.delegate = self
                self.present(passController, animated: true)
            }else{
                
                ShowAlert(message: "contact_card_already_exist".localize(), theme: .error)
                
            }
        }
    }
}

排查与解决步骤

  1. 移除或调整relevantDate字段

    • 当前代码中relevantDate设为实时时间,Apple Wallet默认会在relevantDate后的2天内保持卡片在"活跃"栏目,超过后自动移至过期栏目,这是导致问题的核心原因。
    • 处理方案:如果业务不需要该字段,直接从$data数组中删除relevantDate;若必须保留,将其设置为接近expirationDate的时间,例如:
      'relevantDate' => date('Y-m-d\TH:i:sP', strtotime('2029-12-31')),
      
  2. 验证expirationDate的实际值

    • 生成pass包后,手动解压查看内部的pass.json文件,确认expirationDate字段确实是2030-01-01T23:00:00Z,排除PHP代码中字段被意外覆盖的情况。
    • 确保时区格式正确,Z代表UTC时区,避免使用本地时区格式导致解析错误。
  3. 检查设备与应用状态

    • 让用户重启Apple Wallet应用,或重置设备的日期与时间设置(设置->通用->传输或还原iPhone->还原->还原所有设置),排除本地缓存或时间异常导致的误判。
    • 确认设备系统时间未被手动修改为未来日期,这会导致Wallet错误识别卡片过期状态。
  4. 验证Pass包签名有效性

    • 使用Apple官方的passvalidator工具检查生成的pass包,确认签名流程未出现文件篡改,避免因签名无效导致Wallet解析字段异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 04:31:04