跳过主要内容
教程

Ionic Capacitor 与 Firebase 的推送通知:一步步的指南

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

马丁·多纳迪厄

马丁·多纳迪厄

内容营销人员

Ionic Capacitor 与 Firebase 的推送通知:一步步的指南

在本教程中,我们将在 Ionic Capacitor 应用中集成推送通知,使用 Firebase。您不需要特定的服务,但您需要在此之前配置几个东西。Firebase 是一个优秀的选择,因为它是 Android 所必需的,并且您可以轻松地使用它来发送通知,而无需使用数据库。

首先,我们将创建一个启用了 Capacitor 的 Ionic 应用,并指定我们的 包 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本身。 __CAPGO_KEEP_0__.config.json 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 Configuration

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

如果你有一个新的应用,你应该看到 “Get started by adding Firebase to your app” 在你的应用的控制台中。 否则,点击齿轮图标并进入 项目设置

来添加一个应用。 iOS 和 Android 的对话框看起来类似,重要的是要使用你的 包 ID

来为应用添加 Firebase

下载完成后,请下载以下文件:

  • __CAPGO_KEEP_0__ Android文件
  • __CAPGO_KEEP_0__ iOS文件

接下来,配置平台。

Android推送准备

对于 Android,移动下载的 __CAPGO_KEEP_0__ 文件到 __CAPGO_KEEP_0__ 文件夹中。

android-push-file

Android配置完成。现在让我们配置iOS。

iOS推送准备

这个部分更复杂。首先, 在您的Apple Developer帐户中创建一个用于您的应用程序的App ID, 确保您从列表中选择推送通知功能。 ionic-ios-push-id Bundle ID

应与您的App ID和 Firebase中的__CAPGO_KEEP_0__保持一致。

create an App ID for your app within the identifiers list select the Push Notifications capability should be the same as your App ID within Capacitor and Firebase.

现在, 创建一个 Key 并启用 Apple Push Notifications 服务(APNs) . 如果您已经达到最大密钥数量,可以使用现有的密钥或证书,但过程更复杂。ios-developer-push-key

下载完成后,

.p8 文件后,上传到 Firebase。打开 Firebase 项目设置中的 Cloud Messaging 选项卡,上传文件,并输入 Key ID 和您的 Team ID 的详细信息。 firebase-upload-ios-key

ios-developer-push-key

现在,通过运行:

npx cap open ios

复制您从 Firebase 下载的 GoogleService-Info.plist 文件并将其拖放到 Xcode 项目中,选择 Copy items if needed.

然后,在 ios/App/Podfile:

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

中添加 Firebase 依赖项的新 Pod

npx cap update ios

Modify the native Swift code in 修改本机 Swift __CAPGO_KEEP_0__

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)
            }
        }
    }
}

以便与 Firebase 注册并返回正确的令牌给您的应用程序。最后,在 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();
    });
  }
}

处理详情页面上的信息 __CAPGO_KEEP_0__:

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();
  }

}

__CAPGO_KEEP_0__:

<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>

构建应用程序,同步更改并将其部署到您的设备上。

ionic build
npx cap sync

现在,您可以使用 Firebase 发送推送通知。

使用 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 平台上向您的用户发送推送通知。

实时更新 Capacitor 应用

当 web 层 bug 活跃时,通过 Capgo 将修复推送到用户,而不是等待几天的应用商店审批。用户在后台接收更新,而本机更改保持在正常审批路径中。

立即开始

最新博客文章

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