在 MacOS 上进行 Flutter 开发的过程中,很多人会碰到 idevice_id 不能执行,需要挪到废纸篓的提示,并且找不到连接的 iOS 设备,不胜其烦。提示类似下图:
产生这个问题是因为 MacOS 的安全机制,将下载的文件标记了特殊的扩展属性,执行这个文件的时候,会检查这个扩展属性,导致出现上述问题。
假设 Flutter 的安装目录为 FLUTTER_ROOT,我们使用 xattr 命令查看一下:
关于 xattr 命令,请参考 https://ss64.com/osx/xattr.html 。
xattr -l $FLUTTER_ROOT/bin/cache/artifacts/libimobiledevice/idevice_id
输出如下:
com.apple.quarantine: 0082;5df1b9a7;The Unarchiver;
quarantine 是隔离区的意思,这里可以看出这个文件是 The Unarchiver 解压的,标记了隔离区。
使用下面的命令去掉这个扩展属性:
xattr -d com.apple.quarantine $FLUTTER_ROOT/bin/cache/artifacts/libimobiledevice/idevice_id
然后再执行上面的 xattr -l 可以看到没有输出了。idevice_id 就能正常执行了。
在 Flutter 安装目录,需要如此处理的文件有这些:
$FLUTTER_ROOT/bin/cache/artifacts/libimobiledevice/idevice_id
$FLUTTER_ROOT/bin/cache/artifacts/libimobiledevice/ideviceinfo
$FLUTTER_ROOT/bin/cache/artifacts/libimobiledevice/idevicename
$FLUTTER_ROOT/bin/cache/artifacts/libimobiledevice/idevicescreenshot
$FLUTTER_ROOT/bin/cache/artifacts/libimobiledevice/idevicesyslog
$FLUTTER_ROOT/bin/cache/artifacts/usbmuxd/iproxy
$FLUTTER_ROOT/bin/cache/artifacts/ideviceinstaller/ideviceinstaller
$FLUTTER_ROOT/bin/cache/artifacts/ios-deploy/ios-deploy
打完收功。