在MAC OS Sierra上使用Qt app的Permisison问题

时间:2016-11-07 15:41:07

标签: macos qt sign

我正在使用Qt 5.6开发跨平台应用程序。应用程序启动时,它会在app目录中创建一个文件:

QFile file;

// /MyApp.app/Contents/MacOS
file.setFileName(QApplication::applicationDirPath() + QString("/file.csv"); 
file.open(QIODevice::ReadWrite | QIODevice::Truncate);

...

file.close();

这适用于旧的OS X版本,但是自Sierra以来,此文件不会重新生成(仅当应用程序是从Internet下载时)。请注意,我不会在MAC商店上发布我的应用程序,只需使用.dmg文件。

以下是我完成的一些测试:

  • 编译应用并启动Sierra =>的确定
  • 编译应用,创建.dmg并启动Sierra =>的确定
  • 编译应用,创建.dmg(我上传),在Sierra =>上下载并启动应用的 FAIL

我认为问题与权限访问有关。这个单一的命令行解决了我的问题,但当然我不能为我的用户提供这个解决方案:

sudo spctl --master-disable

这是我签署申请的方式:

# Signing application
codesign --force --deep --sign "Developer ID Application: *** ***" /MyPath/MyApp.app 

# Validating signature
spctl --assess --verbose /MyPath/MyApp.app

这是我的info.plist文件,由Qt生成:

<?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>NSPrincipalClass</key>
    <string>NSApplication</string>
    <key>CFBundleIconFile</key>
    <string>mac_app_icon.icns</string>
    <key>CFBundlePackageType</key>
    <string>APPL</string>
    <key>CFBundleGetInfoString</key>
    <string>Created by Qt/QMake</string>
    <key>CFBundleSignature</key>
    <string>????</string>
    <key>CFBundleExecutable</key>
    <string>MyApp</string>
    <key>CFBundleIdentifier</key>
    <string>com.company.myapp</string>
    <key>NOTE</key>
    <string>This file was generated by Qt/QMake.</string>
    <key>LSUIElement</key>
    <true/>
</dict>
</plist>

我对MAC签名工具不是很熟悉,所以任何帮助都会受到高度赞赏。谢谢。

1 个答案:

答案 0 :(得分:4)

可能不是您正在寻找的答案,但最佳做法是将数据存储在可执行文件中一段时间​​。在QApplication::applicationDirPath()的位置写作是不可取的。

理想情况下,您应该将运行时信息存储在标准位置:

http://doc.qt.io/qt-5/qstandardpaths.html#StandardLocation-enum

QStandardPaths::standardLocations(QStandardPaths::AppDataLocation).first();