iOS flutter工程如何不依赖Xcode来运行项目

背景:最近在做的项目是flutter的工程,代码部分既有OC的原生代码,也有dart的代码,当然,大多数时间都是在写dart的代码,写dart的代码需要用VS code或Android Studio(下面简称AS),我是习惯使用AS 的,但是在run项目的时候,还得要打开Xcode,虽然不在 Xcode上写代码,但还是要把Xcode打开,把项目跑起来,既然Xcode的作用这么卑微,那么有没有办法不打开Xcode也能把项目跑起来呀?

首先声明一下,以下都是在模拟器下操作 ,并非真机,因为iOS的模拟器基本就可以满足日常开发需求

1、去Xcode化第一步 - 编译

第一步,当然是解决编译问题,这个比较简单,因为我们可以通过脚本来替代Xcode的编译
核心脚本

cd project/dir #进入你的项目目录下
#打开模拟器
open -a Simulator
#终止运行
xcrun simctl terminate booted com.tencent.qq #后面的是项目bundle id
#依赖更新,如果有需要的话
pod install
#编译,如无需编译直接运行,可以把这句注释
xcrun xcodebuild -workspace QQ.xcworkspace -scheme QQ -sdk iphonesimulator -configuration Debug -arch x86_64 -derivedDataPath build
#安装到模拟器
xcrun simctl install booted  ./build/Build/Products/Debug-iphonesimulator/QQ.app
#模拟器运行,如果你改了bundle id,记得这里跟着改,否则你跑起来的不一定是你当前编译的
xcrun simctl launch booted com.tencent.qq

脚本注释比较清楚,就不展开讲解了,把这段脚本跑起来,基本就可以编译成功并运行在模拟器上。
可能遇到的问题:

  • 如果没有编译成功,那就是你项目代码的问题,好好检查一下吧,试试看在Xcode是否能成功编译
  • 有时候会遇到模拟器没能成功打开,打开Activity Monitor看看simulator的进程是否已经存在,如果存在则kill掉,并且在terminal下重新执行open -a Simulator
  • 打开的模拟器不是你想要的机型?比如我想打开iPhone 13的模拟器,但是打开的却是一个iPhone 6;这种情况有两个解决方案,第一种比较简单,就是打开Xcode,然后先用你喜欢的模拟器打开一遍,以后执行open -a Simulator都会打开这个模拟器了,它会记住它的;第二个方案比较有技术含量,下面专门讲一下

打开指定模拟

  • 首先执行xcrun simctl list,它会把电脑里支持的模拟器都列出来,并且在后面有一串很长的唯一标记的字符串,记住它
    模拟器列表
  • 执行xcrun simctl boot 2245645B-AE71-444E-9965-9F7AAB522CC8,后面这串改为对应模拟器的即可,这时候就会打开你指定的模拟器了

2、去Xcode化第二步 - 断点调试

有了第一步,不需要依赖Xcode也可以把项目编译并在想要的模拟器上运行了。但是我们平时写代码,除了编译运行,还需要调试呀,如果你需要断点调试原生的代码,那不好意思,你还是打开Xcode吧。我们这里说的是flutter项目,所以只需要AS就好了(或者VSCode),而Xcode本身也并不支持断点调试flutter。
好了直接上干货,当第一步完成后,我们的项目已经在模拟器跑起来了,接下来要做的就是flutter attach,点击下图红框的按钮就好,当然前面的设备要选你跑起来的模拟器


flutter attach

attach成功后,就可以断点调试了,至于怎么调试,那就好好学一下 AS如何调试flutter吧,不扩展了 。

3、去Xcode化最后一步 - 日志查看

调试除了断点,有时候还需要看log,我们之前看log都是在Xcode上的,现在Xcode没了,怎么看呢?
方法有很多,这里讲的是mac给我们提供的一个工具 Console

Console

先来认识一下它,关注 一下我加红字的区域即可

  • 首先在左边选择你的模拟器(据说真机也可以用这个方法来看日志)
  • 然后在进程里找你的APP的进程,对应的就是你项目的日志了
  • 用鼠标选中就可以底部的日志详细区看到对应的日志了


    Console

    那么问题来了,这里打印的是你所选设备的所有日志,太多了吧,怎么快速筛选呢?
    看看右边的搜索框了吗?
    如图所示,可以通过 PROCESS过滤进程名,这样就过滤出你的进程的日志了


    过滤maps的日志

    如果你还需要过滤更多的条件,也可以继续在搜索框添加其他条件,很简单,还有其他的功能,比如暂停日志输出,清空日志等,自己摸索吧。
    到这里就完全去Xcode化了,可以仅靠AS,就可以完成iOS项目的编译、断点调试、看日志了,日常flutter的开发都满足了。

你可能感兴趣的:(iOS flutter工程如何不依赖Xcode来运行项目)