Skip to content

Latest commit

 

History

History
116 lines (92 loc) · 4.8 KB

8.App 接入《监听手机定位》能力.md

File metadata and controls

116 lines (92 loc) · 4.8 KB

App 接入《监听手机定位》能力

本节介绍“监听手机定位,定位更新后,主动将经纬度信息同步到 Flutter” 需求的具体实践,我们分原生和Flutter双侧来讲解。从职责上看:

  • 原生侧主要负责生产数据和发送数据
  • Flutter 侧主要负责接收数据和消费数据

在[定义《Native 同步定位信息到 Flutter》接口](5.定义《Native 同步定位信息到 Flutter》接口.md) 章节已经完成通信协议约定。

原生侧实现

原生侧主要负责生产数据和发送数据,无需实现约定的通信协议,因为通信协议是使用@UniFlutterModule()修饰的。

在原生侧,我们将用到LocationInfoModelLocationInfoService,它们都是 Unify 自动生成的。下面 Android 和 iOS 将分别介绍。

Android篇

在 Android 端,可按照下面的步骤操作:

  1. 调用LocationInfoServicesetup方法完成 Channel 连接,调用时机需要在“Flutter Engine运行”之后。本例,我们选择MainActivityonCreate方法。
  2. 监听定位更新后,将经纬信息存入LocationInfoModel对象中,然后通过LocationInfoServiceupdateLocationInfo方法,发送给 Flutter。

核心代码:

// setup时机:Flutter Engine运行后
public class MainActivity extends FlutterActivity {
    // 假设会触发下面方法
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ......
        // 步骤1:完成 Channel 连接
        new LocationInfoService().setup(engine.getDartExecutor().getBinaryMessenger());
        ......
    }

    // 步骤2:定位更新后,发送经纬度信息
    void didLocationUpdate() {
        LocationInfoModel model = new LocationInfoModel();
        model.setLat(39.989410);
        model.setLng(116.480881);
        // 这里 我们直接发送了自定义类LocationInfoModel实体 
        UniAPI.get(LocationInfoService.class).updateLocationInfo(model, result -> {});
    }
}

iOS篇

在 iOS 端,可按照下面的步骤操作:

  1. 导入用到的头文件。
// 导入头文件
#import "LocationInfoService.h"
#import "LocationInfoModel.h"
  1. 调用LocationInfoServicesetup方法完成 Channel 连接,调用时机需要在“Flutter Engine运行”之后。本例,我们封装了方法- (void)didLoadFlutterEngine:完成这部分的工作。
  2. 监听定位更新后,将经纬信息存入LocationInfoModel对象中,然后通过LocationInfoServiceupdateLocationInfo方法,发送给 Flutter。

iOS 的操作步骤和 Android 基本一致。

核心代码:

// 步骤1:导入头文件
#import "LocationInfoService.h"
#import "LocationInfoModel.h"

// 步骤2:完成 Channel 连接。setup时机根据自己实际情况决定,可调用:- (void)didLoadFlutterEngine:
- (void)didLoadFlutterEngine:(FlutterEngine *)engine {
    [LocationInfoService setup:engine.binaryMessenger];
}

// 步骤3:定位更新后,发送经纬度信息
- (void)updateLatitude:(double)lat longitude:(double)lng {
    LocationInfoModel *model = [LocationInfoModel new];
    model.lat = @(lat);
    model.lng = @(lng);
    // 这里 我们直接发送了自定义类LocationInfoModel实体 
    [LocationInfoService updateLocationInfo:model];
}

Flutter 侧实现

Flutter 侧主要负责接收数据和消费数据,切需实现约定的通信协议,因为通信协议是使用@UniFlutterModule()修饰的。

可按照下面的步骤操作:

  1. 定义一个实现了通信协议的类:LocationInfoServiceImpl,继承自LocationInfoService,并override协议接口。实现代码如下:
/// location_info_service_impl.dart 
import 'package:hello_uni_foundation/location_info_model.dart';
import 'package:hello_uni_foundation/location_info_service.dart';

class LocationInfoServiceImpl extends LocationInfoService {
  @override
  void updateLocationInfo(LocationInfoModel model) {
    // TODO: implement updateLocationInfo
    // 这里既可以通过LocationInfoModel获得Native侧传过来的定位信息数据
  }
}
  1. 通过LocationInfoServicesetup方法注册LocationInfoServiceImpl实例。比如在main.dartmain()中注册。
import 'package:hello_uni_foundation/location_info_service.dart';
import 'location_info_service_impl.dart';

void main() {
    ......
    LocationInfoService.setup(LocationInfoServiceImpl());
    ......
}

注册时机只要在Native侧发送数据之前就可以,依照实际情况自己确定。

至此,我们就完成了监听手机定位,定位更新后,主动将经纬度信息同步到 Flutter的需求开发。