Flutter iOS推送集成插件appmetrica_push_ios的使用

发布于 1周前 作者 sinazl 来自 Flutter

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>

开始前需要准备的事项

  1. AppMetrica 中创建一个项目。
  2. Firebase 中创建一个项目,并添加 iOS 应用程序,下载配置文件 GoogleService-Info.plist
  3. 在 AppMetrica 项目设置中获取 API key(用于 SDK)
  4. 配置 AppMetrica 以与 APNs 协同工作。

可选:启用推送令牌更新

APNS 服务可能会撤销设备的推送令牌,例如如果用户长时间未启动应用程序。AppMetrica 将推送令牌存储在服务器上,并且无法向具有过期令牌的设备发送推送通知。要自动收集当前推送令牌,请进入 AppMetrica 界面中的应用设置,并在推送通知选项卡中启用“通过静默推送通知更新令牌”。

连接 AppMetrica Push SDK

<project>/ios/Runner/ 目录下通过 XCode 放置 GoogleService-Info.plist 文件。

创建通知服务扩展

  1. 在 Xcode 中选择 File → New → Target
  2. 在 iOS 扩展部分,从列表中选择 Notification Service Extension 并点击 Next
  3. Product Name 字段中输入扩展名并点击 Finish

创建共享应用组

  1. 在 Xcode 项目设置中,转到 Capabilities 选项卡。
  2. 为创建的扩展和应用切换 App Groups 选项。要在这两者之间切换,请转到项目设置面板并点击或使用下拉元素。
  3. App Groups 部分使用 + 按钮创建一个组。在后续配置中需要此组名称。
  4. 选择你为应用和扩展创建的组。

在创建的 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.registerreturn 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

1 回复

更多关于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'),
        ),
      ),
    );
  }
}

注意事项

  1. 确保你已经在Apple Developer控制台中配置了推送通知证书,并将其导入到你的Xcode项目中。
  2. appmetrica_push_ios插件可能依赖于Yandex AppMetrica SDK,因此请确保你也按照Yandex AppMetrica的文档进行了必要的配置。
  3. 测试推送通知时,请确保你的设备已经正确配置了开发者账号,并且你的应用是通过Xcode直接运行到设备上的(而非通过模拟器)。

这个示例展示了如何在Flutter应用中集成appmetrica_push_ios插件以支持iOS推送通知。根据你的具体需求,你可能需要进一步调整代码和配置。

回到顶部