查找AppDelegate.m文件

时间:2014-12-27 08:29:31

标签: objective-c xcode macos cocoa

如果我们知道.xcodeproj文件的完整路径,有没有办法找到AppDelegate.m的绝对路径?
我正在编写一个桌面应用程序,用于将一些lib集成到xcode项目中,为此,我需要在AppDelegate的{​​{1}}方法中添加一些初始化代码。

我尝试了什么 1.在选定的.xcodeproj的父目录中搜索并读取didFinishLaunchingWithOptions文件,以查找AppDelegate的类名(即从main.m行解析类名)。
2.现在,当我知道NSStringFromClass([AppDelegate class])的类名时,我在项目的根文件夹中搜索AppDelegate文件。乍一看一切似乎都好。但是如果我们已经集成了Facebook sdk,那么我们的搜索结果将是多个,因为Facebook sdk中有一些示例项目带有他们自己的AppDelegate.m文件。在这种情况下,我不知道这些AppDelegate.m中的哪一个属于当前项目。

我也尝试解析project.pbxproj文件,但找不到任何有用的东西。

那么如果我知道AppDelegate文件的完整路径,我怎么能找到AppDelegate.m文件的绝对路径?

1 个答案:

答案 0 :(得分: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. 组合前缀和后缀以获得完整路径。
  10. 这将为我提供所有项目目标中包含的所有文件的完整列表。我可以尝试通过过滤isa = PBXFileReference直接跳到步骤(7),但这将包括在Xcode中列出但未包含在任何目标中的文件。

    在99.9999%的情况下,项目中只有一个文件包含一个实现UIApplicationDelegate的类。

    作为替代策略,我可能决定检查构建产品:

    1. 调用xcodebuild来构建项目;
    2. 询问isa = PBXFileReferenceexplicitFileType = wrapper.application的对象以获取输出名称;
    3. 调用otool -ov <output binary>并检查任何实现UIApplicationDelegate协议的人的输出;
    4. 在候选人名单中找到该班级。
    5. 或者,我自己负责clang,我可能会:

      1. 依次在每个源文件上部署libclang(obligatory Mike Ash link),遍历AST以获得协议一致性声明。
      2. ...我对此感到模糊,因为我从未使用过libclang,而不是因为一些非常错误的企图羞怯。