203static NSDictionary<UIApplicationLaunchOptionsKey, id>* ConvertConnectionOptions(
204 UISceneConnectionOptions* connectionOptions) {
205 NSMutableDictionary<UIApplicationLaunchOptionsKey, id>* convertedOptions =
206 [NSMutableDictionary dictionary];
208 if (connectionOptions.shortcutItem) {
209 convertedOptions[UIApplicationLaunchOptionsShortcutItemKey] = connectionOptions.shortcutItem;
211 if (connectionOptions.sourceApplication) {
212 convertedOptions[UIApplicationLaunchOptionsSourceApplicationKey] =
213 connectionOptions.sourceApplication;
215 if (connectionOptions.URLContexts.anyObject.URL) {
216 convertedOptions[UIApplicationLaunchOptionsURLKey] =
217 connectionOptions.URLContexts.anyObject.URL;
219 return convertedOptions;
222- (
BOOL)application:(UIApplication*)application
223 willFinishLaunchingWithOptions:(NSDictionary*)launchOptions {
225 self.didForwardApplicationWillLaunch = YES;
228 for (NSObject<FlutterApplicationLifeCycleDelegate>* delegate in
_delegates.allObjects) {
232 if ([delegate respondsToSelector:_cmd]) {
233 if (![delegate application:application willFinishLaunchingWithOptions:launchOptions]) {
241- (void)handleDidEnterBackground:(NSNotification*)notification
242 NS_EXTENSION_UNAVAILABLE_IOS("Disallowed in app extensions") {
243 if ([
self appSupportsSceneLifecycle]) {
246 UIApplication* application = [UIApplication sharedApplication];
247#if FLUTTER_RUNTIME_MODE == FLUTTER_RUNTIME_MODE_DEBUG
253 _debugBackgroundTask = [application
254 beginBackgroundTaskWithName:@"Flutter debug task"
256 if (_debugBackgroundTask != UIBackgroundTaskInvalid) {
257 [application endBackgroundTask:_debugBackgroundTask];
258 _debugBackgroundTask = UIBackgroundTaskInvalid;
261 logWarning:@"\nThe OS has terminated the Flutter debug connection for being "
262 "inactive in the background for too long.\n\n"
263 "There are no errors with your Flutter application.\n\n"
264 "To reconnect, launch your application again via 'flutter run'"];
267 [
self applicationDidEnterBackground:application isFallbackForScene:NO];
270- (void)sceneDidEnterBackgroundFallback {
275 [
self applicationDidEnterBackground:application isFallbackForScene:YES];
278- (void)applicationDidEnterBackground:(UIApplication*)application
279 isFallbackForScene:(
BOOL)isFallback {
280 for (NSObject<FlutterApplicationLifeCycleDelegate>* delegate in
_delegates.allObjects) {
281 if (!delegate || (isFallback && [
self pluginSupportsSceneLifecycle:delegate])) {
284 if ([delegate respondsToSelector:@selector(applicationDidEnterBackground:)]) {
285 [delegate applicationDidEnterBackground:application];
290- (void)handleWillEnterForeground:(NSNotification*)notification
291 NS_EXTENSION_UNAVAILABLE_IOS("Disallowed in app extensions") {
292 if ([
self appSupportsSceneLifecycle]) {
295 UIApplication* application = [UIApplication sharedApplication];
296#if FLUTTER_RUNTIME_MODE == FLUTTER_RUNTIME_MODE_DEBUG
297 if (_debugBackgroundTask != UIBackgroundTaskInvalid) {
298 [application endBackgroundTask:_debugBackgroundTask];
299 _debugBackgroundTask = UIBackgroundTaskInvalid;
302 [
self applicationWillEnterForeground:application isFallbackForScene:NO];
305- (void)sceneWillEnterForegroundFallback {
310 [
self applicationWillEnterForeground:application isFallbackForScene:YES];
313- (void)applicationWillEnterForeground:(UIApplication*)application
314 isFallbackForScene:(
BOOL)isFallback {
315 for (NSObject<FlutterApplicationLifeCycleDelegate>* delegate in
_delegates.allObjects) {
316 if (!delegate || (isFallback && [
self pluginSupportsSceneLifecycle:delegate])) {
319 if ([delegate respondsToSelector:@selector(applicationWillEnterForeground:)]) {
320 [delegate applicationWillEnterForeground:application];
325- (void)handleWillResignActive:(NSNotification*)notification
326 NS_EXTENSION_UNAVAILABLE_IOS("Disallowed in app extensions") {
327 if ([
self appSupportsSceneLifecycle]) {
330 UIApplication* application = [UIApplication sharedApplication];
331 [
self applicationWillResignActive:application isFallbackForScene:NO];
334- (void)sceneWillResignActiveFallback {
339 [
self applicationWillResignActive:application isFallbackForScene:YES];
342- (void)applicationWillResignActive:(UIApplication*)application
343 isFallbackForScene:(
BOOL)isFallback {
344 for (NSObject<FlutterApplicationLifeCycleDelegate>* delegate in
_delegates.allObjects) {
345 if (!delegate || (isFallback && [
self pluginSupportsSceneLifecycle:delegate])) {
348 if ([delegate respondsToSelector:@selector(applicationWillResignActive:)]) {
349 [delegate applicationWillResignActive:application];
354- (void)handleDidBecomeActive:(NSNotification*)notification
355 NS_EXTENSION_UNAVAILABLE_IOS("Disallowed in app extensions") {
356 if ([
self appSupportsSceneLifecycle]) {
359 UIApplication* application = [UIApplication sharedApplication];
360 [
self applicationDidBecomeActive:application isFallbackForScene:NO];
363- (void)sceneDidBecomeActiveFallback {
368 [
self applicationDidBecomeActive:application isFallbackForScene:YES];
371- (void)applicationDidBecomeActive:(UIApplication*)application isFallbackForScene:(
BOOL)isFallback {
372 for (NSObject<FlutterApplicationLifeCycleDelegate>* delegate in
_delegates.allObjects) {
373 if (!delegate || (isFallback && [
self pluginSupportsSceneLifecycle:delegate])) {
376 if ([delegate respondsToSelector:@selector(applicationDidBecomeActive:)]) {
377 [delegate applicationDidBecomeActive:application];
382- (void)handleWillTerminate:(NSNotification*)notification
383 NS_EXTENSION_UNAVAILABLE_IOS("Disallowed in app extensions") {
384 UIApplication* application = [UIApplication sharedApplication];
385 for (NSObject<FlutterApplicationLifeCycleDelegate>* delegate in
_delegates.allObjects) {
389 if ([delegate respondsToSelector:@selector(applicationWillTerminate:)]) {
390 [delegate applicationWillTerminate:application];
395#pragma GCC diagnostic push
396#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
397- (void)application:(UIApplication*)application
398 didRegisterUserNotificationSettings:(UIUserNotificationSettings*)notificationSettings {
399 for (NSObject<FlutterApplicationLifeCycleDelegate>* delegate in
_delegates.allObjects) {
403 if ([delegate respondsToSelector:_cmd]) {
404 [delegate application:application didRegisterUserNotificationSettings:notificationSettings];
408#pragma GCC diagnostic pop
410- (void)application:(UIApplication*)application
411 didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken {
412 for (NSObject<FlutterApplicationLifeCycleDelegate>* delegate in
_delegates.allObjects) {
416 if ([delegate respondsToSelector:_cmd]) {
417 [delegate application:application
418 didRegisterForRemoteNotificationsWithDeviceToken:deviceToken];
423- (void)application:(UIApplication*)application
424 didFailToRegisterForRemoteNotificationsWithError:(NSError*)error {
425 for (NSObject<FlutterApplicationLifeCycleDelegate>* delegate in
_delegates.allObjects) {
429 if ([delegate respondsToSelector:_cmd]) {
430 [delegate application:application didFailToRegisterForRemoteNotificationsWithError:error];
536static NSDictionary<UIApplicationOpenURLOptionsKey, id>* ConvertOptions(
537 UISceneOpenURLOptions* options) {
538 NSMutableDictionary<UIApplicationOpenURLOptionsKey, id>* convertedOptions =
539 [NSMutableDictionary dictionary];
540 if (options.sourceApplication) {
541 convertedOptions[UIApplicationOpenURLOptionsSourceApplicationKey] = options.sourceApplication;
543 if (options.annotation) {
544 convertedOptions[UIApplicationOpenURLOptionsAnnotationKey] = options.annotation;
546 convertedOptions[UIApplicationOpenURLOptionsOpenInPlaceKey] = @(options.openInPlace);
547 if (options.eventAttribution) {
548 convertedOptions[UIApplicationOpenURLOptionsEventAttributionKey] = options.eventAttribution;
550 return convertedOptions;
553- (
BOOL)application:(UIApplication*)application handleOpenURL:(NSURL*)url {
554 for (NSObject<FlutterApplicationLifeCycleDelegate>* delegate in
_delegates.allObjects) {
558 if ([delegate respondsToSelector:_cmd]) {
559 if ([delegate application:application handleOpenURL:url]) {
567- (
BOOL)application:(UIApplication*)application
569 sourceApplication:(NSString*)sourceApplication
570 annotation:(
id)annotation {
571 for (NSObject<FlutterApplicationLifeCycleDelegate>* delegate in
_delegates.allObjects) {
575 if ([delegate respondsToSelector:_cmd]) {
576 if ([delegate application:application
578 sourceApplication:sourceApplication
579 annotation:annotation]) {
587- (void)application:(UIApplication*)application
588 performActionForShortcutItem:(UIApplicationShortcutItem*)shortcutItem
589 completionHandler:(
void (^)(
BOOL succeeded))completionHandler {
590 [
self application:application
591 performActionForShortcutItem:shortcutItem
592 completionHandler:completionHandler
593 isFallbackForScene:NO];
596- (
BOOL)sceneFallbackPerformActionForShortcutItem:(UIApplicationShortcutItem*)shortcutItem
597 completionHandler:(
void (^)(
BOOL succeeded))completionHandler {
602 return [
self application:application
603 performActionForShortcutItem:shortcutItem
604 completionHandler:completionHandler
605 isFallbackForScene:YES];
608- (
BOOL)application:(UIApplication*)application
609 performActionForShortcutItem:(UIApplicationShortcutItem*)shortcutItem
610 completionHandler:(
void (^)(
BOOL succeeded))completionHandler
611 isFallbackForScene:(
BOOL)isFallback {
612 for (NSObject<FlutterApplicationLifeCycleDelegate>* delegate in
_delegates.allObjects) {
613 if (!delegate || (isFallback && [
self pluginSupportsSceneLifecycle:delegate])) {
617 respondsToSelector:@selector(
618 application:performActionForShortcutItem:completionHandler:)]) {
619 if ([delegate application:application
620 performActionForShortcutItem:shortcutItem
621 completionHandler:completionHandler]) {
629- (
BOOL)application:(UIApplication*)application
630 handleEventsForBackgroundURLSession:(nonnull NSString*)identifier
631 completionHandler:(nonnull
void (^)())completionHandler {
632 for (NSObject<FlutterApplicationLifeCycleDelegate>* delegate in
_delegates.allObjects) {
636 if ([delegate respondsToSelector:_cmd]) {
637 if ([delegate application:application
638 handleEventsForBackgroundURLSession:identifier
639 completionHandler:completionHandler]) {
647- (
BOOL)application:(UIApplication*)application
648 performFetchWithCompletionHandler:(
void (^)(UIBackgroundFetchResult result))completionHandler {
649 for (NSObject<FlutterApplicationLifeCycleDelegate>* delegate in
_delegates.allObjects) {
653 if ([delegate respondsToSelector:_cmd]) {
654 if ([delegate application:application performFetchWithCompletionHandler:completionHandler]) {
662- (
BOOL)application:(UIApplication*)application
663 continueUserActivity:(NSUserActivity*)userActivity
664 restorationHandler:(
void (^)(NSArray*))restorationHandler {
665 return [
self application:application
666 continueUserActivity:userActivity
667 restorationHandler:restorationHandler
668 isFallbackForScene:NO];