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 (@available(iOS 14.5, *)) {
548 if (options.eventAttribution) {
549 convertedOptions[UIApplicationOpenURLOptionsEventAttributionKey] = options.eventAttribution;
552 return convertedOptions;
555- (
BOOL)application:(UIApplication*)application handleOpenURL:(NSURL*)url {
556 for (NSObject<FlutterApplicationLifeCycleDelegate>* delegate in
_delegates.allObjects) {
560 if ([delegate respondsToSelector:_cmd]) {
561 if ([delegate application:application handleOpenURL:url]) {
569- (
BOOL)application:(UIApplication*)application
571 sourceApplication:(NSString*)sourceApplication
572 annotation:(
id)annotation {
573 for (NSObject<FlutterApplicationLifeCycleDelegate>* delegate in
_delegates.allObjects) {
577 if ([delegate respondsToSelector:_cmd]) {
578 if ([delegate application:application
580 sourceApplication:sourceApplication
581 annotation:annotation]) {
589- (void)application:(UIApplication*)application
590 performActionForShortcutItem:(UIApplicationShortcutItem*)shortcutItem
591 completionHandler:(
void (^)(
BOOL succeeded))completionHandler {
592 [
self application:application
593 performActionForShortcutItem:shortcutItem
594 completionHandler:completionHandler
595 isFallbackForScene:NO];
598- (
BOOL)sceneFallbackPerformActionForShortcutItem:(UIApplicationShortcutItem*)shortcutItem
599 completionHandler:(
void (^)(
BOOL succeeded))completionHandler {
604 return [
self application:application
605 performActionForShortcutItem:shortcutItem
606 completionHandler:completionHandler
607 isFallbackForScene:YES];
610- (
BOOL)application:(UIApplication*)application
611 performActionForShortcutItem:(UIApplicationShortcutItem*)shortcutItem
612 completionHandler:(
void (^)(
BOOL succeeded))completionHandler
613 isFallbackForScene:(
BOOL)isFallback {
614 for (NSObject<FlutterApplicationLifeCycleDelegate>* delegate in
_delegates.allObjects) {
615 if (!delegate || (isFallback && [
self pluginSupportsSceneLifecycle:delegate])) {
619 respondsToSelector:@selector(
620 application:performActionForShortcutItem:completionHandler:)]) {
621 if ([delegate application:application
622 performActionForShortcutItem:shortcutItem
623 completionHandler:completionHandler]) {
631- (
BOOL)application:(UIApplication*)application
632 handleEventsForBackgroundURLSession:(nonnull NSString*)identifier
633 completionHandler:(nonnull
void (^)())completionHandler {
634 for (NSObject<FlutterApplicationLifeCycleDelegate>* delegate in
_delegates.allObjects) {
638 if ([delegate respondsToSelector:_cmd]) {
639 if ([delegate application:application
640 handleEventsForBackgroundURLSession:identifier
641 completionHandler:completionHandler]) {
649- (
BOOL)application:(UIApplication*)application
650 performFetchWithCompletionHandler:(
void (^)(UIBackgroundFetchResult result))completionHandler {
651 for (NSObject<FlutterApplicationLifeCycleDelegate>* delegate in
_delegates.allObjects) {
655 if ([delegate respondsToSelector:_cmd]) {
656 if ([delegate application:application performFetchWithCompletionHandler:completionHandler]) {
664- (
BOOL)application:(UIApplication*)application
665 continueUserActivity:(NSUserActivity*)userActivity
666 restorationHandler:(
void (^)(NSArray*))restorationHandler {
667 return [
self application:application
668 continueUserActivity:userActivity
669 restorationHandler:restorationHandler
670 isFallbackForScene:NO];