使用libimobiledevice+ifuse访问iOS沙盒目录
libimobiledevice项目地址:https://github.com/libimobiledevice/libimobiledevice
libimobiledevice还有自己的网站:https://libimobiledevice.org/
ifuse项目地址:https://github.com/libimobiledevice/ifuse
【简介】
1、libimobiledevice是与iOS设备通信的工具。
2、ifuse是在 macOS 和 Linux 上挂载 iOS 设备文件系统的工具,依赖于 libimobiledevice 库。
【libimobiledevice安装】
之前本地已经安装了libimobiledevice,安装比较简单,这里略过。
【ifuse安装】
我使用的是mac,安装时遇到了一些小问题,
(1)我最先的安装方式是:brew install ifuse
遇到报错:Error: ifuse: Unsatisfied requirements failed this build.
testmanzhang@TestMandeMBP ~ % ifuse --version
zsh: command not found: ifuse
(2)之后安装了:brew install macfuse
(3)之后再安装:brew install ifuse --HEAD
还是报错:Error: ifuse: Unsatisfied requirements failed this build.
没办法更换安装方式,选择从源代码编译安装,适用于所有系统:
(1)git clone https://github.com/libimobiledevice/ifuse.git
遇到网络问题:
Cloning into 'ifuse'...
error: RPC failed; curl 28 Failed to connect to github.com port 443 after 75001 ms: Couldn't connect to server
fatal: expected 'packfile'
解决网络问题后继续克隆:
(2)./autogen.sh
报错:
./autogen.sh: line 10: aclocal: command not found
./autogen.sh: line 11: autoheader: command not found
./autogen.sh: line 12: automake: command not found
./autogen.sh: line 13: autoconf: command not found
./autogen.sh: line 19: ./configure: No such file or directory
这些错误是因为系统缺少 autogen.sh 需要的自动化构建工具 (autotools),包括 aclocal、automake、autoheader 和 autoconf。在 macOS 上可以通过 Homebrew 来安装这些工具。
(3)brew install autoconf automake libtool
(4)./autogen.sh
(5)make
编译的时候有一些警告信息,可以忽略:
testmanzhang@TestMandeMBP ifuse % make /Applications/Xcode.app/Contents/Developer/usr/bin/make all-recursive Making all in docs make[2]: Nothing to be done for all'.
Making all in src CC ifuse.o CCLD ifuse ld: warning: ignoring duplicate libraries: '-lfuse', '-limobiledevice-1.0', '-lplist-2.0' make[2]: Nothing to be done for all-am'.
(6)sudo make install
此时安装成功:
testmanzhang@TestMandeMBP ifuse % ifuse --version
ifuse 1.1.5
【挂载】
(1)为挂载 iOS 应用的沙盒目录创建一个本地目录:
mkdir -p ~/ios_sandbox/iPhone\ X
但是挂载的时候提示:
testmanzhang@TestMandeMBP ~ % ifuse ~/ios_sandbox/iPhone\ X --udid f89d91234567a81c0fe2d22f80c1a123456790ef --appid com.1234567.ios
ERROR: the mount point specified does not exist
但目录确实是存在的:
testmanzhang@TestMandeMBP ~ % ls -ld ~/ios_sandbox/iPhone\ X
drwxr-xr-x 2 testmanzhang staff 64 10 28 10:49 /Users/testmanzhang/ios_sandbox/iPhone X
修改权限后依然不行:
testmanzhang@TestMandeMBP ~ % chmod 777 ~/ios_sandbox/iPhone\ X
testmanzhang@TestMandeMBP ~ % ifuse ~/ios_sandbox/iPhone\ X --udid f89d91234567a81c0fe2d22f80c1a123456790ef --appid com.1234567.ios
ERROR: the mount point specified does not exist
删除目录后重新创建:testmanzhang@TestMandeMBP ~ % mkdir -p ~/ios_sandbox/iPhoneX
还是提示:ERROR: the mount point specified does not exist
使用sudo也是不行,
后来改成完整路径,也是不行:
testmanzhang@TestMandeMBP ios_sandbox % ifuse /Users/testmanzhang/ios_sandbox --udid f89d91234567a81c0fe2d22f80c1a123456790ef --appid com.1234567.ios
ERROR: the mount point specified does not exist
后来看了一下:
testmanzhang@TestMandeMBP ~ % ifuse -h
修改了一下命令的写法:
testmanzhang@TestMandeMBP ~ % ifuse --container com.glazero.ios -o ~/ios_sandbox
ERROR: No mount point specified
testmanzhang@TestMandeMBP ~ % ifuse ~/ios_sandbox --container com.glazero.ios
mount_macfuse: the file system is not available (1)
看到这个提示,感觉差不多了,这是电脑上弹出提示:
重启电脑
在手机上也会弹出提示,点击 允许:
重启电脑后,需要拔插一下数据线(此时libimobiledevice也会提示:No device found!):
testmanzhang@TestMandeMBP ~ % ideviceinfo
ERROR: No device found!
但是idevice_id -l 不会有任何提示
当时怀疑安装了ifuse后会把libimobiledevice卸载掉,确认了一下,不会卸载:
testmanzhang@TestMandeMBP ~ % brew list | grep libimobiledevice
libimobiledevice
libimobiledevice-glue
插拔一下数据线就好了。
再次执行挂载成功:
【意外的错误】
电脑休眠后再次打开时,再次挂载会提示这个错误:
testmanzhang@TestMandeMBP ~ % ifuse ~/ios_sandbox/iPhoneX --container com.glazero.ios
There was an error accessing the mount point: Input/output error
此时挂载了iphoneX的上级目录,挂载成功:
testmanzhang@TestMandeMBP ~ % ifuse ~/ios_sandbox --container com.1234567.ios
testmanzhang@TestMandeMBP ~ %
testmanzhang@TestMandeMBP ~ % ls ios_sandbox
Documents Library SystemData tmp
如果是重复挂载的话应该提示这个错误:
testmanzhang@TestMandeMBP ~ % ifuse ~/ios_sandbox/iPhoneX --container com.1234567.ios --udid f89d91234567a81c0fe2d22f80c1a123456790ef
mount_macfuse: mount point /Users/testmanzhang/ios_sandbox/iPhoneX is itself on a macFUSE volume
【卸载】
testmanzhang@TestMandeMBP ~ % fusermount -u ~/ios_sandbox
zsh: command not found: fusermount
ifuse没有这个命令fusermount。
卸载命令是umount:
testmanzhang@TestMandeMBP ~ % umount ~/ios_sandbox
testmanzhang@TestMandeMBP ~ % ls ios_sandbox
iPhoneX
testmanzhang@TestMandeMBP ~ % cd ios_sandbox/iPhoneX
cd: Input/output error: ios_sandbox/iPhoneX
但是ios_sandbox/iPhoneX还是有问题,这个目录不能删除:
testmanzhang@TestMandeMBP ios_sandbox % rm -rf ~/ios_sandbox/iPhoneX
testmanzhang@TestMandeMBP ios_sandbox % mkdir ~/ios_sandbox/iPhoneX
mkdir: /Users/testmanzhang/ios_sandbox/iPhoneX: File exists
上级目录也是没有权限删除:
testmanzhang@TestMandeMBP ios_sandbox % rm -rf ~/ios_sandbox
rm: /Users/testmanzhang/ios_sandbox: Permission denied
使用sudo后也是不可以:
testmanzhang@TestMandeMBP ~ % sudo rm -rf ~/ios_sandbox
rm: /Users/testmanzhang/ios_sandbox/iPhoneX: Input/output error
rm: /Users/testmanzhang/ios_sandbox: Permission denied
后来查了一下这个目录是否正在挂载,结果确实在挂载中:
testmanzhang@TestMandeMBP ~ % mount | grep ios_sandbox
ifuse@macfuse0 on /Users/testmanzhang/ios_sandbox/iPhoneX (macfuse, nodev, nosuid, synchronous, mounted by testmanzhang)
卸载这个目录,再查没有挂载关系:
testmanzhang@TestMandeMBP ~ % umount /Users/testmanzhang/ios_sandbox/iPhoneX
testmanzhang@TestMandeMBP ~ % mount | grep ios_sandbox
再次执行挂载:
testmanzhang@TestMandeMBP ~ % ifuse ~/ios_sandbox/iPhoneX --container com.1234567.ios --udid f89d91234567a81c0fe2d22f80c1a123456790ef
testmanzhang@TestMandeMBP ~ %
挂载关系生成:
testmanzhang@TestMandeMBP ~ % mount | grep ios_sandbox/iPhoneX
ifuse@macfuse0 on /Users/testmanzhang/ios_sandbox/iPhoneX (macfuse, nodev, nosuid, synchronous, mounted by testmanzhang)
testmanzhang@TestMandeMBP ~ % ls ios_sandbox/iPhoneX
Documents Library SystemData tmp
这样的话在本地就可以访问沙盒目录了: