PhoneGap IOS - настройка плагинов
Я разрабатываю приложение, используя PhoneGap и PhoneGap Build. Приложение было в значительной степени завершено, но я не работаю над Push-уведомлениями.
Я изо всех сил пытаюсь заставить устройство вообще быть зарегистрированным. Я добавил следующий плагин в свой проект (добавлен в конфигурации для сборки phonegap) https://github.com/phonegap/phonegap-plugin-push
Я добавил плагин и у меня есть следующий в моем файле JavaScript.
var app = {
// Application Constructor
initialize: function () {
this.bindEvents();
},
// Bind Event Listeners
//
// Bind any events that are required on startup. Common events are:
// 'load', 'deviceready', 'offline', and 'online'.
bindEvents: function () {
document.addEventListener('deviceready', this.onDeviceReady, false);
},
// deviceready Event Handler
//
// The scope of 'this' is the event. In order to call the 'receivedEvent'
// function, we must explicitly call 'app.receivedEvent(...);'
onDeviceReady: function () {
app.receivedEvent('deviceready');
var push = PushNotification.init({
"android": {
"senderID": "1234567890"
},
"ios": { "alert": "true", "badge": "true", "sound": "true" },
"windows": {}
});
push.on('registration', function (data) {
console.log("registration event");
//document.getElementById("regId").innerHTML = data.registrationId;
alert(data.registrationId)
console.log(JSON.stringify(data));
});
push.on('notification', function (data) {
console.log("notification event");
console.log(JSON.stringify(data));
var cards = document.getElementById("cards");
var card = '<div class="row">' +
'<div class="col s12 m6">' +
' <div class="card darken-1">' +
' <div class="card-content black-text">' +
' <span class="card-title black-text">' + data.title + '</span>' +
' <p>' + data.message + '</p>' +
' </div>' +
' </div>' +
' </div>' +
'</div>';
cards.innerHTML += card;
push.finish(function () {
console.log('finish successfully called');
});
});
push.on('error', function (e) {
console.log("push error");
});
},
// Update DOM on a Received Event
receivedEvent: function (id) {
var parentElement = document.getElementById(id);
var listeningElement = parentElement.querySelector('.listening');
var receivedElement = parentElement.querySelector('.received');
listeningElement.setAttribute('style', 'display:none;');
receivedElement.setAttribute('style', 'display:block;');
console.log('Received Event: ' + id);
}
};
function successHandler(result) {
alert('result = ' + result); //Here you will get your device id.
}
function errorHandler(error) {
alert('error = ' + error);
}
Так что я точно не знаю, куда идти отсюда. Я создал учетную запись с помощью мастера push-уведомлений и создал дополнительные сертификаты, но это не захватывает никакие устройства, так как я предполагаю, что еще нет устройств, которые настроены на получение уведомлений.
Итак, я думаю, что моя главная проблема в том, что я упускаю что-то глупое, например этап регистрации, где мое устройство регистрируется для получения уведомлений?
2 ответа
Вы не используете this
контекст правильно. Это распространенная ошибка. Javascript this
НЕ работает как Java this
,
Причина этого не в том, что this
разрешается во время выполнения, а не во время сборки (или во время компиляции). Когда событие происходит, this
решает глобальный this
потому что ваш app
Объект теперь находится вне области видимости. Событие происходит * вне * вашего app
объект.
Быстрое решение было бы сделать app.onDeviceReady
вместо this.onDeviceReady
Вы можете проверить это, сделав onDeviceReady()
глобальная функция и оставляя this
на месте.
Эти видео должны помочь. - Удачи.
Контекст в JavaScript - 1/4 - Цель и проблемы с JavaScript "This"
Контекст в JavaScript - 2/4 - Как JavaScript решает, что на самом деле означает "это"
Контекст в JavaScript - 3/4 - "Это" может не соответствовать вашим ожиданиям и как это исправить
Контекст в JavaScript - 4/4 - Освоение "This:" Дополнительные методы и поддержка в будущем
Итак, здесь было два раздела: во-первых, что упомянул jesseMonroy, мой код не был правильно подобран, а мой js-файл не был запущен должным образом.
Вторая часть заключалась в том, что я не вызывал функцию регистрации, которая позволяет вам получить device_token.
push.registerDevice({ alert: true, badge: true, sound: true }, function (status) {
app.myLog.value += JSON.stringify(['registerDevice status: ', status]) + "\n";
app.storeToken(status.deviceToken);
alert(status.deviceToken)
});
Это то, чего мне не хватало. весь мой раздел инициализации выглядит так;
var push = PushNotification.init({
"android": {
"senderID": "1234567890"
},
"ios": { "alert": "true", "badge": "true", "sound": "true" },
"windows": {}
});
push.on('registration', function (data) {
console.log("registration event");
//document.getElementById("regId").innerHTML = data.registrationId;
alert(data.registrationId)
console.log(JSON.stringify(data));
});
push.on('notification', function (data) {
console.log("notification event");
console.log(JSON.stringify(data));
var cards = document.getElementById("cards");
var card = '<div class="row">' +
'<div class="col s12 m6">' +
' <div class="card darken-1">' +
' <div class="card-content black-text">' +
' <span class="card-title black-text">' + data.title + '</span>' +
' <p>' + data.message + '</p>' +
' </div>' +
' </div>' +
' </div>' +
'</div>';
cards.innerHTML += card;
push.finish(function () {
console.log('finish successfully called');
});
});
push.on('error', function (e) {
console.log("push error");
});
// var pushNotification = window.plugins.PushNotification;
push.registerDevice({ alert: true, badge: true, sound: true }, function (status) {
app.myLog.value += JSON.stringify(['registerDevice status: ', status]) + "\n";
app.storeToken(status.deviceToken);
alert(status.deviceToken)
});