I've implemented pass generation and it's updated through Apple's silent notification, which updates the passes to their latest versions.
I want to send some marketing push notifications to the Apple Wallet App as shown in the attachment.
Here is the Silent notification implementation, which is working perfectly fine.
const options: apn.ProviderOptions = {
token: {
key: fs.readFileSync("./certs/APNs_AuthKey_7YYF346FU5.p8"),
keyId: "******",
teamId: "******",
},
pfx: fs.readFileSync("./certs/private_key.pem"),
cert: fs.readFileSync("./certs/certificate.pem"),
production: true,
rejectUnauthorized: true,
};
const apnProvider = new apn.Provider(options);
async function sendSilentPushNotification(
deviceTokens: string[],
serialNumber: string
) {
try {
const notification = new apn.Notification();
notification.topic = "pass.com.digital.passmaker";
notification.payload = {
aps: {
"content-available": 1,
},
serialNumber,
};
notification.priority = 5;
return await apnProvider.send(notification, deviceTokens);
} catch (error) {
logger.error("Apple Notification error: " + error);
return error;
}
}
Here is the marketing notification I am trying to send, it is working with success, but I don't see any notification on mobile phone.
please help me to fix it.
async function sendCustomPushNotification(
deviceTokens: string[],
serialNumber: string,
title: string,
body: string,
category?: string,
badge?: number
) {
try {
const notification = new apn.Notification();
notification.topic = "pass.com.digital.passmaker";
// Set the title and body of the notification
notification.alert = {
title: title,
subtitle: "Pass Update",
body: body,
};
// Set the sound to play when the notification is received
notification.sound = "default";
// Set the badge number on the app icon (optional)
if (badge !== undefined) {
notification.badge = badge;
}
notification.contentAvailable = true;
notification.mutableContent = true;
notification.aps.category = category;
notification.aps.alert = {
title: title,
body: body,
};
notification.aps.badge = badge;
notification.aps["content-available"] = 1;
notification.aps["launch-image"] =
"https://banner2.cleanpng.com/20180423/gkw/kisspng-google-logo-logo-logo-5ade7dc753b015.9317679115245306313428.jpg";
// You can still include the serialNumber in the custom payload
notification.payload = {
serialNumber: serialNumber,
aps: {
"content-available": 1,
"mutable-content": 1,
"interruption-level": "time-sensitive",
},
};
// Set to high priority
notification.priority = 10;
return await apnProvider.send(notification, deviceTokens);
} catch (error) {
logger.error("Apple Notification error: " + error);
return error;
}
}
I am building this with Typescript and deploying it on Firebase Cloud Functions.
I am using APN to build and send notifications.
I was wrong about the custom push notification for Apple Pass, as I was trying to send notifications from the backend.
But, the Apple Wallet app automatically emits notifications when we update any pass field with changeMessage.
For example: If I have the lastMessage field in pass data (backFields) then if I want to show the user a notification. I will update the lastMessage filed and push it with changeMessage as following:
if (body.lastMessage) {
console.log("found last message: ", body.lastMessage);
payload.backFields?.push({
key: "lastMessage",
label: "Last Message",
value: body.lastMessage,
changeMessage: "%@",
});
}
When the pass is updated the Wallet app will automatically generate a notification and notify the user.