Flutter Engine
The Flutter Engine
FlutterAppDelegate.mm
Go to the documentation of this file.
1// Copyright 2013 The Flutter Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#import "flutter/shell/platform/darwin/macos/framework/Headers/FlutterAppDelegate.h"
6#import "flutter/shell/platform/darwin/macos/framework/Source/FlutterAppDelegate_Internal.h"
7
8#import <AppKit/AppKit.h>
9
10#include "flutter/fml/logging.h"
11#import "flutter/shell/platform/darwin/macos/framework/Headers/FlutterAppLifecycleDelegate.h"
12#import "flutter/shell/platform/darwin/macos/framework/Source/FlutterAppLifecycleDelegate_Internal.h"
13#include "flutter/shell/platform/embedder/embedder.h"
14
15@interface FlutterAppDelegate ()
16
17/**
18 * Returns the display name of the application as set in the Info.plist.
19 */
20- (NSString*)applicationName;
21
23@end
24
25@implementation FlutterAppDelegate
26
27- (instancetype)init {
28 if (self = [super init]) {
29 _terminationHandler = nil;
30 _lifecycleRegistrar = [[FlutterAppLifecycleRegistrar alloc] init];
31 }
32 return self;
33}
34
35- (void)applicationWillFinishLaunching:(NSNotification*)notification {
36 // Update UI elements to match the application name.
37 NSString* applicationName = [self applicationName];
38 _mainFlutterWindow.title = applicationName;
39 for (NSMenuItem* menuItem in _applicationMenu.itemArray) {
40 menuItem.title = [menuItem.title stringByReplacingOccurrencesOfString:@"APP_NAME"
41 withString:applicationName];
42 }
43}
44
45#pragma mark - Delegate handling
46
47- (void)addApplicationLifecycleDelegate:(NSObject<FlutterAppLifecycleDelegate>*)delegate {
48 [self.lifecycleRegistrar addDelegate:delegate];
49}
50
51- (void)removeApplicationLifecycleDelegate:(NSObject<FlutterAppLifecycleDelegate>*)delegate {
52 [self.lifecycleRegistrar removeDelegate:delegate];
53}
54
55#pragma mark Private Methods
56
57- (NSString*)applicationName {
58 NSString* applicationName =
59 [NSBundle.mainBundle objectForInfoDictionaryKey:@"CFBundleDisplayName"];
60 if (!applicationName) {
61 applicationName = [NSBundle.mainBundle objectForInfoDictionaryKey:@"CFBundleName"];
62 }
63 return applicationName;
64}
65
66#pragma mark NSApplicationDelegate
67
68- (void)application:(NSApplication*)application openURLs:(NSArray<NSURL*>*)urls {
69 for (NSObject<FlutterAppLifecycleDelegate>* delegate in self.lifecycleRegistrar.delegates) {
70 if ([delegate respondsToSelector:@selector(handleOpenURLs:)] &&
71 [delegate handleOpenURLs:urls]) {
72 return;
73 }
74 }
75}
76
77- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication* _Nonnull)sender {
78 // If the framework has already told us to terminate, terminate immediately.
79 if ([self terminationHandler] == nil || [[self terminationHandler] shouldTerminate]) {
80 return NSTerminateNow;
81 }
82
83 // Send a termination request to the framework.
84 FlutterEngineTerminationHandler* terminationHandler = [self terminationHandler];
85 [terminationHandler requestApplicationTermination:sender
86 exitType:kFlutterAppExitTypeCancelable
87 result:nil];
88
89 // Cancel termination to allow the framework to handle the request asynchronously. When the
90 // termination request returns from the app, if termination is desired, this method will be
91 // reinvoked with self.terminationHandler.shouldTerminate set to YES.
92 return NSTerminateCancel;
93}
94
95@end
void requestApplicationTermination:exitType:result:(NSApplication *sender,[exitType] FlutterAppExitType type,[result] nullable FlutterResult result)
FlutterEngineTerminationHandler * terminationHandler
FlutterAppLifecycleRegistrar * lifecycleRegistrar
static bool init()
BOOL handleOpenURLs:(NSArray< NSURL * > *urls)