3

Я пытаюсь интегрировать push-уведомления в мое приложение Ionic/Cordova. Я использую сервис OneSignal для интеграции. Я успешно настроил свой iPhone для получения push-уведомлений с веб-интерфейса OneSignal.Как вводить объект в ионный контроллер из плагина cordova?

Следующим шагом является получение pushToken (который OneSignal/Apple использует для отправки Вдавите уведомления на одном устройстве), чтобы заполнить в ионном контроллер моего приложения, так что я могу реализовать логику приложения и нажмите сообщения на основе приложения Мероприятия.

Я установил плагин Кордовы (OneSignal), и мои iPhone регистрируются, и он сообщает pushToken. Однако я не могу передать строку pushToken ни одному из моих контроллеров для моей жизни. Как я могу это сделать? Ниже приведены мои приложения.js и controller.js.

app.js

angular.module('cApp', ['ionic', 'cApp.controllers']) 

.run(function($ionicPlatform, $cordovaSplashscreen, $rootScope) { 

$ionicPlatform.ready(function() { 

if(window.cordova && window.cordova.plugins.Keyboard) { 
    cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true); 
    cordova.plugins.Keyboard.disableScroll(true); // Fixes keyboard issue 
} 

if (window.StatusBar) { 
    // org.apache.cordova.statusbar required 
    StatusBar.styleDefault(); 
} 

/*=========================================================================== 
http://documentation.onesignal.com/v2.0/docs/phonegap--cordova-sdk-api#init 
===========================================================================*/ 
window.plugins.OneSignal.init("5eb87dse-b458-11e3-ac11-000c2940e62c", 
    {googleProjectNumber: "", 
    autoRegister: true}, 
     app.didReceiveRemoteNotificationCallBack); 


window.plugins.OneSignal.getIds(function(ids) { 
    console.log('getIds: ' + JSON.stringify(ids)); // I can see PushToken and UserId in the console. 
    $rootScope.pushToken = ids.pushToken; 
}); 

}); 

console.log($rootScope.pushToken); 

}) 

// Configure Routes....... etc. 

controller.js

.controller('MenuCtrl', function($scope, $rootScope, $ionicModal, $ionicPlatform) { 

console.log($rootScope.pushToken); // It comes back undefined :(
+0

В контроллере.js вы можете попробовать добавить задержку к печати $ rootScope.pushToken? Обратный вызов не запускается сразу из OneSignal.getIds(). Можете ли вы сделать то, что вам нужно, с помощью pushToken в app.js? Вы должны иметь его в своем контроллере.js? – jkasten

+0

Спасибо за советы Jkasten. Я попытался отложить печать $ rootScope.pushToken, и все это выглядит пустым в консоли (оно не отображается). Насколько я могу делать то, что мне нужно делать в app.js, я так не думаю. Мне по существу нужно передать $ rootScope.pushToken на другой сервер. Этот процесс должен выполняться в контроллере. – Syirrus

+0

UPDATE: Я попытался снова отложить печать $ rootScope.pushToken в «MenuCtrl», и он появляется на консоли в таймере в «MenuCtrl». Как я могу сделать это так, чтобы я мог получить доступ к $ rootScope.pushToken, чтобы передать мою функцию за пределами таймера $?У меня есть вызов $ scope. $ Apply(); или что-то подобное, чтобы обновить переменную области видимости или сделать что-то с циклом дайджеста? В других работах, как я могу синхронизировать $ rootScope.pushToken со всеми другими переменными приложения? Большое спасибо за ваш первоначальный ответ. Я получил намного больше! – Syirrus

ответ

1

Это звучит как app.js бежит перед вашим controller.js. Если это так, вы должны иметь возможность сделать следующее:

  • Для обработки, когда приложение открывается с уведомлением
    • Установить переменную на $ rootScope в didReceiveRemoteNotificationCallBack и читать его в контроллере.
  • Для обработки, когда приложение работает, и вы получите уведомление
    • Назначьте функцию обработчика на $ rootScope в контроллере и вызывать в вашем didReceiveRemoteNotificationCallBack, если он существует.

Вот код реализации этих потоков 2:

app.js:

didReceiveRemoteNotificationCallBack(message, additionalData, isActive) { 
    var notificationObj = {message: message, additionalData: additionalData, isActive: isActive}; 
    if ($rootScope.notificationReceivedHandler) 
    $rootScope.notificationReceivedHandler(notificationObj); 
    else 
    $rootScope.openedFromNotification = notificationObj; 
} 

controller.js:

.controller('MenuCtrl', function($scope, $rootScope, $ionicModal, $ionicPlatform) { 
    if ($rootScope.openedFromNotification) 
    processNotificationOpened($rootScope.openedFromNotification); 
    $rootScope.openedFromNotification = processNotificationOpened; 
} 

function processNotificationOpened(notificationObj) { 
    // Read and process what you need to here. 
} 

ПРИМЕЧАНИЕ. Код выше не проверен.

Смежные вопросы