如何在Xcode模拟器中测试Tweak (1)

如何在Xcode模拟器中测试Tweak (1)

先上效果图

模拟器测试的优点

  • 功能基本和实机一致
    • 表面没有但实际有的功能如Control Center、缺失的Settings项目也能通过Tweak解除限制显示出来
  • 无需越狱
    • 因此可以在新系统无法越狱时第一时间提前适配
  • 测试各种iOS版本、设备
    • 继承模拟器本身的优点

测试环境

  • x64 macOS
  • Xcode 10-12

工具

  • theos: 编译工具
  • simject: 作为Tweak Loader加载我们的dylib

原理

  • 使用Theos编译出模拟器架构的dylib,由simject加载。

步骤

  1. 因为坑太多了,所以不一定都能想起来,想起来了再补充

  2. 安装simject

    git clone https://github.com/angelXwind/simject.git
    cd simject/
    make setup
    
    • 安装后新增目录 /opt/simject 对应实机上的/Library/MobileSubstrate/DynamicLibraries, 把dylib和plist放在这里后,simject就会帮我们加载
    • 新增命令行工具 resim, 类似sbreload,可用于重启模拟器的SpringBoard。
      • 每个模拟器启动后并不会自动加载simject,需要resim一次,之后仅需在需要sbreload时再resim
  3. 安装Cydia Substrate

    • simject提供了一个脚本帮我们自动安装好Cydia Substrate
    • 如果是Xcode 10和以上,sudo ./installsubstrate.sh subst 否则sudo ./installsubstrate.sh cs
  4. 测试

是不是很简单,不,这只是坑的开始,甚至很多人demo都跑不起来。

  1. 总结
    • 在项目Makefile中加入TARGET = simulator:clang::7.0
    • 增加一个新target setup::,需要安装到模拟器时就 make setup 来编译+手动拷贝编译产物至/opt/simject
8 个赞

坑点1: 一定要先删掉原位置的dylib再拷贝新的,不能直接覆盖,否则注入的进程可能会crash loop
坑点2: 最新theos会在target模拟器时自动设定generator为internal。所有hookf和MSHookFunction都会被删除,如果需要使用它们的话需要在makefile中添加XXX_LOGOSFLAGS += -c generator=MobileSubstrate

大佬 :call_me_hand: :call_me_hand: :call_me_hand: :call_me_hand:

:call_me_hand::call_me_hand::call_me_hand::call_me_hand:大老,标记收藏

收藏了,紫薯布丁

:wave: :wave: :wave: :wave: :wave: :wave: :wave:大老,标记收藏

大老,标记收藏 :thinking: :laughing: :laughing: :smiling_face_with_three_hearts: :smiling_face_with_three_hearts:

请问大佬们 有遇上喷这串 Error ?

Will build iOS bootstrap.
Traceback (most recent call last):
  File "./configure", line 250, in <module>
    mconfig.finish_and_emit()
  File "./script/mconfig.py", line 1137, in finish_and_emit
    settings_root.emitter.emit()
  File "./script/mconfig.py", line 1027, in emit
    self.add_command_raw([makefile], list_mconfig_scripts(self.settings), cs_argvs)
  File "./script/mconfig.py", line 878, in list_mconfig_scripts
    if hasattr(mod, '__file__') and relpath_if_within(real_src, os.path.realpath(mod.__file__)):
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/posixpath.py", line 394, in realpath
    filename = os.fspath(filename)
TypeError: expected str, bytes or os.PathLike object, not NoneType

已解決
修改python 腳本路徑即可~

2 个赞

折騰兩天終於成功了!