问题
I'm creating a Ticket
from my server and passing it into my ios app but I keep getting this error when I try to pass the JSON data into the PKPass
model.
Error Domain=PKPassKitErrorDomain Code=1 "The pass cannot be read because it isn’t valid.
In my server it says that the ticket was created successfully and but I still get this error in Xcode. Am I decoding the data wrong? How can I create the PKPass
using the JSON Response?
Server Side code:
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 Side:
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": {}
}
Signature:
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
回答1:
Looking at your signature and you pass.json, your pass is failing to load because the certificate that has been used to create the signature is:
- PassTypeId: pass.com.apple.devpubs.example
- TeamName: A93A5CM278
This doesn't match the passTypeIdentifier
and teamName
you have in your pass.json
.
Replace ./models/certs/signerCert.pem
and ./models/certs/signerKey.pem
with the correct certificate and key for your PassTypeId Certificate and you should get past this error.
Any pass compiled with the pass.json
above still will not load, but for a different reason. The eventTicket
object cannot be empty.
来源:https://stackoverflow.com/questions/61479545/swift-pkpass-eror-the-pass-cannot-be-read-because-it-isn-t-valid