2010-02-02 177 views
12

我有一段時間以來我一直在開發的應用程序。最近通過雙擊啓動應用程序會出現一個對話框,其中顯示「您無法打開應用程序RepoWatch,因爲它可能已損壞或不完整。」該應用程序無法打開,因爲它的可執行文件缺失

通過打開./RepoWatch.app啓動應用程序給我「該應用程序無法打開,因爲它的可執行文件缺失。」

我通常通過./RepoWatch.app/Contents/MacOS/RepoWatch通過簡單的習慣(哪個能工作)來啓動應用程序,所以我不確定這個事情發生了多久,或者在手邊發生了什麼變化。最有可能的變化是我將cp Info.plist ./RepoWatch.app/Contents/放入我的make文件中,以便版本化Info.plist,而無需版本化.app包中的所有內容。

我已經多次查看了Info.plist,無法找到任何問題。該文件打開與屬性列表編輯器沒有任何錯誤。從屬性列表編輯器保存不會使文件「工作」(如果它是首先被責備)。

據我可以告訴也期待理智的權限:

$ ls -l 
./RepoWatch.app/Contents/Info.plist 
[email protected] 1 dgrace staff 789 Feb 1 23:20 ./RepoWatch.app/Contents/Info.plist 
$ ls -l 
/Applications/Adium.app/Contents/Info.plist 
-rw-rw-r-- 1 dgrace staff 5750 Aug 21 15:41 /Applications/Adium.app/Contents/Info.plist 

我很茫然,什麼下一個嘗試。

這裏是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>CFBundleInfoDictionaryVersion</key> 
    <string>6.0</string> 
    <key>CFBundleDevelopmentRegion</key> 
    <string>English</string> 
    <key>CFBundleExecutable</key> 
    <string>RepoWatch</string> 
    <key>CFBundleIdentifier</key> 
    <string>com.doomstick.RepoWatch</string> 
    <key>CFBundleName</key> 
    <string>RepoWatch</string> 
    <key>CFBundleShortVersionString</key> 
    <string>1.0.0</string> 
    <key>LSMinimumSystemVersion</key> 
    <string>10.6</string> 
    <key>CFBundleVersion</key> 
    <string>Beta26</string> 
    <key>NSMainNibFile</key> 
    <string>MainMenu</string> 
    <key>NSPrincipalClass</key> 
    <string>NSApplication</string> 
</dict> 
</plist> 
+0

你忘了包含'ls -l/Applications/Adium.app/Contents/Info.plist'的輸出嗎,還是你不打算在第一個地方加入那個命令? – 2010-02-02 05:44:57

+0

我遇到了該塊的格式化問題,並以某種方式被刪除。它已被添加。我也刪除了我的文件的擴展屬性,這沒有什麼區別。 「 – 2010-02-02 06:56:22

+0

」......我不確定這件事發生了多長時間,或者緊接着發生了什麼樣的變化。「如果你的版本控制系統有一個平分命令,現在是時候使用它了。 (如果你沒有使用版本控制,這是一個很好的例子。) – 2010-02-02 07:15:24

回答

6

的問題可能是由於在Info.plist文件無效CFBundleExecutable property值要複製進入應用程序。

在Xcode項目中,此屬性的默認值是在構建系統構建應用程序時展開(替換)的特殊變量(佔位符)值(${EXECUTABLE_NAME})。你確定你需要手動複製這個文件嗎?也許你可以添加一個腳本構建階段,使你需要的任何變化之後它已被正常的構建過程擴展並複製到位。

當你在它的時候,你應該檢查文件中的其他佔位符值。很可能您需要填寫CFBundleName(其他可能也是必需的,具體取決於您的申請類型)。

+0

我沒有使用XCode。我知道,我是一個異教徒。自從我開始複製文件後,CFBundleExecutable沒有改變。這是最合乎邏輯的答案,但是我找不到任何讓這個價值變得無效的東西。 – 2010-02-02 06:15:34

+0

我帶回了這個答案,即使它沒用。在我刪除答案之前,我沒有考慮評論是否仍然有用。 – 2010-02-06 07:55:07

+1

這發生在我遇到的區分大小寫的文件系統上,其中CFBundleExecutable屬性使用正確的可執行文件名稱,但是大寫且可執行文件是小寫。有趣的是,'.app'在它的'.dmg'裏面工作,但不在我的'/ Applications'文件夾中,這表明這個特殊的'dmg'不區分大小寫。 – 2014-08-28 14:31:29

2

好的,在黑暗中拍攝一些(更多)照片。

  1. docs for LSMinimumSystemVersion說,值應該是與形式n.n.n的字符串。您可以嘗試在值的末尾添加「.0」。
  2. 當您使用./RepoWatch.app/Contents/MacOS/RepoWatch來手動運行它時,您正在使用某種完成或文件名生成,還是您全部輸入(尤其是可執行文件的文件名)?
    • 也許可執行文件名有一些奇怪的不可見/組合/相似的字符,它不符合Info.plist中的值。嘗試ls -w /path/to/RepoWatch.app/Contents/MacOS/ | xxd查看非ASCII字節的字節。
  3. 請問plutil -lint /path/to/Info.plist會給你一個「OK」嗎?
  4. ls -l輸出中的權限之後的@指示了一些xattrs。這些可能是無害的,但是你看過哪些是ls [email protected]
    • 如果其中一個xattrs看起來懷疑(或者甚至沒有),您可以(cd /path/to/RepoWatch.app/Contents/ && mv Info.plist Info.plist.save && cat Info.plist.save > Info.plist)獲取沒有xattrs的副本並進行測試。
    • 如果使用非xattr'd文件仍然會導致問題,則可以嘗試系統地修改和刪除密鑰(在創建備份副本之後,如上面的.save),以查看是否可以導致可能有助於指示的其他錯誤消息問題。
+0

我即將步出,剛纔注意到了新的答案。有沒有辦法讓SO給我發郵件來回答問題?在第一個24小時左右之後,我不再定期看這個。 我刪除了xattrs。這沒有幫助。當我回來時,我會嘗試其餘的。我特別感興趣的是plutil-lint。我不知道這個命令,並假定plist編輯會告訴我是否有錯誤。 – 2010-02-06 05:38:05

+0

您的建議中,唯一令我感到奇怪的是: $ ls -w ./RepoWatch.app/Contents/MacOS/ | xxd 0000000:5265 706f 5761 7463 680a RepoWatch。 0a似乎是一個換行符,並在右側顯示爲一個句點。這是因爲它是奇數個字符,還是這實際上是一個問題? – 2010-02-06 05:47:01

+0

通知:當問一個問題有一個「通知_每日新答案」複選框,那是一個問題(可能只有在編輯?)那裏的選項?另外在你的個人資料頁面(點擊任何頂部你的名字)在「首選項」下,是另一個通知複選框。見http://meta.stackexchange.com/questions/24659/instant-email-alerts-and-notifications和http://meta.stackoverflow.com/search?q=email+new+answers – 2010-02-06 07:47:41

1

項目菜單>設置活動的可執行

+0

我沒有使用Xcode。我已經把它寫入了被刪除的評論。對困惑感到抱歉。 – 2010-02-06 05:38:55

11

重建發射服務數據庫解決了這個問題對我來說。

嘗試在終端執行以下命令:

/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -kill -r -domain local -domain system -domain user 
+1

重建Launch Services數據庫的一個副作用是,它忘記了所有你說「是」的時間到「X是從互聯網上下載的應用程序,你確定要打開它嗎?」。要測試'lsregister'是否可能解決該問題:製作.app的副本。你可以運行副本嗎?如果是這樣,運行'lsregister'。 – jlstrecker 2013-01-30 03:18:00

+2

要在不重建整個數據庫的情況下更新您的應用的啓動服務數據庫,請使用'-f'選項:http://stackoverflow.com/a/16546673/162094 – 2013-07-06 15:06:28

11

大廈答案是@smokris發佈:

這個問題似乎是與發射服務數據庫應用的註冊。沒有必要重建整個數據庫。要強制更新您的應用程序(特別是),使用入lsregister-f選項:

/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -f MyApp.app 

我在你描述了同樣的問題,這爲我工作。謝謝,@smokris!

相關問題