2014-09-05 73 views
2

對於背景審查,我使用Qt 5.3.1與OSX 10.9的Xcode 5.1.1。提交的Qt 5.3的應用程序在Mac App Store中

經過一番掙扎後,我終於能得到我的應用程序的PKG文件通過Application Loader上傳和出現在我的應用程序在iTunes Connect我的「預發行」構建列表。但是,一旦我構建添加到應用程序,然後點擊「提交審覈」我得到的錯誤以下轉換:

ITC.apps.assetvalidation.DESKTOP_MISSING_NESTED_BUNDLE_IDENTIFIER.error.message 
The Info.plist of the nested bundle must contain a valid CFBundleExecutable key. 
ITC.apps.assetvalidation.DESKTOP_MISSING_NESTED_BUNDLE_IDENTIFIER.error.message 
The Info.plist of the nested bundle must contain a valid CFBundleExecutable key. 
ITC.apps.assetvalidation.DESKTOP_MISSING_NESTED_BUNDLE_IDENTIFIER.error.message 
The Info.plist of the nested bundle must contain a valid CFBundleExecutable key. 
ITC.apps.assetvalidation.DESKTOP_MISSING_NESTED_BUNDLE_IDENTIFIER.error.message 
The Info.plist of the nested bundle must contain a valid CFBundleExecutable key. 
ITC.apps.assetvalidation.DESKTOP_MISSING_NESTED_BUNDLE_IDENTIFIER.error.message 
The Info.plist of the nested bundle must contain a valid CFBundleExecutable key. 
ITC.apps.assetvalidation.DESKTOP_MISSING_NESTED_BUNDLE_IDENTIFIER.error.message 
The Info.plist of the nested bundle must contain a valid CFBundleExecutable key. 
ITC.apps.assetvalidation.DESKTOP_MISSING_NESTED_BUNDLE_IDENTIFIER.error.message 
The Info.plist of the nested bundle must contain a valid CFBundleExecutable key. 
ITC.apps.assetvalidation.DESKTOP_MISSING_NESTED_BUNDLE_IDENTIFIER.error.message 
The Info.plist of the nested bundle must contain a valid CFBundleExecutable key. 
ITC.apps.assetvalidation.DESKTOP_MISSING_NESTED_BUNDLE_IDENTIFIER.error.message 
The Info.plist of the nested bundle must contain a valid CFBundleExecutable key. 
The nested bundle must contain an executable that matches the CFBundleExecutable key in the Info.plist of the nested bundle . 
ITC.apps.assetvalidation.DESKTOP_MISSING_NESTED_BUNDLE_IDENTIFIER.error.message 
The Info.plist of the nested bundle must contain a valid CFBundleExecutable key. 
ITC.apps.assetvalidation.DESKTOP_MISSING_NESTED_BUNDLE_IDENTIFIER.error.message 
The Info.plist of the nested bundle must contain a valid CFBundleExecutable key. 
ITC.apps.assetvalidation.DESKTOP_MISSING_NESTED_BUNDLE_IDENTIFIER.error.message 
The Info.plist of the nested bundle must contain a valid CFBundleExecutable key. 
ITC.apps.assetvalidation.DESKTOP_MISSING_NESTED_BUNDLE_IDENTIFIER.error.message 
The Info.plist of the nested bundle must contain a valid CFBundleExecutable key. 
ITC.apps.assetvalidation.DESKTOP_MISSING_NESTED_BUNDLE_IDENTIFIER.error.message 
The Info.plist of the nested bundle must contain a valid CFBundleExecutable key. 
ITC.apps.assetvalidation.DESKTOP_MISSING_NESTED_BUNDLE_IDENTIFIER.error.message 
The Info.plist of the nested bundle must contain a valid CFBundleExecutable key. 
ITC.apps.assetvalidation.DESKTOP_MISSING_NESTED_BUNDLE_IDENTIFIER.error.message 
The Info.plist of the nested bundle must contain a valid CFBundleExecutable key. 
ITC.apps.assetvalidation.DESKTOP_MISSING_NESTED_BUNDLE_IDENTIFIER.error.message 
The Info.plist of the nested bundle must contain a valid CFBundleExecutable key. 
ITC.apps.assetvalidation.DESKTOP_MISSING_NESTED_BUNDLE_IDENTIFIER.error.message 
The Info.plist of the nested bundle must contain a valid CFBundleExecutable key. 

我申請在該答覆中提到的注意事項:Sign a Framework for OSX 10.9

基本上,我通過Xcode構建我的應用程序(在發佈模式下),然後使用我編寫的一個小腳本來幫助自動完成應用商店的準備工作。腳本的要點是在這裏:

import os 
import shutil 
import subprocess 
import sys 

bundleFolder = '/path/to/the/bundle/app' 
qtFolder = '/path/to/qt/et/al' 
entitlements = '/path/to/entitlesments/file' 

print 'Bundle folder: ', bundleFolder 
print 'Qt Folder: ', qtFolder 

print 'Executing macdeploy' 
subprocess.call([qtFolder + '/bin/macdeployqt', bundleFolder + '/Program.app']) 

frameworks = ['QtConcurrent', 'QtCore', 'QtGui', 'QtMultimedia', 'QtMultimediaWidgets', 'QtNetwork', 
    'QtOpenGL', 'QtPositioning', 'QtPrintSupport', 'QtQml', 'QtQuick', 'QtSensors', 'QtSql', 
    'QtWebKit', 'QtWebKitWidgets', 'QtWidgets', 'QtXml', 'QtXmlPatterns'] 

for fwork in frameworks : 
    print ('Copying Info.plist to frameworks: ' + fwork) 
    fworkFolder = qtFolder + '/lib/' + fwork + '.framework/Contents/Info.plist' 
    destFolder = bundleFolder + '/Program.app/Contents/Frameworks/' + fwork + '.framework/Resources/' 

    if (os.path.exists(destFolder)) : 
     print 'Copying ' + fworkFolder + ' to ' + destFolder 
     shutil.copy(fworkFolder,destFolder) 

print ('Deleting unnecessary PlugIns') 
rmFiles = ['accessible','audio', 'mediaservice', 'printsupport'] 

for rmFile in rmFiles : 
    fullFile = bundleFolder + r'/Program.app/Contents/PlugIns/' + rmFile 
    if (os.path.exists(fullFile)) : 
     print ('Deleting directory: ' + fullFile) 
     shutil.rmtree(fullFile) 

print ('Signing Qt Executables') 
for fwork in frameworks : 
    subprocess.call([r'/usr/bin/codesign', 
     r'--deep', 
     r'--force', 
     r'--verify', 
     r'--verbose', 
     r'--sign', 
     r'3rd Party Mac Developer Application: [valid info]', 
     r'--entitlements', 
     entitlements, 
     bundleFolder + '/Program.app/Contents/Frameworks/' + fwork + '.framework/Versions/5/' + fwork 
    ]) 

print ('Signing Bundle') 
subprocess.call([r'/usr/bin/codesign', 
    r'--deep', 
    r'--force', 
    r'--verify', 
    r'--verbose', 
    r'--sign', 
    r'3rd Party Mac Developer Application: [valid info]', 
    r'--entitlements', 
    entitlements, 
    bundleFolder + '/Program.app', 
]) 

print ("Building PKG") 
subprocess.call([r'/usr/bin/productbuild', 
    r'--component', 
    bundleFolder + '/Program.app', 
    r'/Applications', 
    r'Program-Installer.pkg' 
]) 

print ("Building Signed PKG") 
subprocess.call([r'/usr/bin/productsign', 
    r'--sign', 
    r'3rd Party Mac Developer Installer: [valid info]', 
    r'Program-Installer.pkg', 
    r'Program-Installer-Signed.pkg' 
]) 

我猜問題在於每一個人的Qt * .framework Info.plist中的文件中,但是當我往裏他們的信息看起來有效的,據我可以告訴,例如:

<?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>CFBundlePackageType</key> 
    <string>FMWK</string> 
    <key>CFBundleShortVersionString</key> 
    <string>5.3</string> 
    <key>CFBundleGetInfoString</key> 
    <string>Created by Qt/QMake</string> 
    <key>CFBundleSignature</key> 
    <string>????</string> 
    <key>CFBundleExecutable</key> 
    <string>QtConcurrent</string> 
    <key>NOTE</key> 
    <string>Please, do NOT change this file -- It was generated by Qt/QMake.</string> 
</dict> 
</plist> 

所以,我不明白爲什麼Mac App Store抱怨。有人有想法嗎?

謝謝!

+0

同樣在這裏。我認爲這可能是一個新的要求,即在嵌套包的plist文件(即YouApp.app而不是框架名稱)中擁有主應用程序的可執行名稱,但由於iTunesConnect不允許我更新構建。我刪除舊版本,上傳一個新版本,但是我仍然只有一個版本在服務器上(分開上傳)。如果您知道如何重新上傳二進制文件 - 我可以嘗試一下我的想法並回報。 – Gobra 2014-09-06 00:28:30

+0

我通過遞增內部版本號完成了上傳新的二進制文件。 – Addy 2014-09-06 01:12:00

+0

我甚至不能改變版本號後,看到在iTunes新建,但每次上傳我收到一個郵件具有相同的問題列表。所以,我想,我的想法不起作用。 – Gobra 2014-09-06 10:35:22

回答

3

我終於雖然它。這似乎是Qt的的Info.plist文件已損壞,即他們沒有足夠的信息和對蘋果服務器發生故障時的最後一步驗證。

爲了解決這個問題,我從一個原生Mac應用程序中包含的常規XCode編譯框架中取出Info.plist文件,並通過了驗證。內容是這樣的:

<?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>BuildMachineOSBuild</key> 
    <string>13E28</string> 
    <key>CFBundleDevelopmentRegion</key> 
    <string>English</string> 
    <key>CFBundleExecutable</key> 
    <string>BUNDLE_NAME</string> 
    <key>CFBundleIdentifier</key> 
    <string>BUNDLE_IDENTITY</string> 
    <key>CFBundleInfoDictionaryVersion</key> 
    <string>6.0</string> 
    <key>CFBundleName</key> 
    <string>BUNDLE_NAME</string> 
    <key>CFBundlePackageType</key> 
    <string>FMWK</string> 
    <key>CFBundleShortVersionString</key> 
    <string>BUNDLE_VERSION</string> 
    <key>CFBundleSignature</key> 
    <string>????</string> 
    <key>CFBundleVersion</key> 
    <string>BUNDLE_VERSION</string> 
    <key>DTCompiler</key> 
    <string>com.apple.compilers.llvm.clang.1_0</string> 
    <key>DTPlatformBuild</key> 
    <string>5B1008</string> 
    <key>DTPlatformVersion</key> 
    <string>GM</string> 
    <key>DTSDKBuild</key> 
    <string>12F37</string> 
    <key>DTSDKName</key> 
    <string>macosx10.8</string> 
    <key>DTXcode</key> 
    <string>0511</string> 
    <key>DTXcodeBuild</key> 
    <string>5B1008</string> 
</dict> 
</plist> 

我已經取代軟件包版本,名稱和佔位符字符串原始文件的標識,比我用這個文件的Info.plist Qt的框架,通過正確的值替換佔位符Perl腳本。

有一些額外的修復程序,如合適的符號鏈接符合this article,我終於得到了我的Qt 4.8應用程序通過審查,我相信你應該能夠得到與Qt 5 +相同的結果。

+0

這終於從我的工作,我的應用程序終於被批准審查。謝謝! – Addy 2014-09-09 12:58:26

+1

謝謝!如果其他人想知道什麼字符串用於佔位符(例如QtCore 4.8):BUNDLE_NAME - > QtCore,BUNDLE_IDENTITY - > QtCore,BUNDLE_VERSION - > 4 – Hyndrix 2014-09-13 09:26:29

+0

我有同樣的問題,但應用新的plist仍然不解決它說壞CFBundleExecuitable密鑰。你能否提供更多關於你如何解決這個錯誤的信息? – ponnus 2014-10-06 18:07:21

相關問題