Несовместимость между cordova-plugin-marketingcloudsdk и phonegap-plugin-pu sh on iOS - PullRequest
0 голосов
/ 16 апреля 2020

Я успешно внедрил уведомления 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. * Устройства.

Ура, и будьте в безопасности!

...