iOS工程03-Xcode内置工具及pods调试

2,162 阅读2分钟

上一章讲了xcode 生成产物的过程及路径配置,还有 xcodeproj文件作用。今天来了解Xcode内置工具及pods调试。

一、Xcode内置工具

先来看看Xcode内置PlugIns有哪些: image.png xcode是通过xcode3core这个差距来配置原文件关联xcodeproj工程文件的。 image.png 我们发现上一章出现的熟悉参数。

核心问题来了(ps:让我想到<一休哥>多动脑思考一下):
1.如果我们能调用这个系统动态库dyld(DevToolsCore)
2.通过系统动态库来调用内置工具
3.比如修改xcodeproj文件比较,举一反三。

1.将系统动态库导入Xcode

  • 将系统动态库拖入Xcode中时可能会运行报错:
dyld[20219]: Library not loaded: 
    @rpath/DVTPortal.framework/Versions/A/DVTPortal
  • @rpath:framework在真机中的路径(真机中采用@rpath + framework中要调用的类的路径)

  • 解决方法:找到链接不到的framework所在路径,配置给Runpath Search Paths(多个framework找不到可能要添加多个路径) image.png 配置Config.xcconfig文件环境变量

LD_RUNPATH_SEARCH_PATHS = "/Applications/Xcode.app/Contents/SharedFrameworks" "/Applications/Xcode.app/Contents/Frameworks" "/Applications/Xcode.app/Contents/PlugIns/Xcode3Core.ideplugin/Contents/Frameworks"
  • framework search path:去哪个路径去搜索framework image.png 在Config.xcconfig文件环境变量对应环境变量
FRAMEWORK_SEARCH_PATHS = "/Applications/Xcode.app/Contents/PlugIns/Xcode3Core.ideplugin/Contents/Frameworks"
  • ld -framework:使用Other Linker Flags告诉链接器要链接的framework名称
OTHER_LDFLAGS = -framework DevToolsCore -Xlinker -U -Xlinker _IDEInitialize
  • Xlinker:后面接的参数是直接传给链接器的,而非Clang了
  • -U:要求链接器不要检查后边的符号(例中为_IDEInitialize符号)
  • 告诉连接器忽略_IDEInitialize这个符号错误。
  1. 配置Header Search Paths,让工程能按路径找到这些头文件(注意如果在Build Settings中手动改了会影响Config文件生效
HEADER_SEARCH_PATHS = "${SRCROOT}"

2.在编写功能代码(模拟将文件拖入工程)

int main(int argc, const char * argv[]) {
    NSError *error;
    BOOL initialized = IDEInitialize(1, &error);
    PBXProject *project = [PBXProject projectWithFile:@"xxxxxx"];
    [[project rootGroup] addFiles:@[@"xxxxx.h"] copy:NO createGroupsRecursively:NO];
    [project writeToFileSystemProjectFile:YES userFile:NO checkNeedsRevert:NO];
    NSLog(@"%@", project);
    return 0;
}

编译成功: image.png

二、pods调试

image.png 第二条是ruby调用三方库的流程。

1.ruby环境配置

也可参考ruby安装,已经安装或者会的同学就跳过。

1.gem info ruby-macho
2.ruby -v  //查看版本
3.rvm list
4.bat ~/.zshrc //查看环境变量
5.vim ~/.bashrc //创建一个配置环境变量文件
6.source ~/.zshrc
7.echo $PATH
8.gem sources --add https://mirrors.tuna.tsinghua.edu.cn/rubygems/ --remove https://rubygems.org/
bundle config mirror.https://rubygems.org https://mirrors.tuna.tsinghua.edu.cn/rubygems

过程中遇到的问题集合: image.png 1.发现rvm list 并没有指定到具体版本:

rvm list known  //具体可以支持版本
rvm install 2.7.3
//如果rvm 版本过旧更新
\curl -sSL https://get.rvm.io | bash -s stable
rvm -v

2.国内老实的改镜像地址 image.png 3.配置IDE-VSCode image.png 4.安装VSCode插件

Ruby
Ruby Solargraph
Error Lens

image.png

//验证是否安装 插件
gem info bundler
gem info ruby-debug-ide  
gem info debase
gem info rubocop
gem info solargraph
gem info rake
//没有安装就执行
gem install ruby-debug-ide 
//保证这些插件安装成功

//如果solargraph 无效执行如下代码
brew install coreutils
//查看安装路径
which solargraph

参考借鉴了:RVM 的安装和使用

2.pods调试

接下来,我们在xcode里用ruby调试pods。 注意:xcode的Ruby插件作用就是会生成一个调试文件launch.json image.png

1.配置VsCode-ruby

image.png name就是调试项目的名称,program 就是ruby代码文件。一般bin目录存放rb文件。

1.bundle:的命令,在VSCode中也需要用(Gemfile)配置文件编写 image.png 这些代码是不是很熟悉,就如我们podfile 文件代码差不多。 image.png

2.pods调试

使用VSCode打开CocoaPods-master image.png 创建调试文件launch.json修改"program": "${workspaceRoot}/bin/pod" 然后在vscode终端执行:

bundle install

运行好久后: image.png rake版本太旧也要更新。

Uncaught exception: You have already activated rake 13.0.3, but your Gemfile requires rake 12.3.3. Prepending `bundle exec` to your command may solve this.
[/Users/xx/.rvm/rubies/ruby-3.0.0/lib/ruby/site_ruby/3.0.0/bundler/runtime.rb:309](<> [/Users/xx/.rvm/rubies/ruby-3.0.0/lib/ruby/site_ruby/3.0.0/bundler/runtime.rb:25](<> 

image.png launch.json配置args 添加install

{
	"version": "0.2.0",
	"configurations": [
        {
			"name": "Debug xcodeproj",
			"type": "Ruby",
			"request": "launch",
			"program": "${workspaceRoot}/CocoaPods-master/bin/pod",
			"args":[
				"install",
				"--project-directory=./LGApp"

			]
		}
	]
}

image.png 运行调试成功! (由于本人对工程化理解有限,我就记录我所知的东西)