前言

最近需要重新编译一个名为 PassBy 的iOS越狱插件,发现在我的新设备上频频报错,于是将探索经过与解决过程记录在下。

由于我并不专业,甚至对iOS开发并不了解,完全是以学习的态度进行的探索记录。如有纰漏,欢迎大家在评论区批评指正。

顺便给自己的另外一篇相关文章打打广告哈哈:

iOS越狱插件PassBy定制,记录了我尝试解决PassBy不识别Apple Watch之外的其他蓝牙穿戴设备的经过。

尝试编译

第一次编译

系统:macOS Monterey 12.6.5

芯片类型:Intel芯片,非M系列

Xcode版本:14.2

我先是尝试直接编译,输入make package,结果提示openURL已经被淘汰。

openURL已被淘汰

此时我便猜测是Xcode版本太高导致的不适配,我打算先去GitHub的源代码地址去看看作者有没有进行更新。结果很可惜,没有办法,我只能尝试修改一下代码。

根据报错信息我先是找到了相关c文件,搜索openURL关键词后,注释了相关代码。

注释openURL代码

继续寻找,可以发现这是并不影响主要功能的代码,应该是执行一个打开捐赠和源代码网址的操作,由于我并不熟悉Objective-C语言,最简单的方式便是直接注释掉,所幸也不影响插件主体功能。两个网址我粘贴在下面:

  • 捐赠(Donate):https://paypal.me/giorgioiavicoli
  • 源代码(Source Code):https://github.com/giorgioiavicoli/PassBy

注释openURL代码

第二次编译

尝试继续编译,不出所料,新的问题又出现了。

这次的问题则更为棘手,theos在调用Xcode编译工具时直接提示找不到Message框架。

找不到Message框架

这个问题就不是我简单修改能够解决的了。我猜测是新版本的Xcode舍弃了这个框架,这是摆在我眼前的就只有两条路:要么重构相关代码(难度对我来说确实是太大了),要么就只能更换到Xcode的旧版本(在我实践之前其实也是个未知数,不能保证一定能解决)。

我只能尝试更换Xcode版本这条路了。

尝试更换Xcode版本

先查看一下目前的版本,可以看到是14.2版本的。

查看版本

Xcode的支持页面可以清楚的看到每个Xcode版本的最低系统要求以及包含的SDK等信息。

Xcode版本区别

接下来去Apple官方关于Xcode所有版本的下载页面,下载一个旧版本即可。我下载的是12.5.1版本。

下载12.5.1版本Xcode

接下来就是解压.xip文件,将解压出来的Xcode.app更改一个名字,比如Xcode_12.5.app,最后将其移动到/Application目录下即可。

解压并改名

上图可以看到我的老版本Xcode是并不能直接打开的,但是对本章来说是丝毫没有影响的,我们并不需要直接打开老版本Xcode进行操作。具体缘由请继续看下去。

这里解压的时间比较久,需要耐心等待一下。

另外平时下载更新Xcode也可以这样操作。配合多线程下载工具的话,基本上可以跑满宽带速度,同时避免App Store下载失败等问题。缺点就是解压比较耗时。

切换Xcode开发工具版本

注意本节的小标题并不是“切换Xcode版本”,因为对我们来说,仅仅需要的只是Xcode老版本软件自带的开发目录下的那些脚本工具而已,比如gcc等。

开发者工具目录

接下来只需要使用该命令切换xcode-select目录即可:

1
sudo xcode-select -s /Applications/{这里修改成具体的文件名}/Contents/Developer/

修改成自己的老版本文件名即可,输入密码不显示。

切换路径

此时再输入命令验证一下:

1
2
3
4
xcodebuild -version
xcode-select -p
gcc -v
g++ -v

老版本的gcc

以上命令的输出结果都可以看到你选择的老版本Xcode文件名称的字样,类似 Xcode_12.5

第三次编译

再次尝试编译,问题终于迎刃而解了。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
yuesir at iMac in /Volumes/Data/Xcode/PassBy
$ make package
> Making all for tweak PassBy…
make[2]: Nothing to be done for 'internal-library-compile'.
> Making all in passbyprefs…
> Making all for bundle PassByPrefs…
==> Copying resource directories into the bundle wrapper…
==> Compiling PassByRootListController.m (arm64)==> Compiling PassByRootListController.m (arm64e)==> Linking bundle PassByPrefs (arm64)==> Generating debug symbols for PassByPrefs…
==> Stripping PassByPrefs (arm64)==> Linking bundle PassByPrefs (arm64e)==> Generating debug symbols for PassByPrefs…
==> Stripping PassByPrefs (arm64e)==> Merging bundle PassByPrefs…
==> Signing PassByPrefs…
> Making all in passbyflipswitch…
> Making all for bundle PassByFlipswitch…
==> Copying resource directories into the bundle wrapper…
make[3]: Nothing to be done for 'internal-bundle-compile'.
> Making stage for tweak PassBy…
> Making stage in passbyprefs…
> Making stage for bundle PassByPrefs…
> Making stage in passbyflipswitch…
> Making stage for bundle PassByFlipswitch…
dm.pl: building package `com.giorgioiavicoli.passby:iphoneos-arm' in `./packages/com.giorgioiavicoli.passby_1.9.5_iphoneos-arm.deb'

其实之后我还尝试过将上面注释掉的代码恢复正常,没想到还是报一样的错误

这里我怀疑可能是安装的 Command Line Tools 的版本问题。由于不知道安装低版本的Tools会造成什么影响,我就没有进行尝试。

切换回原版本

1
sudo xcode-select -s /Applications/Xcode.app/Contents/Developer/

还是验证一下:

切换回原版本

一键脚本

这里再提供一个大佬分享的一键脚本,但我并没有亲自尝试,于是我将链接贴在这里,以示感谢。

文章链接:https://www.cnblogs.com/zndxall/p/12463744.html

感谢

Apple Xcode

Xcode安装多个版本并自动切换版本