Flutter - pisanie kodu specyficznego dla IOS
Dostęp do kodu specyficznego dla iOS jest podobny do tego na platformie Android, z tym wyjątkiem, że używa języków specyficznych dla iOS - Objective-C lub Swift i iOS SDK. W przeciwnym razie koncepcja jest taka sama, jak w przypadku platformy Android.
Napiszmy również tę samą aplikację, co w poprzednim rozdziale na platformę iOS.
Stwórzmy nową aplikację w Android Studio (macOS), flutter_browser_ios_app
Wykonaj kroki 2–6, jak w poprzednim rozdziale.
Uruchom XCode i kliknij File → Open
Wybierz projekt xcode w katalogu ios naszego projektu flutter.
Otwórz AppDelegate.m pod Runner → Runner path. Zawiera następujący kod -
#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
Dodaliśmy metodę openBrowser do otwierania przeglądarki z określonym adresem URL. Akceptuje pojedynczy argument, url.
- (void)openBrowser:(NSString *)urlString {
NSURL *url = [NSURL URLWithString:urlString];
UIApplication *application = [UIApplication sharedApplication];
[application openURL:url];
}
W metodzie didFinishLaunchingWithOptions znajdź kontroler i ustaw go w zmiennej kontrolera.
FlutterViewController* controller = (FlutterViewController*)self.window.rootViewController;
W metodzie didFinishLaunchingWithOptions ustaw kanał przeglądarki jako flutterapp.tutorialspoint.com/browse -
FlutterMethodChannel* browserChannel = [
FlutterMethodChannel methodChannelWithName:
@"flutterapp.tutorialspoint.com/browser" binaryMessenger:controller];
Utwórz zmienną, słabySelf i ustaw aktualną klasę -
__weak typeof(self) weakSelf = self;
Teraz zaimplementuj setMethodCallHandler. Wywołaj openBrowser, dopasowując call.method. Uzyskaj adres URL, wywołując call.arguments i przekaż go podczas wywoływania openBrowser.
[browserChannel setMethodCallHandler:^(FlutterMethodCall* call, FlutterResult result) {
if ([@"openBrowser" isEqualToString:call.method]) {
NSString *url = call.arguments[@"url"];
[weakSelf openBrowser:url];
} else { result(FlutterMethodNotImplemented); }
}];
Kompletny kod wygląda następująco -
#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
Otwórz ustawienia projektu.
Iść do Capabilities i włącz Background Modes.
Dodaj *Background fetch i Remote Notification**.
Teraz uruchom aplikację. Działa podobnie do wersji Androida, ale przeglądarka Safari zostanie otwarta zamiast chrome.