Flutter實(shí)戰(zhàn) 插件開(kāi)發(fā):IOS端API實(shí)現(xiàn)

2021-03-09 14:02 更新

本節(jié)我們接著之前"獲取電池電量"插件的示例,來(lái)完成 iOS 端 API 的實(shí)現(xiàn)。以下步驟使用 Objective-C,如果您更喜歡 Swift,可以直接跳到后面 Swift 部分。

首先打開(kāi) Xcode 中 Flutter 應(yīng)用程序的 iOS 部分:

  1. 啟動(dòng) Xcode
  2. 選擇 File > Open…
  3. 定位到您 Flutter app 目錄, 然后選擇里面的 iOS文件夾,點(diǎn)擊 OK
  4. 確保 Xcode 項(xiàng)目的構(gòu)建沒(méi)有錯(cuò)誤。
  5. 選擇 Runner > Runner ,打開(kāi)AppDelegate.m

接下來(lái),在application didFinishLaunchingWithOptions:方法內(nèi)部創(chuàng)建一個(gè)FlutterMethodChannel,并添加一個(gè)處理方法。 確保與在 Flutter 客戶端使用的通道名稱(chēng)相同。

#import <Flutter/Flutter.h>


@implementation AppDelegate
- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {
  FlutterViewController* controller = (FlutterViewController*)self.window.rootViewController;


  FlutterMethodChannel* batteryChannel = [FlutterMethodChannel
                                          methodChannelWithName:@"samples.flutter.io/battery"
                                          binaryMessenger:controller];


  [batteryChannel setMethodCallHandler:^(FlutterMethodCall* call, FlutterResult result) {
    // TODO
  }];


  return [super application:application didFinishLaunchingWithOptions:launchOptions];
}

接下來(lái),我們添加 Objective-C 代碼,使用 iOS 電池 API 來(lái)獲取電池電量,這和原生是相同的。

AppDelegate類(lèi)中添加以下新的方法:

- (int)getBatteryLevel {
  UIDevice* device = UIDevice.currentDevice;
  device.batteryMonitoringEnabled = YES;
  if (device.batteryState == UIDeviceBatteryStateUnknown) {
    return -1;
  } else {
    return (int)(device.batteryLevel * 100);
  }
}

最后,我們完成之前添加的setMethodCallHandler方法。我們需要處理的平臺(tái)方法名為getBatteryLevel,所以我們?cè)?call 參數(shù)中需要先判斷是否為getBatteryLevel。 這個(gè)平臺(tái)方法的實(shí)現(xiàn)只需調(diào)用我們?cè)谇耙徊街芯帉?xiě)的 iOS 代碼,并使用 result 參數(shù)返回成功或錯(cuò)誤的響應(yīng)。如果調(diào)用了未定義的 API,我們也會(huì)通知返回:

[batteryChannel setMethodCallHandler:^(FlutterMethodCall* call, FlutterResult result) {
  if ([@"getBatteryLevel" isEqualToString:call.method]) {
    int batteryLevel = [self getBatteryLevel];


    if (batteryLevel == -1) {
      result([FlutterError errorWithCode:@"UNAVAILABLE"
                                 message:@"電池信息不可用"
                                 details:nil]);
    } else {
      result(@(batteryLevel));
    }
  } else {
    result(FlutterMethodNotImplemented);
  }
}];

現(xiàn)在可以在 iOS 上運(yùn)行該應(yīng)用程序了,如果使用的是 iOS 模擬器,請(qǐng)注意,它不支持電池 API,因此應(yīng)用程序?qū)@示“電池信息不可用”。

#使用Swift實(shí)現(xiàn)iOS API

以下步驟與上面使用 Objective-C 相似,首先打開(kāi) Xcode 中 Flutter 應(yīng)用程序的 iOS 部分:

  1. 啟動(dòng) Xcode
  2. 選擇 File > Open…
  3. 定位到您 Flutter app 目錄, 然后選擇里面的 ios文件夾,點(diǎn)擊 OK
  4. 確保Xcode項(xiàng)目的構(gòu)建沒(méi)有錯(cuò)誤。
  5. 選擇 Runner > Runner ,然后打開(kāi)AppDelegate.swift

接下來(lái),覆蓋 application 方法并創(chuàng)建一個(gè)FlutterMethodChannel綁定通道名稱(chēng)samples.flutter.io/battery

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    GeneratedPluginRegistrant.register(with: self);


    let controller : FlutterViewController = window?.rootViewController as! FlutterViewController;
    let batteryChannel = FlutterMethodChannel.init(name: "samples.flutter.io/battery",
                                                   binaryMessenger: controller);
    batteryChannel.setMethodCallHandler({
      (call: FlutterMethodCall, result: FlutterResult) -> Void in
      // Handle battery messages.
    });


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

接下來(lái),我們添加 Swift 代碼,使用 iOS 電池 API 來(lái)獲取電池電量,這和原生開(kāi)發(fā)是相同的。

將以下新方法添加到AppDelegate.swift底部:

private func receiveBatteryLevel(result: FlutterResult) {
  let device = UIDevice.current;
  device.isBatteryMonitoringEnabled = true;
  if (device.batteryState == UIDeviceBatteryState.unknown) {
    result(FlutterError.init(code: "UNAVAILABLE",
                             message: "電池信息不可用",
                             details: nil));
  } else {
    result(Int(device.batteryLevel * 100));
  }
}

最后,我們完成之前添加的setMethodCallHandler方法。我們需要處理的平臺(tái)方法名為getBatteryLevel,所以我們?cè)?call 參數(shù)中需要先判斷是否為getBatteryLevel。 這個(gè)平臺(tái)方法的實(shí)現(xiàn)只需調(diào)用我們?cè)谇耙徊街芯帉?xiě)的 iOS 代碼,并使用 result 參數(shù)返回成功或錯(cuò)誤的響應(yīng)。如果調(diào)用了未定義的 API,我們也會(huì)通知返回:

batteryChannel.setMethodCallHandler({
  (call: FlutterMethodCall, result: FlutterResult) -> Void in
  if ("getBatteryLevel" == call.method) {
    receiveBatteryLevel(result: result);
  } else {
    result(FlutterMethodNotImplemented);
  }
});

現(xiàn)在可以在 iOS 上運(yùn)行應(yīng)用程序,如果使用的是 iOS 模擬器,請(qǐng)注意,它不支持電池 API,因此應(yīng)用程序?qū)@示“電池信息不可用”。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)