#import #import @interface AppDelegate : NSObject @property NSButton *installButton; @property NSTextField *statusLabel; @end @implementation AppDelegate - (void)applicationDidFinishLaunching:(NSNotification *)notification { NSWindow *window = [[NSWindow alloc] initWithContentRect:NSMakeRect(0, 0, 400, 200) styleMask:NSWindowStyleMaskTitled | NSWindowStyleMaskClosable backing:NSBackingStoreBuffered defer:NO]; [window setTitle:@"MarkBaseFS Installer"]; [window center]; // Status label self.statusLabel = [[NSTextField alloc] initWithFrame:NSMakeRect(20, 140, 360, 24)]; [self.statusLabel setStringValue:@"Ready to install MarkBaseFS System Extension"]; [self.statusLabel setBezeled:NO]; [self.statusLabel setDrawsBackground:NO]; [self.statusLabel setEditable:NO]; [[window contentView] addSubview:self.statusLabel]; // Install button self.installButton = [[NSButton alloc] initWithFrame:NSMakeRect(150, 80, 100, 32)]; [self.installButton setTitle:@"Install"]; [self.installButton setBezelStyle:NSBezelStyleRounded]; [self.installButton setTarget:self]; [self.installButton setAction:@selector(installExtension:)]; [[window contentView] addSubview:self.installButton]; [window makeKeyAndOrderFront:nil]; } - (void)installExtension:(id)sender { [self.statusLabel setStringValue:@"Submitting installation request..."]; [self.installButton setEnabled:NO]; NSString *bundleID = @"com.momentry.markbase.fskit"; OSSystemExtensionRequest *request = [OSSystemExtensionRequest activationRequestForExtensionWithIdentifier:bundleID queue:[NSOperationQueue mainQueue]]; request.delegate = self; [[OSSystemExtensionManager sharedManager] submitRequest:request]; NSLog(@"Installation request submitted for %@", bundleID); } - (void)request:(OSSystemExtensionRequest *)request didFinishWithResult:(OSSystemExtensionRequestResult)result { [self.statusLabel setStringValue:@"✅ Installation succeeded!"]; NSLog(@"Installation succeeded: %ld", (long)result); // Check installed extensions [[OSSystemExtensionManager sharedManager] getSystemExtensionsWithCompletionHandler: ^(NSArray *extensions) { NSLog(@"Installed extensions: %@", extensions); }]; } - (void)request:(OSSystemExtensionRequest *)request didFailWithError:(NSError *)error { [self.statusLabel setStringValue:@"❌ Installation failed"]; NSLog(@"Installation failed: %@ (Code: %ld)", error.localizedDescription, (long)error.code); NSLog(@"Domain: %@", error.domain); [self.installButton setEnabled:YES]; } - (void)requestNeedsUserApproval:(OSSystemExtensionRequest *)request { [self.statusLabel setStringValue:@"⚠️ Please approve in System Settings → Privacy & Security"]; NSLog(@"User approval required"); } - (OSSystemExtensionReplacementAction)request:(OSSystemExtensionRequest *)request actionForReplacingExtension:(OSSystemExtensionProperties *)existing withExtension:(OSSystemExtensionProperties *)newExt { NSLog(@"Replacing existing extension..."); return OSSystemExtensionReplacementActionReplace; } @end int main(int argc, const char *argv[]) { NSApplication *app = [NSApplication sharedApplication]; AppDelegate *delegate = [[AppDelegate alloc] init]; [app setDelegate:delegate]; [app run]; return 0; }