Flutter集成Netmera服务插件netmera_flutter_sdk的使用

Flutter集成Netmera服务插件netmera_flutter_sdk的使用

NETMERA是一个移动应用参与平台。我们提供一系列开发工具和应用程序通信功能,以帮助您的移动业务蓬勃发展。

安装

使用此软件包作为库
  1. 将以下内容添加到您的包的 pubspec.yaml 文件中:
dependencies:
  netmera_flutter_sdk: ^x.x.x
  1. 您可以通过命令行从Flutter安装包:
$ flutter pub get

对于Android和iOS两个原生部分,您无需包含额外的Netmera SDK库。

设置 - Android部分

  1. Firebase控制台中创建并注册您的应用。

  2. 下载 google-services.json 文件并将其放置在 android/app/ 文件夹中。

  3. 在您的项目的 build.gradle 文件中,添加以下依赖项:

buildscript {
    repositories {
        google()
        mavenCentral()
        maven {url 'https://developer.huawei.com/repo/'}
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:4.1.3'
        classpath 'com.google.gms:google-services:4.3.10'
        classpath 'com.huawei.agconnect:agcp:1.6.3.300'
    }
}

allprojects {
    repositories {
        google()
        mavenCentral()
        maven {url 'https://maven.google.com'}
        maven {url 'https://developer.huawei.com/repo/'}
    }
}
  1. 在您的应用的 build.gradle 文件中,添加以下依赖项:
dependencies {
    implementation 'androidx.core:core:1.1.0'
}
  1. 在您的应用的 build.gradle 文件顶部添加以下内容:
apply plugin: 'com.google.gms.google-services'
apply plugin: 'com.huawei.agconnect'
  1. 创建一个应用类如下所示:
public class NMApp extends FlutterApplication {
    @Override
    public void onCreate() {
        super.onCreate();
        FNetmeraConfiguration fNetmeraConfiguration = new FNetmeraConfiguration.Builder()
            .firebaseSenderId("<YOUR GCM SENDER ID>")
            .huaweiSenderId("<YOUR HMS SENDER ID>")
            .apiKey("<YOUR NETMERA API KEY>")
            .logging(true) // 这是为了启用Netmera日志。
            .build(this);
        FNetmera.initNetmera(fNetmeraConfiguration); 
    }
}

设置 - iOS部分

  1. 导航到iOS文件夹并在终端中运行以下命令:
$ pod install
  1. 从Firebase下载 GoogleService-Info.plist 文件并将其放置在 ios/ 文件夹中。

  2. 为您的项目启用推送通知:

  3. 如果您正在使用Swift,请在您的 Runner-Bridging-Header.h 中输入以下内容:

#import "FNetmera.h"
#import "FNetmeraService.h"
#import "NetmeraFlutterSdkPlugin.h"
  1. 如果您希望从iOS向Dart发送类似Android的消息,请考虑将您的 AppDelegate 类设置为如下形式:
import UIKit
import Flutter

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate, UNUserNotificationCenterDelegate, NetmeraPushDelegate {

    override func application(_ application: UIApplication,
                              didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        GeneratedPluginRegistrant.register(with: self)

        if #available(iOS 10.0, *) {
            UNUserNotificationCenter.current().delegate = self
        } else {
            // Fallback on earlier versions
        };

        // 当应用被杀死并且用户点击推送时触发 onPushReceive
        let notification = launchOptions?[.remoteNotification]
        if notification != nil {
            FNetmeraService.handleWork(ON_PUSH_RECEIVE, dict:["userInfo" : notification])
        }

        FNetmera.logging(true) // 启用Netmera日志
        FNetmera.initNetmera("<YOUR-NETMERA-KEY>") // 初始化Netmera包
        FNetmera.setPushDelegate(self)
        Netmera.setAppGroupName("group.com.netmera.flutter") // 您的应用组名称

        return super.application(application, didFinishLaunchingWithOptions: launchOptions)
    }

    override func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        FNetmeraService.handleWork(ON_PUSH_REGISTER, dict: ["pushToken": deviceToken])
    }

    @available(iOS 10.0, *)
    func userNotificationCenter(_ center: UNUserNotificationCenter,
                                didReceive response: UNNotificationResponse,
                                withCompletionHandler completionHandler:
        @escaping () -> Void) {

        if response.actionIdentifier == UNNotificationDismissActionIdentifier {
            FNetmeraService.handleWork(ON_PUSH_DISMISS, dict:["userInfo" : response.notification.request.content.userInfo])
        }
        else if response.actionIdentifier == UNNotificationDefaultActionIdentifier {
            FNetmeraService.handleWork(ON_PUSH_OPEN, dict:["userInfo" : response.notification.request.content.userInfo])
        }
        completionHandler()
    }

    @available(iOS 10.0, *)
    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        completionHandler([UNNotificationPresentationOptions.alert])
        if UIApplication.shared.applicationState == .active {
            FNetmeraService.handleWork(ON_PUSH_RECEIVE, dict:["userInfo" : notification.request.content.userInfo])
        } else {
            FNetmeraService.handleWork(ON_PUSH_RECEIVE_BACKGROUND, dict:["userInfo" : notification.request.content.userInfo])
        }
    }
}

例如,如果您从 AppDelegate 触发 FNetmeraService.handleWork(ON_PUSH_RECEIVE, dict:["userInfo" : userInfo]),在Dart部分将触发以下方法:

void _onPushReceive(Map<dynamic, dynamic> bundle) async {
  print("onPushReceive: $bundle");
}
  1. 若要使用iOS10媒体推送,请遵循Netmera产品中心中的说明。不同之处在于,您应该在 Podfile 的顶部添加Netmera的pod:
// For receiving Media Push, you must add Netmera pods to top of your Podfile.
pod "Netmera", "3.23.6"
pod "Netmera/NotificationServiceExtension", "3.23.6"
pod "Netmera/NotificationContentExtension", "3.23.6"

设置 - Dart部分

  1. 您可以在Dart端设置自己的推送回调。这些方法是可选的。
void initBroadcastReceiver() {
  void _onPushRegister(Map<dynamic, dynamic> bundle) async {
    print("onPushRegister: $bundle");
  }

  void _onPushReceive(Map<dynamic, dynamic> bundle) async {
    print("onPushReceive: $bundle");
  }

  void _onPushDismiss(Map<dynamic, dynamic> bundle) async {
    print("onPushDismiss: $bundle");
  }

  void _onPushOpen(Map<dynamic, dynamic> bundle) async {
    print("onPushOpen: $bundle");
  }

  void _onPushButtonClicked(Map<dynamic, dynamic> bundle) async {
    print("onPushButtonClicked: $bundle");
  }

  void _onCarouselObjectSelected(Map<dynamic, dynamic> bundle) async {
    print("onCarouselObjectSelected: $bundle");
  }

  NetmeraPushBroadcastReceiver().initialize(
    onPushRegister: _onPushRegister,
    onPushReceive: _onPushReceive,
    onPushDismiss: _onPushDismiss,
    onPushOpen: _onPushOpen,
    onPushButtonClicked: _onPushButtonClicked,
    onCarouselObjectSelected: _onCarouselObjectSelected,
  );
}
  1. 您需要一个后台处理程序来能够在应用处于后台或终止状态时监听推送通知。您可以按如下方式添加此处理程序。接收到推送时,将启动一个隔离(仅限Android,iOS不需要单独的隔离)允许您在应用未运行时处理消息。

注意:由于处理器在其自己的隔离中运行,而不是在您的应用程序上下文中,因此无法更新应用程序状态或执行任何影响UI的逻辑。但是,您可以执行诸如HTTP请求、执行I/O操作等逻辑。

// 此方法必须是一个顶级函数
@pragma('vm:entry-point')
void _onPushReceiveBackgroundHandler(Map<dynamic, dynamic> bundle) async {
  print("onPushReceiveBackground: $bundle");
}

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  // 此方法必须在runApp之前调用,并且提供的处理器必须是一个顶级函数。
  NetmeraPushBroadcastReceiver.onPushReceiveBackground(_onPushReceiveBackgroundHandler);
  runApp(MyApp());
}
  1. 如果您有自定义Firebase消息传递集成,请参见以下用法:
FirebaseMessaging messaging = FirebaseMessaging.instance;

messaging.getToken(vapidKey: "<YOUR_KEY>").then((value) {
  Netmera.onNetmeraNewToken(value);
});

FirebaseMessaging.onMessage.listen((RemoteMessage message) {
     if (Netmera.isNetmeraRemoteMessage(message.data)) {
         Netmera.onNetmeraFirebasePushMessageReceived(message.from, message.data);
     }
});   

Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
  await Firebase.initializeApp();

  if (Netmera.isNetmeraRemoteMessage(message.data)) {
      Netmera.onNetmeraFirebasePushMessageReceived(message.from, message.data);
  }
}

注意:如果您使用 flutter run --release 构建项目,请将 @pragma('vm:entry-point') 注解添加到 _firebaseMessagingBackgroundHandler 方法中,如以下代码块所示:

@pragma('vm:entry-point')
Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage remoteMessage) async {
  // 处理消息
}
  1. 如果您有自定义华为消息传递集成,请参见以下用法:
Push.getTokenStream.listen((String token) {
  Netmera.onNetmeraNewToken(token);
});

Push.onMessageReceivedStream.listen((RemoteMessage remoteMessage) {
  Map<String, String> map = remoteMessage.dataOfMap ?? new Map();
  if (Netmera.isNetmeraRemoteMessage(map)) {
    Netmera.onNetmeraHuaweiPushMessageReceived(remoteMessage.from, map);
  }
});
  1. 若要使用小部件URL回调,请在 AppDelegate 类中添加以下方法:
// Required code block to handle widget URL's in Flutter
func shouldHandleOpen(_ url: URL!, for object: NetmeraPushObject!) -> Bool {
   return false
}

func handleOpen(_ url: URL!, for object: NetmeraPushObject!) {
   FNetmera.handleOpen(url, for: object)
}

调用Dart方法

更新用户示例
updateUser() {
    NetmeraUser user = new NetmeraUser();
    user.setUserId(userController.text);
    user.setName(nameController.text);
    user.setSurname(surnameController.text);
    user.setEmail(emailController.text);
    user.setMsisdn(msisdnController.text);
    user.setGender(int.parse(_selectedGender));
    
    // 用户更新异步
    Netmera.updateUser(user);
    
    // 用户更新同步
    Netmera.updateUser(user).then((value) {
      print('User updated');
    }).catchError((error) {
      print('User update failed: $error');
    });
  }
发送事件示例

您可以按以下方式发送事件。更多示例,请参阅示例项目

  void sendLoginEvent() {
    NetmeraEventLogin loginEvent = new NetmeraEventLogin();
    Netmera.sendEvent(loginEvent);
  }

  void sendRegisterEvent() {
    NetmeraEventRegister registerEvent = new NetmeraEventRegister();
    Netmera.sendEvent(registerEvent);
  }

  void sendViewCartEvent() {
    NetmeraEventCartView cartViewEvent = new NetmeraEventCartView();
    cartViewEvent.setItemCount(3);
    cartViewEvent.setSubTotal(15.99);
    Netmera.sendEvent(cartViewEvent);
  }
小部件URL回调

要使用小部件URL回调,请按如下方式使用 onWidgetUrlTriggered 方法:

 void _onWidgetUrlTriggered(String url) {
   String message = "Widget URL handle by app: " + url;
   print(message);
 }

 Netmera.onWidgetUrlTriggered(_onWidgetUrlTriggered);
推送通知权限

如果您在运行时没有请求通知权限,可以通过调用 requestPushNotificationAuthorization() 方法请求它。

注意:通知运行时权限在Android 13 (API 33)或更高版本中是必需的。因此,在调用该方法之前,请确保您的项目目标API为33及以上。

 Netmera.requestPushNotificationAuthorization();

如果需要了解权限的状态,可以调用 areNotificationsEnabled() 方法。

 Netmera.areNotificationsEnabled().then((enabled) {
      // 使用权限的启用状态作为布尔值
 });
Netmera收件箱示例

您可以按以下方式获取Netmera收件箱。更多详细用法,请参阅示例项目

  getInboxFilter() {
    NetmeraInboxFilter inboxFilter = NetmeraInboxFilter();
    inboxFilter.setPageSize(2);
    inboxFilter.setStatus(Netmera.PUSH_OBJECT_STATUS_UNREAD);
    inboxFilter.setIncludeExpiredObjects(true);
    inboxFilter.setCategories(null);
    return inboxFilter;
  }

  fetchInbox() async {
    Netmera.fetchInbox(getInboxFilter()).then((list) {
      debugPrint(list);
    }).catchError((error) {
      debugPrint(error);
    });
  }
Netmera收件箱分类示例

您可以按以下方式获取Netmera分类。更多详细用法,请参阅示例项目

  getCategoryFilter() {
    NetmeraCategoryFilter categoryFilter = NetmeraCategoryFilter();
    categoryFilter.setPageSize(2);
    categoryFilter.setStatus(Netmera.PUSH_OBJECT_STATUS_UNREAD);
    categoryFilter.setIncludeExpiredObjects(true);
    return categoryFilter;
  }

  fetchCategory() async {
    Netmera.fetchCategory(getCategoryFilter()).then((list) {
      debugPrint(list);
    }).catchError((error) {
      debugPrint(error);
    });
  }
获取先前存在的外部ID
    Netmera.getCurrentExternalId()

请探索Netmera SDK库中的示例文件夹以获取详细信息。

Netmera弹窗展示

要启用弹窗展示,您需要在您想要显示弹窗的页面上调用 enablePopupPresentation() 方法。 注意:要在应用启动时或在整个应用中显示弹窗,请在 main.dart 文件的 initState() 方法中添加此代码。

 Netmera.enablePopupPresentation();
数据传输暂停与恢复
停止数据传输方法

stopDataTransfer() 方法是一个有用的特性,可以帮助用户暂时暂停SDK发送到后端的所有请求。 这在用户因网络问题或其他原因需要暂时停止数据传输时非常有用。一旦问题解决,用户可以使用 startDataTransfer() 方法重新开始数据传输。

 Netmera.stopDataTransfer();
开始数据传输方法

startDataTransfer() 方法是 stopDataTransfer() 方法的补充功能,允许用户重新启动任何已停止的请求。 当用户暂时停止数据传输并准备恢复传输时,这很有用。一旦用户调用 startDataTransfer() 方法,SDK将尝试重新发送之前停止的任何请求。

 Netmera.startDataTransfer();

更多关于Flutter集成Netmera服务插件netmera_flutter_sdk的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter集成Netmera服务插件netmera_flutter_sdk的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中集成并使用Netmera服务插件netmera_flutter_sdk的代码示例。这个示例将展示如何安装插件、初始化Netmera SDK并进行一些基本操作。

1. 添加依赖

首先,你需要在pubspec.yaml文件中添加netmera_flutter_sdk依赖:

dependencies:
  flutter:
    sdk: flutter
  netmera_flutter_sdk: ^最新版本号  # 请替换为最新的版本号

然后运行flutter pub get来安装依赖。

2. 配置Android项目

android/app/src/main/AndroidManifest.xml文件中添加必要的权限和Netmera的配置:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.yourapp">

    <!-- 添加必要的权限 -->
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

    <application
        ...>

        <!-- Netmera SDK 配置 -->
        <meta-data
            android:name="com.netmera.sdk.API_KEY"
            android:value="你的Netmera API密钥" />
        <meta-data
            android:name="com.netmera.sdk.APP_ID"
            android:value="你的Netmera APP ID" />
        <meta-data
            android:name="com.netmera.sdk.GCM_SENDER_ID"
            android:value="你的GCM Sender ID(如果适用)" />

        <!-- 其他配置 -->
        ...
    </application>
</manifest>

3. 配置iOS项目

ios/Runner/Info.plist文件中添加Netmera的配置(如果需要):

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

<!-- 其他可能的Netmera配置(根据需要添加) -->

4. 初始化Netmera SDK

在你的Flutter应用的入口文件(通常是main.dart)中初始化Netmera SDK:

import 'package:flutter/material.dart';
import 'package:netmera_flutter_sdk/netmera_flutter_sdk.dart';

void main() {
  WidgetsFlutterBinding.ensureInitialized();

  // 初始化Netmera SDK
  NetmeraFlutter.init(
    apiKey: "你的Netmera API密钥",
    appId: "你的Netmera APP ID",
    enableLogging: true, // 是否启用日志记录
  );

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Netmera Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Netmera Demo'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () async {
            // 示例:记录一个自定义事件
            await NetmeraFlutter.trackCustomEvent(eventName: "custom_event_name", properties: {"key": "value"});
            print("Event tracked");
          },
          child: Text('Track Custom Event'),
        ),
      ),
    );
  }
}

5. 运行应用

确保所有配置正确无误后,运行你的Flutter应用:

flutter run

现在,你的Flutter应用已经集成了Netmera服务,并可以记录自定义事件。你可以根据需要进一步探索Netmera SDK提供的其他功能,如推送通知、用户画像等。

请注意,上述代码示例仅用于演示目的,实际使用中请根据你的项目需求和Netmera的文档进行适当调整。

回到顶部