#javascript #ios #notifications #titanium-mobile #titanium-alloy
#javascript #iOS #уведомления #titanium-мобильный #титановый сплав
Вопрос:
Раньше это работало нормально, но затем стало неустойчивым.
У меня есть базовый оконный контроллер, который регистрирует push-уведомления, все остальные окна в окне навигации происходят отсюда:
//when base window is set up, set up push notifcations
//register push notifications
function registerPushNotifications() {
Titanium.Network.registerForPushNotifications({
types : [Titanium.Network.NOTIFICATION_TYPE_BADGE, Titanium.Network.NOTIFICATION_TYPE_ALERT],
success : function(e) {
var deviceToken = e.deviceToken;
Ti.API.info("Push notification device token is: " deviceToken);
Ti.API.info("Push notification types: " Titanium.Network.remoteNotificationTypes);
Ti.API.info("Push notification enabled: " Titanium.Network.remoteNotificationsEnabled);
Ti.API.error("device Token is: " e.deviceToken);
//return device Token to store in Model.
return e.deviceToken;
},
error : function(e) {
Ti.API.info("Error during registration: " e.error);
},
callback : function(e) {
// called when a push notification is received.
//var data = JSON.parse(e.data);
alert(e);
var data = e.data;
var badgeCount = Ti.UI.iPhone.getAppBadge();
//Will return the app badges
badgeCount = badgeCount 1;
//Incrementing the appbadge
Ti.UI.iPhone.setAppBadge(badgeCount);
//Setting new appbadge
var message = data.message;
/*
if (message != '') {
var my_alert = Ti.UI.createAlertDialog({
title : '',
message : message
});
my_alert.show();
}
*/
var location = data.path;
var parts = location.split('/');
var index = parts.length - 1;
//get type id
var id = parts[index];
var type = parts[0];
//if push notification came from background, open window if not current window
if (e.inBackground == 1) {
} else {
//update view directly after entering app from the background.
});
};
Эта функция регистрируется для push-уведомлений.
До недавнего времени мое приложение начало работать неустойчиво. Всякий раз, когда я получаю push-уведомление, если я выхожу из системы, затем снова вхожу в систему и снова запускаю функцию registerPushNotifications в процессе. Он будет продолжать запускать старые push-уведомления, для свойства e.inBackground установлено значение 1. Несмотря на то, что вы не нажимаете на push-уведомление в фоновом режиме.
Я пытался отменить регистрацию для push-уведомлений при выходе из системы, вот так:
} else if (e.row.name == '_logout') {
Ti.API.info('Logout');
Alloy.Globals.facebookModule.logout();
//alert(Alloy.Globals.navGroup);
var login = Alloy.createController('index', {}).getView();
login.open();
//clear base controllers
Alloy.Globals.navGroup.close();
Alloy.Globals.baseController.close();
Alloy.Globals.baseController = null;
Ti.Network.unregisterForPushNotifications();
Но мне не повезло.
Я также попытался сбросить push-уведомления, удалив приложение, изменив дату и время и нажав ok для использования push-уведомлений, когда диалоговое окно снова появится. Но это не работает.
Итак, я не уверен, что делать — и почему возникает эта проблема. Я вернул код обратно к более старой версии кода. Та же проблема.
Любые идеи, почему это происходит, приветствия.
Обновить:
Ошибка действительно очень странная и разочаровывающая!
Я только что изолировал его дальше, похоже, что он выдает ошибку, если я получаю push-уведомления на переднем плане.
Если я вернусь к окну, которое отвечает за регистрацию push-уведомлений, push-уведомление на переднем плане продолжит выполняться, но на этот раз думая, что оно пришло из фона.
function registerPushNotifications() {
Titanium.Network.registerForPushNotifications({
types : [Titanium.Network.NOTIFICATION_TYPE_BADGE, Titanium.Network.NOTIFICATION_TYPE_ALERT],
success : function(e) {
var deviceToken = e.deviceToken;
Ti.API.info("Push notification device token is: " deviceToken);
Ti.API.info("Push notification types: " Titanium.Network.remoteNotificationTypes);
Ti.API.info("Push notification enabled: " Titanium.Network.remoteNotificationsEnabled);
Ti.API.error("device Token is: " e.deviceToken);
//return device Token to store in Model.
return e.deviceToken;
},
error : function(e) {
Ti.API.info("Error during registration: " e.error);
},
callback : function(e) {
// called when a push notification is received.
//var data = JSON.parse(e.data);
alert(e);
var data = e.data;
var badgeCount = Ti.UI.iPhone.getAppBadge();
//Will return the app badges
badgeCount = badgeCount 1;
//Incrementing the appbadge
Ti.UI.iPhone.setAppBadge(badgeCount);
//Setting new appbadge
var message = data.message;
}});
};
registerPushNotifications();
$.winLogin.open();
Действительно разочаровывающая ошибка — довольно застрял. 🙁
обновление 2:
var deviceToken = null;
if(Alloy.Globals.testFlag==0){
Ti.Network.registerForPushNotifications({
// Specifies which notifications to receive
types: [
Ti.Network.NOTIFICATION_TYPE_BADGE,
Ti.Network.NOTIFICATION_TYPE_ALERT,
Ti.Network.NOTIFICATION_TYPE_SOUND
],
success: deviceTokenSuccess,
error: deviceTokenError,
callback: receivePush
});
// Process incoming push notifications
function receivePush(e) {
alert('Received push: ' e);
}
// Save the device token for subsequent API calls
function deviceTokenSuccess(e) {
deviceToken = e.deviceToken;
Alloy.Globals.testFlag = 1;
}
function deviceTokenError(e) {
alert('Failed to register for push notifications! ' e.error);
}
}
Я обернул глобальную переменную, которая является флагом, вокруг регистра для прослушивателя событий push-уведомлений.
Я больше не получаю эту ошибку.
Таким образом, кажется, что каждый раз, когда окно открывается (и закрывается), этот прослушиватель событий дублируется, вызывая странное поведение.
Я не уверен, почему это происходит, когда закрытое окно должно быть удалено из памяти, так же как и прослушиватель событий. Или прослушиватель событий ведет себя так — как только он установлен в приложении, он сохраняется в глобальной памяти?
Ответ №1:
Это не ваша вина, это ошибка в titanium NetworkModule.m.
В NetowrkModule.m есть функция ‘registerForPushNotifications’, в конце функции,
// check to see upon registration if we were started with a push
// notification and if so, go ahead and trigger our callback
id currentNotification = [[TiApp app] remoteNotification];
if (currentNotification!=nil amp;amp; pushNotificationCallback!=nil)
{
NSMutableDictionary * event = [TiUtils dictionaryWithCode:0 message:nil];
[event setObject:currentNotification forKey:@"data"];
[event setObject:NUMBOOL(YES) forKey:@"inBackground"];
[self _fireEventToListener:@"remote" withObject:event listener:pushNotificationCallback thisObject:nil];
}
Titanium кэшировал remoteNotification как переменную в TiApp.m, она запускает событие сразу после регистрации pn.
Вы можете либо закомментировать коды этой части, либо принудительно отменить все события обратного вызова, прежде чем ваш push-токен вернется.