本节目标
- 创建 ios flutter 插件流程
- 集成百度定位功能
视频
https://www.bilibili.com/video/BV1HT4y1L73i/
代码
https://github.com/ducafecat/flutter_baidu_plugin_ducafecat/releases/tag/v1.0.3
百度平台部分
设置 AK
https://lbsyun.baidu.com/apiconsole/key#/home
- 添加应用
- 查看 Bundle Identifier
IOS 部分
自动部署 CocoaPods
- 安装工具
sudo gem install cocoapods
- ios/flutter_baidu_plugin_ducafecat.podspec
...
s.dependency 'Flutter'
s.platform = :ios, '8.0'
s.dependency 'BMKLocationKit'
# Flutter.framework does not contain a i386 slice. Only x86_64 simulators are supported.
s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'VALID_ARCHS[sdk=iphonesimulator*]' => 'x86_64' }
end
- 安装百度 sdk 包
pod install
- 升级
pod repo update
- pod search 无法搜索到类库的解决办法(找不到类库)
(1)执行pod setup
(2)删除~/Library/Caches/CocoaPods目录下的search_index.json文件
pod setup成功后会生成~/Library/Caches/CocoaPods/search_index.json文件
终端输入rm ~/Library/Caches/CocoaPods/search_index.json
删除成功后再执行pod search
(3)执行pod search
Info.plist 定位授权
example/ios/Runner/Info.plist
<dict>
<key>NSLocationWhenInUseUsageDescription</key>
<string>需要定位</string>
消息通知 BdmapFlutterStreamManager
- ios/Classes/BdmapFlutterStreamManager.h
//
// Header.h
// bdmap_location_flutter_plugin
//
// Created by Wang,Shengzhan on 2020/2/4.
//
#import <Foundation/Foundation.h>
#import <Flutter/Flutter.h>
NS_ASSUME_NONNULL_BEGIN
@class BdmapFlutterStreamHandler;
@interface BdmapFlutterStreamManager : NSObject
+ (instancetype)sharedInstance ;
@property (nonatomic, strong) BdmapFlutterStreamHandler* streamHandler;
@end
@interface BdmapFlutterStreamHandler : NSObject<FlutterStreamHandler>
@property (nonatomic, strong) FlutterEventSink eventSink;
@end
NS_ASSUME_NONNULL_END
- ios/Classes/BdmapFlutterStreamManager.m
//
// BdmapFlutterStreamManager.m
// bdmap_location_flutter_plugin
//
// Created by Wang,Shengzhan on 2020/2/4.
//
#import "BdmapFlutterStreamManager.h"
@implementation BdmapFlutterStreamManager
+ (instancetype)sharedInstance {
static dispatch_once_t onceToken;
static BdmapFlutterStreamManager *manager = nil;
dispatch_once(&onceToken, ^{
manager = [[BdmapFlutterStreamManager alloc] init];
BdmapFlutterStreamHandler * streamHandler = [[BdmapFlutterStreamHandler alloc] init];
manager.streamHandler = streamHandler;
});
return manager;
}
@end
@implementation BdmapFlutterStreamHandler
- (FlutterError*)onListenWithArguments:(id)arguments eventSink:(FlutterEventSink)eventSink {
self.eventSink = eventSink;
return nil;
}
- (FlutterError*)onCancelWithArguments:(id)arguments {
return nil;
}
@end
地图接口业务 FlutterBaiduPluginDucafecatPlugin
- ios/Classes/FlutterBaiduPluginDucafecatPlugin.h
#import <Flutter/Flutter.h>
@interface FlutterBaiduPluginDucafecatPlugin : NSObject<FlutterPlugin>
@end
- ios/Classes/FlutterBaiduPluginDucafecatPlugin.m
#import "FlutterBaiduPluginDucafecatPlugin.h"
#import "BMKLocationkit/BMKLocationComponent.h"
#import "BdmapFlutterStreamManager.h"
@interface FlutterBaiduPluginDucafecatPlugin()<BMKLocationManagerDelegate>
@property (nonatomic,strong) BMKLocationManager *locManager;
@property (nonatomic, copy) FlutterResult flutterResult;
@end
@implementation FlutterBaiduPluginDucafecatPlugin
+ (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar>*)registrar {
// FlutterMethodChannel* channel = [FlutterMethodChannel
// methodChannelWithName:@"flutter_baidu_plugin_ducafecat"
// binaryMessenger:[registrar messenger]];
// FlutterBaiduPluginDucafecatPlugin* instance = [[FlutterBaiduPluginDucafecatPlugin alloc] init];
// [registrar addMethodCallDelegate:instance channel:channel];
FlutterMethodChannel* channel = [FlutterMethodChannel
methodChannelWithName:@"flutter_baidu_plugin_ducafecat"
binaryMessenger:[registrar messenger]];
FlutterBaiduPluginDucafecatPlugin* instance = [[FlutterBaiduPluginDucafecatPlugin alloc] init];
[registrar addMethodCallDelegate:instance channel:channel];
FlutterEventChannel *eventChanel = [FlutterEventChannel eventChannelWithName:@"flutter_baidu_plugin_ducafecat_stream" binaryMessenger:[registrar messenger]];
[eventChanel setStreamHandler:[[BdmapFlutterStreamManager sharedInstance] streamHandler]];
}
// - (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result {
// if ([@"getPlatformVersion" isEqualToString:call.method]) {
// result([@"iOS " stringByAppendingString:[[UIDevice currentDevice] systemVersion]]);