Problems with Open-Source Downloads read https://www.qt.io/blog/problem-with-open-source-downloads and https://forum.qt.io/post/638946

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 :

    1. make my own Info.plist, but it would be complicated if it is just to change one key...
    2. 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.


  • Lifetime Qt Champion

    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


  • Lifetime Qt Champion

    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 :)


  • Lifetime Qt Champion

    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...


  • Lifetime Qt Champion

    Good catch, a fix for that is under review





  • 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


  • Lifetime Qt Champion

    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>@


  • Lifetime Qt Champion

    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 adding

    QMAKE_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@'


  • Lifetime Qt Champion

    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.


Log in to reply