Flutter iOS推送集成插件appmetrica_push_ios的使用
Flutter iOS 推送集成插件 appmetrica_push_ios 的使用
概述
AppMetrica Push SDK 是一套用于处理推送通知的库。启用 AppMetrica Push SDK 后,您可以创建和配置推送通知活动,并在 AppMetrica 网页界面中监控统计数据。
SDK 特性
- 接收并显示推送通知
- 接收静默推送通知
- 处理通知的有效负载
- 在通知中显示图像
- 支持打开通知时的深层链接操作
- 支持在打开通知时的 URL 操作
安装
在项目的 pubspec.yaml
文件中添加以下依赖项:
dependencies:
firebase_core: <latest_version>
firebase_analytics: <latest_version>
appmetrica_plugin: <latest_version>
appmetrica_push_ios: <latest_version>
开始前需要准备的事项
- 在 AppMetrica 中创建一个项目。
- 在 Firebase 中创建一个项目,并添加 iOS 应用程序,下载配置文件
GoogleService-Info.plist
。 - 在 AppMetrica 项目设置中获取
API key(用于 SDK)
。 - 配置 AppMetrica 以与 APNs 协同工作。
可选:启用推送令牌更新
APNS 服务可能会撤销设备的推送令牌,例如如果用户长时间未启动应用程序。AppMetrica 将推送令牌存储在服务器上,并且无法向具有过期令牌的设备发送推送通知。要自动收集当前推送令牌,请进入 AppMetrica 界面中的应用设置,并在推送通知选项卡中启用“通过静默推送通知更新令牌”。
连接 AppMetrica Push SDK
在 <project>/ios/Runner/
目录下通过 XCode 放置 GoogleService-Info.plist
文件。
创建通知服务扩展
- 在 Xcode 中选择
File → New → Target
。 - 在 iOS 扩展部分,从列表中选择
Notification Service Extension
并点击Next
。 - 在
Product Name
字段中输入扩展名并点击Finish
。
创建共享应用组
- 在 Xcode 项目设置中,转到
Capabilities
选项卡。 - 为创建的扩展和应用切换
App Groups
选项。要在这两者之间切换,请转到项目设置面板并点击或使用下拉元素。 - 在
App Groups
部分使用+
按钮创建一个组。在后续配置中需要此组名称。 - 选择你为应用和扩展创建的组。
在创建的 Notification Service Extension
中更改代码如下:
import UserNotifications
import YandexMobileMetricaPush
class YourNotificationServiceName: UNNotificationServiceExtension {
private var contentHandler: ((UNNotificationContent) -> Void)?
private var bestAttemptContent: UNMutableNotificationContent?
private let syncQueue = DispatchQueue(label: "YourNotificationServiceName.syncQueue")
override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
self.contentHandler = contentHandler
bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)
if bestAttemptContent != nil {
// 修改通知内容...
YMPYandexMetricaPush.setExtensionAppGroup("<your.app.group.name>")
YMPYandexMetricaPush.handleDidReceive(request)
}
YMPYandexMetricaPush.downloadAttachments(for: request) { [weak self] attachments, error in
if let error = error {
print("Error: \(error)")
}
self?.completeWithBestAttempt(attachments: attachments)
}
}
override func serviceExtensionTimeWillExpire() {
completeWithBestAttempt(attachments: nil)
}
func completeWithBestAttempt(attachments: [UNNotificationAttachment]?) {
syncQueue.sync { [weak self] in
if let contentHandler = contentHandler, let bestAttemptContent = bestAttemptContent {
if let attachments = attachments {
bestAttemptContent.attachments = attachments
}
contentHandler(bestAttemptContent)
self?.bestAttemptContent = nil
self?.contentHandler = nil
}
}
}
}
在 <project>/ios/Runner/AppDelegate.swift
中,在 application:didFinishLaunchingWithOptions
方法中,在 GeneratedPluginRegistrant.register
和 return super.application
之间添加以下行:
...
YMPYandexMetricaPush.setExtensionAppGroup("<your.app.group.name>")
...
在 <project>/ios/Podfile
文件中,进行如下修改和添加:
platform :ios, '10.0'
...
target '<YourNotificationServiceName>' do
use_frameworks!
pod 'YandexMobileMetricaPush'
end
post_install do |installer|
installer.pods_project.targets.each do |target|
# 如果出现 `Multiple commands produce .../XCFrameworkIntermediates/YandexMobileMetrica` 问题
if target.name == 'YandexMobileMetrica-Static_Core'
target.remove_from_project
end
flutter_additional_ios_build_settings(target)
end
end
初始化 AppMetrica Push SDK
await Firebase.initializeApp();
await FirebaseAnalytics.instance.setAnalyticsCollectionEnabled(true);
// AppMetrica.activate 必须在 AppmetricaPush.activate 之前调用
await AppMetrica.activate(AppMetricaConfig('<AppMetrica API key>'));
await AppmetricaPushIos.instance.activate();
await AppmetricaPushIos.instance.requestPermission(PermissionOptions(
alert: true,
badge: true,
sound: true,
));
使用 AppMetrica Push SDK
// 获取 PUSH 服务令牌
await AppmetricaPushIos.instance.getTokens();
// 流式推送服务令牌。当设备上的令牌发生变化时触发
// 注意这是一个流广播
AppmetricaPushIos.instance.tokenStream.listen((Map<String, String?> data) => print('token: $data'));
// 流式静默推送,数据作为有效载荷传递
// 注意这是一个流广播
AppmetricaPushIos.instance.onMessage
.listen((String data) => print('onMessage: $data'));
// 流式推送,数据作为有效载荷传递
// 注意这是一个流广播
AppmetricaPushIos.instance.onMessageOpenedApp
.listen((String data) => print('onMessageOpenedApp: $data'));
更多关于Flutter iOS推送集成插件appmetrica_push_ios的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter iOS推送集成插件appmetrica_push_ios的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在Flutter项目中集成appmetrica_push_ios
插件以实现iOS推送功能,可以按照以下步骤进行。以下是一个简要的代码示例,帮助你理解如何配置和使用该插件。
1. 添加依赖
首先,在你的pubspec.yaml
文件中添加appmetrica_push_ios
依赖:
dependencies:
flutter:
sdk: flutter
appmetrica_push_ios: ^最新版本号 # 请替换为实际的最新版本号
然后运行flutter pub get
来安装依赖。
2. 配置iOS项目
2.1. 在ios/Runner/Info.plist
中添加必要的配置
确保你的Info.plist
文件中包含以下配置,以支持推送通知:
<key>UIApplicationSupportsMultipleWindows</key>
<true/>
<key>UIBackgroundModes</key>
<array>
<string>remote-notification</string>
</array>
<key>USER_NOTIFICATIONS_BUNDLE_ID</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
2.2. 注册推送通知权限
在ios/Runner/AppDelegate.swift
文件中,添加以下代码以请求推送通知权限:
import UIKit
import Flutter
import UserNotifications
@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
GeneratedPluginRegistrant.register(with: self)
// 请求推送通知权限
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { (granted, error) in
if let error = error {
print("推送通知权限请求失败: \(error.localizedDescription)")
} else if granted {
DispatchQueue.main.async {
application.registerForRemoteNotifications()
}
}
}
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
override func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
let flutterEngine = (UIApplication.shared.delegate as! AppDelegate).flutterEngine
let channel = FlutterMethodChannel(name: "appmetrica_push_ios/channel", binaryMessenger: flutterEngine.binaryMessenger)
channel.invokeMethod("registerDeviceToken", deviceToken.hexString)
}
override func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
let flutterEngine = (UIApplication.shared.delegate as! AppDelegate).flutterEngine
let channel = FlutterMethodChannel(name: "appmetrica_push_ios/channel", binaryMessenger: flutterEngine.binaryMessenger)
channel.invokeMethod("didReceiveRemoteNotification", userInfo)
completionHandler(.newData)
}
}
// Data扩展,用于将deviceToken转换为十六进制字符串
extension Data {
var hexString: String {
return map { String(format: "%02x", $0) }.joined()
}
}
3. 在Flutter代码中使用插件
在你的Flutter代码中,你可以通过以下方式使用appmetrica_push_ios
插件:
import 'package:flutter/material.dart';
import 'package:appmetrica_push_ios/appmetrica_push_ios.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
String _deviceToken = '';
@override
void initState() {
super.initState();
_initPushNotifications();
}
Future<void> _initPushNotifications() async {
AppmetricaPushIos.registerDeviceTokenCallback((String token) {
setState(() {
_deviceToken = token;
});
print('Device Token: $_deviceToken');
});
AppmetricaPushIos.receiveNotificationCallback((Map<String, dynamic> message) {
print('Received notification: $message');
});
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Appmetrica Push iOS Example'),
),
body: Center(
child: Text('Device Token: $_deviceToken'),
),
),
);
}
}
注意事项
- 确保你已经在Apple Developer控制台中配置了推送通知证书,并将其导入到你的Xcode项目中。
appmetrica_push_ios
插件可能依赖于Yandex AppMetrica SDK,因此请确保你也按照Yandex AppMetrica的文档进行了必要的配置。- 测试推送通知时,请确保你的设备已经正确配置了开发者账号,并且你的应用是通过Xcode直接运行到设备上的(而非通过模拟器)。
这个示例展示了如何在Flutter应用中集成appmetrica_push_ios
插件以支持iOS推送通知。根据你的具体需求,你可能需要进一步调整代码和配置。