原生通信系列

1. Flutter 调用 Android
2. Android 通知 Flutter
3. Flutter 调用 iOS
4. iOS 通知 Flutter

项目地址


本篇主要介绍如何在 iOS 中发布广播,然后在 dart 端进行订阅

oc

先来查看 OC 篇

#import "BattlePowerPlugin.h"
#import <Foundation/NSTimer.h>

@implementation BattlePowerPlugin

+ (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar>*)registrar {
    //  ...

    [self registerPostTimerWithRegistrar:registrar];
}

+(void) registerPostTimerWithRegistrar:(NSObject<FlutterPluginRegistrar>*)registrar{
    FlutterBasicMessageChannel *channel = [FlutterBasicMessageChannel messageChannelWithName:@"run_time" binaryMessenger:[registrar messenger]];

    long start = [self getNow];

    [NSTimer scheduledTimerWithTimeInterval:5 repeats:true block:^(NSTimer * _Nonnull timer) {
        long run = [self getNow] - start;
        [channel sendMessage:[NSNumber numberWithLong:run]];

        if (run > 100){
            [timer invalidate];
        }
    }];
}

+(long)getNow{
    NSDate *date = [NSDate date];
    long timeStamp = [date timeIntervalSince1970];
    return timeStamp;
}

//...

@end

间隔 5 秒通过 sendMessage 发送一条消息

dart

再来看 dart 代码,这里和系列文章第二篇一致

import 'dart:async';

import 'package:flutter/services.dart';

class BattlePower {
  // ...

  static const BasicMessageChannel<dynamic> runTimer = const BasicMessageChannel("run_time", StandardMessageCodec());

  static void initMessageHandler() {
    print("initMessageHandler");
    runTimer.setMessageHandler((dynamic value) {
      // 接收到的时间
      int time = value;
      print("value = $time");
    });
  }
}

这里使用BasicMessageChannel 接收回调

看看  运行结果,这里和 android 不一样, ios 的时间戳是 double 形式, 小数点左边是秒, 我这里进行了强转,所以获取到的时间就只有秒

图片


好了 插件入门篇到这里就结束了,希望大家多多为开源做出贡献,也希望大家的 flutter 开发之路越走越宽