Swift PKPass 错误 'The pass cannot be read because it isn’t valid'

Swift PKPass eror 'The pass cannot be read because it isn’t valid'

我正在从我的服务器创建一个 Ticket 并将其传递到我的 ios 应用程序但是当我尝试将 JSON 数据传递到 PKPass型号.

Error Domain=PKPassKitErrorDomain Code=1 "The pass cannot be read because it isn’t valid.

在我的服务器中它说票已成功创建,但我在 Xcode 中仍然收到此错误。我解码数据错了吗?如何使用 JSON 响应创建 PKPass

服务器端代码:

exports.createTicket = functions.https.onRequest(async (req, res) => {

const passName = "Event"

try {
  const examplePass = await createPass({
      model: "./models/Event",
      certificates: {
          wwdr: "./models/certs/wwdrc.pem",
          signerCert: "./models/certs/signerCert.pem",
          signerKey: {
              keyFile: "./models/certs/signerKey.pem",
              passphrase: "54321"
          }
      },
      overrides: {
          // keys to be added or overridden
          serialNumber: "AAGH44625236dddaffbda"
      }
  });

  examplePass.barcode("36478105430"); // Random value

// Generate the stream, which gets returned through a Promise
const stream = examplePass.generate();

res.set({
  "Content-Type": "application/vnd.apple.pkpass",
  "Content-disposition": `attachment; filename=${passName}.pkpass`
});

stream.pipe(res);

console.log("Successfully created ticket", stream)
} catch (err) {
console.log("There was an error", err)

    res.set({
        "Content-type": "text/html",
    });

    res.send(err.message);
 }
 });

IOS 边:

AF.request(URLString, method: .post, parameters: requestData).responseString { response in

        guard let data = response.data as? Data else { return }

        do {
            let pass = try PKPass(data: data)
            print(pass)
        } catch {
            print("Error", error)
        }


    }

pass.json

{
"formatVersion": 1,
"passTypeIdentifier": "pass.com.CodyHost.Finder-Dev",
"teamIdentifier": "L9C6U8UKPB",
"organizationName": "Finder",
"description": "Rolling loud new york 2020",
"eventTicket": {}
}

签名:

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

查看您的签名和您 pass.json,您的通行证无法加载,因为用于创建签名的证书是:

  • 密码类型:pass.com.apple.devpubs.example
  • 队名:A93A5CM278

这与您在 pass.json 中的 passTypeIdentifierteamName 不匹配。

./models/certs/signerCert.pem./models/certs/signerKey.pem 替换为您的 PassTypeId 证书的正确证书和密钥,您应该可以解决此错误。

使用上面的 pass.json 编译的任何通道仍然不会加载,但出于不同的原因。 eventTicket 对象不能为空。