使用firebase api打开特定页面

时间:2017-06-28 08:34:36

标签: android firebase ionic-framework

我正在使用以下代码向设备发送推送通知。

      var nTitle = "New message from " + $rootScope.clients_firstName;
      var to = "DeviceToken is here";
      var notification = {
        'title': nTitle,
        //'body': 'Click here to more details...',
        'icon': 'firebase-logo.png',
        'click_action': 'openapp'
      };

      var key = 'your key';
      fetch('https://fcm.googleapis.com/fcm/send', {
      'method': 'POST',
        'headers': {
        'Authorization': 'key=' + key,
        'Content-Type': 'application/json'
      },
      'body': JSON.stringify({
        'notification': data,
        'to': to
      })
      }).then(function(response) {
        //console.log("res ", response);
      }).catch(function(error) {
        console.error("err ", error);
     });

推送通知在设备上成功发送。

但是当我点击通知时,特定页面应该是打开的。

例如'click_action' : 'openapp/somepage'

然后是' somepage'当我点击推送通知时应该打开。

的AndroidManifest.xml

<activity android:name="MainActivity" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale" android:label="@string/activity_name" android:launchMode="singleTop" android:theme="@android:style/Theme.DeviceDefault.NoActionBar" android:windowSoftInputMode="adjustResize">

        <intent-filter>
            <action android:name="openapp" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
        </intent-filter>

</activity>

我的项目结构

--platforms
--plugins
--www
  --app
    --about
      --about.html
      --about.ctrl.js
    --product
      --product.html
      --product.ctrl.js
  --css
  --js
  --lib
  index.html

如果我点击通知,我想打开产品或关于页面,那么我必须做什么?

这里有什么问题?请告诉我正确的解决方案。

5 个答案:

答案 0 :(得分:2)

我知道你问过Ionic 1.但我只知道Ionic 2.希望这会对你有帮助。

我认为您应该在通知的其他数据部分添加有关需要打开的页面的信息。像这样:

'body': JSON.stringify({
        'notification': data,
        'to': to,
        'data' : {
           'action' : 'Needed page'
        }
      })

然后你应该在subscribe方法上捕获它。这样的事情:

fcm.onNotification().subscribe(data=>{
  console.log("data", data);
  if (data['action'] && data['action'] == 'Needed page'){
    this.navCtrl.push('Needed page'); //Use Navigation controller to open needed page
  }
})

对于本机cordova FCM插件:

FCMPlugin.onNotification(function(data){
    console.log("data", data);
    if (data['action'] && data['action'] == 'Needed page'){
      this.navCtrl.push('Needed page'); //Use Navigation controller to open needed page
    }
});

答案 1 :(得分:2)

要让应用在后台时可以点击通知,您需要在通知有效负载中使用click_action属性。

请查看Firebase文档的section

此外,当您定义click_action属性时,您还需要在要启动的活动的<action>中使用相应的<intent-filter>属性。

video以非常详细的方式解释了它。

但请注意,如果您要从Firebase控制台发送通知,则无法设置click__action属性。只有从自己的管理服务器或使用Firebase云功能发送通知时,才能执行此操作。

最后,在启动的活动中,您可以使用数据属性设置其他Data(也显示在我上面链接的同一文档中)。当您通过单击通知启动应用程序时,您可以使用getIntent()获取通知数据。查看this answer了解有关如何执行此操作的详细信息。

问题更新后修改:

不要将<intent-filter>放在MainActivity中,而是将过滤器放在单击通知时要打开的活动的<activity>标记中。一个例子如下: -

<activity android:name="ProductDetailsActivity" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale" android:label="@string/activity_name" android:launchMode="singleTop" android:theme="@android:style/Theme.DeviceDefault.NoActionBar" android:windowSoftInputMode="adjustResize">

    <intent-filter>
        <action android:name="openapp" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
    </intent-filter>

现在您的指定活动已打开,您可以使用data从通知的getIntent()部分获取信息。

例如,如果您的通知有效内容具有以下结构,

payload = {
  notification: {
    title: `You ordered a new product`,
    click_action : 'HANDLE_NOTIFICATION',

  },
  data : {
        product_id : 'ABC98292',
        type : `Clothes`,
        product_name : 'Cotton spring shirt'
    }
};

然后,您可以使用product_id从通知中获取getIntent().getStringsExtra("product_id"),依此类推。

这样,您将打开所需的活动,并可以使用从通知中获取的相关详细信息填充该活动,而无需使用任何其他框架。

答案 2 :(得分:1)

如果您使用的是Ionic Push Plugin,则可以使用

$scope.$on('cloud:push:notification', function(event, data) {
        var msg = data.message;
        var appState = msg.app;
        var appAsleep = appState.asleep;
        var appClosed = appState.closed;


        if (appAsleep || appClosed) {               
            $state.go("your state");
        } else {
           //if app is open while receiving push
        }

    });

答案 3 :(得分:0)

将您的网址传递到推送有效负载中,并使用以下代码打开该网址引用的特定屏幕:

$rootScope.$on("$cordovaLocalNotification:click", function(notification, state) {
    var data = JSON.parse(state.data);
    window.location.href = data.url;
});

答案 4 :(得分:0)

你问我here。 如果您使用我的解决方案并在onReceive(Context context, Intent intent)方法中手动创建通知,则必须将待处理意图置于通知构建器中。

NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
//init builder with icon, text, any other params

Intent activityIntent = new Intent(context, Activity.class);
activityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); //it is needed if you creating an activity from not activity context
PendingIntent pendingIntent = PendingIntent.getActivity(context, REQUEST_CODE, activityIntent, PendingIntent.FLAG_CANCEL_CURRENT);
builder.setContentIntent(pendingIntent);

Notification notification = builder.build();
notification.defaults |= Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE | Notification.DEFAULT_LIGHTS;
NotificationManagerCompat.from(context).notify(notificationId, notification);