Yu9191/wloc
Productivity & UtilitiesSpoofs iOS Wi-Fi and cellular location by intercepting Apple's WLOC responses through a proxy module.
What it does
wloc changes the coordinates returned by Apple's network location service (gs-loc.apple.com / gs-loc-cn.apple.com) so that iOS Wi-Fi and cell-tower positioning resolves to a chosen place. It ships as proxy modules for Surge, Quantumult X, Loon, Stash and Shadowrocket; you pick a point on a web map and the module patches the protobuf response on subsequent WLOC lookups. GPS hardware positioning is not touched, so it works best indoors where Wi-Fi positioning dominates.
Two script rules do the work: one intercepts /clls/wloc responses and rewrites coordinates, the other saves the selected coordinate from the map page into persistent storage (how it works). Coordinates are stored as WGS84, and links from Apple Maps, Google Maps, Amap and Baidu are converted as needed; mainland-China links are GCJ-02 and get shifted, while Hong Kong/Macau/Taiwan links from Apple and Google stay WGS84 (README lines 101-103).
Quick start
Prerequisites: a supported proxy tool with MITM enabled, a trusted CA certificate for gs-loc.apple.com and gs-loc-cn.apple.com, and Safari routed through the proxy when using the map page.
- Subscribe to the module for your tool: Surge, Quantumult X, Loon, Stash, or Shadowrocket. Egern can reuse the Surge module; Stash should subscribe directly to the
.stoverridefile. - Open the online picker (add it to the Home Screen for convenience), choose a location on the map, search a place name, or paste a map link.
- Tap save to device.
- Trigger a location request; on iOS 15–18 the change usually applies without a reboot, while iOS 26+ caches
locationdresults and generally needs a restart.
The shortcut route is faster if the module is already active: pick a point in Apple Maps (long press → share) and run wloc set location, or run wloc restore location to return to the real position. Amap links work through share → more. Shortcut parsing goes through a Cloudflare Worker that resolves redirects and converts GCJ-02 to WGS84 without logging or caching; the source is in worker/src/parse.js and can be self-hosted (README lines 83-124).
Module parameters include longitude, latitude, accuracy (default 25 m), randomRadius (0 by default; each response jitters within the radius) and logLevel. A stored pick from the map page takes precedence over module parameters, which take precedence over defaults.
Running constraints
- MITM interception of the Apple WLOC domains is required; without a trusted certificate nothing is rewritten.
- Since 2026-11-04, users on various iOS 26 and iOS 18 versions report the interception failing with certificate errors, sometimes after a reboot; the cause is unconfirmed (tracking issue).
- From iOS 27 beta 6, Apple rejects non-Apple CAs at the TLS layer inside
locationd, and gateway-side or transparent-proxy setups do not help. The project cannot work on those versions (test data). - Only Wi-Fi and cell-tower positioning is changed; strong GPS signal can override the network result.
- Because of the iOS 26+ location cache, switching coordinates may require a reboot; on 2026-11-04+ builds this reboot carries the risk described above.
- To restore real positioning, disable or remove the module, or clear the
wloc_settingspersistent key so the script passes responses through. Manually changed module coordinates must be reset to defaults for pass-through to trigger. - The public picker has a request limit; self-deploying the Worker is recommended. The one-click Deploy to Cloudflare Workers button handles Workers; Pages requires
npm run pages:deployinworker/because the compatibility config would otherwise be lost. - Licensed under AGPL-3.0, with commercial use and app-store distribution prohibited without authorization.
HotRepo's take
On 2026-11-06 the project ranked 5th on the JavaScript daily list with 127 stars gained that day, against 10,611 total stars and 2,627 forks. The README shows an active maintenance rhythm that matches that visibility: it carries dated incident notes for the 2026-11-04 certificate failures and the iOS 27 TLS restriction, plus links to per-version issue threads, and the changelog names outside contributors for Baidu support, GCJ conversion fixes, random-radius jitter and Stash response fixes. The main open question is version reach: the same interception path is documented as broken or unreliable on iOS 18, iOS 26 and iOS 27 beta 6+, so whether the project works depends heavily on the device's iOS build.
Written by AI from the project's README, updated . The project's own docs are the source of truth.