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
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.