electricbubble / gidevice

communicate with iOS devices implemented with Golang
MIT License
274 stars 68 forks source link

SimulateLocationUpdate return InvalidService error #7

Closed x1nchen closed 3 years ago

x1nchen commented 3 years ago

hi, I ran the example code of SimulateLocation but return error as below

2021/06/12 01:07:39 receive packet: InvalidService

Here is my code and iOS version is 14.0.1

package main

import (
    "log"

    giDevice "github.com/electricbubble/gidevice"
    "github.com/electricbubble/gidevice/pkg/libimobiledevice"
)

func main() {
    libimobiledevice.SetDebug(true)

    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://developer.amap.com/tools/picker
    // https://lbs.qq.com/tool/getpoint/index.html
    if err = d.SimulateLocationUpdate(113.925734, 22.511836, giDevice.CoordinateSystemWGS84); err != nil {
        log.Fatalln(err)
    }
}

I tried to debug this program and found it break at this function

func (c *lockdown) startService(service string, escrowBag []byte) (dynamicPort int, enableSSL bool, err error) {
    req := c.client.NewStartServiceRequest(service)
    if escrowBag != nil {
        req.EscrowBag = escrowBag
    }

    var pkt libimobiledevice.Packet
    if pkt, err = c.client.NewXmlPacket(req); err != nil {
        return 0, false, err
    }

    if err = c.client.SendPacket(pkt); err != nil {
        return 0, false, err
    }
        // returned error InvalidService
    respPkt, err := c.client.ReceivePacket()
    if err != nil {
        return 0, false, err
    }

    var reply libimobiledevice.LockdownStartServiceResponse
    if err = respPkt.Unmarshal(&reply); err != nil {
        return 0, false, err
    }

    if reply.Error != "" {
        return 0, false, fmt.Errorf("lockdown start service: %s", reply.Error)
    }

    dynamicPort = reply.Port
    enableSSL = reply.EnableServiceSSL

    return
}

Any Suggestion?

electricbubble commented 3 years ago

Maybe you didn't let your device mount the developer image first.

It only needs to be executed once after the iOS system is started

MountDeveloperDiskImage

x1nchen commented 3 years ago

Maybe you didn't let your device mount the developer image first.

It only needs to be executed once after the iOS system is started

MountDeveloperDiskImage

Awesome! It works!

Thanks for replying.