W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
本節(jié)我們接著之前"獲取電池電量"插件的示例,來(lái)完成 iOS 端 API 的實(shí)現(xiàn)。以下步驟使用 Objective-C,如果您更喜歡 Swift,可以直接跳到后面 Swift 部分。
首先打開(kāi) Xcode 中 Flutter 應(yīng)用程序的 iOS 部分:
iOS
文件夾,點(diǎn)擊 OKAppDelegate.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ū)@示“電池信息不可用”。
以下步驟與上面使用 Objective-C 相似,首先打開(kāi) Xcode 中 Flutter 應(yīng)用程序的 iOS 部分:
ios
文件夾,點(diǎn)擊 OKAppDelegate.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ū)@示“電池信息不可用”。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: