◉RORK LABJP
●GPT-6.1 SOL — Added to Rork's model menu (09-29) with Low, Medium and High effort; included on Pro and Max●SONNET 5.5 — Claude Sonnet 5.5 is selectable: strong at UI design and faster than Sonnet 5 (09-28)●SONNET 4.5 — Retires on the Claude API on 11/30, 33 days left. If your app calls it, check the migration target●SDK 58 ISSUE — Early reports include Android widgets not refreshing on a schedule and Stripe linking statically●OBSERVE — EAS Observe now records native crashes too (SDK 57.0.21 or later, 10/07)●NEW — My App Open Ad Only Showed When the App…●GPT-6.1 SOL — Added to Rork's model menu (09-29) with Low, Medium and High effort; included on Pro and Max●SONNET 5.5 — Claude Sonnet 5.5 is selectable: strong at UI design and faster than Sonnet 5 (09-28)●SONNET 4.5 — Retires on the Claude API on 11/30, 33 days left. If your app calls it, check the migration target●SDK 58 ISSUE — Early reports include Android widgets not refreshing on a schedule and Stripe linking statically●OBSERVE — EAS Observe now records native crashes too (SDK 57.0.21 or later, 10/07)●NEW — My App Open Ad Only Showed When the App…
Articles/Dev Tools
⬡ Dev Tools/2026-10-28Advanced

Users Told Me They Could Not Close a Fullscreen Ad. The Entry Points Were Scattered, So I Put the Show-or-Not Check and a Safety Net in One Place

An unclosable fullscreen ad came from calls that ignored foreground state, a clash with a permission dialog, and no safety net. A single entry-point component, tested in Node.

interstitial adsAdMob75permission dialogAppStateindie developer51design

✦ Premium Article

Saving a wallpaper makes the phone ask, "Allow adding to Photos?" There were moments when that prompt and a fullscreen ad tried to appear in the same scene, and they collided.

What reached me was a short message: the ad could not be closed. Force-quitting the app gets a person out, but what they remember afterward is less the ad than the fact that they could not close it.

Decide in one place when a fullscreen ad may appear, and keep the safety net for a missing close notification in that same place. That sentence is what the fix came down to.

This happened in an iOS wallpaper app I run as an indie developer. Any Expo app that Rork exports can run into the same shape wherever it uses an OS prompt, such as saving photos or asking for notification permission, so I rebuilt the idea in TypeScript and ran it on Node 22. It is not a reproduction of the ad SDK's internals, and it is not a check on a real device. I mark that line wherever it matters.

The report was one line: "can't close it"

When a report gives you little to go on, it helps to lay out what you can read from it before deciding what to suspect first. The table below is the order of investigation I drew from the report, not a record of what I observed on screen.

What the report tells youWhat to check first
"Can't close it" (the ad is showing)Suspect the moment it was shown, not a load failure
Which action it followedCount how many places in the app call for an ad
Actions that involve an OS prompt, such as a photo permissionCheck whether the prompt and the ad can be on screen together
When the "currently showing" flag is clearedSee whether the flag stays set when the close notification never arrives

Before looking at ad settings or review status, I settled the order: first, in which moment was the ad shown.

Three things stacked on top of each other

There was not one cause. It took three, together, to produce "can't close it."

The first was that the calls that show an ad were scattered across several places. Each one showed an ad for its own reasons, and none of them looked at whether the app was in the foreground.

The second was the clash with the photo permission dialog. There were moments when the prompt asking for permission and the ad overlapped. I put that overlap into the reproduction as one of the situations in which the close action becomes unreachable.

The third was the missing safety net. The "currently showing" flag tends to be cleared only when the close notification arrives, and if the notification never comes, the flag stays. That is how I wrote it in the reproduction.

The fix was to gather every ad call into one shared component. The check for whether it is a good moment to show, and the safety net, both live inside it.

✦

Thank you for reading this far.

Continue Reading

What follows includes implementation code, benchmarks, and practical content we hope you'll find useful. This site runs without ads — server and development costs are supported entirely by members like you. If it's been helpful, we'd be truly grateful for your support.

WHAT YOU'LL LEARN
✦You can narrow down an 'I can't close the ad' report from the moment the ad was shown (foreground or not, prompt on screen or not) before blaming the ad SDK
✦You can gather every ad call into one entry point and unit-test the rule 'never show in the background or during a permission dialog' without the ad SDK
✦You can add a safety net for ads whose close notification never arrives, counted so it never cuts a healthy ad, and prevent the 'can't close it' report before you ship
Secure payment via Stripe · Cancel anytime
✦

Unlock This Article

Get full access to the rest of this article. Buy once, read anytime. This site is ad-free — your support goes directly toward keeping it running.

or
Unlock all articles with Membership →
Share

Thank You for Reading

Rork Lab is ad-free, supported entirely by members like you. We publish practical guides daily with implementation code, benchmarks, and production-ready patterns. If you've found it useful, we'd love to have you on board.

  • ✦Copy-paste ready implementation code
  • ✦New advanced guides published daily
  • ✦$5/mo or $10 for lifetime access
View Membership →

Related Articles

⬡ Dev Tools2026-10-25
Fullscreen Ads Stopped Showing After Going Back and Forth Between Screens — The Ad Holder Was Still Holding a Closed Screen
Fullscreen ads vanished after reopening a screen because a reused ad holder kept notifying a closed screen. A holder that swaps only its listener target, tested in Node.
⬡ Dev Tools2026-10-14
My App Open Ad Only Showed When the App Came Back From Background. The 'Returned to Foreground' Signal Fired Before the Ad Had Loaded
On a cold start, the app open ad in my Android app never showed. The foreground signal came before the load began. Here is how I split the signal from the load and rebuilt it as logic you can test ordering by ordering.
⬡ Dev Tools2026-10-24
The ANR Was Coming From Cleanup When a Screen Closed: Classifying the Blocking Line From Traces
A Python script that reads Android ANR traces and classifies the line that blocked the main thread, such as billing client teardown or synchronous image decoding. Two causes I found in my wallpaper apps, and the thinking behind the fixes.