访问iOS特定代码与Android平台上的代码相似,不同之处在于它使用iOS特定语言-Objective-C或Swift和iOS SDK。
下表显示了如何在Android和iOS平台上接收Dart值。
dart | android | ios |
---|---|---|
null | null | 无(嵌套时为NSNull) |
bool | java.lang.Boolean | NSNumber numberWithBool: |
int | java.lang.Integer | NSNumber numberWithInt: |
double | java.lang.Double | NSNumber numberWithDouble: |
String | java.lang.String | NSString: |
Uint8List | byte[] | FlutterStandardTypedData typedDataWithBytes: |
Int32List | int[] | FlutterStandardTypedData typedDataWithInt32: |
Int64List | long[] | FlutterStandardTypedData typedDataWithInt64: |
Float64List | double[] | FlutterStandardTypedData typedDataWithFloat64: |
List | java.util.ArrayList | NSArray |
Map | java.util.HashMap | NSDictionary |
让无涯教程也为iOS平台编写与上一章相同的应用程序。
让无涯教程在Android Studio(macOS)中创建一个新应用, flutter_browser_ios_app
启动XCode并单击 File→Open
在flutter项目的ios目录下选择xcode项目。
在 Runner→Runner path 下打开AppDelegate.m。它包含以下代码-
#include "AppDelegate.h" #include "GeneratedPluginRegistrant.h" @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { //[GeneratedPluginRegistrant registerWithRegistry:self]; //Override point for customization after application launch. return [super application:application didFinishLaunchingWithOptions:launchOptions]; } @end
无涯教程添加了openBrowser方法来打开具有指定URL的浏览器。它接受单个参数url。
- (void)openBrowser:(NSString *)urlString { NSURL *url = [NSURL URLWithString:urlString]; UIApplication *application = [UIApplication sharedApplication]; [application openURL:url]; }
在didFinishLaunchingWithOptions方法中,找到控制器并将其设置在控制器变量中。
FlutterViewController* controller=(FlutterViewController*)self.window.rootViewController;
在didFinishLaunchingWithOptions方法中,将浏览器通道设置为flutterapp.learnfk.com/browse-
FlutterMethodChannel* browserChannel = [ FlutterMethodChannel methodChannelWithName: @"flutterapp.learnfk.com/browser" binaryMessenger:controller];
创建一个变量weakSelf并设置当前类-
__weak typeof(self) weakSelf=self;
现在,实现setMethodCallHandler,通过匹配call.method调用openBrowser,通过调用call.arguments获取URL,并在调用openBrowser时传递它。
[browserChannel setMethodCallHandler:^(FlutterMethodCall* call, FlutterResult result) { if ([@"openBrowser" isEqualToString:call.method]) { NSString *url = call.arguments[@"url"]; [weakSelf openBrowser:url]; } else { result(FlutterMethodNotImplemented); } }];
完整的代码如下-
#include "AppDelegate.h" #include "GeneratedPluginRegistrant.h" @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { //custom code starts FlutterViewController* controller = (FlutterViewController*)self.window.rootViewController; FlutterMethodChannel* browserChannel = [ FlutterMethodChannel methodChannelWithName: @"flutterapp.learnfk.com /browser" binaryMessenger:controller]; __weak typeof(self) weakSelf = self; [browserChannel setMethodCallHandler:^( FlutterMethodCall* call, FlutterResult result) { if ([@"openBrowser" isEqualToString:call.method]) { NSString *url = call.arguments[@"url"]; [weakSelf openBrowser:url]; } else { result(FlutterMethodNotImplemented); } }]; //自定义代码结束 [GeneratedPluginRegistrant registerWithRegistry:self]; //Override point for customization after application launch. return [super application:application didFinishLaunchingWithOptions:launchOptions]; } - (void)openBrowser:(NSString *)urlString { NSURL *url = [NSURL URLWithString:urlString]; UIApplication *application = [UIApplication sharedApplication]; [application openURL:url]; } @end
运行应用程序。它的工作方式类似于Android版本,但将打开Safari浏览器,而不是chrome。
参考链接
https://www.learnfk.com/flutter/flutter-writing-ios-specific-code.html
标签:url,self,IOS,无涯,UIApplication,application,call,openBrowser,Flutter From: https://blog.51cto.com/u_14033984/7325349