Je nach Gerätestatus werden eingehende Nachrichten unterschiedlich behandelt. Um diese Szenarien und die Integration von FCM in Ihre eigene Anwendung zu verstehen, ist es wichtig, die verschiedenen Zustände zu kennen, in denen sich ein Gerät befinden kann:
Status | Beschreibung |
---|---|
Vordergrund | Wenn die Anwendung geöffnet, sichtbar und in Gebrauch ist. |
Hintergrund | Wenn die Anwendung geöffnet, aber im Hintergrund (minimiert) ist. Dies geschieht in der Regel, wenn der Nutzer die Startbildschirmtaste auf dem Gerät gedrückt hat, über die App-Übersicht zu einer anderen App gewechselt ist oder die Anwendung in einem anderen Tab (Web) geöffnet ist. |
Gekündigt | Wenn das Gerät gesperrt ist oder die Anwendung nicht ausgeführt wird. |
Bevor die Anwendung Nachrichten-Payloads über FCM empfangen kann, müssen einige Voraussetzungen erfüllt sein:
- Die Anwendung muss mindestens einmal geöffnet worden sein, damit sie bei FCM registriert werden kann.
- Wenn der Nutzer die App unter iOS über den App-Switcher schließt, muss sie manuell wieder geöffnet werden, damit Hintergrundnachrichten wieder funktionieren.
- Wenn der Nutzer die App auf einem Android-Gerät über die Geräteeinstellungen erzwingt, muss sie manuell wieder geöffnet werden, damit Nachrichten wieder funktionieren.
- Im Web müssen Sie mit Ihrem Web-Push-Zertifikat ein Token (mit
getToken()
) angefordert haben.
Berechtigung zum Empfangen von Nachrichten anfordern
Unter iOS, macOS, im Web und unter Android 13 oder höher müssen Sie zuerst die Einwilligung des Nutzers einholen, bevor FCM-Nutzlasten auf seinem Gerät empfangen werden können.
Das Paket firebase_messaging
bietet eine einfache API zum Anfordern von Berechtigungen über die Methode requestPermission
.
Diese API akzeptiert eine Reihe von benannten Argumenten, die den Typ der Berechtigungen definieren, die Sie anfordern möchten. Dazu gehört beispielsweise, ob Nachrichten mit Benachrichtigungs-Nutzlasten einen Ton auslösen oder Nachrichten über Siri vorgelesen werden können. Standardmäßig werden mit der Methode sinnvolle Standardberechtigungen angefordert. Die Referenz-API enthält eine vollständige Dokumentation dazu, wofür die einzelnen Berechtigungen benötigt werden.
Rufen Sie die Methode in Ihrer Anwendung auf, um zu beginnen. Unter iOS wird ein natives Modal angezeigt, im Web wird der native API-Ablauf des Browsers ausgelöst:
FirebaseMessaging messaging = FirebaseMessaging.instance;
NotificationSettings settings = await messaging.requestPermission(
alert: true,
announcement: false,
badge: true,
carPlay: false,
criticalAlert: false,
provisional: false,
sound: true,
);
print('User granted permission: ${settings.authorizationStatus}');
Mit der authorizationStatus
-Eigenschaft des NotificationSettings
-Objekts, das von der Anfrage zurückgegeben wird, kann die allgemeine Entscheidung des Nutzers ermittelt werden:
authorized
: Der Nutzer, dem die Berechtigung gewährt wurde.denied
: Der Nutzer, dem die Berechtigung verweigert wurde.notDetermined
: Der Nutzer hat noch nicht ausgewählt, ob er die Berechtigung erteilen möchte.provisional
: Der Nutzer, dem die vorläufige Berechtigung gewährt wurde
Die anderen Attribute für NotificationSettings
geben zurück, ob eine bestimmte Berechtigung auf dem aktuellen Gerät aktiviert, deaktiviert oder nicht unterstützt wird.
Nachdem die Berechtigung erteilt wurde und die verschiedenen Arten von Gerätestatus verstanden wurden, kann Ihre Anwendung nun mit der Verarbeitung der eingehenden FCM-Nutzlasten beginnen.
Nachrichtenverarbeitung
Je nach aktuellem Status Ihrer Anwendung erfordern eingehende Nutzlasten verschiedener Nachrichtentypen unterschiedliche Implementierungen:
Vordergrundnachrichten
Wenn Sie Nachrichten verarbeiten möchten, während Ihre Anwendung im Vordergrund ausgeführt wird, hören Sie auf den onMessage
-Stream.
FirebaseMessaging.onMessage.listen((RemoteMessage message) {
print('Got a message whilst in the foreground!');
print('Message data: ${message.data}');
if (message.notification != null) {
print('Message also contained a notification: ${message.notification}');
}
});
Der Stream enthält ein RemoteMessage
mit verschiedenen Informationen zur Nutzlast, z. B. woher sie stammt, die eindeutige ID, die Sendezeit und ob sie eine Benachrichtigung enthält. Da die Nachricht abgerufen wurde, während sich Ihre Anwendung im Vordergrund befindet, können Sie direkt auf den Status und Kontext Ihrer Flutter-Anwendung zugreifen.
Nachrichten im Vordergrund und Benachrichtigungen
Benachrichtigungen, die eingehen, während die App im Vordergrund ausgeführt wird, werden standardmäßig weder auf Android- noch auf iOS-Geräten angezeigt. Es ist jedoch möglich, dieses Verhalten zu überschreiben:
- Unter Android müssen Sie einen Benachrichtigungskanal mit hoher Priorität erstellen.
- Unter iOS können Sie die Präsentationsoptionen für die Anwendung aktualisieren.
Hintergrundnachrichten
Die Verarbeitung von Hintergrundnachrichten unterscheidet sich auf nativen (Android und Apple) und webbasierten Plattformen.
Apple-Plattformen und Android
Hintergrundnachrichten verarbeiten, indem Sie einen onBackgroundMessage
-Handler registrieren. Wenn Nachrichten empfangen werden, wird ein Isolat erstellt (nur Android, für iOS/macOS ist kein separates Isolat erforderlich). So können Sie Nachrichten auch dann verarbeiten, wenn Ihre Anwendung nicht ausgeführt wird.
Beachten Sie bei der Implementierung Ihres Hintergrund-Message-Handlers Folgendes:
- Es darf keine anonyme Funktion sein.
- Es muss sich um eine Funktion der obersten Ebene handeln (z.B. keine Klassenmethode, die eine Initialisierung erfordert).
- Wenn Sie Flutter-Version 3.3.0 oder höher verwenden, muss der Message-Handler direkt über der Funktionsdeklaration mit
@pragma('vm:entry-point')
annotiert werden. Andernfalls wird er möglicherweise beim Tree Shaking für den Release-Modus entfernt.
@pragma('vm:entry-point')
Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
// If you're going to use other Firebase services in the background, such as Firestore,
// make sure you call `initializeApp` before using other Firebase services.
await Firebase.initializeApp();
print("Handling a background message: ${message.messageId}");
}
void main() {
FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);
runApp(MyApp());
}
Da der Handler in einem eigenen Isolat außerhalb des Kontextes Ihrer Anwendung ausgeführt wird, ist es nicht möglich, den Anwendungsstatus zu aktualisieren oder UI-beeinträchtigende Logik auszuführen. Sie können jedoch Logik wie HTTP-Anfragen ausführen, E/A-Vorgänge ausführen (z.B. lokalen Speicher aktualisieren) und mit anderen Plug-ins kommunizieren.
Wir empfehlen, die Logik so schnell wie möglich zu vervollständigen. Wenn Sie lange, intensive Aufgaben ausführen, kann sich das auf die Geräteleistung auswirken und dazu führen, dass das Betriebssystem den Prozess beendet. Wenn die Ausführung von Tasks länger als 30 Sekunden dauert, wird der Prozess möglicherweise automatisch vom Gerät beendet.
Web
Schreiben Sie im Web einen JavaScript-Service Worker, der im Hintergrund ausgeführt wird. Verwenden Sie den Service Worker, um Hintergrundnachrichten zu verarbeiten.
Erstellen Sie dazu eine neue Datei in Ihrem Verzeichnis web
und nennen Sie sie firebase-messaging-sw.js
:
// Please see this file for the latest firebase-js-sdk version:
// https://github.com/firebase/flutterfire/blob/main/packages/firebase_core/firebase_core_web/lib/src/firebase_sdk_version.dart
importScripts("https://www.gstatic.com/firebasejs/10.7.0/firebase-app-compat.js");
importScripts("https://www.gstatic.com/firebasejs/10.7.0/firebase-messaging-compat.js");
firebase.initializeApp({
apiKey: "...",
authDomain: "...",
databaseURL: "...",
projectId: "...",
storageBucket: "...",
messagingSenderId: "...",
appId: "...",
});
const messaging = firebase.messaging();
// Optional:
messaging.onBackgroundMessage((message) => {
console.log("onBackgroundMessage", message);
});
In der Datei müssen sowohl das App- als auch das Messaging-SDK importiert, Firebase initialisiert und die Variable messaging
verfügbar gemacht werden.
Als Nächstes muss der Worker registriert werden. Registrieren Sie den Worker in der Datei index.html
, indem Sie das Tag <script>
ändern, mit dem Flutter gebootstrapped wird:
<script src="flutter_bootstrap.js" async>
if ('serviceWorker' in navigator) {
window.addEventListener('load', function () {
navigator.serviceWorker.register('firebase-messaging-sw.js', {
scope: '/firebase-cloud-messaging-push-scope',
});
});
}
</script>
Wenn Sie das alte Vorlagensystem verwenden, können Sie den Worker registrieren, indem Sie das <script>
-Tag, mit dem Flutter gebootstrapped wird, so ändern:
<html>
<body>
<script>
var serviceWorkerVersion = null;
var scriptLoaded = false;
function loadMainDartJs() {
if (scriptLoaded) {
return;
}
scriptLoaded = true;
var scriptTag = document.createElement('script');
scriptTag.src = 'main.dart.js';
scriptTag.type = 'application/javascript';
document.body.append(scriptTag);
}
if ('serviceWorker' in navigator) {
// Service workers are supported. Use them.
window.addEventListener('load', function () {
// Register Firebase Messaging service worker.
navigator.serviceWorker.register('firebase-messaging-sw.js', {
scope: '/firebase-cloud-messaging-push-scope',
});
// Wait for registration to finish before dropping the <script> tag.
// Otherwise, the browser will load the script multiple times,
// potentially different versions.
var serviceWorkerUrl =
'flutter_service_worker.js?v=' + serviceWorkerVersion;
navigator.serviceWorker.register(serviceWorkerUrl).then((reg) => {
function waitForActivation(serviceWorker) {
serviceWorker.addEventListener('statechange', () => {
if (serviceWorker.state == 'activated') {
console.log('Installed new service worker.');
loadMainDartJs();
}
});
}
if (!reg.active && (reg.installing || reg.waiting)) {
// No active web worker and we have installed or are installing
// one for the first time. Simply wait for it to activate.
waitForActivation(reg.installing ?? reg.waiting);
} else if (!reg.active.scriptURL.endsWith(serviceWorkerVersion)) {
// When the app updates the serviceWorkerVersion changes, so we
// need to ask the service worker to update.
console.log('New service worker available.');
reg.update();
waitForActivation(reg.installing);
} else {
// Existing service worker is still good.
console.log('Loading app from service worker.');
loadMainDartJs();
}
});
// If service worker doesn't succeed in a reasonable amount of time,
// fallback to plaint <script> tag.
setTimeout(() => {
if (!scriptLoaded) {
console.warn(
'Failed to load app from service worker. Falling back to plain <script> tag.'
);
loadMainDartJs();
}
}, 4000);
});
} else {
// Service workers not supported. Just drop the <script> tag.
loadMainDartJs();
}
</script>
</body>
Starten Sie als Nächstes Ihre Flutter-Anwendung neu. Der Worker wird registriert und alle Hintergrundnachrichten werden über diese Datei verarbeitet.
Interaktionen verarbeiten
Da Benachrichtigungen ein sichtbarer Hinweis sind, interagieren Nutzer häufig mit ihnen (durch Tippen). Standardmäßig wird die Anwendung sowohl unter Android als auch unter iOS geöffnet. Wenn die Anwendung beendet wird, wird sie gestartet. Wenn sie im Hintergrund ausgeführt wird, wird sie in den Vordergrund gebracht.
Je nach Inhalt einer Benachrichtigung möchten Sie möglicherweise die Interaktion des Nutzers beim Öffnen der Anwendung verarbeiten. Wenn beispielsweise eine neue Chatnachricht über eine Benachrichtigung gesendet wird und der Nutzer darauf tippt, möchten Sie möglicherweise die entsprechende Unterhaltung öffnen, wenn die Anwendung geöffnet wird.
Das firebase-messaging
-Paket bietet zwei Möglichkeiten, diese Interaktion zu verarbeiten:
getInitialMessage()
: Wenn die Anwendung aus einem beendeten Zustand heraus geöffnet wird, wird einFuture
mit einemRemoteMessage
zurückgegeben. Nach der Verwendung wird dieRemoteMessage
entfernt.onMessageOpenedApp
: EinStream
, das einRemoteMessage
postet, wenn die Anwendung aus dem Hintergrund geöffnet wird.
Wir empfehlen, beide Szenarien zu berücksichtigen, um eine reibungslose Nutzererfahrung zu gewährleisten. Im folgenden Codebeispiel wird gezeigt, wie das geht:
class Application extends StatefulWidget {
@override
State<StatefulWidget> createState() => _Application();
}
class _Application extends State<Application> {
// It is assumed that all messages contain a data field with the key 'type'
Future<void> setupInteractedMessage() async {
// Get any messages which caused the application to open from
// a terminated state.
RemoteMessage? initialMessage =
await FirebaseMessaging.instance.getInitialMessage();
// If the message also contains a data property with a "type" of "chat",
// navigate to a chat screen
if (initialMessage != null) {
_handleMessage(initialMessage);
}
// Also handle any interaction when the app is in the background via a
// Stream listener
FirebaseMessaging.onMessageOpenedApp.listen(_handleMessage);
}
void _handleMessage(RemoteMessage message) {
if (message.data['type'] == 'chat') {
Navigator.pushNamed(context, '/chat',
arguments: ChatArguments(message),
);
}
}
@override
void initState() {
super.initState();
// Run code required to handle interacted messages in an async function
// as initState() must not be async
setupInteractedMessage();
}
@override
Widget build(BuildContext context) {
return Text("...");
}
}
Wie Sie mit der Interaktion umgehen, hängt von der Einrichtung Ihrer Anwendung ab. Das obige Beispiel zeigt eine einfache Illustration mit einem StatefulWidget.
Nachrichten lokalisieren
Sie haben zwei Möglichkeiten, lokalisierte Strings zu senden:
- Speichern Sie die bevorzugte Sprache jedes Nutzers auf Ihrem Server und senden Sie für jede Sprache benutzerdefinierte Benachrichtigungen.
- Lokalisierte Strings in Ihre App einbetten und die nativen Gebietsschemaeinstellungen des Betriebssystems verwenden
So verwenden Sie die zweite Methode:
Android
Geben Sie Ihre Nachrichten in der Standardsprache in
resources/values/strings.xml
an:<string name="notification_title">Hello world</string> <string name="notification_message">This is a message</string>
Geben Sie die übersetzten Nachrichten im Verzeichnis
values-language
an. Geben Sie beispielsweise französische Nachrichten inresources/values-fr/strings.xml
an:<string name="notification_title">Bonjour le monde</string> <string name="notification_message">C'est un message</string>
Verwenden Sie in der Server-Payload anstelle der Schlüssel
title
,message
undbody
die Schlüsseltitle_loc_key
undbody_loc_key
für Ihre lokalisierte Mitteilung und legen Sie sie auf das Attributname
der Mitteilung fest, die Sie anzeigen möchten.Die Nutzlast der Nachricht würde so aussehen:
{ "android": { "notification": { "title_loc_key": "notification_title", "body_loc_key": "notification_message" } } }
iOS
Geben Sie Ihre Nachrichten in der Standardsprache in
Base.lproj/Localizable.strings
an:"NOTIFICATION_TITLE" = "Hello World"; "NOTIFICATION_MESSAGE" = "This is a message";
Geben Sie die übersetzten Nachrichten im Verzeichnis
language.lproj
an. Geben Sie beispielsweise französische Nachrichten infr.lproj/Localizable.strings
an:"NOTIFICATION_TITLE" = "Bonjour le monde"; "NOTIFICATION_MESSAGE" = "C'est un message";
Die Nutzlast der Nachricht würde so aussehen:
{ "apns": { "payload": { "alert": { "title-loc-key": "NOTIFICATION_TITLE", "loc-key": "NOTIFICATION_MESSAGE" } } } }
Export von Daten zur Nachrichtenzustellung aktivieren
Sie können Ihre Nachrichtendaten zur weiteren Analyse in BigQuery exportieren. Mit BigQuery können Sie die Daten mit BigQuery SQL analysieren, sie zu einem anderen Cloud-Anbieter exportieren oder für Ihre benutzerdefinierten ML-Modelle verwenden. Ein Export nach BigQuery umfasst alle verfügbaren Daten für Nachrichten, unabhängig vom Nachrichtentyp oder davon, ob die Nachricht über die API oder den Benachrichtigungs-Composer gesendet wird.
Um den Export zu aktivieren, folgen Sie zuerst der Anleitung hier und dann dieser Anleitung:
Android
Sie können den folgenden Code verwenden:
await FirebaseMessaging.instance.setDeliveryMetricsExportToBigQuery(true);
iOS
Bei iOS müssen Sie AppDelegate.m
durch den folgenden Inhalt ersetzen.
#import "AppDelegate.h"
#import "GeneratedPluginRegistrant.h"
#import <Firebase/Firebase.h>
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[GeneratedPluginRegistrant registerWithRegistry:self];
// Override point for customization after application launch.
return [super application:application didFinishLaunchingWithOptions:launchOptions];
}
- (void)application:(UIApplication *)application
didReceiveRemoteNotification:(NSDictionary *)userInfo
fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
[[FIRMessaging extensionHelper] exportDeliveryMetricsToBigQueryWithMessageInfo:userInfo];
}
@end
Web
Für Web müssen Sie Ihren Service Worker ändern, um die Version 9 des SDK verwenden zu können.
Die Version 9 muss gebündelt werden. Sie benötigen also einen Bundler wie esbuild
, damit der Service Worker funktioniert.
In der Beispiel-App sehen Sie, wie das geht.
Nach der Migration zum v9 SDK können Sie den folgenden Code verwenden:
import {
experimentalSetDeliveryMetricsExportedToBigQueryEnabled,
getMessaging,
} from 'firebase/messaging/sw';
...
const messaging = getMessaging(app);
experimentalSetDeliveryMetricsExportedToBigQueryEnabled(messaging, true);
Vergessen Sie nicht, yarn build
auszuführen, um die neue Version Ihres Service Workers in den Ordner web
zu exportieren.
Bilder in Benachrichtigungen auf iOS-Geräten anzeigen
Damit auf Apple-Geräten eingehende FCM-Benachrichtigungen Bilder aus der FCM-Nutzlast anzeigen können, müssen Sie eine zusätzliche Benachrichtigungsdienst-Erweiterung hinzufügen und Ihre App für die Verwendung dieser Erweiterung konfigurieren.
Wenn Sie die Firebase-Telefonauthentifizierung verwenden, müssen Sie Ihrem Podfile den Firebase Auth-Pod hinzufügen.
Schritt 1: Benachrichtigungsdienst-Erweiterung hinzufügen
- Klicken Sie in Xcode auf File > New > Target… (Datei > Neu > Ziel…).
- In einem Modal wird eine Liste möglicher Ziele angezeigt. Scrollen Sie nach unten oder verwenden Sie den Filter, um Notification Service Extension (Notification Service-Erweiterung) auszuwählen. Klicken Sie auf Weiter.
- Fügen Sie einen Produktnamen hinzu (verwenden Sie „ImageNotification“, um dieser Anleitung zu folgen), wählen Sie entweder
Swift
oderObjective-C
aus und klicken Sie auf Fertigstellen. - Klicken Sie auf Aktivieren, um das Schema zu aktivieren.
Schritt 2: Ziel dem Podfile hinzufügen
Swift
Achten Sie darauf, dass Ihre neue Erweiterung Zugriff auf das FirebaseMessaging
-Swift-Paket hat, indem Sie es Ihrem Runner
-Ziel hinzufügen:
Fügen Sie das Firebase Apple Platforms SDK über den Navigator hinzu: File > Add Package Dependencies... (Datei > Paketabhängigkeiten hinzufügen).
Suchen Sie nach der Paket-URL oder geben Sie sie ein:
https://github.com/firebase/firebase-ios-sdk
Zu Projekt
Runner
hinzufügen: Paket hinzufügenWählen Sie „FirebaseMessaging“ aus und fügen Sie es dem Ziel „ImageNotification“ hinzu: Paket hinzufügen
Objective-C
Achten Sie darauf, dass Ihre neue Erweiterung Zugriff auf den Firebase/Messaging
-Pod hat. Fügen Sie ihn dazu in die Podfile-Datei ein:
Öffnen Sie das Podfile über den Navigator: Pods > Podfile
Scrollen Sie zum Ende der Datei und fügen Sie Folgendes hinzu:
target 'ImageNotification' do use_frameworks! pod 'Firebase/Auth' # Add this line if you are using FirebaseAuth phone authentication pod 'Firebase/Messaging' end
Installieren oder aktualisieren Sie Ihre Pods mit
pod install
aus dem Verzeichnisios
odermacos
.
Schritt 3: Erweiterungshilfe verwenden
An diesem Punkt sollte alles noch normal laufen. Im letzten Schritt wird das Erweiterungshilfsprogramm aufgerufen.
Swift
Wählen Sie im Navigator Ihre ImageNotification-Erweiterung aus.
Öffnen Sie die Datei
NotificationService.swift
.Ersetzen Sie den Inhalt von
NotificationService.swift
durch:import UserNotifications import FirebaseMessaging class NotificationService: UNNotificationServiceExtension { var contentHandler: ((UNNotificationContent) -> Void)? var bestAttemptContent: UNMutableNotificationContent? override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) { self.contentHandler = contentHandler bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent) Messaging.serviceExtension().populateNotificationContent(bestAttemptContent!, withContentHandler: contentHandler) } override func serviceExtensionTimeWillExpire() { if let contentHandler = contentHandler, let bestAttemptContent = bestAttemptContent { contentHandler(bestAttemptContent) } } }
Objective-C
Wählen Sie im Navigator Ihre ImageNotification-Erweiterung aus.
Öffnen Sie die Datei
NotificationService.m
.Importieren Sie
FirebaseMessaging.h
oben in der Datei direkt nachNotificationService.h
, wie unten dargestellt.Ersetzen Sie den Inhalt von
NotificationService.m
durch:#import "NotificationService.h" #import "FirebaseMessaging.h" #import <FirebaseAuth/FirebaseAuth-Swift.h> // Add this line if you are using FirebaseAuth phone authentication #import <UIKit/UIKit.h> // Add this line if you are using FirebaseAuth phone authentication @interface NotificationService () <NSURLSessionDelegate> @property(nonatomic) void (^contentHandler)(UNNotificationContent *contentToDeliver); @property(nonatomic) UNMutableNotificationContent *bestAttemptContent; @end @implementation NotificationService /* Uncomment this if you are using Firebase Auth - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options { if ([[FIRAuth auth] canHandleURL:url]) { return YES; } return NO; } - (void)scene:(UIScene *)scene openURLContexts:(NSSet<UIOpenURLContext *> *)URLContexts { for (UIOpenURLContext *urlContext in URLContexts) { [FIRAuth.auth canHandleURL:urlContext.URL]; } } */ - (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler { self.contentHandler = contentHandler; self.bestAttemptContent = [request.content mutableCopy]; // Modify the notification content here... [[FIRMessaging extensionHelper] populateNotificationContent:self.bestAttemptContent withContentHandler:contentHandler]; } - (void)serviceExtensionTimeWillExpire { // Called just before the extension will be terminated by the system. // Use this as an opportunity to deliver your "best attempt" at modified content, otherwise the original push payload will be used. self.contentHandler(self.bestAttemptContent); } @end
Schritt 4: Bild zur Nutzlast hinzufügen
Sie können jetzt ein Bild in die Nutzlast Ihrer Benachrichtigung einfügen. In der iOS-Dokumentation finden Sie Informationen zum Erstellen einer Sendeanfrage. Die maximale Bildgröße von 300 KB wird vom Gerät erzwungen.