项目地址

项目说明

Golang

已实现功能:

  • 设备列表查询
  • 开发者镜像挂载
  • 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)
    // }
}