Skip to content

Commit 175c261

Browse files
funkenstrahlendavimacedo
authored andcommitted
Add support for apns-push-type (#127)
* add support for apns-push-type Required when delivering notifications to devices running iOS 13 and later, or watchOS 6 and later. * set default value for push type to alert If defined explicitly the passed value for push type is used. * adjust test case to also cover push type background * refactor: fix indentation * refactor: add missing semicolons * use parse community fork of apn * run npm update to pull latest packages * update node-apn dependency to 3.0.1 release
1 parent e19028a commit 175c261

File tree

4 files changed

+102
-64
lines changed

4 files changed

+102
-64
lines changed

package-lock.json

+52-54
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,10 @@
3333
"nyc": "^14.1.1"
3434
},
3535
"dependencies": {
36-
"apn": "^3.0.0-alpha1",
3736
"@parse/node-gcm": "^1.0.0",
37+
"apn": "parse-community/node-apn#semver:^3.0.1-parse",
3838
"npmlog": "^4.0.2",
39-
"parse": "^1.9.2"
39+
"parse": "^1.11.1"
4040
},
4141
"engines": {
4242
"node": ">= 8.9.1"

spec/APNS.spec.js

+40-6
Original file line numberDiff line numberDiff line change
@@ -190,9 +190,10 @@ describe('APNS', () => {
190190
};
191191
let expirationTime = 1454571491354;
192192
let collapseId = "collapseIdentifier";
193-
let priority = 5;
194193

195-
let notification = APNS._generateNotification(data, { expirationTime: expirationTime, collapseId: collapseId, priority: priority });
194+
let pushType = "alert";
195+
let priority = 5;
196+
let notification = APNS._generateNotification(data, { expirationTime: expirationTime, collapseId: collapseId, pushType: pushType, priority: priority });
196197

197198
expect(notification.aps.alert).toEqual({ body: 'alert', title: 'title' });
198199
expect(notification.aps.badge).toEqual(data.badge);
@@ -207,11 +208,35 @@ describe('APNS', () => {
207208
});
208209
expect(notification.expiry).toEqual(Math.round(expirationTime / 1000));
209210
expect(notification.collapseId).toEqual(collapseId);
211+
expect(notification.pushType).toEqual(pushType);
210212
expect(notification.priority).toEqual(priority);
211213
done();
212214
});
215+
216+
it('sets push type to alert if not defined explicitly', (done) => {
217+
//Mock request data
218+
let data = {
219+
'alert': 'alert',
220+
'title': 'title',
221+
'badge': 100,
222+
'sound': 'test',
223+
'content-available': 1,
224+
'mutable-content': 1,
225+
'category': 'INVITE_CATEGORY',
226+
'threadId': 'a-thread-id',
227+
'key': 'value',
228+
'keyAgain': 'valueAgain'
229+
};
230+
let expirationTime = 1454571491354;
231+
let collapseId = "collapseIdentifier";
232+
233+
let notification = APNS._generateNotification(data, { expirationTime: expirationTime, collapseId: collapseId });
234+
235+
expect(notification.pushType).toEqual('alert');
236+
done();
237+
});
213238

214-
it('can generate APNS notification from raw data', (done) => {
239+
it('can generate APNS notification from raw data', (done) => {
215240
//Mock request data
216241
let data = {
217242
'aps': {
@@ -228,12 +253,14 @@ describe('APNS', () => {
228253
};
229254
let expirationTime = 1454571491354;
230255
let collapseId = "collapseIdentifier";
231-
let priority = 5
256+
let pushType = "background";
257+
let priority = 5;
232258

233-
let notification = APNS._generateNotification(data, { expirationTime: expirationTime, collapseId: collapseId, priority: priority });
259+
let notification = APNS._generateNotification(data, { expirationTime: expirationTime, collapseId: collapseId, pushType: pushType, priority: priority });
234260

235261
expect(notification.expiry).toEqual(Math.round(expirationTime / 1000));
236262
expect(notification.collapseId).toEqual(collapseId);
263+
expect(notification.pushType).toEqual(pushType);
237264
expect(notification.priority).toEqual(priority);
238265

239266
let stringifiedJSON = notification.compile();
@@ -302,8 +329,10 @@ describe('APNS', () => {
302329
// Mock data
303330
let expirationTime = 1454571491354;
304331
let collapseId = "collapseIdentifier";
332+
let pushType = "alert"; // or background
305333
let data = {
306334
'collapse_id': collapseId,
335+
'push_type': pushType,
307336
'expiration_time': expirationTime,
308337
'priority': 6,
309338
'data': {
@@ -335,7 +364,8 @@ describe('APNS', () => {
335364
let notification = calledArgs[0];
336365
expect(notification.aps.alert).toEqual(data.data.alert);
337366
expect(notification.expiry).toEqual(Math.round(data['expiration_time'] / 1000));
338-
expect(notification.collapseId).toEqual(data['collapse_id']);
367+
expect(notification.collapseId).toEqual(collapseId);
368+
expect(notification.pushType).toEqual(pushType);
339369
expect(notification.priority).toEqual(data['priority']);
340370
let apnDevices = calledArgs[1];
341371
expect(apnDevices.length).toEqual(4);
@@ -373,9 +403,11 @@ describe('APNS', () => {
373403
apns.providers = [provider, providerDev];
374404
// Mock data
375405
let expirationTime = 1454571491354;
406+
let pushType = "alert"; // or background
376407
let collapseId = "collapseIdentifier";
377408
let data = {
378409
'collapse_id': collapseId,
410+
'push_type': pushType,
379411
'expiration_time': expirationTime,
380412
'data': {
381413
'alert': 'alert'
@@ -413,6 +445,7 @@ describe('APNS', () => {
413445
expect(notification.aps.alert).toEqual(data.data.alert);
414446
expect(notification.expiry).toEqual(Math.round(data['expiration_time'] / 1000));
415447
expect(notification.collapseId).toEqual(data['collapse_id']);
448+
expect(notification.pushType).toEqual(pushType);
416449
let apnDevices = calledArgs[1];
417450
expect(apnDevices.length).toBe(3);
418451

@@ -422,6 +455,7 @@ describe('APNS', () => {
422455
expect(notification.aps.alert).toEqual(data.data.alert);
423456
expect(notification.expiry).toEqual(Math.round(data['expiration_time'] / 1000));
424457
expect(notification.collapseId).toEqual(data['collapse_id']);
458+
expect(notification.pushType).toEqual(pushType);
425459
apnDevices = calledArgs[1];
426460
expect(apnDevices.length).toBe(2);
427461
done();

src/APNS.js

+8-2
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ export class APNS {
7373
let coreData = data.data;
7474
let expirationTime = data['expiration_time'];
7575
let collapseId = data['collapse_id'];
76+
let pushType = data['push_type'];
7677
let priority = data['priority'];
7778
let allPromises = [];
7879

@@ -97,7 +98,7 @@ export class APNS {
9798
continue;
9899
}
99100

100-
let headers = { expirationTime: expirationTime, topic: appIdentifier, collapseId: collapseId, priority: priority }
101+
let headers = { expirationTime: expirationTime, topic: appIdentifier, collapseId: collapseId, pushType: pushType, priority: priority }
101102
let notification = APNS._generateNotification(coreData, headers);
102103
const deviceIds = devices.map(device => device.deviceToken);
103104
let promise = this.sendThroughProvider(notification, deviceIds, providers);
@@ -167,7 +168,7 @@ export class APNS {
167168
/**
168169
* Generate the apns Notification from the data we get from api request.
169170
* @param {Object} coreData The data field under api request body
170-
* @param {Object} headers The header properties for the notification (topic, expirationTime, collapseId, priority)
171+
* @param {Object} headers The header properties for the notification (topic, expirationTime, collapseId, pushType, priority)
171172
* @returns {Object} A apns Notification
172173
*/
173174
static _generateNotification(coreData, headers) {
@@ -215,6 +216,11 @@ export class APNS {
215216
notification.topic = headers.topic;
216217
notification.expiry = Math.round(headers.expirationTime / 1000);
217218
notification.collapseId = headers.collapseId;
219+
// set alert as default push type. If push type is not set notifications are not delivered to devices running iOS 13, watchOS 6 and later.
220+
notification.pushType = 'alert';
221+
if (headers.pushType) {
222+
notification.pushType = headers.pushType;
223+
}
218224
if (headers.priority) {
219225
// if headers priority is not set 'node-apn' defaults it to 5 which is min. required value for background pushes to launch the app in background.
220226
notification.priority = headers.priority

0 commit comments

Comments
 (0)