Я успешно внедрил уведомления pu sh в приложении Cordova с помощью плагина, предоставляемого Salesforce для гибридных приложений, cordova-plugin-marketingcloudsdk (https://github.com/salesforce-marketingcloud/MC-Cordova-Plugin). Хотя я смог сделать это только потому, что удалил phonegap-plugin-pu sh (https://github.com/phonegap/phonegap-plugin-push), который мне пришлось установить перед тем, как реализовать некоторые другие функции в нашем приложении. Итак, я пришел к выводу, что существует несовместимость между ранее упомянутыми плагинами, cordova-plugin-marketingcloudsdk и phonegap-plugin-pu sh, при попытке развернуть приложение на iOS и, следовательно, сделать pu sh уведомления работают. С другой стороны, он работает безупречно на Android, либо с плагином phonegap, либо без него.
Поэтому я хотел бы посоветовать всем вам попробовать установить плагин marketing cloud одновременно с phonegap pu sh плагин.
В моем приложении у меня есть следующие плагины:
Версии:
"cordova- android": "^ 8.1 .0 "," cordova- ios ":" ^ 5.1.1 "," cordova-plugin-marketingcloudsdk ":" ^ 7.1.0 "" phonegap-plugin-pu sh ":" ^ 2.3.0 "
Основной код (индекс. js):
let app = {
// Application Constructor
initialize: function() {
document.addEventListener('deviceready', this.onDeviceReady.bind(this), false);
},
// deviceready Event Handler
//
// Bind any cordova events here. Common events are:
// 'pause', 'resume', etc.
onDeviceReady: function() {
this.receivedEvent('deviceready');
document.getElementById('enable').addEventListener('touchstart', this.enablePush.bind(this));
document.getElementById('disable').addEventListener('touchstart', this.disablePush.bind(this));
document.getElementById('check').addEventListener('touchstart', this.checkEnabledPush.bind(this));
document.getElementById('token').addEventListener('touchstart', this.getSystemToken.bind(this));
document.getElementById('setcontactkey').addEventListener('touchstart', this.setContactKey.bind(this));
document.getElementById('getcontactkey').addEventListener('touchstart', this.getContactKey.bind(this));
document.getElementById('attributes').addEventListener('touchstart', this.getAttributes.bind(this));
document.getElementById('enablelogging').addEventListener('touchstart', this.enableVerboseLogging.bind(this));
document.getElementById('disablelogging').addEventListener('touchstart', this.disableVerboseLogging.bind(this));
document.getElementById('logsdkstate').addEventListener('touchstart', this.logSdkState.bind(this));
},
enablePush: function() {
// Enable marketing cloud push notifications
console.log("Sending request to enablePush()");
MCCordovaPlugin.enablePush(
function onSuccess(enabled) {
console.log("Push was enabled");
alert("Push was enabled");
},
function onError(error) {
console.log("Error from enablePush:\n" + error);
alert("Error from enablePush:\n" + error);
}
)
},
disablePush: function() {
// Enable marketing cloud push notifications
console.log("Sending request to disablePush()");
MCCordovaPlugin.disablePush(
function onSuccess(enabled) {
console.log("Push was disabled");
alert("Push was disabled");
},
function onError(error) {
console.log("Error from disablePush:\n" + error);
alert("Error from disablePush:\n" + error);
}
)
},
checkEnabledPush: function() {
console.log("Sending request to isPushEnabled()");
// Check if marketing cloud push notifications is enabled
MCCordovaPlugin.isPushEnabled(
function onSuccess(enabled) {
console.log("Response from isPushEnabled:\n" + enabled);
alert("Response from isPushEnabled:\n" + enabled);
},
function onError(error) {
console.log("Error from isPushEnabled:\n" + error);
alert("Error from isPushEnabled:\n" + error);
}
)
},
setContactKey: function() {
console.log("Sending request to setContactKey()");
MCCordovaPlugin.setContactKey("222886480",
function onSuccess(saved) {
console.log("Was the contact key saved in the registration?: " + saved);
alert("Was the contact key saved in the registration?: " + saved);
},
function onError(error) {
console.log("Error from setContactKey:\n" + error);
alert("Error from setContactKey:\n" + error);
}
)
},
getContactKey: function() {
console.log("Sending request to getContactKey()");
MCCordovaPlugin.getContactKey(
function onSuccess(contactKey) {
console.log("The current contact key currently set on the device is: " + contactKey);
alert("The current contact key currently set on the device is: " + contactKey);
},
function onError(error) {
console.log("Error from getContactKey:\n" + error);
alert("Error from getContactKey:\n" + error);
}
)
},
getSystemToken: function() {
console.log("Sending request to getSystemToken()");
MCCordovaPlugin.getSystemToken(
function onSuccess(token) {
console.log("Response from getSystemToken: " + token);
alert("Response from getSystemToken: " + token);
},
function onError(error) {
console.log("Error from getSystemToken:\n" + error);
alert("Error from getSystemToken:\n" + error);
}
)
},
getAttributes: function() {
console.log("Sending request to getAttributes()");
MCCordovaPlugin.getAttributes(
function onSuccess(attributes) {
let result = JSON.stringify(attributes, null, 4);
alert(result);
console.log("Attributes are: \n" + result);
},
function onError(error) {
console.log("Error from getAttributes:\n" + error);
alert("Error from getAttributes:\n" + error);
}
);
},
enableVerboseLogging: function() {
console.log("Sending request to enableVerboseLogging()");
MCCordovaPlugin.enableVerboseLogging(
function onSuccess() {
console.log("Enabled verbose logging");
alert("Enabled verbose logging");
},
function onError(error) {
console.log("Error from enableVerboseLogging:\n" + error);
alert("Error from enableVerboseLogging:\n" + error);
}
)
},
disableVerboseLogging: function() {
console.log("Sending request to disableVerboseLogging()");
MCCordovaPlugin.disableVerboseLogging(
function onSuccess() {
console.log("Disabled verbose logging");
alert("Disabled verbose logging");
},
function onError(error) {
console.log("Error from disableVerboseLogging:\n" + error);
alert("Error from disableVerboseLogging:\n" + error);
}
)
},
logSdkState: function() {
console.log("Sending request to logSdkState()");
MCCordovaPlugin.logSdkState(
function onSuccess() {
console.log("Enabled logSdkState");
alert("Enabled logSdkState");
},
function onError(error) {
console.log("Error from logSdkState:\n" + error);
alert("Error from logSdkState:\n" + error);
}
)
},
// Update DOM on a Received Event
receivedEvent: function(id) {
let parentElement = document.getElementById(id);
let listeningElement = parentElement.querySelector('.listening');
let receivedElement = parentElement.querySelector('.received');
listeningElement.setAttribute('style', 'display:none;');
receivedElement.setAttribute('style', 'display:block;');
console.log('Received Event: ' + id);
}
};
app.initialize();
Выше приведен соответствующий журнал отладки, который отображается на терминале XCode после сборки и запустить приложение, развернув его на реальном устройстве:
2020-04-16 17:38:37.085716+0100 UniversoPush[15251:1476451] You've implemented -[<UIApplicationDelegate> application:didReceiveRemoteNotification:fetchCompletionHandler:], but you still need to add "remote-notification" to the list of your supported UIBackgroundModes in your Info.plist.
2020-04-16 17:38:44.180229+0100 UniversoPush[15251:1476451] Unexpected call to didRegisterForRemoteNotificationsWithDeviceToken, ignoring: {length = 32, bytes = 0x71566b21 ec919907 cc4cc41f 591dd3c4 ... 2ec65a8b f0034b2b }
2020-04-16 17:38:44.259869+0100 UniversoPush[15251:1476451] Finished load of: file:///private/var/containers/Bundle/Application/AD6455D2-F8C2-4BEC-9F26-3413DF541CAE/UniversoPush.app/www/index.html
2020-04-16 17:38:44.266856+0100 UniversoPush[15251:1476451] Received Event: deviceready
2020-04-16 17:39:05.164411+0100 UniversoPush[15251:1476451] Sending request to enablePush()
2020-04-16 17:39:05.166533+0100 UniversoPush[15251:1476451] Unexpected call to didRegisterForRemoteNotificationsWithDeviceToken, ignoring: {length = 32, bytes = 0x71566b21 ec919907 cc4cc41f 591dd3c4 ... 2ec65a8b f0034b2b }
2020-04-16 17:39:05.411808+0100 UniversoPush[15251:1476451] Push was enabled
2020-04-16 17:39:07.130428+0100 UniversoPush[15251:1476451] Sending request to isPushEnabled()
2020-04-16 17:39:07.181662+0100 UniversoPush[15251:1476451] Response from isPushEnabled:
1
2020-04-16 17:39:09.201400+0100 UniversoPush[15251:1476451] Sending request to setContactKey()
2020-04-16 17:39:09.274266+0100 UniversoPush[15251:1476451] Was the contact key saved in the registration?: 1
2020-04-16 17:39:10.428350+0100 UniversoPush[15251:1476451] Sending request to getContactKey()
2020-04-16 17:39:10.481064+0100 UniversoPush[15251:1476451] The current contact key currently set on the device is: 222886480
2020-04-16 17:39:11.753806+0100 UniversoPush[15251:1476451] Sending request to getSystemToken()
2020-04-16 17:39:11.806384+0100 UniversoPush[15251:1476451] Response from getSystemToken: null
2020-04-16 17:39:13.521316+0100 UniversoPush[15251:1476451] Sending request to getSystemToken()
2020-04-16 17:39:13.578009+0100 UniversoPush[15251:1476451] Response from getSystemToken: null
2020-04-16 17:39:20.649408+0100 UniversoPush[15251:1476451] Sending request to getSystemToken()
Как можно видеть, systemToken, возвращенный APNS, выглядит примерно так: «0x71566b21 ec919907 cc4cc41f 591dd3c4 ... 2ec65a8b f0034b2b», но когда отправка его обратно в маркетинговое облако (за это отвечает плагин маркетингового облака cordova), он обнуляется (строка 17), возможно, из-за к неожиданному вызову (см. строку 3 в журнале выше) функции didRegisterForRemoteNotificationsWithDeviceToken , реализованной в файле PushPlugin.m, из phonegap-pu sh -plugin.
Заметив это, я просто удалил phonegap-plugin-pu sh и сразу же после того, как он начал отправлять настоящий системный токен в маркетинговое облако, что позволило отправлять уведомления pu sh непосредственно на * 1050. * Устройства.
Ура, и будьте в безопасности!