MacOS .app文件无法双击打开

3

我有一个C++程序,应该从argv中获取文件名,打开此文件并与其一起工作。

程序运行得非常好,因为:当我从终端调用二进制文件(Unix可执行文件)时,程序会从argv中获取名称并与其一起工作,但是当我从此二进制文件制作MacOS程序.app时,然后双击要打开的文件,程序会抛出此错误:

Sengine Error while opening .mdl files

再次说明,如果我启动已经在.app目录中的二进制文件,一切正常,但是如果我从终端运行程序.app,程序将再次抛出此错误。

我测试过的终端命令列表:

open -a /Applications/Sengine.app obj/rogers.mdl - 没有工作

/Applications/Sengine.app/Contents/MacOS/SENGINE obj/rogers.mdl - 工作正常

cmake-build-debug/SENGINE obj/rogers.mdl - 工作正常

我使用cmake编译程序:

/Applications/CLion.app/Contents/bin/cmake/mac/bin/cmake --build cmake-build-debug --target SENGINE -- -j 3

以防万一,这是.app程序的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>CFBundleDisplayName</key>
    <string>Sengine</string>
    <key>CFBundleExecutable</key>
    <string>Sengine</string>
    <key>CFBundleIconFile</key>
    <string>icon.icns</string>
    <key>CFBundleIdentifier</key>
    <string>com.zolars.sengine-department.SENGINE</string>
    <key>CFBundleInfoDictionaryVersion</key>
    <string>6.0</string>
    <key>CFBundleName</key>
    <string>Sengine</string>
    <key>CFBundlePackageType</key>
    <string>APPL</string>
    <key>CFBundleShortVersionString</key>
    <string>3.0.0</string>
    <key>NSHighResolutionCapable</key>
    <true/>
    <key>CFBundleDocumentTypes</key>
    <array>
        <dict>
            <key>CFBundleTypeIconFiles</key>
                <string>mdl.icns</string>
            <key>LSItemContentTypes</key>
                <array>
                        <string>mdl</string>
                </array>
            <key>LSHandlerRank</key>
            <string>Owner</string>
        </dict>
    </array>
</dict>
</plist>

如果我理解正确,双击文件后,文件名无法传递到源二进制文件。我无法弄清楚原因,也不知道如何修复。

请帮助我解决这个问题。


这个有用吗?(实现(void)application:(NSApplication *)sender openFiles:(NSArray *)filenames)还是这个?(以编程方式更改打开文件类型的默认应用程序) - starball
1个回答

3
当您运行命令行程序时,它会像所有命令行程序一样读取argv/argc。但是,当您将其打包到带有PLIST的.app目录中时,您正在指示它使用Launch Services和Info.plist文件。
通过这样做,您可以更改它如何打开文件。使用Launch Services,您可以让应用程序保持运行状态,并继续将新文件交给它而无需重新启动。您在问题中已经看到了一个实现方法的例子:
open -a /Applications/Sengine.app obj/rogers.mdl

为了实现这一点,应用程序需要处理application(_:openFiles:)方法。如果不在应用程序中添加此功能,您将需要一些中间启动器来提供openFiles并通过system()或类似方式执行您的应用程序。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接