跳过主要内容
教程

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

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

文章来源

马丁·多纳迪尤

作者

瓦莱里亚

审稿人

乔丹

编辑

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

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 项目 或使用现有的一个。为新项目提供一个名称和默认选项。

如果您有一个新应用,您应该在应用的控制台中看到 “通过添加 Firebase 到您的应用” 否则,点击齿轮图标并转到 项目设置 添加一个应用

对于 iOS 和 Android 来说,弹出框的外观类似,重要的是使用你的 包 ID 为应用

firebase-app-setup-ios

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

  • 用于 Android 的 Google 服务 JSON 文件 用于 Android 的 Google 服务 JSON 文件
  • 用于 iOS 的 GoogleService-info.plist 文件 用于 iOS 的 GoogleService-info.plist 文件

接下来,配置平台

Android 推送准备

对于 Android,移动下载的 google-services.json 文件到 android/app/ android-push-file Android 的所有工作都完成了。现在让我们配置 iOS。

iOS 推送准备

这个部分更复杂。首先,在 Apple Developer 帐户的标识符列表中

创建一个用于您的应用的 App ID。确保您

__CAPGO_KEEP_0__ __CAPGO_KEEP_1__ __CAPGO_KEEP_2__ 选择 Push 通知功能 从列表中选择。

ionic-ios-push-id

The 包 ID 应与您的 Capacitor 和 Firebase 中的 App ID 相同。

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

Bundle ID

After下载Capacitor应用后 .p8 文件,上传到Firebase。打开 Cloud Messaging 选项卡在您的Firebase项目设置中,上传文件,并输入Key ID和您的团队ID的详细信息从iOS。

firebase-upload-ios-key

现在,修改您的Xcode项目通过运行:

npx cap open ios

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

然后,添加一个新的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();
  }

}

pages/details/details.page.html:

<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 上下文:Capgo 营销网站。角色:短 UI 标签或导航项。见于:页面 trust.astro。消息键 `and` (And)。

That’s it! You’ve successfully integrated push notifications in your Ionic Capacitor app using Firebase. Now you can send push notifications to your users on both Android and iOS platforms.

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

继续阅读 Ionic __CAPGO_KEEP_0__ 使用 Firebase 的推送通知:一步一步的指南 Ionic Capacitor 推送通知与 Firebase:一步步的指南 为迁移和企业运营做好准备,连接它 Capgo 企业 为产品工作流程在 Capgo 企业 Ionic 企业插件替代品 为产品工作流程在 Ionic 企业插件替代品 Capgo 替代品 为产品工作流程在 Capgo 替代品 Capgo 咨询 为产品工作流程在 Capgo 咨询,并且 Capgo 高级支持 为产品工作流程在 Capgo 高级支持

实时更新 Capacitor 应用

When a web-layer bug is live, ship the fix through Capgo instead of waiting days for app store approval. Users get the update in the background while native changes stay in the normal review path.

当 web 层 bug 活跃时,通过 __CAPGO_KEEP_0__ 发送修复,而不是等待几天的 app 商店审批。用户在后台接收更新,而原生更改保持在正常审查路径中。

上下文:Capgo 营销网站。角色:支持描述段落或元描述。见于:组件 GetStarted.astro。保留 Capgo 产品/品牌和开发人员术语完全不变。消息键 `instant_updates_for_capacitor_apps_description` (Capacitor 应用实时更新描述)。

来自 Martin 的人工支持

Capgo gives you the best insights you need to create a truly professional mobile app.