问题描述
我有一个Mac Catalyst应用程序,该应用程序本质上是一个单窗口的应用程序,但是我添加了多窗口支持(使用场景),以便为一个功能打开第二个窗口,一小部分用户将使用该窗口。现在,Apple已拒绝了该应用程序,因为有了多窗口支持,当用户单击主窗口顶部的红色按钮时,该应用程序不会退出。一种解决方案是提供一个菜单项来重新打开它,但我认为,如果该应用程序像以前一样简单退出,对于用户来说将更加直观。
我发现了类似的问题on the Apple forums,并且正在尝试实施所提供的解决方案。使用提供更多设置说明的this tutorial,我将macOS捆绑软件添加为新目标,并将其嵌入到iOS目标中,并将此类添加到捆绑软件中:
#import "AppKitBridge.h"
@implementation AppKitBridge
@synthesize application;
@synthesize window;
- (id)init {
NSLog(@"AppKitBridge init");
self = [super init];
self.application = [NSApplication sharedApplication];
self.window = [[self.application windows] firstObject];
if (self.window) {
self.application.delegate = self;
self.window.delegate = self;
} else {
NSLog(@"AppKitBridge error: window is nil");
}
return self;
}
- (void)test {
NSArray *windows = NSApplication.sharedApplication.windows;
for (NSWindow *window in windows) {
NSLog(@"AppKitBridge window: %@",window);
}
}
- (void)applicationDidUpdate:(NSNotification *)notification {
NSLog(@"AppKitBridge applicationDidUpdate");
}
- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)sender {
NSLog(@"AppKitBridge applicationShouldTerminateAfterLastWindowClosed");
return TRUE;
}
- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender {
NSLog(@"AppKitBridge applicationShouldTerminate");
return TRUE;
}
@end
然后在iOS应用的初始视图控制器的viewDidLoad中,我调用此方法来加载包:
- (void)enableAppKit {
NSString *pluginPath = [[[NSBundle mainBundle] builtInPlugInsPath] stringByAppendingPathComponent:@"AppKit.bundle"];
NSBundle *bundle = [NSBundle bundleWithPath:pluginPath];
[bundle load];
NSObject *appKit = [[[bundle classNamed:@"AppKitBridge"] alloc] init];
[appKit performSelector:@selector(test) withObject:nil afterDelay:0];
}
当我运行应用程序时,控制台会显示AppKitBridge init
,AppKitBridge window
和AppKitBridge applicationDidUpdate
行。因此,似乎整体设置正常。但是,当我单击红色的窗口按钮时,它不会显示AppKitBridge applicationShouldTerminateAfterLastWindowClosed
或AppKitBridge applicationShouldTerminate
行,并且该应用程序不会退出。
这应该能达到我的期望吗?如果是,我在设置中缺少什么?
解决方法
问题是这一行:
NSObject *appKit = [[[bundle classNamed:@"AppKitBridge"] alloc] init];
您的appKit
对象是一个局部变量,因此您的AppKitBridge实例在以后的一行中不再存在。如果要用作应用程序/窗口委托,则需要该对象 persist 。将其分配给某些持久对象的实例属性。