Golang Go语言实现的与iOS设备进行通信的跨平台工具库

发布于 1周前 作者 eggper 来自 Go语言

Golang Go语言实现的与iOS设备进行通信的跨平台工具库

项目地址

Go Module 版本: https://github.com/electricbubble/gidevice
CLI 版本: https://github.com/electricbubble/gidevice-cli

项目说明

使用 Golang 实现的的与 iOS 设备 进行通信的跨平台工具库

所有功能无需越狱
macOS 可直接使用
Windows 需要先安装 iTunes 或者 usbmuxd
Linux 或其他需先安装 usbmuxd

已实现功能:

  • 设备列表查询
  • 开发者镜像挂载
  • App 启 /停 /卸载 /安装
  • 端口转发
  • 截图
  • XCTest
  • Syslog
  • CrashReport
  • 沙盒文件访问
  • 定位修改 /恢复
  • Pair

部分 CLI 版本使用示例

Devices

$ gidevice list

DeveloperDiskImage

$ gidevice mount -l
# gidevice mount -l -u=39xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7
$ gidevice mount -d=/path/.../DeviceSupport/14.4/
$ gidevice mount /path/.../DeviceSupport/14.4/DeveloperDiskImage.dmg /path/.../DeviceSupport/14.4/DeveloperDiskImage.dmg.signature

Forward

# Default port local=8100 remote=8100
$ gidevice forward
$ gidevice forward -l=9100 -r=9100 -u=39xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7

部分 Go Module 版本使用示例

Devices

package main

import ( giDevice “github.com/electricbubble/gidevice” “log” )

func main() { usbmux, err := giDevice.NewUsbmux() if err != nil { log.Fatalln(err) }

devices, err := usbmux.Devices()
if err != nil {
	log.Fatal(err)
}

for _, dev := range devices {
	log.Println(dev.Properties().SerialNumber, dev.Properties().ProductID, dev.Properties().DeviceID)
}

}

DeveloperDiskImage

package main

import ( “encoding/base64” giDevice “github.com/electricbubble/gidevice” “log” )

func main() { usbmux, err := giDevice.NewUsbmux() if err != nil { log.Fatal(err) }

devices, err := usbmux.Devices()
if err != nil {
	log.Fatal(err)
}

if len(devices) == 0 {
	log.Fatal("No Device")
}

d := devices[0]

imageSignatures, err := d.Images()
if err != nil {
	log.Fatalln(err)
}

for i, imgSign := range imageSignatures {
	log.Printf("[%d] %s\n", i+1, base64.StdEncoding.EncodeToString(imgSign))
}

dmgPath := "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/14.4/DeveloperDiskImage.dmg"
signaturePath := "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/14.4/DeveloperDiskImage.dmg.signature"

err = d.MountDeveloperDiskImage(dmgPath, signaturePath)
if err != nil {
	log.Fatalln(err)
}

}

App

package main

import ( giDevice “github.com/electricbubble/gidevice” “log” “path/filepath” )

func main() { usbmux, err := giDevice.NewUsbmux() if err != nil { log.Fatalln(err) }

devices, err := usbmux.Devices()
if err != nil {
	log.Fatalln(err)
}

if len(devices) == 0 {
	log.Fatalln("No Device")
}

d := devices[0]

bundleID := "com.apple.Preferences"
pid, err := d.AppLaunch(bundleID)
if err != nil {
	log.Fatalln(err)
}

err = d.AppKill(pid)
if err != nil {
	log.Fatalln(err)
}

runningProcesses, err := d.AppRunningProcesses()
if err != nil {
	log.Fatalln(err)
}

for _, process := range runningProcesses {
	if process.IsApplication {
		log.Printf("%4d\t%-24s\t%-36s\t%s\n", process.Pid, process.Name, filepath.Base(process.RealAppName), process.StartDate)
	}
}

}

Screenshot

package main

import ( giDevice “github.com/electricbubble/gidevice” “image” “image/jpeg” “image/png” “log” “os” )

func main() { usbmux, err := giDevice.NewUsbmux() if err != nil { log.Fatalln(err) }

devices, err := usbmux.Devices()
if err != nil {
	log.Fatalln(err)
}

if len(devices) == 0 {
	log.Fatalln("No Device")
}

d := devices[0]

raw, err := d.Screenshot()
if err != nil {
	log.Fatalln(err)
}

img, format, err := image.Decode(raw)
if err != nil {
	log.Fatalln(err)
}
userHomeDir, _ := os.UserHomeDir()
file, err := os.Create(userHomeDir + "/Desktop/s1." + format)
if err != nil {
	log.Fatalln(err)
}
defer func() { _ = file.Close() }()
switch format {
case "png":
	err = png.Encode(file, img)
case "jpeg":
	err = jpeg.Encode(file, img, nil)
}
if err != nil {
	log.Fatalln(err)
}
log.Println(file.Name())

}

SimulateLocation

package main

import ( giDevice “github.com/electricbubble/gidevice” “log” )

func main() { usbmux, err := giDevice.NewUsbmux() if err != nil { log.Fatalln(err) }

devices, err := usbmux.Devices()
if err != nil {
	log.Fatalln(err)
}

if len(devices) == 0 {
	log.Fatalln("No Device")
}

d := devices[0]

// https://api.map.baidu.com/lbsapi/getpoint/index.html
if err = d.SimulateLocationUpdate(116.024067, 40.362639, giDevice.CoordinateSystemBD09); err != nil {
	log.Fatalln(err)
}

// https://developer.amap.com/tools/picker
// https://lbs.qq.com/tool/getpoint/index.html
// if err = d.SimulateLocationUpdate(120.116979, 30.252876, giDevice.CoordinateSystemGCJ02); err != nil {
// 	log.Fatalln(err)
// }

// if err = d.SimulateLocationUpdate(121.499763, 31.239580,giDevice.CoordinateSystemWGS84); err != nil {
// if err = d.SimulateLocationUpdate(121.499763, 31.239580); err != nil {
// 	log.Fatalln(err)
// }

// err = d.SimulateLocationRecover()
// if err != nil {
// 	log.Fatalln(err)
// }

}


更多关于Golang Go语言实现的与iOS设备进行通信的跨平台工具库的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

回到顶部