3

我正在尝试将推送通知集成到我的 Ionic/Cordova 应用程序中。我正在使用服务 OneSignal 进行集成。我已成功设置我的 iPhone 以接收来自 OneSignal 网络界面的推送通知。

下一步是获取 pushToken(OneSignal/Apple 用于向单个设备发送推送通知)填充到我的应用程序的 ionic 控制器中,以便我可以实现应用程序逻辑并根据应用程序事件推送消息。

我安装了他们的(OneSignal 的)Cordova 插件,并且我的 iPhone 注册了它并报告了 pushToken。但是,我无法终生将 pushToken 字符串传递给我的任何控制器。我怎样才能做到这一点?下面是我的 app.js 和 controller.js。

应用程序.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.  

控制器.js

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

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

1 回答 1

1

听起来 app.js 在你的 controller.js 之前运行。如果是这种情况,您应该能够执行以下操作;

  • 处理从通知中打开您的应用程序的时间
    • 在 didReceiveRemoteNotificationCallBack 的 $rootScope 上设置一个变量并在您的控制器中读取它。
  • 处理您的应用程序何时运行并收到通知
    • 在控制器中的 $rootScope 上分配一个处理函数,如果存在,则调用您的 didReceiveRemoteNotificationCallBack。

这是实现这两个流程的代码:

应用程序.js:

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

控制器.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.
}

注意:上面的代码未经测试。

于 2015-04-21T00:36:44.843 回答