跳过主要内容
教程

使用 Firebase 在 Ionic Capacitor 中集成推送通知:一步步指南

了解如何在 Ionic Capacitor 应用程序中使用 Firebase 集成推送通知,提供 Android 和 iOS 平台的步骤指南。

马丁·多纳迪尤

马丁·多纳迪尤

内容营销人员

Ionic Capacitor Push Notifications with Firebase: A Step-by-Step Guide

In 这个教程中,我们将在 Ionic Capacitor 应用程序中集成推送通知使用 Firebase。有关维护的 Capacitor 插件,带有 Firebase Cloud Messaging 支持,请参见 @capgo/capacitor-firebase-messaging。您不需要特定的服务,但您需要配置几个东西。 Firebase 是一个很好的选择,因为它是 Android 所必需的,并且您可以轻松使用它来发送通知而不使用数据库。

首先,我们将创建一个 Ionic 应用程序,启用 Capacitor 并指定我们的 package id,这是您的应用程序的唯一标识符。然后,我们将构建应用程序并添加原生平台。

ionic start pushApp blank --type=angular --capacitor --package-id=com.appdactic.devpush
cd ./pushApp
ionic build
npx cap add ios
npx cap add android

如果您已经有一个应用程序,则可以更改的 capacitor.config.json 以包含您的 appId。然而,如果您的原生文件夹已经存在,则需要在所有文件中替换 id,因为 Capacitor 只创建文件夹一次 不会更新 id 本身. 在 capacitor.config.json,您还可以指定选项,如更新徽章计数、推送时播放声音以及在通知到达时显示警告。

{
  "appId": "com.appdactic.devpush",
  "appName": "pushApp",
  "bundledWebRuntime": false,
  "npmClient": "npm",
  "webDir": "www",
  "plugins": {
    "SplashScreen": {
      "launchShowDuration": 0
    },
    "PushNotifications": {
      "presentationOptions": ["badge", "sound", "alert"]
    }
  },
  "cordova": {}
}

现在,让我们在应用程序外配置推送通知。

Firebase 配置

首先 创建一个新的 Firebase 项目 或使用现有的一个。为新项目提供一个名称和默认选项。

如果您有一个新应用程序,则应在应用程序的控制台中看到 “Get started by adding Firebase to your app” 在应用程序的控制台中点击齿轮图标并转到 项目设置 添加一个应用。

iOS 和 Android 的对话框看起来很相似,重要的是要使用你的 package id 用于应用的

firebase-app-setup-ios

完成初始步骤后,请下载以下文件:

  • google-services.json 用于 Android 的文件
  • GoogleService-info.plist 用于 iOS 的文件

接下来,配置平台。

安卓推送准备

对于安卓,移动下载的 google-services.json 文件到 android/app/ 文件夹。

android-push-file

安卓配置完成。现在让我们配置 iOS。

iOS 推送准备

这个部分更复杂。首先,在 Apple Developer 账户中的标识符列表中为您的应用创建一个 App ID。确保您 选择 Push 通知功能 从列表中选择。

ionic-ios-push-id

该 Bundle ID 应该与您的 App ID 在 __CAPGO_KEEP_0__ 和 Firebase 中保持一致。 现在, should be the same as your App ID within Capacitor and Firebase.

并启用 Apple Push 通知服务 (APNs)。 如果您已经达到密钥数量的最大限制,则可以使用现有的密钥或证书,但该过程更为复杂。 ios-developer-push-key ios-developer-push-keyios-developer-push-key

ios-developer-push-key

下载完成后,上传到 Firebase。打开 Firebase 项目设置中的 "Cloud Messaging" tab,上传文件并输入 iOS 中的 Key ID 和 Team ID 详情。 __CAPGO_KEEP_0__ 现在,请在 Xcode 项目中运行以下命令: 复制从 Firebase 下载的 "GoogleService-Info.plist" 文件并将其拖放到 iOS 项目中,选择 "app/app" 文件夹内的 Xcode 项目,选择 "Copy items if needed" 接下来,在 Xcode 项目中添加一个新的 Pod 来依赖 Firebase 依赖项

在 Xcode 项目中添加一个新的 Pod 来依赖 Firebase 依赖项

在 Xcode 项目中添加一个新的 Pod 来依赖 Firebase 依赖项

npx cap open ios

在 Xcode 项目中添加一个新的 Pod 来依赖 Firebase 依赖项 在 Xcode 项目中添加一个新的 Pod 来依赖 Firebase 依赖项 在 Xcode 项目中添加一个新的 Pod 来依赖 Firebase 依赖项 在 Xcode 项目中添加一个新的 Pod 来依赖 Firebase 依赖项.

在 Xcode 项目中添加一个新的 Pod 来依赖 Firebase 依赖项 ios/App/Podfile:

target 'App' do
  capacitor_pods
  # Add your Pods here
  pod 'Firebase/Messaging'
end

使用以下命令更新本地平台:

npx cap update ios

修改本地 Swift code 中的 ios/App/App/AppDelegate.swift 以 Firebase 注册并将正确令牌返回给您的应用。

import UIKit
import Capacitor
import Firebase

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

  var window: UIWindow?

  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
    FirebaseApp.configure()
    return true
  }

  // All the existing functions
  // ...

  // Update this one:
    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        Messaging.messaging().apnsToken = deviceToken
        InstanceID.instanceID().instanceID { (result, error) in
            if let error = error {
                NotificationCenter.default.post(name: Notification.Name(CAPNotifications.DidFailToRegisterForRemoteNotificationsWithError.name()), object: error)
            } else if let result = result {
                NotificationCenter.default.post(name: Notification.Name(CAPNotifications.DidRegisterForRemoteNotificationsWithDeviceToken.name()), object: result.token)
            }
        }
    }
}

最后,在 Xcode 项目中添加推送通知的能力。

capacitor-xcode-capability

现在,构建您的应用并集成推送通知。

Ionic 推送通知集成

在 Ionic 项目中创建一个服务和一个新页面:

ionic g service services/fcm
ionic g page pages/details

更新 app/app-routing.module.ts 要包含具有动态 ID 的新页面:

import { NgModule } from '@angular/core';
import { PreloadAllModules, RouterModule, Routes } from '@angular/router';

const routes: Routes = [
  {
    path: 'home',
    loadChildren: () => import('./home/home.module').then( m => m.HomePageModule)
  },
  {
    path: '',
    redirectTo: 'home',
    pathMatch: 'full'
  },
  {
    path: 'home/:id',
    loadChildren: () => import('./pages/details/details.module').then( m => m.DetailsPageModule)
  },
];

@NgModule({
  imports: [
    RouterModule.forRoot(routes, { preloadingStrategy: PreloadAllModules })
  ],
  exports: [RouterModule]
})
export class AppRoutingModule { }

创建一个处理推送通知的服务: services/fcm.service.ts:

import { Injectable } from '@angular/core';
import {
  Plugins,
  PushNotification,
  PushNotificationToken,
  PushNotificationActionPerformed,
  Capacitor
} from '@capacitor/core';
import { Router } from '@angular/router';

const { PushNotifications } = Plugins;

@Injectable({
  providedIn: 'root'
})
export class FcmService {

  constructor(private router: Router) { }

  initPush() {
    if (Capacitor.platform !== 'web') {
      this.registerPush();
    }
  }

  private registerPush() {
    PushNotifications.requestPermission().then((permission) => {
      if (permission.granted) {
        // Register with Apple / Google to receive push via APNS/FCM
        PushNotifications.register();
      } else {
        // No permission for push granted
      }
    });

    PushNotifications.addListener(
      'registration',
      (token: PushNotificationToken) => {
        console.log('My token: ' + JSON.stringify(token));
      }
    );

    PushNotifications.addListener('registrationError', (error: any) => {
      console.log('Error: ' + JSON.stringify(error));
    });

    PushNotifications.addListener(
      'pushNotificationReceived',
      async (notification: PushNotification) => {
        console.log('Push received: ' + JSON.stringify(notification));
      }
    );

    PushNotifications.addListener(
      'pushNotificationActionPerformed',
      async (notification: PushNotificationActionPerformed) => {
        const data = notification.notification.data;
        console.log('Action performed: ' + JSON.stringify(notification.notification));
        if (data.detailsId) {
          this.router.navigateByUrl(`/home/${data.detailsId}`);
        }
      }
    );
  }
}

initPush() app/app.component.ts 中调用函数::

import { Component } from '@angular/core';

import { Platform } from '@ionic/angular';
import { SplashScreen } from '@ionic-native/splash-screen/ngx';
import { StatusBar } from '@ionic-native/status-bar/ngx';
import { FcmService } from './services/fcm.service';

@Component({
  selector: 'app-root',
  templateUrl: 'app.component.html',
  styleUrls: ['app.component.scss']
})
export class AppComponent {
  constructor(
    private platform: Platform,
    private splashScreen: SplashScreen,
    private statusBar: StatusBar,
    private fcmService: FcmService
  ) {
    this.initializeApp();
  }

  initializeApp() {
    this.platform.ready().then(() => {
      this.statusBar.styleDefault();
      this.splashScreen.hide();

      // Trigger the push setup
      this.fcmService.initPush();
    });
  }
}

pages/details/details.page.ts:

import { Component, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { Plugins } from '@capacitor/core';
const { PushNotifications } = Plugins;

@Component({
  selector: 'app-details',
  templateUrl: './details.page.html',
  styleUrls: ['./details.page.scss'],
})
export class DetailsPage implements OnInit {
  id = null;

  constructor(private route: ActivatedRoute) { }

  ngOnInit() {
    this.route.paramMap.subscribe(params => {
      this.id = params.get('id');
    });
  }

  resetBadgeCount() {
    PushNotifications.removeAllDeliveredNotifications();
  }

}

中处理详细信息: :

<ion-header>
  <ion-toolbar>
    <ion-buttons slot="start">
      <ion-back-button defaultHref="/"></ion-back-button>
    </ion-buttons>
    <ion-title>Details</ion-title>
  </ion-toolbar>
</ion-header>

<ion-content>
  My Id from push: {{ id }}

  <ion-button (click)="resetBadgeCount()" expand="block">
    Reset Badge Count
  </ion-button>
</ion-content>

pages/details/details.page.html

ionic build
npx cap sync

中显示详细信息:

使用 Firebase 发送推送通知

有多种方法可以使用 Firebase 发送推送通知。

特定设备测试

在部署应用程序到设备后,您可以检查控制台日志以查看注册后令牌。使用此令牌发送一个针对性的测试推送以确认您的集成正在工作。在 Firebase 中,转到 Cloud Messaging 并选择 发送测试消息.从日志中添加设备令牌。

firebase-test-push

如果一切设置正确,您应该在设备上看到一个推送通知。

带有载荷的推送消息

要测试带有额外信息的推送通知,请遵循同一页面上的向导,指定一般信息并选择要目标的平台。添加 额外选项 向推送通知中发送一个载荷。

firebase-push-payload

高级选项 部分,添加一个 自定义数据 键值对。例如,您可以使用键 detailsId 并选择一个值。这段数据将用于在应用程序中导航到指定ID的详细页面。

当用户点击通知时,应用程序应该接收推送通知并显示指定ID的详细页面。

使用 Firebase API

您还可以使用 Firebase API 程序matic地发送推送通知。要实现此功能,您需要获得 服务器密钥 从您的 Firebase 项目设置中找到 Cloud Messaging 选项卡。

使用服务器密钥,您可以向 Firebase API 发送一个包含所需负载的 POST 请求。以下是使用 Node.js 和 request 库的示例:

const request = require('request');

const serverKey = 'YOUR_SERVER_KEY';
const deviceToken = 'YOUR_DEVICE_TOKEN';

const options = {
  method: 'POST',
  url: 'https://fcm.googleapis.com/fcm/send',
  headers: {
    'Content-Type': 'application/json',
    Authorization: 'key=' + serverKey
  },
  body: JSON.stringify({
    to: deviceToken,
    notification: {
      title: 'Test Push',
      body: 'This is a test push notification with custom data'
    },
    data: {
      detailsId: '123'
    }
  })
};

request(options, (error, response, body) => {
  if (error) {
    console.error('Error sending push:', error);
  } else {
    console.log('Push sent successfully:', body);
  }
});

替换 YOUR_SERVER_KEYYOUR_DEVICE_TOKEN 为您的实际服务器密钥和设备令牌。运行脚本,设备应该会接收到带有自定义负载的推送通知。

就这样!您已经成功在 Ionic Capacitor 应用中集成 Firebase 推送通知。现在,您可以在 Android 和 iOS 平台上向您的用户发送推送通知。

继续阅读 Ionic Capacitor 使用 Firebase 的推送通知指南:一步一步的指南

如果您正在使用 Ionic Capacitor 推送通知与 Firebase:一步步的指南 连接它以 Capgo 企业 为 Capgo 企业中的产品工作流程 Ionic 企业插件替代品 为 Ionic 企业插件替代品中的产品工作流程 Capgo 替代品 为 Capgo 替代品中的产品工作流程 Capgo 咨询 为 Capgo 咨询中的产品工作流程 Capgo 高级支持 为 Capgo 高级支持中的产品工作流程

Capacitor 应用的实时更新

当 web 层面的 bug 活跃时,通过 Capgo 将修复推送给用户,而不是等待几天的 app store 审核。用户在后台接收更新,而原生代码的更改仍然在正常的审查路径中。

立即开始

最新博客

Capgo 为您提供创建真正专业的移动应用所需的最佳见解。