What you are seeing
The code works on Android yet fails on iPhone, or works on some iPhones and not others. iPhone decoding is strict about certain payload shapes and about how the camera app hands the result to the next app, so a code that Android forgives can still stall on iPhone. The split can also come from the iPhone camera setup: an older iOS version, a disabled scan setting, or a lens and focus quirk. Work through the payload first, then the phone, because a payload fix helps every iPhone while a phone setting only helps one.
Likely causes
1.
Payload shape iPhone rejects — Some payloads use field orders, separators, or action formats that Android tolerates and iPhone refuses, particularly for WiFi, contacts, and calendar events. Test: decode the payload and compare it with the standard layout for that type.
2.
iPhone Scan QR Codes setting switched off — iPhone has a camera setting that enables QR scanning, and when it is off the camera simply ignores codes. Test: open the camera settings on the failing iPhone and confirm the scanning option is on.
3.
Action iPhone will not perform automatically — iPhone may show the preview banner yet refuse the follow-on action, such as joining a network or saving a contact with unusual fields. Test: watch whether the banner appears; if it does but the action fails, the action is the problem.
4.
Encoding or special characters — Characters outside the basic set can decode differently between platforms, and iPhone may show garbled text or refuse the payload. Test: decode on both platforms and compare the text exactly.
5.
Focus, distance, or lens issue on that iPhone — A smudged lens, a scratched camera cover, or a focus struggle at close range can look like a code failure. Test: try the same iPhone on other codes and at a different distance.
Step-by-step fix
1. Confirm the iPhone camera scanning setting is on and the lens is clean.
2. Decode the payload and compare it with the standard layout for its type.
3. Rebuild the payload with the matching generator and simplify any unusual fields or characters.
4. Test on two iPhones at the real distance, and watch both the banner and the follow-on action.
5. Add a typed fallback beside the code for the action it performs.
6. Retest on Android to confirm the fix did not break the platform that worked.
Putting this into practice
In practice, check the phone before you rebuild the code: a switched-off scanning setting explains a failure in seconds and saves a redesign. Once the phone is ruled out, rebuild the payload in the standard format, because that is the fix that helps every iPhone rather than just the one in your hand. Keep a short note of what you tested, what failed, and what you changed, so the next person starts from evidence rather than guesswork. A fix that is written down survives staff changes and reprints; a fix that lives only in memory gets repeated.
Common mistakes to avoid
- Assuming every iPhone behaves identically, when settings, iOS version, and lens condition all vary.
- Reprinting the full run before a single proof passes, which turns one failure into many.
- Testing on one phone in ideal conditions instead of two phones in the real conditions where a code that scans on Android but not iPhone will be used.
- Changing the artwork and the placement at the same time, so you cannot tell which change fixed a code that scans on Android but not iPhone.- Skipping the proof test because the change looked small, when small changes cause most repeat failures.
Quick checklist
- iPhone camera scanning is enabled on the test phone
- The payload uses the standard format for its type
- The code scans and completes its action on two iPhones
- The corrected proof passes on two phones in the real conditions
- The fix is recorded in the job file so the next reprint starts from a proven setup
- Every printed copy is checked against the approved proof
- The proof is retested after any later change to the link, design, or placement
Related tools and guides
- [QR payload inspector](/qr-payload-inspector)
- [QR offline verifier](/qr-offline-verifier)
- [QR scanner](/qr-scanner)
- [QR size calculator](/qr-size-calculator)
- [QR safety checker](/qr-safety-checker)
- [blog](/blog)