Check client and subscription compatibility before changing your App Store region
On iPhone, follow this order: check which configuration formats the client supports, see whether it’s available in your App Store region, import the configuration, then authorize the VPN and test the connection. Installing a client won’t give you proxy nodes automatically. Subscription URLs usually come from your service provider, and app purchase costs are separate from proxy service fees.
Desktop Clash clients, the mihomo core, and iOS proxy apps aren’t interchangeable. iOS apps typically use the system’s Network Extension to route traffic; supported protocols, rule syntax, and configuration management depend on each app’s implementation. An app labeled “proxy” or “VPN” isn’t necessarily able to parse a complete Clash YAML configuration.
| What to check | What to verify | Common misconception |
|---|---|---|
| Apps that support Clash-style configurations, such as Stash | Check which YAML fields, protocols, and extensions the current version supports | Assuming support for Clash configurations means support for every mihomo feature |
| Proxy tools such as Shadowrocket | Use a subscription URL the provider explicitly identifies as compatible with the app | Treating a complete Clash YAML file as a generic node subscription |
| Subscription service | Tell node subscriptions, complete configurations, and app-specific URLs apart | Assuming one URL works in every app without any adjustments |
App Store availability and region settings
Some proxy clients are available only in select App Store countries or regions. If you can’t find an app, check your App Store region first—not your iPhone’s language, time zone, or Language & Region settings. App availability is generally tied to the region of the Apple Account used for purchases. Availability can change, so check the current App Store listing.
Check the app name, developer, and system requirements
- Open the App Store, search for the app by its full name, and verify the developer. Don’t rely on a similar-looking icon or search ranking.
- On the app’s product page, check the minimum iOS version under Compatibility. Changing regions won’t help if your current iOS version doesn’t meet the requirements.
- Check the price, which account will make the purchase, and whether the app can be installed on your device. Verify that your subscription format is supported before buying, so you don’t discover a compatibility issue after installing the app.
View or change your App Store account region
On a typical iOS 18 setup, go to Settings → your name at the top → Media & Purchases → View Account → Country/Region. Labels may vary slightly depending on your iOS version and account status. This is separate from Settings → General → Language & Region.
- Changing your current account’s region: Apple may require you to spend your remaining balance, resolve subscriptions and pending orders, and provide a payment method accepted in the new region. Family Sharing may also affect eligibility.
- Using another regional account you own: You can manage your App Store sign-in under Media & Purchases without signing out of iCloud on the entire device. Switching accounts may still affect purchases, media subscriptions, and future updates, so read the prompts carefully.
- Keep your purchase history in mind: App purchases, redownloads, and update eligibility are tied to the account used to buy the app. Don’t rely on shared accounts from strangers or give verification codes to anyone offering to switch accounts for you.
Enter accurate regional information and follow Apple’s terms. Downloading an app package from a website isn’t a substitute for installing it through the App Store. Desktop .exe and .dmg files, as well as Android .apk files, can’t be used on iPhone. TestFlight is for beta distribution, with limited slots and builds that expire; it’s not a reliable long-term alternative to the App Store.
Import by subscription URL: keep the original link and verify updates
Subscription URLs are useful when you need to refresh proxy nodes regularly. They often contain access tokens, so anyone with the full URL may be able to access the subscription. Don’t post it in public chats, screenshots, or support tickets. When troubleshooting, share only the status code, error message, and domain with the token removed.
Import in three steps: add a configuration, download it, and select it
- Copy the HTTPS subscription URL for your client from your provider’s account page. Make sure you’ve copied the URL itself—not a sign-in page, sharing instructions, or text wrapped in quotation marks.
- In the client, open the Configuration, Subscription, or Profiles page and choose an option such as Add or Download from URL. The labels vary by app; look for remote configuration import, not the option to add a single node manually.
- Paste the full URL and give the configuration a local name that identifies its source, such as “Personal subscription.” If iOS asks whether to allow pasting from another app, verify the source before granting permission.
- Download or update the configuration, then check that nodes, proxy groups, or rules appear. Saving a configuration name alone doesn’t mean its contents were downloaded successfully.
- Set the new configuration as the active one. Some clients can store multiple configurations, but only the selected one is used for connections.
A complete Clash-style configuration commonly includes proxies, proxy-groups, and rules, and may use proxy-providers to load nodes. A subscription that returns only an encoded list of nodes isn’t a complete YAML configuration. Likewise, an HTML sign-in page isn’t a usable subscription. If parsing fails, check the response type and the app’s supported formats before changing a large number of rules.
Updating a subscription fetches its remote contents again. Whether the client overwrites local rules or preserves your node selection depends on its implementation. To keep custom routing changes, use the app’s supported override, script, or separate rule mechanism. Don’t assume edits made directly to a remote configuration will persist.
Import from a file or QR code: identify the content first
Import a configuration from the Files app
Configuration files are useful for offline transfer, backups, and troubleshooting. Save the file to On My iPhone or iCloud Drive in the Files app, then choose Import from File in the client. You can also select the client from the file’s share menu if it supports that file type.
- Check what’s actually in the file.
.yamland.ymlare common extensions for Clash-style configurations; changing the extension won’t convert the format. - After importing, review the configuration check results and look for indentation issues, invalid field types, or unsupported protocols. YAML uses spaces for indentation; don’t replace them with tabs.
- Select the imported configuration and check whether its proxy groups offer nodes to choose from. Any remote proxy providers or rule providers referenced in the file still need to be downloaded over the network.
- Keep a backup of the original file. A static file usually won’t fetch new nodes automatically like a remote subscription, unless it contains supported remote references.
Import a subscription or single node from a QR code
A QR code is just a way to carry text, not a universal configuration format. It may contain an HTTPS subscription URL, a single-node URI, or an import command specific to an app. Scanning only helps if the client supports the content.
- Scan from another screen: Open the scanner in the client, grant camera access when iOS prompts you, then review the import preview.
- QR code saved in your photo library: If the client supports scanning from Photos, select the screenshot. Otherwise, copying the subscription URL from your provider’s site is simpler.
- Scan with the system camera: iOS may treat the result as a regular web address. That doesn’t confirm the client imported it successfully.
After importing, check whether you added a single node or a subscription. A single-node QR code usually won’t include complete routing rules and may not support automatic updates. QR codes containing node passwords or subscription tokens are just as sensitive as the original URLs; obscure the entire code before sharing a screenshot.
Authorize the VPN and verify the first connection
After importing, select a configuration and node, then tap Connect. The first time a tunnel starts, iOS will usually ask whether the app can add a VPN configuration. Make sure the prompt names the client you just installed, then tap Allow and enter your device passcode or complete any requested verification.
This permission lets the client create a system network tunnel. It isn’t the same as installing a device management profile, root certificate, or MDM management. A standard subscription import usually doesn’t require any of these. If an unfamiliar guide asks you to install a certificate or management profile, stop and verify why it’s needed.
Use three checks to verify the connection—not just the VPN icon
- Check the mode and proxy group: For an initial test, use rule mode and select a node in a manual group that your rules actually reference. If the selected option is
DIRECT, matching traffic will still connect directly. - Check the tunnel status: Make sure the client shows Connected. You can also check Settings → General → VPN & Device Management → VPN in iOS 18. Menu names may vary by iOS version.
- Verify actual requests: Open a website that should use the proxy under your current rules, then check the client’s connection history or logs for the domain, matched policy, and outbound node. An exit IP lookup can provide another clue, but don’t judge by the status bar icon alone.
Your rules may route some IP lookup sites directly, so an unchanged result doesn’t always mean the connection failed. To isolate the cause, briefly try the app’s global proxy mode and make sure the global policy uses the intended node. Restore rule mode when you’re done. Don’t change DNS, nodes, and rules at the same time, or it’ll be hard to tell what fixed the issue.
Desktop TUN mode and the iOS system tunnel may both route app traffic, but their settings and underlying limitations differ. Don’t assume an iOS app handles a tun field in exactly the same way as a desktop client.
Troubleshoot import failures, connection timeouts, and update issues
| What you’re seeing | Check first | What to do next |
|---|---|---|
| Subscription returns HTTP 401 or 403 | Whether the URL token has expired or the service restricts access | Get a fresh URL from your provider’s site and check your account status |
| Subscription returns HTTP 404 | Whether the URL is missing part of its path or was truncated when copied | Copy the full URL again; don’t manually remove query parameters |
| Download succeeds, but parsing fails | Whether the response is a sign-in page, node list, or YAML with unsupported fields | Switch to a subscription format made for that client |
| Configuration imports, but won’t connect | Whether the configuration is selected and the proxy group has a working node selected | Select a node manually, then check the connection error |
| VPN connects, but webpages time out | Node availability, DNS, rules, and conflicts with other VPNs | Disable other network tunnels and test over both Wi-Fi and cellular |
| Rules revert after an update | Whether you edited the remote configuration directly | Save changes using a local override method supported by the client |
Retest one variable at a time
First disconnect and confirm that your regular network can reach your provider’s site, then run a subscription update. Select a node and connect, noting when the error occurs and what type of error the client reports. If Wi-Fi fails but cellular works, check the router, DNS, or local network restrictions first. If both fail, check node availability and configuration compatibility.
Another VPN, an on-demand connection rule, or a network filtering extension on iOS may interfere with testing. Disconnect other VPNs first and check whether they reconnect automatically. If the client starts routing traffic again after a restart, check its Connect On Demand setting and the corresponding system VPN setting rather than repeatedly deleting the subscription.
A latency test returning a value only shows that the test target was reachable at that moment. It doesn’t guarantee that every website, streaming service, or UDP app will work. For a basic first-connection check, confirm that the configuration updates, the intended policy is selected, logs show requests that should use the proxy, and the target service loads. For protocol or rule field details, see the YAML manual; the iOS client’s supported features remain the final authority.