Flutter功能未知插件rationalowl_flutter的探索使用

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

Flutter功能未知插件rationalowl_flutter的探索使用

pub package

一个用于使用RationalOwl API的Flutter插件。

使用

要使用此插件,在你的pubspec.yaml文件中添加rationalowl_flutter作为依赖项。

入门指南

  1. 在你的RationalOwl服务中集成Firebase Cloud Messaging (FCM) 和 Apple Push Notification服务 (APNs)。

Android

  1. 下载rationalowl-android-1.4.1.aar文件。
  2. android/app目录下创建libs文件夹,并将rationalowl-android-1.4.1.aar文件复制到该文件夹内。

android1

  1. android/app/build.gradle文件中设置dependencies
dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation files('libs/rationalowl-android-1.4.1.aar')
}
  1. 使用Firebase Messaging来处理后台消息。

iOS

  1. 打开你的项目工作区文件ios/Runner.xcworkspace
  2. 下载RationalOwl.framework目录。
  3. RationalOwl.framework目录拖放到Runner项目中。
  4. 选择Copy items if needed复选框,然后点击Finish

ios1

  1. 选择Runner项目,然后选择Runner目标。
  2. 打开Frameworks, Libraries, and Embedded Content部分,然后点击+按钮。
  3. 点击Add Files...菜单项,然后选择RationalOwl.framework目录。

ios2

  1. 选择Signing & Capabilities选项卡,然后点击+ Capability按钮。
  2. 添加Push NotificationsBackground Modes功能。
  3. Background Modes功能中启用Background fetchRemote notifications模式。

ios3

  1. 选择Build Phases选项卡,然后打开Link Binary With Libraries部分。
  2. 点击+按钮。
  3. 选择UserNotifications.framework,然后点击Add

ios4

  1. 打开Embed Frameworks部分,选择Copy only when installing复选框。

ios5

  1. 点击左下角的+按钮。
  2. 选择Notification Service Extension模板,然后点击Next

ios6

  1. 添加Product Name,然后点击Finish

ios7

示例用法

const iOSAppGroup = 'group.com.rationalowl.flutterexample';

Future<void> _initialize() async {
  if (Platform.isAndroid) {
    await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform);
    FirebaseMessaging.onBackgroundMessage(handleMessage);
  }

  await initializeNotification();

  final MinervaManager minMgr = MinervaManager.getInstance();

  if (Platform.isIOS) {
    await minMgr.setAppGroup(iOSAppGroup);
  }

  await minMgr.setMsgListener(RoMessageListener());
}

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await _initialize();

  runApp(const Application());
}

class Application extends StatefulWidget {
  const Application({super.key});

  @override
  State<StatefulWidget> createState() => _ApplicationState();
}

class _ApplicationState extends State<Application> with WidgetsBindingObserver {
  late final MinervaAppLifecycleObserver _observer;

  @override
  void initState() {
    super.initState();

    if (Platform.isIOS) {
      _observer = MinervaAppLifecycleObserver();
      WidgetsBinding.instance.addObserver(_observer);
    } else {
      FirebaseMessaging.instance.onTokenRefresh.listen(handleTokenRefresh);
    }
  }

  @override
  void dispose() {
    if (Platform.isIOS) {
      WidgetsBinding.instance.removeObserver(_observer);
    }

    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      home: Scaffold(
        body: SafeArea(
          child: MainPage(),
        ),
      ),
    );
  }
}

在你的Dart代码中实现MessageListener以接收Android和iOS上的前台消息。

class RoMessageListener implements MessageListener {
  @override
  void onDownstreamMsgReceived(List<Map<String, dynamic>> msgList) {}

  @override
  void onP2PMsgReceived(List<Map<String, dynamic>> msgList) {
    if (msgList.isNotEmpty) {
      final latestMessage = Map<String, dynamic>.from(msgList[0]['data']);
      showNotification(latestMessage);
    }
  }

  @override
  void onPushMsgReceived(List<Map<String, dynamic>> msgList) {
    if (msgList.isNotEmpty) {
      final latestMessage = Map<String, dynamic>.from(msgList[0]['data']);
      showNotification(latestMessage);
    }
  }

  @override
  void onSendUpstreamMsgResult(int resultCode, String? resultMsg, String? msgId) {}

  @override
  void onSendP2PMsgResult(int resultCode, String? resultMsg, String? msgId) {}
}

在你的Dart代码中实现处理器以接收Android上的令牌和后台消息。

Future<void> handleTokenRefresh(String token) async {
  final MinervaManager minMgr = MinervaManager.getInstance();
  minMgr.setDeviceToken(token);
}

@pragma('vm:entry-point')
Future<void> handleMessage(RemoteMessage message) async {
  final Map<String, dynamic> data = message.data;

  final MinervaManager minMgr = MinervaManager.getInstance();
  minMgr.enableNotificationTracking(data: data);

  if (!data.containsKey('silent')) {
    showNotification(data);
  }
}

在你的Swift代码ios/{Product Name}/NotificationService.swift中实现UNNotificationServiceExtension以接收iOS上的后台消息。

class NotificationService: UNNotificationServiceExtension {
    private static let appGroup = "group.com.rationalowl.flutterexample"

    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)
        
        if let bestAttemptContent = bestAttemptContent {
            let userInfo = bestAttemptContent.userInfo

            let minMgr = MinervaManager.getInstance()!
            minMgr.enableNotificationTracking(userInfo, appGroup: Self.appGroup)

            if userInfo["notiTitle"] != nil {
                bestAttemptContent.title = userInfo["notiTitle"] as! String
            }
            if userInfo["notiBody"] != nil {
                bestAttemptContent.body = userInfo["notiBody"] as! String
            }

            contentHandler(bestAttemptContent)
        }
    }
    
    override func serviceExtensionTimeWillExpire() {
        if let contentHandler = contentHandler, let bestAttemptContent = bestAttemptContent {
            contentHandler(bestAttemptContent)
        }
    }
}

更多关于Flutter功能未知插件rationalowl_flutter的探索使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter功能未知插件rationalowl_flutter的探索使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


探索和使用 rationalowl_flutter 插件时,了解其功能和API是关键。虽然我不能直接提供关于 rationalowl_flutter 特定功能的建议(因为这是一个假设的插件名称,且Flutter社区中并未广泛提及),但我可以展示一个通用的Flutter插件集成和使用的基本框架。这可以帮助你开始探索和使用任何新的Flutter插件。

假设 rationalowl_flutter 插件已经存在于pub.dev或者你的私有包管理器中,以下是一个基本的集成和使用示例:

  1. 添加依赖: 首先,你需要在 pubspec.yaml 文件中添加对该插件的依赖。

    dependencies:
      flutter:
        sdk: flutter
      rationalowl_flutter: ^x.y.z  # 假设版本号为x.y.z,请替换为实际版本号
    
  2. 获取插件实例: 在你的 Dart 代码中,你需要导入该插件并获取其实例。

    import 'package:flutter/material.dart';
    import 'package:rationalowl_flutter/rationalowl_flutter.dart';  // 假设这是插件的导入路径
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'RationalOwl Flutter Demo',
          theme: ThemeData(
            primarySwatch: Colors.blue,
          ),
          home: MyHomePage(),
        );
      }
    }
    
    class MyHomePage extends StatefulWidget {
      @override
      _MyHomePageState createState() => _MyHomePageState();
    }
    
    class _MyHomePageState extends State<MyHomePage> {
      RationalOwlFlutter? _rationalOwl;
    
      @override
      void initState() {
        super.initState();
        // 初始化插件实例
        _rationalOwl = RationalOwlFlutter();
        // 如果插件有初始化方法,可以在这里调用
        // _rationalOwl!.initialize();
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text('RationalOwl Flutter Demo'),
          ),
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                Text(
                  'You have pushed the button this many times:',
                ),
                // 假设插件有一个方法叫 doSomething
                ElevatedButton(
                  onPressed: () {
                    if (_rationalOwl != null) {
                      _rationalOwl!.doSomething().then((result) {
                        // 处理结果
                        print('Result from RationalOwl: $result');
                      }).catchError((error) {
                        // 处理错误
                        print('Error from RationalOwl: $error');
                      });
                    }
                  },
                  child: Text('Call RationalOwl Method'),
                ),
              ],
            ),
          ),
        );
      }
    
      @override
      void dispose() {
        // 清理资源,如果插件有dispose方法,可以在这里调用
        // _rationalOwl?.dispose();
        super.dispose();
      }
    }
    
  3. 处理插件返回的数据或错误: 在上面的代码中,我们假设 doSomething 方法返回一个 Future,你可以使用 .then.catchError 来处理返回的数据或捕获错误。

请注意,上述代码是一个模板,具体的API调用、方法名称和参数需要根据 rationalowl_flutter 插件的实际文档进行调整。由于这是一个假设的插件名称,你可能需要查阅该插件的官方文档或源代码来了解其具体的API和功能。

如果你已经有了 rationalowl_flutter 插件的文档或源代码,你应该能够找到类似 initializedoSomething 这样的方法,并根据文档中的说明进行调用。如果插件提供了示例代码或教程,那将是一个非常好的起点。

回到顶部