We build EasyScan, an embedded inventory and order app used by warehouse and retail teams. Many of them scan barcodes with their phone camera inside the Shopify app. Camera scanning in embedded apps on iOS isn’t reliable enough for that work right now, and we have no way to detect the failures or work around them.
We’d like to raise three connected problems.
1. shopify.scanner.capture() is not reliable
Merchants on Shopify Mobile for iOS regularly report that tapping scan in our app:
- opens a black or blank scanner sheet, or a spinner that never ends
- shows the “Scan Barcode” bar but the camera view never appears
- sometimes closes the scanner and returns to the app’s home screen instead of scanning (about 3 in 5 attempts for one merchant)
Shopify’s own barcode scanner (Products → search → barcode icon) works on the same devices. We’ve followed App Bridge issue #535, which says this was fixed in iOS app v10.2607.0, but we still regularly get these reports.
2. We don’t get errors
When the scanner fails, capture() usually neither resolves nor rejects. The promise just stays pending. This also happens when the merchant closes the sheet with the back button. As a result:
- there’s no rejection reason, no “cancelled” result and no “permission denied” signal
- we can’t tell a failed scanner apart from a merchant who is still aiming the camera
- we can’t show the merchant a useful message, so the failure looks like our app is broken
To stop the button spinning forever, we reset its state after 5 seconds. That timeout also fires during normal slow scans, so we can’t use it to say the scan failed.
3. Apps can’t trigger the camera permission prompt
Inside Shopify Mobile on iPhone, the request fails straight away, without ever showing the system camera permission prompt. Shopify’s native scanner works on the same device in the same session. Merchants have no way to grant our app camera access. On newer iOS versions there also doesn’t seem to be a per-app camera setting under Settings → Shopify, so we can’t point them anywhere.
What would help
- Make
capture()always settle, and reject with a clear reason, for examplecancelled,permission_denied,unavailableorfailed_to_open. - A way for embedded apps to check camera permission and ask for it, or allow
getUserMediain the embedded app’s iframe on Shopify Mobile and POS so the system prompt appears. - Guidance on the supported way to do camera scanning in embedded apps on iOS, and whether a continuous scanning API is planned. We know POS UI extensions have continuous scanning through
scannerData.subscribe; App Bridge only offers one scan per tap.
We can provide test devices, screen recordings and Shopify app / iOS version details, and we’re happy to test beta builds.