我正在使用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文件。
以下是我完成的一些测试:
我认为问题与权限访问有关。这个单一的命令行解决了我的问题,但当然我不能为我的用户提供这个解决方案:
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签名工具不是很熟悉,所以任何帮助都会受到高度赞赏。谢谢。
答案 0 :(得分:4)
可能不是您正在寻找的答案,但最佳做法是将数据存储在可执行文件中一段时间。在QApplication::applicationDirPath()
的位置写作是不可取的。
理想情况下,您应该将运行时信息存储在标准位置:
http://doc.qt.io/qt-5/qstandardpaths.html#StandardLocation-enum
QStandardPaths::standardLocations(QStandardPaths::AppDataLocation).first();