Flutter - Написание кода для iOS
Доступ к коду, специфичному для iOS, аналогичен доступу на платформе Android, за исключением того, что он использует специальные языки для iOS - Objective-C или Swift и iOS SDK. В остальном концепция такая же, как у платформы Android.
Напишем то же приложение, что и в предыдущей главе, и для платформы iOS.
Давайте создадим новое приложение в Android Studio (macOS), flutter_browser_ios_app
Выполните шаги 2–6, как в предыдущей главе.
Запустите XCode и нажмите File → Open
Выберите проект xcode в каталоге ios нашего проекта flutter.
Откройте AppDelegate.m под Runner → Runner path. Он содержит следующий код -
#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.tutorialspoint.com/browse -
FlutterMethodChannel* browserChannel = [
FlutterMethodChannel methodChannelWithName:
@"flutterapp.tutorialspoint.com/browser" binaryMessenger:controller];
Создайте переменную weakSelf и установите текущий класс -
__weak typeof(self) weakSelf = self;
Теперь реализуйте setMethodCallHandler. Вызовите openBrowser, сопоставив call.method. Получите URL-адрес, вызвав call.arguments, и передайте его при вызове 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.tutorialspoint.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); }
}];
// custom code ends
[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
Открыть настройку проекта.
Идти к Capabilities и включить Background Modes.
Добавить *Background fetch и Remote Notification**.
Теперь запустите приложение. Он работает аналогично версии для Android, но вместо Chrome открывается браузер Safari.