Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

GEFI — GPS Emulator for iOS

GEFI interface preview

GEFI is a local web application for simulating GPS coordinates on a USB-connected iPhone. It combines a Flask backend, an interactive Leaflet map, and pymobiledevice3 to maintain a location-simulation session without jailbreaking the device.

GEFI is intended for development and testing. Use it only on devices and applications you are authorized to test.

Features

  • USB and network iOS device detection with selectable targets
  • Developer Disk Image mounting for location simulation
  • Address search with map-based geocoding
  • Instant teleportation to any map coordinate
  • Automated movement along a selected route
  • Manual movement through an on-screen joystick and keyboard controls
  • Adjustable speed presets for walking, cycling, and driving
  • GPX route import with timestamp-aware playback
  • Map styles: standard, satellite, and dark
  • One-click restore to the device's physical GPS location
  • Live console logging for session monitoring

Movement controls are map-relative. GEFI updates latitude and longitude only; it does not emulate device heading or altitude.

Supported platforms

GEFI is built and tested for macOS. The web interface can run on other systems, but reliable iPhone GPS emulation depends on macOS, USB connectivity, and the iOS 17+ userspace workflow used by pymobiledevice3.

Requirements

  • macOS
  • Python 3.10 or newer
  • iPhone with Developer Mode enabled
  • USB connection and a trusted computer
  • Internet access for installation, map tiles, and address search

GEFI is designed around the iOS 17+ userspace tunnel supported by pymobiledevice3. Compatibility can change with new iOS and pymobiledevice3 releases.

Quick start

git clone https://github.com/olaftnt/GEFI.git
cd GEFI
chmod +x run.sh
./run.sh

Open http://127.0.0.1:5001, connect the iPhone, select Scan, and mount the DDI if required.

The launcher creates a local venv, installs dependencies, attempts to mount the DDI, and starts the server.

Manual setup

python3 -m venv venv
source venv/bin/activate
python -m pip install -r requirements.txt
python app.py

Optional environment variables:

GEFI_HOST=127.0.0.1
GEFI_PORT=5001
GEFI_DEBUG=false

Do not expose the Flask server to untrusted networks. The API can control the location of a connected device and does not include authentication.

Using the map

  1. Connect and select an iPhone.
  2. Right-click the map and choose Teleport Here or Walk Here.
  3. Use the joystick or keyboard controls for manual movement.
  4. Press Space to stop movement.
  5. Select Reset GPS when testing is complete.

GPX routes

Load a .gpx file containing trkpt elements in the GPX Route Player. By default, GEFI replays the route using the original <time> timestamps from the recording, so movement speed matches the source GPX.

GEFI validates GPX files on load and shows warnings in the GPX panel and console when a file is incomplete or not ideal for playback, for example:

  • invalid XML
  • no <trkpt> track points
  • only waypoints or route points instead of track points
  • missing or partial <time> timestamps
  • reversed or duplicate timestamps
  • very long pauses between points
  • unrealistic implied speeds for navigation apps

If a GPX file has no timestamps, playback falls back to 1 point per second. Enable Use Manual Speed only when you want to ignore GPX timing and follow the movement speed slider instead.

convert_logs.py converts files named gps_log_*.json in the current directory into GPX:

python convert_logs.py

API

  • GET /health — service health
  • GET /api/devices — connected iOS devices
  • POST /api/mount — mount the Developer Disk Image
  • POST /api/spoof — set { "udid", "latitude", "longitude" }
  • POST /api/clear — clear simulated location
  • GET /api/status — current simulation status

Troubleshooting

  • No device found: unlock the iPhone, reconnect USB, accept the trust prompt, and select Scan.
  • DDI mount fails: enable Developer Mode, restart the iPhone if requested, and try Mount DDI Image again.
  • Location does not update: keep the device unlocked during setup and check the GEFI console and terminal output.
  • An iOS update breaks connectivity: install a compatible pymobiledevice3 release and review its upstream compatibility notes.

Security and privacy

GEFI runs locally by default. Address searches use OpenStreetMap Nominatim, and map views load tiles from OpenStreetMap, CARTO, or Esri. Search terms and tile requests are therefore sent to those providers.

Disclaimer

This project is not affiliated with or endorsed by Apple Inc. Simulated locations may violate the rules of third-party services. You are responsible for complying with applicable laws, platform terms, and application policies.

License

This project is licensed under the MIT License. See LICENSE for details.

Releases

Packages

Contributors

Languages