iOS开发的另类神器:libimobiledevice开源包【类似android adb 方便获取iOS设备信息】
简介
libimobiledevice又称libiphone,是一个开源包,可以让Linux支持连接iPhone/iPod Touch等iOS设备。由于苹果官方并不支持Linux系统,但是Linux上的高手绝对不能忍受因为要连接iOS设备就换用操作系统这个事儿。因此就有人逆向出iOS设备与Windows/Mac Host接口的通讯协议,最终成就了横跨三大桌面平台的非官方版本USB接口library。经常用Linux系统的人一定对libimobiledevice不陌生,但是许多Windows和Mac用户也许就不知道了。事实上,它同iTools一样,都是可以替代iTunes,进行iOS设备管理的工具。因为源码是开放的,可以自行编译,所以对很多开发者而言可以说更为实用。
官方github地址:https://github.com/libimobiledevice/libimobiledevice
最后还有一点,作为一个前Android开发,习惯使用adb命令各种调试,转了iOS怎么能没有这种工具,而去使用iTunes和iTools呢?对此零容忍!
快速直接安装libmobiledevice的方法
- 在MacOS下安装可以使用brew,类似Ubuntu中的apt-get
sudo brew update
sudo brew install libimobiledevice
#libimobiledevice中并不包含ipa的安装命令,所以还需要安装
sudo brew install ideviceinstaller
- Ubuntu下安装需要添加一个新的软件库,里面包含了libimobiledevice
sudo add-apt-repository ppa:pmcenery/ppa
sudo apt-get update
apt-get install libimobiledevice-utils
sudo apt-get install ideviceinstaller
常用功能
- 安装ipa包,卸载应用
//命令安装一个ipa文件到手机上,如果是企业签名的,非越狱机器也可以直接安装了。
ideviceinstaller -i xxx.ipa
//命令卸载应用,需要知道此应用的bundleID
ideviceinstaller -U [bundleID]
- 查看系统日志
idevicesyslog
- 查看当前已连接的设备的UUID
idevice_id --list
- 截图
idevicescreenshot
- 查看设备信息
ideviceinfo
- 获取设备时间
idevicedate
- 设置代理(也好像是端口转发的工具,具体能利用它干啥还没试过)
iproxy
- 挂载DeveloperDiskImage,用于调试
ideviceimagemounter
- 获取设备名称
idevicename
- 调试程序(需要预先挂载DeveloperImage)
idevicedebug
- 查看和操作设备的描述文件
ideviceprovision list
ideviceinstaller安装ipa报错(已经支持iOS11)
"Could not connect to lockdownd. Exiting."
出现这个问题一般是因为新版操作系统的通信协议可能有些微调,参考下面的stackoverflow的帖子,可以通过下面的命令尝试更新使用最新的libimobiledevice构建版本。
The best solution here is to get the latest libimobiledevice, which has a fix for this particular issue:
brew uninstall ideviceinstaller
brew uninstall libimobiledevice
brew install --HEAD libimobiledevice
brew link --overwrite libimobiledevice
brew install ideviceinstaller
brew link --overwrite ideviceinstaller
挂载文件系统工具:ifuse
ifuse是一个依赖libimobiledevice库的工具,所以必须首先安装libimobiledevice
首先去 https://osxfuse.github.io/ 下载fuse for macos的库。
然后github上clone下载ifuse最新源码到本地(自己决定放哪):
//cd 到要安装的目标路径,然后:
git clone https://github.com/libimobiledevice/ifuse.git
- 进入clone好的目录,执行:
//将源码在本机编译:
./autogen.sh
./configure
make
//执行脚本ifuse到系统终端(其实也可以不用,直接去src中运行也可以)
sudo make install
- 挂载媒体文件目录:
//注意,此处的挂载点必须要真实存在,需要预先创建好目录,否则挂载失败
ifuse [挂载点]
- 挂载某应用的documents目录
ifuse --documents [要挂载的应用的bundleID] [挂载点]
//注意,iOS 8.3之后要求应用的UIFileSharingEnabled权限要开启,否则可能没有权限访问,会有如下的错误提示
ERROR: InstallationLookupFailed
The App 'com.wsgh.test' is either not present on the device, or the 'UIFileSharingEnabled' key is not set in its Info.plist. Starting with iOS 8.3 this key is mandatory to allow access to an app's Documents folder.
- 挂载某应用的整个沙盒目录 ifuse --container [要挂载的应用的bundleID] [挂载点]
- 获取bundleID ideviceinstaller -l
- 卸载挂载点 fusermount -u [挂载点]
- 如果是越狱的设备,并且配置好了,可以使用下面命令挂载整个iphone文件系统(暂时没试过,还没有开始研究越狱设备)
ifuse --root [挂载点]
- 详细说明,可以进入ifuse的github主页查看原版文档
https://github.com/libimobiledevice/ifuse
libimobiledevice其实包含了一大坨有用的工具,装完后可以敲idevice,再按两下Tab查看。这里提到的查看控制台日志的工具叫做idevicesyslog,只是那一大坨中的一个而已,其他好玩的请自行发掘。另外要注意,还有个ideviceinstaller不属于libimobiledevice套件,需要单独安装,我上面的命令中顺带着把它也安装了。这货是用来管理真机上的app的,安装/升级/卸载……无所不能。
好了,回归真题。使用idevicesyslog有些前提条件必须准备好。首先你的iOS设备必须跟当前主机配对过,对,就是第一次插上数据线后手机上提示是否信任电脑的那个提示框,你点击了信任,就算配对成功。配对功能对应于libimobiledevice套件中的idevicepair命令,具体使用方法可以通过idevicepair --help
查看。
其次,你的iOS设备如果处于锁屏状态,那idevicesyslog也是无法工作的,这条其实适用于所有idevice*命令。
配对过的iOS设备通过数据线连接到电脑后,执行idevice_id -l
,便会列出设备的udid,idevice*
系列命令都需要通过-u udid
参数来指定操作哪台设备,但如果只有一台设备可用时,就可以忽略-u
参数。
好了,有了以上认识,直接执行idevicesyslog
来查看通过数据线连接的iOS设备的控制台日志吧。
接下来自然是本文的重点——不插数据线,而是通过WiFi,必须启用iTunes中的WiFi Sync(无线同步)功能。我们知道,iTunes WiFi Sync工作时,需要手机插着充电,但这里根本无需这个限制。按本屌的理解,启用这个功能并不是真正要用这个功能,而只是借用它来使手机启用跟主机进行无线通讯的某个进程而已。一旦WiFi Sync启用后,libimobiledevice套件就能发现跟当前主机处于同一局域网中,并且配对过的iOS设备。试试idevice_id -l
便知,是不是不插数据线也能列出你的udid来了?当然,如果此时还同时连着数据线,那同样的udid会出现两次。貌似这是一个feature,而非bug。
只要idevice_id -l
能通过WiFi发现你的设备,那idevicesyslog
自然也能工作了。
最后唠一下idevicedebug
和上面提到的ideviceinstaller
,这两个(至少是这两个)命令不能通过WiFi工作,必须通过数据线。idevicedebug run 'APP_BUNDLE_ID'
可以直接launch某个app,当然,这个app必须是你通过development证书build到手机上的才行。ideviceinstaller -l
则可以列出手机上所有的用户安装的app,关于ideviceinstaller的其他强大功能,这里就不提了,有兴趣的朋友自己去研究吧。
iOS开发的另类神器:libimobiledevice开源包【类似android adb 方便获取iOS设备信息】的更多相关文章
- Windows下USB磁盘开发系列三:枚举系统中U盘、并获取其设备信息
前面我们介绍了枚举系统中的U盘盘符(见<Windows下USB磁盘开发系列一:枚举系统中U盘的盘符>).以及获取USB设备的信息(见<Windows下USB磁盘开发系列二:枚举系统中 ...
- iOS开发之实现图片自动切换(类似android画廊效果)
#import ViewController.h #define ImageViewCount 5 @interface ViewController ()<uiscrollviewdele ...
- iOS开发-Swift获取手机设备信息(UIDevice)
使用UiDevice获取设备信息 获取设备名称 let name = UIDevice.currentDevice().name 获取设备系统名称 let systemName = UIDevice. ...
- iOS开发UI调试神器----Reveal
做iOS的开发,UI是非常非常重要的一环.调试时我们一般用模拟器,提交前用真机做測试.用模拟器来调试UI效果尽管快捷方便,但有时仍然希望有更强大的工具来帮助分析UI,尤其是专注在UI的效果调试时.近期 ...
- iOS开发-14款状态栏(StatusBar)开源软件
本文转载至 http://mobile.51cto.com/hot-418125.htm 之前逛街看到移动做推广,有一个定位应用挺好的,合理的利用了状态栏,做了一些消息提醒和隐藏动画,自己回家就做了一 ...
- [开源类库/项目] android保存崩溃时的错误信息log至本地【源码+jar包+使用说...
不知大家是否经常遇到这种情况:自己的项目有时会在没有连接到电脑时发生崩溃,好不容易发现的bug结果连接到电脑时又复现不出来了:又或者自己写的一个功能在开机启动时产生小bug导致崩溃,而刚启动的机器想让 ...
- iOS开发(1):设置APP的图标与启动图 | iOS图标的尺寸 | LaunchScreen的使用
每个APP都应该有自己的图标跟启动图. 这里介绍怎么设置iOS的APP的图标跟启动图. (1)图标 小程的xcode是10.0版本,设置图标的入口如下: 点击入口后,进到设置页面,如下: 可以看到有很 ...
- iOS开发-Object-C获取手机设备信息(UIDevice)
一.获取UiDevice设备信息 // 获取设备名称 NSString *name = [[UIDevice currentDevice] name]; // 获取设备系统名称 NSString *s ...
- ios 获取当前设备信息、内存
//在[UIDevice currentDevice]中的属性 @property(nonatomic,readonly,strong) NSString *name; // e.g. "M ...
随机推荐
- python学习第一天基础篇
学习背景:决定开始学习python之前,因为公司基本都是微软系统,所以很少碰到linux系统,机缘巧合接到了一个项目是使用shell对mysql进行backup,因为公司唯一的系统工程师是微软在行,对 ...
- 运行期以索引获取tuple元素-C++14(原创)
在编译期很容易根据索引来获取对应位置的元素,因为 tuple 的帮助函数 std::get<N>(tp) 就能获取 tuple 中第 N 个元素.然而我们却不能直接在运行期通过变量来获取 ...
- iOS_20_微博OAuth授权_取得用户授权的accessToken
终于效果图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcHJlX2VtaW5lbnQ=/font/5a6L5L2T/fontsize/400/fill ...
- centos 6.5 安装mongodb2.6
前言: 系统版本号:Centos-6.5-x86_64 *** Centos编译安装mongodb 2.6 系统最好是64位的,才干更好发挥mongodb的性能 1.准备,下载源文件(二进制编译版) ...
- 重要经验五:block作为属性的注意事项
现代ios应用的开发.不使用GCD和block,效率会减少非常多,在今年3月份之前,我在block的学习和使用方面,精力和经验都明显不足,在SF有个牛逼同事.不仅自己积累了一套库,并且对这个库持续进行 ...
- 用IFeatureWorkspaceAnno.CreateAnnotationClass 创建注记图层时报“The application is not licensed to modify or create schema”的错误的解决方案。
用IFeatureWorkspaceAnno.CreateAnnotationClass 的方法创建注记图层的时候报"The application is not licensed to m ...
- TypeScript学习笔记之基础类型
从今天开始学习typescript了,记录ts学习点滴,最后,使用ts结合nodejs开发后端应用,一起共勉吧: typescript最新版本2.6,所有演示代码均基于此版本 开始之前确定安装了如下n ...
- gcc编译相关tips
http://blog.csdn.net/benpaobagzb/article/details/51364005 静态库链接时搜索路径顺序: ld会去找GCC命令中的参数-L 再找gcc的环境变量L ...
- APP之构架自己的webapi框架
当我们学习到一定程度的时候,我们会想要去深入了解代码底层的东西,也更想拥有一个属于自己的框架.本文可能成为编写一个webapi框架的开端.有研究MVC框架的朋友会发现,mvc框架的路由MvcRoute ...
- socket编程部分API
以TCP协议为例,UNIX的相关API int socket(int domain , int type , int protocol); 根据指定的地址族,数据类型,协议来分配一个socket的描述 ...