我有一个使用SwiftUI构建的单窗口macOS应用程序.应用程序导出一个新的类型标识符,并将自己注册为该文档类型的编辑器.

预期行为:双击该类型的文件时,我希望应用程序启动(如果未运行),并使用文件路径调用我的AppDelegate应用程序(\uOpenFile:)方法.

实际行为:应用程序启动,但从未调用openFile.如果应用程序已经在运行,则会创建一个新的主窗口,我也不希望这样,并且永远不会调用openFile.

Info.plist:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>CFBundleDocumentTypes</key>
    <array>
        <dict>
            <key>CFBundleTypeName</key>
            <string>Launch Tester File</string>
            <key>CFBundleTypeRole</key>
            <string>Editor</string>
            <key>LSHandlerRank</key>
            <string>Default</string>
            <key>LSItemContentTypes</key>
            <array>
                <string>com.mrrsoftware.ltfile</string>
            </array>
        </dict>
    </array>
    <key>UTExportedTypeDeclarations</key>
    <array>
        <dict>
            <key>UTTypeConformsTo</key>
            <array>
                <string>public.json</string>
            </array>
            <key>UTTypeDescription</key>
            <string>Launch Tester File</string>
            <key>UTTypeIcons</key>
            <dict/>
            <key>UTTypeIdentifier</key>
            <string>com.mrrsoftware.ltfile</string>
            <key>UTTypeTagSpecification</key>
            <dict>
                <key>public.filename-extension</key>
                <array>
                    <string>ltfile</string>
                </array>
            </dict>
        </dict>
    </array>
</dict>
</plist>

App file:

import SwiftUI

@main
struct LaunchTesterApp: App {
    @NSApplicationDelegateAdaptor private var appDeletate : MyAppDelegate
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
        .commands {
            CommandGroup(replacing: .newItem, addition: { })
        }
    }
}

class MyAppDelegate: NSObject, NSApplicationDelegate, ObservableObject {
    func applicationWillFinishLaunching(_ notification: Notification) {
        print("WillFinishLaunching")
    }
    
    func applicationDidFinishLaunching(_ notification: Notification) {
        print("DidFinishLaunching")
        NSWindow.allowsAutomaticWindowTabbing = false
    }
    
    func application(_ sender: NSApplication, openFile filename: String) -> Bool {
        print( "AppDelegate openFile: \(filename)")
        return true
    }
}

如何让应用程序调用我的AppDelegate应用程序(\uOpenFile:)方法,而不是打开新窗口?

推荐答案

改用

class AppDelegate: NSObject, NSApplicationDelegate {
    func application(_ application: NSApplication, open urls: [URL]) {
        print(">> \(urls)")
    }

使用Xcode 13.4/macOS 12.4进行测试

Swift相关问答推荐

从 Finder 打开文件时,SwiftUI 的应用程序(_ openFile:) 从未调用过

Swift 覆盖实例变量

如何快速截取 UIView 的屏幕截图?

Swift - 迭代 struct 对象时如何对其进行变异

使用 Swift 以编程方式自定义 UITableViewCell

Objective-C 方法与可选需求方法 Swift 冲突

如何将 Int 拆分为其各个数字?

迭代 Firebase 中的子快照

如何在swift中的每N个字符处为字符串添加分隔符?

在这个例子中美元符号有什么作用?

判断字符串是否包含 Swift 中的特殊字符

如何在 Codable 类型中使用 Any

弃用 Swift C 样式循环后循环中的递减索引

Xcode/Swift“文件名使用了两次”构建错误

检测 UITextField 中的退格事件

同时关闭多个视图控制器

@NSManaged 有什么作用?

Swift过滤器字典错误:无法将“[(_,_)]”类型的值分配给“[_:_]”类型的值

如何在 Swift 中使用属性字符串附加属性文本字符串

Xcode 11.4.导航的标题 colored颜色 从情节提要中变为黑色