Отображать push-уведомления как предупреждающие сообщения в iOS-приложении [phonegap/cordova][Pushwoosh]

Здравствуйте, спасибо за просмотр этого вопроса. У меня проблемы с получением push-уведомления, когда мое приложение для iOS открыто. Он отлично работает, когда приложение работает в фоновом режиме. Но когда приложение открыто, оно даже не запускает событие push-уведомлений, которое должно отображать уведомление в виде предупреждающего сообщения.

Я следовал этим инструкциям, но сделал несколько настроек: http://www.pushwoosh.com/programming-push-notification/ios/ios-additional-platforms/push-notification-sdk-integration-for-phonegap/

и вот мой код при загрузке страницы:

document.addEventListener("deviceready", pushwooshReady, true);
document.addEventListener("push-notification", displayPushwooshMessage, true);

Функция pushwooshReady:

function pushwooshReady() {
    initPushwoosh();

    if(device.platform == 'iOS') {
        app.receivedEvent('deviceready');
    }
}

функция initPushwoosh:

function initPushwoosh() {
    //get the plugin
    var pushNotification = window.pushNotification;

    if(device.platform == 'iOS') {
        //call the registration function for iOS
        registerPushwooshIOS();
    } else if (device.platform == 'Android') {
        //call the registration function for Android
        registerPushwooshAndroid();
    }
    pushNotification.onDeviceReady();
}

и это функция registerPushWooshIOS:

function registerPushwooshIOS() {
    var pushNotification = window.pushNotification;

    //register for push notifications
    pushNotification.registerDevice({alert:true, badge:true, sound:true, pw_appid: PW_appid, appname: PW_appname},
                                function(status) {
                                //this is a push token
                                var deviceToken = status['deviceToken'];
                                console.warn('registerDevice: ' + deviceToken);

                                //we are ready to use the plugin methods
                                onPushwooshiOSInitialized(deviceToken);
                                },
                                function(status) {
                                console.warn('failed to register : ' + JSON.stringify(status));
                                navigator.notification.alert(JSON.stringify(['failed to register ', status]));
                                });

    //reset badges on application start
    pushNotification.setApplicationIconBadgeNumber(0);
}

и вот моя функция displayPushwooshMessage:

function displayPushwooshMessage(event) {
if(device.platform == 'Android') {

    var msg = event.notification.title;
    var userData = event.notification.userdata;

    if(typeof(userData) != "undefined") {
        console.warn('user data: ' + JSON.stringify(userData));
    }

    alert(msg);

} else if(device.platform == 'iOS') {
    var notification = event.notification;
    alert(notification.aps.alert);
    pushNotification.setApplicationIconBadgeNumber(0);
}
}

Ваша помощь будет очень ценится.

1 ответ

Решение

Хорошо, похоже, я собираюсь снова ответить на свой вопрос.

Я заставил это работать, но не использовал метод alert() javascript, потому что инструкции на веб-сайте pushwoosh на самом деле не работают для меня. То, что я сделал, было очень просто, но мне потребовался целый день, чтобы понять, потому что у меня нет никакого опыта Objective-C.

Я закомментировал оператор if внутри функции handlePushReceived в PushNotificationManager.m. Вот код:

    NSString *alertMsg = [pushDict objectForKey:@"alert"];

    bool msgIsString = YES;
    if(![alertMsg isKindOfClass:[NSString class]])
        msgIsString = NO;

    //if(!isPushOnStart && showPushnotificationAlert && msgIsString) { <- Commented this out
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:self.appName message:alertMsg delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil];
        alert.tag = ++internalIndex;
        [pushNotifications setObject:userInfo forKey:[NSNumber numberWithInt:internalIndex]];
        [alert show];
        return YES;
    //} <- Also this one.

    [self processUserInfo:userInfo];

И это сработало. Я даже не знаю, почему это не работает, это из SDK, который я скачал. Ну да ладно, я не уверен, что у кого-то есть или когда-либо возникнет такая же проблема, но я надеюсь, что этот ответ поможет тем, кто будет в будущем.

**ОБНОВИТЬ:

На самом деле ошибка другая, и решение выше не понадобится. Я получил следующий ответ от службы поддержки Pushwoosh:

Дмитрий Дюдеев (Pushwoosh)
29 мая 16:41

Привет Клинт,

Благодарим Вас за обращение к нам!

Оказывается, вы обнаружили ошибку в нашем плагине. Спасибо за указание на это! Мы будем> обновлять наш плагин в ближайшее время.

Между тем, поскольку обновление плагина займет некоторое время, вы можете найти метод onDeviceReady в файле PushNotification.m и добавить следующую строку в его конец, это решит проблему:

     [[NSUserDefaults standardUserDefaults] synchronize];

Пожалуйста, дайте мне знать о результатах!

С Уважением,
Дмитрий Дюдеев
Команда Pushwoosh

Другие вопросы по тегам