2014-12-27 112 views
0

如果知道.xcodeproj文件的完整路徑,有沒有辦法找到AppDelegate.m的絕對路徑?
我正在寫一個桌面應用程序,用於將一些lib集成到xcode項目中,爲此我需要在AppDelegatedidFinishLaunchingWithOptions方法中添加一些初始化代碼。查找AppDelegate.m文件

我試過了。
1.在選定的.xcodeproj的父目錄中搜索並讀取main.m文件以查找AppDelegate的類名(即從NSStringFromClass([AppDelegate class])行解析類名)。
2.現在,當我知道AppDelegate的類名時,我在項目的根文件夾中搜索AppDelegate.m文件。乍一看,一切似乎都沒問題。但是如果我們已經整合了Facebook sdk,那麼我們的搜索結果將會是多重的,因爲在Facebook sdk中有一些示例項目使用他們自己的AppDelegate.m文件。在這種情況下,我無法知道這些AppDelegate屬於當前項目中的哪一個。

我也嘗試解析project.pbxproj文件,但找不到任何有用的東西。

那麼如果我知道*.xcodeproj文件的完整路徑,我如何才能找到AppDelegate.m文件的絕對路徑?

+0

我相信這是所有在.pbxproj文件中; 「你找不到有用的東西」是什麼意思?它應該列出作爲構建組成部分的所有文件和路徑,並通過GUID鏈接各個部分。 – Tommy

+0

你可以請舉一些如何解析和編程找到它的例子嗎? – arturdev

+0

我把所有我能想到的東西都扔進了答案,但是,正如它強烈暗示的,我從來沒有真正做過程序化的步法;我剛剛花了多年的時間處理合並衝突。不能走得更遠的道歉。 – Tommy

回答

1

如果我的Xcode我可能會:

  1. 打開project.pbxproj
  2. 找到rootObject線。看起來它通常是最後一個,但不依賴於它。獲取GUID。例如。在我目前正在查看的文件中是rootObject = 29B97313FDCFA39411CA2CEA /* Project object */;
  3. 按照GUID查找項目對象。在我的情況下,開場線看起來像29B97313FDCFA39411CA2CEA /* Project object */ = {。在該對象內查找targets。礦山有兩個,一個用於主項目,一個用於測試,另外提供兩個GUID;
  4. 查找目標。例如。我的一個用1D6058900D05DD3D006BFB54 /* ProjectName */ = {打開。整理所有buildPhases的清單;
  5. 查找所有構建階段的GUID並編譯內部列表files(它們由更多的GUID標識);
  6. 通過GUID查找每個文件並抓取fileRef GUID;
  7. 從每個文件中獲取path(它只是一個後綴)和sourceTree;
  8. 找到具有該名爲源樹的isa = PBXGroup的對象,從而獲取路徑前綴;
  9. 結合前綴和後綴得到完整路徑。

這會給我一個包含在所有項目目標中的所有文件的完整列表。我可以嘗試通過在isa = PBXFileReference上過濾直接跳到步驟(7),但是這將包括在Xcode中列出但未包含在任何目標中的文件。

在99.9999%的情況下,項目中只有一個文件包含實現UIApplicationDelegate的類。

作爲一種替代策略,我可能會決定檢查建立產品:

  1. 電話xcodebuild建設項目;
  2. 詢問其中isa = PBXFileReferenceexplicitFileType = wrapper.application以獲得輸出名稱的對象;
  3. 調用otool -ov <output binary>並檢查輸出是否執行UIApplicationDelegate協議;
  4. 在候選列表中找到該類。

或者,負責鐺的自己,我可能:依次對每個源文件,用於遍歷協議一致性聲明的AST

  1. 部署libclang(obligatory Mike Ash link)。

...關於哪個我是模糊的,因爲我從來沒有使用libclang,而不是因爲一些嚴重錯位的嘗試變得co。。