Mac deployment (clang) : @BUNDLEIDENTIFIER@ in Info.plist replaced with com.yourcompany
-
Hi,
I am developing on MacOSX 10.8 with Clang x86 64bit, with Qt 5.2.1 (and 5.2.0 before that).
Here is my problem : in my .app, in Info.plist, the key CFBundleIdentifier equals com.yourcompany.MyApp. It is a problem because I want to deploy my application, and I want to replace com.yourcompany by my own value.
I have looked for a solution, and I found that normally, this value is set by setting QMAKE_TARGET_BUNDLE_PREFIX in the .pro ( https://bugreports.qt-project.org/browse/QTBUG-19006 ).
Unfortunately, after looking into Qt's code, I realized that this solution was only available when compiling with pbuilder : when using Clang, "@BUNDLEIDENTIFIER@" is replaced automatically with com.yourcompany, and the value of QMAKE_TARGET_BUNDLE_PREFIX is not read.Qt/5.2.1/Src/qtbase/qmake/generators/mac/pbuilder_pbx.cpp :
@
QString bundlePrefix = project->first("QMAKE_TARGET_BUNDLE_PREFIX").toQString();
if (bundlePrefix.isEmpty())
bundlePrefix = "com.yourcompany";
plist_in_text = plist_in_text.replace("@BUNDLEIDENTIFIER@", bundlePrefix + "." + QLatin1String("${PRODUCT_NAME:rfc1034identifier}"));
@Qt/5.2.1/Src/qtbase/qmake/generators/unix/unixmake2.cpp :
@
QString bundleIdentifier = "com.yourcompany." + var("QMAKE_BUNDLE");
if (bundleIdentifier.endsWith(".app"))
bundleIdentifier.chop(4);
t << "@$(DEL_FILE) " << info_plist_out << "\n\t"
<< "@sed ";
foreach (const ProString &arg, commonSedArgs)
t << arg;
t << "-e "s,@ICON@," << icon.section(Option::dir_sep, -1) << ",g" "
<< "-e "s,@BUNDLEIDENTIFIER@," << bundleIdentifier << ",g" "
@For now, the only solutions I found are :
- make my own Info.plist, but it would be complicated if it is just to change one key...
- replace manually the default value. That is the solution that I chose, because I use a bash script to deploy my application by creating a .pkg file. This way, I just have to do :
@sed -i '' -e 's/com.yourcompany/com.MyCompany/g' MyApp.app/Contents/Info.plist@
I could keep going like this, but I came on this forum because I think that it deserved to be mentioned somewhere, and in case someone has a better solution. I didn't report a bug, because I am not sure that it is one : it has already been reported but only fixed for the pbuilder compilation, so maybe there is a reason why it is not done for Clang.
I hope this will be useful for other people who might have the same problem.
If you know a better solution, please tell me !
Thanks ! :)
Kniebou
EDIT : with Qt 5.2.0, the CFBundleIdentifier key equals "@BUNDLEIDENTIFIER@", and is not replaced with com.yourcompany anymore. This was fixed in 5.2.1 : now it is replaced with com.yourcompany again.
-
Hi and welcome to devnet,
I can't really comment on why it hasn't been fixed for both however a fix for that is in progress
-
Hi and thank you for your answer :)
Is it possible to follow the progress of fixes ? It would be helpful to know when they are available.
Thanks !
Kniebou
-
If a bug report has been opened then the bug report itself, and/or the related submissions :)
-
Ok thank you, I will look if I find a bug report about it :)
-
There's currently no bug report attached to this one
-
Ok, thanks ! I just posted a comment on the bug report I talked about.
-
The problem is fixed with Qt 5.3 RC !!
Qt/5.3/Src/qtbase/qmake/generators/unix/unixmake2.cpp :
@
QString bundlePrefix = project->first("QMAKE_TARGET_BUNDLE_PREFIX").toQString();
if (bundlePrefix.isEmpty())
bundlePrefix = "com.yourcompany.";
QString bundleIdentifier = bundlePrefix + var("QMAKE_BUNDLE");(...)
t << "-e "s,@ICON@," << icon.section(Option::dir_sep, -1) << ",g" "
<< "-e "s,@BUNDLEIDENTIFIER@," << bundleIdentifier << ",g" "
@The only thing is that you must put a "." at the end of QMAKE_TARGET_BUNDLE_PREFIX, which is not the case with pbuilder...
-
Good catch, a fix for that is under review
-
Fixed in Qt 5.3.1 !
"https://qt.gitorious.org/qt/qtbase/source/b1d99dad098320777a4391052eac531c834748fa:dist/changes-5.3.1":https://qt.gitorious.org/qt/qtbase/source/b1d99dad098320777a4391052eac531c834748fa:dist/changes-5.3.1
Thanks for everything !! :)
-
Hi,
i've got custom .plist file in my app...with 5.3.1 i got following error while compiling app for iOS
CFBundleIdentifier '@BUNDLEIDENTIFIER@' contains illegal character '@'
The same app was compiled with 5.3.0 without any errors. For now i've set CFBundleIdentifier with my company string and it works ok.
Cheers
-
How does your plist look like ?
-
It was the default one from /ios/mkspecs/macx-ios-clang/, plus i've added two additional keys at the end
@<?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>CFBundleIconFile</key>
<string>@ICON@</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleGetInfoString</key>
<string>Created by Qt/QMake</string>
<key>CFBundleSignature</key>
<string>@TYPEINFO@</string>
<key>CFBundleExecutable</key>
<string>@EXECUTABLE@</string>
<key>CFBundleIdentifier</key>
<string>@BUNDLEIDENTIFIER@</string>
<key>CFBundleDisplayName</key>
<string>${PRODUCT_NAME}</string>
<key>CFBundleName</key>
<string>${PRODUCT_NAME}</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1.0</string>
<key>NOTE</key>
<string>This file was generated by Qt/QMake.</string>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UIStatusBarHidden</key>
<true/>
</dict>
</plist>@ -
At what stage do you get that error ?
-
I've created now new project just for test purposes.
The only thing that i've done now was copying default plist file and addingQMAKE_INFO_PLIST = my.plist in .pro file.
The error appears at following stage :
ProcessProductPackaging /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.1.sdk/Entitlements.plist Err.build/Debug-iphoneos/Err.build/Err.xcent
cd /Users/Robert/WORK/development/QT/projects/build-Err-iphoneos_clang_Qt_5_3_1_for_iOS-Debug
export PATH="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin"
builtin-productPackagingUtility /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.1.sdk/Entitlements.plist -entitlements -format xml -o /Users/Robert/WORK/development/QT/projects/build-Err-iphoneos_clang_Qt_5_3_1_for_iOS-Debug/Err.build/Debug-iphoneos/Err.build/Err.xcent
(null): error: CFBundleIdentifier '@BUNDLEIDENTIFIER@' contains illegal character '@'
invalid bundle identifier '@BUNDLEIDENTIFIER@' -
I would say that you where lucky before. AFAIK these are placeholder values meant to be replaced with something sensible or if nothing is given, removed.