flutter_pushed_messaging 1.6.5
flutter_pushed_messaging: ^1.6.5 copied to clipboard
A Flutter plugin for use Multipushed messaging system.
🚀 Плагин Pushed Messaging для Flutter #
🚀 Начало работы #
📦 Установка #
Добавьте в ваш pubspec.yaml
:
dependencies:
flutter_pushed_messaging: ^1.6.5
Затем выполните:
flutter pub get
📥 Импорт #
import 'package:flutter_pushed_messaging/flutter_pushed_messaging.dart';
📚 Содержание #
- 🚀 Начало работы
- 📱 Настройка iOS
- 🤖 Настройка Android
- 💡 Реализация
- 🐛 Решение проблем
- ❓ Часто задаваемые вопросы
🚀 Начало работы #
📦 Установка #
Добавьте в ваш pubspec.yaml
:
dependencies:
flutter_pushed_messaging: ^1.6.5
Затем выполните:
flutter pub get
📥 Импорт #
import 'package:flutter_pushed_messaging/flutter_pushed_messaging.dart';
📱 Настройка iOS #
📦 Базовая настройка iOS #
⚠️ Предварительные условия: Убедитесь, что ваше iOS приложение правильно настроено для push-уведомлений
🔧 Необходимые возможности
- Откройте ваш iOS проект в Xcode
- Добавьте возможность Push Notifications:
- Выберите ваш target → Signing & Capabilities
- Нажмите + Capability → Push Notifications
- Добавьте возможность Background Modes:
- Нажмите + Capability → Background Modes
- Включите Remote notifications
📝 Настройка AppDelegate
Добавьте это в ваш AppDelegate.swift
(или AppDelegate.m
) в метод didFinishLaunchingWithOptions
:
if #available(iOS 10.0, *) {
UNUserNotificationCenter.current().delegate = self as? UNUserNotificationCenterDelegate
}
🎯 Следующий шаг: Настройка iOS Extension 👇 #
🔧 Настройка Notification Service Extension #
🚀 Зачем это нужно? Notification Service Extension обеспечивает расширенные возможности push-уведомлений, такие как богатый контент, отслеживание доставки и фоновая обработка.
📱 Создание Extension #
Шаг 1: Создание Extension Target
- 🎯 В Xcode:
File
→New
→Target
→Notification Service Extension
- 📝 Product Name:
extension
(или ваше предпочитаемое имя) - ✅ Нажмите:
Activate
- 🔄 Язык: Swift (рекомендуется)
Шаг 2: Настройка Build Phases
⚠️ Критический шаг: Это обеспечивает правильный порядок сборки
- 🎯 Выберите ваш основной target (Runner)
- 📂 Перейдите: на вкладку
Build Phases
- 🔄 Перетащите:
Embed Foundation Extensions
НАДRun Script
Шаг 3: Конфигурация сборки
# Выполните это в корне вашего проекта
flutter build ios --config-only
🛠️ Настройка Podfile #
Редактируйте ios/Podfile
Найдите эту строку:
flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
Добавьте сразу после:
target 'extension' do # ← Замените 'extension' на фактическое имя вашего extension
inherit! :search_paths
end
Обновите зависимости
cd ios
pod update
📝 Реализация NotificationService.swift #
Замените содержимое вашего NotificationService.swift
на:
import UserNotifications
import flutter_pushed_messaging
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)
// 🚀 Эта магическая строка обеспечивает расширенные возможности
FlutterPushedMessagingPlugin.confirmExtension(userInfo: request.content.userInfo)
if let bestAttemptContent = bestAttemptContent {
contentHandler(bestAttemptContent)
}
}
override func serviceExtensionTimeWillExpire() {
// Вызывается непосредственно перед завершением extension системой.
if let contentHandler = contentHandler, let bestAttemptContent = bestAttemptContent {
contentHandler(bestAttemptContent)
}
}
}
🔐 Настройка Keychain Sharing #
⚠️ КРИТИЧЕСКИ ВАЖНО: Без этой настройки Extension не будет работать!
🎯 Настройка основного приложения #
- 📱 Выберите ваш основной app target (Runner)
- 🔧 Перейдите в:
Signing & Capabilities
- ➕ Добавьте:
Keychain Sharing
capability - 🔑 Добавьте keychain group:
$(AppIdentifierPrefix)com.yourcompany.yourapp.shared
🔧 Настройка Extension #
- 🎯 Выберите ваш extension target
- 🔧 Перейдите в:
Signing & Capabilities
- ➕ Добавьте:
Keychain Sharing
capability - 🔑 Добавьте ТУ ЖЕ keychain group:
$(AppIdentifierPrefix)com.yourcompany.yourapp.shared
💡 Совет профи: Замените
com.yourcompany.yourapp
на ваш фактический bundle identifier
🤖 Настройка Android #
🔥 Настройка Firebase (FCM) #
📱 Для приложений Google Play Store и большинства Android устройств
Шаг 1: Зависимости в корневом build.gradle
Добавьте в android/build.gradle
:
buildscript {
dependencies {
classpath 'com.google.gms:google-services:4.3.15'
classpath 'com.google.firebase:firebase-crashlytics-gradle:2.8.1'
// ... другие зависимости
}
}
Шаг 2: Добавьте файл конфигурации
- 📥 Скачайте
google-services.json
из Firebase Console - 📂 Поместите в: папку
android/app/
Шаг 3: Конфигурация на уровне приложения
Добавьте в android/app/build.gradle
:
apply plugin: 'com.google.gms.google-services'
apply plugin: 'com.google.firebase.crashlytics'
📱 Настройка Huawei (HMS) #
📱 Для устройств Huawei и AppGallery
Шаг 1: Конфигурация корневого build.gradle
Добавьте в android/build.gradle
:
buildscript {
repositories {
maven { url 'https://developer.huawei.com/repo/' }
// ... другие репозитории
}
dependencies {
classpath 'com.huawei.agconnect:agcp:1.5.2.300'
// ... другие зависимости
}
}
allprojects {
repositories {
maven { url 'https://developer.huawei.com/repo/' }
// ... другие репозитории
}
}
Шаг 2: Добавьте файл конфигурации
- 📥 Скачайте
agconnect-services.json
из Huawei Developer Console - 📂 Поместите в: папку
android/app/
Шаг 3: Конфигурация на уровне приложения
Добавьте в android/app/build.gradle
:
dependencies {
implementation 'com.huawei.agconnect:agconnect-core:1.5.2.300'
// ... другие зависимости
}
apply plugin: 'com.huawei.agconnect'
🏪 Настройка RuStore #
🇷🇺 Для RuStore (российский магазин приложений)
Добавьте в android/app/src/main/AndroidManifest.xml
:
<application>
<!-- ... другие настройки ... -->
<meta-data
android:name="ru.rustore.sdk.pushclient.project_id"
android:value="Ваш RuStore project ID" />
</application>
💡 Реализация #
🚀 Обработчик фоновых сообщений #
import 'package:flutter_pushed_messaging/flutter_pushed_messaging.dart';
// 🔄 Этот обработчик работает даже когда ваше приложение закрыто
@pragma('vm:entry-point')
Future<void> backgroundMessage(Map<dynamic, dynamic> message) async {
print("📱 Получено фоновое сообщение: $message");
// 💡 Добавьте вашу логику здесь
// - Сохранение в локальную базу данных
// - Показ кастомного уведомления
// - Обновление значка приложения
}
🎯 Настройка основного приложения #
void main() async {
WidgetsFlutterBinding.ensureInitialized();
// 🚀 Инициализация плагина
await FlutterPushedMessaging.init(
backgroundMessage,
notificationChannel: "messages", // 🤖 Только для Android
askPermissions: true, // 📱 Автозапрос разрешений
loggerEnabled: false, // 🐛 Включите для отладки
applicationId: "YOUR_APP_ID", // 🔑 Кастомный идентификатор (опционально)
);
// 🔑 Получение уникального токена клиента
print("🔑 Токен клиента: ${FlutterPushedMessaging.token}");
runApp(const MyApp());
}
📱 Прослушивание сообщений #
class _MyAppState extends State<MyApp> {
@override
void initState() {
super.initState();
_setupMessageListeners();
}
void _setupMessageListeners() {
// 📥 Сообщения на переднем плане
FlutterPushedMessaging.onMessage().listen((message) {
print("📱 Сообщение на переднем плане: $message");
// 💡 Обработка сообщения
_showInAppNotification(message);
});
// 📊 Статус соединения
FlutterPushedMessaging.onStatus().listen((status) {
print("📡 Статус: $status");
switch (status) {
case ServiceStatus.active:
print("✅ Подключен и готов!");
break;
case ServiceStatus.disconnected:
print("🔄 Переподключение...");
break;
case ServiceStatus.notActive:
print("❌ Сервис неактивен");
break;
}
});
}
}
🔐 Ручной запрос разрешений #
// 📱 Запрос разрешений вручную при необходимости
await FlutterPushedMessaging.askPermissions(
askNotificationPermission: true, // 📱 Показ уведомлений
askBackgroundPermission: true, // 🤖 Фоновая работа Android
);
🐛 Решение проблем #
📱 Проблемы iOS #
🔴 Extension не работает
Проверьте эти распространенные проблемы:
- ✅ Keychain Sharing - Оба target должны иметь одинаковую keychain group
- ✅ Build Phases - Extension должен быть встроен перед Run Script
- ✅ Podfile - Extension target должен быть правильно настроен
- ✅ Подписание - Extension должен быть правильно подписан
Шаги отладки:
# Очистка и пересборка
flutter clean
cd ios && pod install
flutter build ios --config-only
🔴 Push-уведомления не появляются
Проверьте:
- ✅ Capabilities - Push Notifications + Background Modes включены
- ✅ APNs Сертификат - Действителен и не истек
- ✅ Device Token - Приложение успешно зарегистрировано для push
- ✅ Payload - Формат сообщения правильный
Тестирование:
# Проверка регистрации устройства
print("Токен: ${FlutterPushedMessaging.token}");
🤖 Проблемы Android #
🔴 FCM не работает
Проверьте:
- ✅ google-services.json - Файл существует в
android/app/
- ✅ Плагины - Оба плагина применены в app/build.gradle
- ✅ Зависимости - Правильные версии в build.gradle
- ✅ Имя пакета - Совпадает с Firebase проектом
Отладка:
# Проверка Firebase регистрации
flutter run --verbose
# Ищите логи "Firebase"
🔴 Фоновые сообщения не работают
Проверьте:
- ✅ Оптимизация батареи - Приложение не ограничено
- ✅ Автозапуск - Приложению разрешен автоматический запуск
- ✅ Фоновый обработчик - Правильно зарегистрирован
- ✅ Разрешения - Разрешение фоновой работы предоставлено
Тестирование:
// Добавьте логирование в фоновый обработчик
@pragma('vm:entry-point')
Future<void> backgroundMessage(Map<dynamic, dynamic> message) async {
print("ФОНОВОЕ: $message"); // Это должно появиться в логах
}
🛠️ Общие проблемы #
🔴 Плагин не инициализируется
Распространенные причины:
- ❌ Отсутствует await - Убедитесь, что используете await для init()
- ❌ Неправильное время - Инициализируйте после WidgetsFlutterBinding
- ❌ Зависимости - Убедитесь, что все зависимости установлены
Правильная инициализация:
void main() async {
WidgetsFlutterBinding.ensureInitialized(); // ← Важно!
await FlutterPushedMessaging.init(
backgroundMessage,
notificationChannel: "messages", // 🤖 Только для Android
askPermissions: true, // 📱 Автозапрос разрешений
loggerEnabled: false, // 🐛 Включите для отладки
applicationId: "YOUR_APP_ID", // 🔑 Кастомный идентификатор (опционально)
); // ← Await!
runApp(MyApp());
}
❓ Часто задаваемые вопросы #
📱 Могу ли я настроить внешний вид уведомлений?
Да! На Android вы можете настроить канал уведомлений. На iOS настройте payload в вашем NotificationService extension.
🔄 Как обрабатывать обновления приложения?
Токен остается действительным после обновлений приложения. Однако всегда тестируйте push-уведомления после крупных обновлений для обеспечения совместимости.
🌍 Работает ли это с несколькими языками?
Да! Плагин поддерживает интернационализацию. Настройте содержимое уведомлений на основе локали пользователя.
📊 Могу ли я отслеживать доставку сообщений?
Да! Используйте Extension на iOS и уведомления о доставке FCM на Android для отслеживания статуса доставки сообщений.
🎉 Всё готово! #
Ваше приложение теперь готово для получения push-уведомления 🚀
Сделано с ❤️ командой Multipushed