How to Set Up a Proxy on iPhone and iPad (Wi-Fi)
How to set up proxy on iPhone and iPad with a username and password, why it only covers one Wi-Fi network, how to stop password prompts and check the exit IP.
If you need to know how to set up proxy on iphone for a geo test, the setting itself takes a minute: Settings, Wi-Fi, the info button next to your network, Configure Proxy, Manual. The trouble starts afterwards. The proxy belongs to that one Wi-Fi network and nothing else, cellular data never touches it, some phones keep asking for the proxy password, and Safari will happily show you the wrong country if Private Relay or a cellular fallback is in play. This guide sets up a SparkProxy username/password proxy on iPhone and iPad, explains each of those catches from Apple's own documentation, and ends with a check in Safari that proves which IP and country the phone is really using.
What the iPhone Wi-Fi Proxy Covers, and What It Skips
The proxy you type into iOS Settings is an HTTP proxy attached to a single saved Wi-Fi network. Most "my iPhone proxy isn't working" reports come down to one of the rows below.
| Traffic | Goes through the Wi-Fi proxy? | Why |
|---|---|---|
| Safari on that Wi-Fi network | Yes | Follows the system proxy |
| Apps using Apple's standard networking (URLSession) on that network | Usually | Apple documents that a session with no proxy dictionary set "use[s] the default system settings" |
| Apps that set their own proxy dictionary or ship their own network stack | Not guaranteed | They can override or ignore the system value |
| Any traffic over cellular data | No | The setting lives on the Wi-Fi network, not on the phone |
| A different Wi-Fi network | No | Each saved network has its own proxy setting |
| UDP traffic (some games, calls) | No | An HTTP proxy carries TCP connections only |
The URLSession row comes from Apple's connectionProxyDictionary reference: "The default value is nil, which means that tasks use the default system settings." That's why most mainstream apps follow your proxy and a minority don't. An app that pins its own proxy configuration, or sets an empty one, routes around you, and nothing in Settings can force it.
There is no SOCKS option. The Settings screen offers Off, Manual and Automatic, and Apple's Wi-Fi configuration payload exposes only ProxyType (None, Manual, Auto), ProxyServer, ProxyServerPort, ProxyUsername, ProxyPassword, ProxyPACURL and ProxyPACFallbackAllowed. SparkProxy's SOCKS5 port (13000) is for desktop tools. On the phone you use the HTTP ports.
HTTPS still works through an HTTP proxy. Safari asks the proxy to open a tunnel with CONNECT, and TLS runs end to end inside it, so the proxy sees the hostname but not the page.
If your end goal is a QA programme rather than one phone, our guide to proxies for mobile app testing teams covers where to insert a proxy across simulators, emulators and device farms. This post stays on a real iPhone or iPad.
Collect Four Values Before You Pick Up the Phone
Typing credentials on a phone keyboard is where most failed setups begin, so get the values right on a laptop first.
| Field on the iPhone | SparkProxy value |
|---|---|
| Server | `gateway.sparkproxy.io` |
| Port | `11000` for Random Rotation, `11002` for Sticky Sessions |
| Username | The proxy username from your SparkProxy dashboard |
| Password | The matching proxy password |
Country selection rides on the credential. The sample credential on the SparkProxy homepage shows a country suffix in the username (user-country-us). Copy the exact username your dashboard issues for the country you want rather than editing it by hand, because one wrong character produces the same 407 as a wrong password.
Then test that credential from any computer on the same Wi-Fi. This curl call goes through the gateway and prints the exit IP and country:
curl -s -x "http://YOUR_USERNAME:YOUR_PASSWORD@gateway.sparkproxy.io:11000" https://ipinfo.io/json
A good result is a JSON object whose ip is not your office IP and whose country matches the one you chose. A bad credential fails before any page loads. We sent a request with no credentials to the gateway on 2026-10-30, and it answered:
HTTP/1.1 407 Proxy Authentication Required
X-Squid-Error: ERR_CACHE_ACCESS_DENIED 0
Proxy-Authenticate: Basic realm="SparkProxy"
Via: 1.1 gateway.sparkproxy.io (squid/7.3-VCS)
Remember that realm, SparkProxy. It's the name you'll see if the iPhone ever shows a sign-in sheet for the proxy. If you prefer Python, this does the same check and turns the failure into a readable message:
import sys
import requests
USER = "YOUR_USERNAME"
PASSWORD = "YOUR_PASSWORD"
PORT = 11000 # 11002 for Sticky Sessions
proxy = f"http://{USER}:{PASSWORD}@gateway.sparkproxy.io:{PORT}"
proxies = {"http": proxy, "https": proxy}
try:
resp = requests.get("https://ipinfo.io/json", proxies=proxies, timeout=20)
except requests.exceptions.ProxyError as exc:
if "407" in str(exc):
sys.exit("Proxy rejected the credential (407). Fix it here before typing it on the phone.")
sys.exit(f"Could not reach the proxy: {exc}")
data = resp.json()
print(f"exit IP {data.get('ip')} country {data.get('country')} network {data.get('org')}")
With requests 2.32.5 on Python 3.14.2, a bad credential raised ProxyError containing Tunnel connection failed: 407 Proxy Authentication Required, which is what the "407" in str(exc) test matches. If this script prints an IP and country, the credential is good and anything that goes wrong later is on the phone side.
Scraping at scale? Skip the blocks.
Fast, unblockable datacentre proxies with unlimited bandwidth.
Enter the Proxy on iPhone and iPad
The path is the same on iPhone and iPad. Apple's Setup Assistant article (published 2025-03-21) lists "Set up an HTTP proxy" among the options on a network's info screen, and the same screen is reachable from Settings at any time.
- Connect to the Wi-Fi network you'll test on. The setting attaches to the network you open, so join the right one first.
- Open Settings > Wi-Fi and tap the info button next to the connected network.
- Scroll to the bottom and tap Configure Proxy.
- Choose Manual.
- Server:
gateway.sparkproxy.io. Nohttp://, no trailing slash. - Port:
11000or11002. - Turn on Authentication and enter the username and password exactly as the laptop test used them.
- Tap Save, then go back one screen so the network reconnects with the new settings.
Two small things trip people up. Autocorrect and auto-capitalisation can alter a username as you type it, so paste it from a note or a password manager instead. And a trailing space copied with the password is invisible in the field but enough to fail authentication.
To turn the proxy off later, return to the same screen and set Configure Proxy back to Off. The values aren't kept, so save them somewhere if you switch often.
Stop the Repeated Proxy Password Prompt
The single most common complaint about iPhone proxies is a sign-in sheet that keeps coming back, sometimes over Safari, sometimes over an unrelated app. It appears when a request reaches the gateway without credentials the gateway accepts, and the gateway answers with the Basic realm="SparkProxy" challenge shown above.
Work through the causes in this order, cheapest first:
- Authentication toggle is off. Reopen Configure Proxy. If the switch is off, the phone sends nothing and every request is challenged.
- The stored value is wrong. Re-enter the password from scratch rather than editing it. Check for a trailing space and a capitalised first letter.
- The credential changed upstream. A password reset in the dashboard, an expired trial or a username with a different country suffix all produce the same prompt. Run the laptop test from the previous section; if it fails there too, the phone isn't the problem.
- A background process doesn't use the saved credential. User reports describe prompts that appear while no app is open, which points at system services or apps that send their own requests without the credential stored on the Wi-Fi network. Apple doesn't document which processes behave this way, so treat it as observed behaviour rather than a rule. Retyping the password doesn't help with this one.
Cause 4 is the one with a clean fix: remove the challenge altogether with IP whitelisting. SparkProxy supports both whitelist and user:pass authentication on every plan. On a Wi-Fi network, every device leaves the building through the router's public IP, so whitelist that address and the gateway stops asking anybody on that network for a password.
Find the network's public IP with the proxy turned off. Open this in Safari on the phone, or run it from a laptop on the same network:
curl -s https://api.ipify.org
Add that IP to the whitelist in your SparkProxy dashboard, then go back to Configure Proxy on the phone, keep Server and Port, and turn Authentication off. The prompts stop because there is no longer a challenge to answer. Our explainer on IP whitelisting for proxies goes through the trade-off in more depth, and how proxy authentication works covers the 407 handshake itself.
Know the costs before you choose it:
- Whitelisting authorises every device on that network, not just your test phone.
- Home and many office connections get a new public IP from the ISP now and then. When it changes, the proxy starts refusing again until you update the whitelist.
- Behind carrier-grade NAT, the public IP is shared with strangers. Don't whitelist an address you can't be sure is yours alone.
Whitelisting pairs well with the per-network design of the iPhone setting: the proxy only applies on one Wi-Fi, and the whitelist only trusts that Wi-Fi's exit. Leave the phone and both stop applying together.
Why Cellular Data Ignores Your Proxy
The proxy is a property of the Wi-Fi network. The moment the phone sends traffic over cellular, that traffic goes direct, with your carrier's IP and your real country. There are three ways this happens during a test, and only the first is obvious.
You walk out of range. The phone drops the Wi-Fi network and everything moves to cellular.
Connectivity Assist borrows cellular. Apple's support article on it (published 2026-09-14) says Connectivity Assist "replaces and supersedes Wi-Fi Assist, previously found in Cellular settings" and "uses cellular data to improve your connection when Wi-Fi is slow or unusable." If Wi-Fi Assist was on before you updated, Connectivity Assist starts on. The switch is now under Settings > Wi-Fi, and Apple says it can also be turned off for a single network. A slow proxied page is exactly the case it's built to rescue, which is why a geo test can quietly finish loading over the carrier.
The app picks cellular itself. Apps can ask for cellular explicitly, and some do for real-time features.
For any test where the country matters, turn Cellular Data off for the duration (Settings > Cellular, or Mobile Data in some regions) and switch off Connectivity Assist. A Wi-Fi-only iPad doesn't have this problem, which makes it the easier device for geo checks.
Could you proxy cellular instead? Apple's Cellular payload does have APN proxy fields, and it doesn't require supervision. Its APN entry offers ProxyServer and ProxyPort, and the only Username and Password keys belong to the APN login, not the proxy. So a cellular APN proxy has no way to carry SparkProxy credentials, which leaves IP whitelisting, and the IP you'd have to whitelist is your carrier's shared, changing exit. In practice it's a dead end for a commercial proxy. The supported route for "everything, on every interface" is the global proxy covered below.
Confirm the Exit IP and Country in Safari
Don't trust the saved setting. Ask a server what it sees. In Safari on the phone, open:
https://ipinfo.io/json
You get a small JSON page. Read three fields: ip (should be a SparkProxy exit, not your router's address from the whitelist step), country (should match the credential you chose) and org (the network that owns the exit IP). Then turn Wi-Fi off and load the page once more over cellular. You should see your carrier and real country, which proves the comparison is working and not cached.
If Safari shows your own IP while the proxy is set, check Private Relay before anything else. Apple's developer note says Private Relay "protects users' web browsing in Safari, DNS resolution queries, and insecure http app traffic," and Apple doesn't document how it interacts with a manual HTTP proxy. Remove the doubt by turning it off for the test network: Apple's article on managing Private Relay (published 2026-10-01) gives the path as Settings > Wi-Fi, the More Info button next to the network, then Limit IP Address Tracking. The same Apple page mentions geo-IP annotation fields such as is_relay for marking relay addresses, so an org you don't recognise is worth checking.
For a quick rotation check, reload the page a few times on port 11000 and watch ip change. On 11002 it should hold steady. Deeper testing (latency, HTTPS versus HTTP, health scripts) is covered in how to test if your proxy is working, so we won't repeat it here.
What the IP check can't tell you: Safari still reports the phone's own time zone and language to every site, Location Services still reports GPS, and the App Store storefront is an Apple Account setting (Apple's guide to changing country or region, published 2026-10-05, asks for a payment method valid in the new country). A proxy changes the IP address and nothing else on that list. If a site still shows your home country with a correct exit IP, compare against those signals before blaming the proxy.
Random Rotation or Sticky Sessions on a Phone
The port decides how often the exit IP changes, and on a phone the wrong choice looks like a broken app.
| Port 11000: Random Rotation | Port 11002: Sticky Sessions | |
|---|---|---|
| Exit IP behaviour | SparkProxy describes it as "Fresh IP per request" | Same IP for 5 minutes |
| Good for | Checking what a page shows in a country, price and content checks | Logging in, carts, checkout flows, any app that ties a session to an IP |
| Failure pattern | Logins bounce, captchas loop, an app signs you out mid-test | A test that runs past the window may see a new IP mid-flow |
A browser loading one page opens many connections, so on Random Rotation the page's assets can arrive from several IPs. For "does this page show the German price" that's harmless. For an app login, the server sees the session hop countries between requests, and many will kill it. Use Sticky Sessions for anything with a sign-in, and see what a sticky session proxy is for how the window behaves.
Concurrency matters less on one phone than on a scraper, but it adds up when a team shares a plan across several devices. SparkProxy plans are packs, starting from $75/month (USD, read from sparkproxy.io on 2026-10-09), with unlimited bandwidth included. The billing unit is the plan and its concurrency, not gigabytes, so streaming test video through the proxy doesn't run up a traffic bill. The 24-hour free trial needs no credit card, which is enough time to run the whole checklist in this guide on a real device before buying.
Install the Same Proxy as a Wi-Fi Profile
Typing the setting by hand on five test phones invites five different typos. A configuration profile carries the Wi-Fi network and its proxy in one file. Apple's Wi-Fi payload (com.apple.wifi.managed) allows manual install on iOS and doesn't require supervision, so any iPhone or iPad can take it.
This script writes the profile with Python's standard library:
import plistlib
import uuid
SSID = "QA-Lab-5G"
WIFI_PASSWORD = "wifi-passphrase"
PROXY_USER = "YOUR_USERNAME"
PROXY_PASS = "YOUR_PASSWORD"
PROXY_PORT = 11002 # Sticky Sessions; use 11000 for Random Rotation
def new_uuid() -> str:
return str(uuid.uuid4()).upper()
wifi_payload = {
"PayloadType": "com.apple.wifi.managed",
"PayloadVersion": 1,
"PayloadIdentifier": "io.sparkproxy.qa.wifi",
"PayloadUUID": new_uuid(),
"PayloadDisplayName": f"{SSID} through SparkProxy",
"SSID_STR": SSID,
"EncryptionType": "WPA2",
"Password": WIFI_PASSWORD,
"AutoJoin": True,
"ProxyType": "Manual",
"ProxyServer": "gateway.sparkproxy.io",
"ProxyServerPort": PROXY_PORT,
"ProxyUsername": PROXY_USER,
"ProxyPassword": PROXY_PASS,
}
profile = {
"PayloadType": "Configuration",
"PayloadVersion": 1,
"PayloadIdentifier": "io.sparkproxy.qa",
"PayloadUUID": new_uuid(),
"PayloadDisplayName": "SparkProxy QA Wi-Fi",
"PayloadContent": [wifi_payload],
}
with open("sparkproxy-qa-wifi.mobileconfig", "wb") as fh:
plistlib.dump(profile, fh)
print("wrote sparkproxy-qa-wifi.mobileconfig")
Every key there comes from Apple's Wi-Fi payload reference. Drop the two credential keys if you've whitelisted the network instead. To get the file onto the phone, serve it from a laptop on the same network and open it in Safari:
python3 -m http.server 8000
# then on the phone: http://<laptop-LAN-IP>:8000/sparkproxy-qa-wifi.mobileconfig
Apple's install article (published 2026-04-14) gives the rest: open Settings, tap Profile Downloaded, then Install. Two details from that page matter here. "If a profile is not installed within 8 minutes of downloading it, it is automatically deleted," and Stolen Device Protection must be turned off before installing a profile unless you're in a familiar location. Turn it back on afterwards. The file holds the proxy password in plain text, so stop the web server and delete the file once the phones are done.
Proxy Every Connection on a Supervised Test Device
When a test genuinely needs all traffic proxied, on Wi-Fi and cellular alike, Apple has a payload for it: Global HTTP Proxy (com.apple.proxy.http.global). It accepts ProxyServer, ProxyServerPort, ProxyUsername and ProxyPassword, so SparkProxy credentials fit. The catch is in Apple's availability table: it "Requires supervision" on iOS. Supervision is set when a device is prepared in Apple Configurator for Mac or enrolled through Automated Device Enrollment, and preparing an existing phone for supervision means erasing it. That's fine for a dedicated test device and wrong for your own phone.
The payload body, inside the same outer profile structure as the Wi-Fi example:
<dict>
<key>PayloadType</key>
<string>com.apple.proxy.http.global</string>
<key>PayloadVersion</key>
<integer>1</integer>
<key>PayloadIdentifier</key>
<string>io.sparkproxy.qa.globalproxy</string>
<key>PayloadUUID</key>
<string>REPLACE-WITH-A-NEW-UUID</string>
<key>ProxyType</key>
<string>Manual</string>
<key>ProxyServer</key>
<string>gateway.sparkproxy.io</string>
<key>ProxyServerPort</key>
<integer>11002</integer>
<key>ProxyUsername</key>
<string>YOUR_USERNAME</string>
<key>ProxyPassword</key>
<string>YOUR_PASSWORD</string>
<key>ProxyCaptiveLoginAllowed</key>
<true/>
</dict>
ProxyCaptiveLoginAllowed is worth setting to true on a device that travels. Apple's description: it "allows the device to bypass the proxy server to display the login page for captive networks." Without it, a hotel or airport sign-in page can't load, because the phone sends it to the proxy before it has internet access. Apple also allows only one payload of this type on a device at a time.
If you build the app under test, you can confirm from inside it what the system thinks the proxy is. This Swift snippet reads the effective settings with CFNetwork:
import CFNetwork
if let settings = CFNetworkCopySystemProxySettings()?.takeRetainedValue() as? [String: Any] {
let host = settings[kCFNetworkProxiesHTTPProxy as String] ?? "none"
let port = settings[kCFNetworkProxiesHTTPPort as String] ?? "-"
print("System HTTP proxy: \(host):\(port)")
}
If that prints none while Settings shows a proxy, the device is on a different network from the one you configured, or on cellular.
Symptom Table: What You See and What Fixes It
Read across from the symptom. The last column says plainly whether a proxy change can fix it.
| What you see | Most likely cause | Fix | Proxy can fix it? |
|---|---|---|---|
| Sign-in sheet for "SparkProxy", again and again | Wrong stored credential, or a process not using it | Re-enter credential; if it persists, whitelist the network IP and turn Authentication off | Yes |
| Plain-HTTP page shows "Cache Access Denied" | Gateway returned 407 (its error page title is "SparkProxy - Cache Access Denied") | Same as above | Yes |
| Safari shows your real IP with the proxy set | Private Relay, wrong Wi-Fi network, or cellular fallback | Limit IP Address Tracking off; check the network name; turn Cellular Data off | Partly: these are phone settings |
| Correct exit IP, site still shows home country | Time zone, language, GPS or Apple Account region | Change those on the device or account | No |
| App works only with the proxy off | App sets its own proxy rules or uses UDP | Test that app on a device with the global proxy, or accept the gap | No |
| Login drops mid-flow | Random Rotation changing IP | Switch to port 11002 (Sticky Sessions) | Yes |
| Hotel Wi-Fi never shows its sign-in page | Captive portal sent to the proxy | Turn the proxy off to sign in, or set `ProxyCaptiveLoginAllowed` | Yes |
| Everything worked yesterday, all requests now refused | Trial ended, or the whitelisted public IP changed | Check plan status; re-run the ipify check and update the whitelist | Yes |
The "Cache Access Denied" title is what we got back from the gateway on 2026-10-30 for a plain-HTTP request without credentials. HTTPS sites don't show it: a refused CONNECT fails before any page exists, so Safari shows its own error instead.
Frequently asked questions
FAQ
Open Settings > Wi-Fi, tap the info button next to your network, then Configure Proxy > Manual. Enter gateway.sparkproxy.io, port 11000 or 11002, turn on Authentication and type the username and password from your dashboard, then tap Save.
No. The manual proxy belongs to one Wi-Fi network, so cellular traffic goes direct with your carrier's IP. Turn Cellular Data and Connectivity Assist off during geo tests, or use Apple's Global HTTP Proxy payload, which requires a supervised device.
A request reached the proxy without a credential it accepted. Re-enter the password, confirm the Authentication switch is on and test the credential from a laptop; if prompts continue, whitelist the Wi-Fi network's public IP and turn Authentication off.
Not through Settings. iOS offers only an HTTP proxy (Manual or Automatic via a PAC file), and Apple's Wi-Fi payload has no SOCKS field. Use SparkProxy's HTTP ports 11000 or 11002 on the phone.
With the proxy on, open https://ipinfo.io/json in Safari and read the ip and country fields. Compare them with the same page loaded over cellular to confirm the proxy, not a cached result, is what changed.
Yes. Each saved network keeps its own proxy setting, on iPad and iPhone alike. To avoid retyping, install a Wi-Fi configuration profile that carries the network and the proxy together.
Get 20% off your first month
Premium datacentre proxies with unlimited bandwidth. Use the code at checkout.
Save up to 15% more on quarterly, half-yearly and yearly plans
Related articles
Java Proxy Settings: Fix JVM 407 and Ignored Proxies
Java proxy settings that work: which JVM properties HttpClient reads, why Basic auth gets 407 on HTTPS, and the startup flag that fixes it, with a check each.
Sticky Session IP Changing Mid-Flow? Causes and Fixes
Sticky session IP changing mid-login or checkout? Check leaks, session ID format, the 5-minute window, parallel connections and exit churn in order.
httpx proxies Argument Removed? Fix ProxyError and 407
The httpx proxies argument is gone in 0.28. Fix the TypeError, then ProxyError 407, SOCKS ImportError and RemoteProtocolError, with verbatim errors and code.
