◉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)●SDK 58 — Beta since 09/15 with no stable date yet; running projects in Expo Go has required login since 09/03●WIDGET — A write-up traces an iOS widget that renders black only in production builds●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)●SDK 58 — Beta since 09/15 with no stable date yet; running projects in Expo Go has required login since 09/03●WIDGET — A write-up traces an iOS widget that renders black only in production builds●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/App Dev
◇ App Dev/2026-05-31Intermediate

Getting Users All the Way to 'Set as Wallpaper' on iOS — Save-to-Photos Permissions and Shortcuts

iOS apps cannot set the wallpaper directly. Here is how I handle add-only photo permissions, Live Photo saving, guiding users to Settings, and Shortcuts automation, with real numbers from running six wallpaper apps.

iOS116wallpaper app22expo-media-library3permissions7Shortcuts3Rork585

✦ Premium Article

When you build a wallpaper app, the single hardest thing to ship is one tiny button: "Set as Wallpaper." You can lay out the gallery, sync favorites, wire up ads, and add a paywall — but on iOS that one button never behaves the way you expect. This is where a lot of indie developers hit a wall: the app saves the image and then leaves the user wondering what to do next.

I have been building apps on my own since 2014, and across that time my Dolice apps have passed 50 million cumulative downloads. I still run six wallpaper and calming-image apps in parallel. As someone who makes images as an artist, the real problem was never the code — it was the design of how a picture actually reaches someone's screen. This article shares the save flow I have refined across those six apps, along with the numbers I measured along the way.

iOS Does Not Let Apps Set the Wallpaper

Start by accepting one constraint: iOS exposes no public API for a third-party app to change the user's lock-screen or home-screen wallpaper programmatically. There is no equivalent of Android's WallpaperManager.setBitmap() available to iOS app developers.

So a "Set as Wallpaper" button can really only do two things:

  1. Save the image into the user's photo library (camera roll)
  2. Guide the user into the Settings app's wallpaper screen to pick the saved image

If you design without knowing this, you promise a "one tap and the wallpaper changes" experience, and your reviews fill with "it doesn't actually set anything." In my first version the button said "Set as Wallpaper" while it only saved the file. The mismatch between expectation and behavior pulled down my first-week review average. Renaming it to "Save to Photos" and rebuilding the post-save guidance fixed the gap.

Saving Only Needs add-only Permission

People reach for full "Photos access" when all they want is to save. But a wallpaper app only needs to add; it never needs to read the user's existing photos. That is exactly what the add-only access level, introduced in iOS 14, is for.

Asking for full access (PHAccessLevel.readWrite) shows the heavy "Allow access to all your photos?" dialog. Add-only (PHAccessLevel.addOnly) shows the much lighter "Allow adding to Photos?" wording instead. A wallpaper app has no reason to want to see all of someone's pictures, and review scrutiny over privacy is lighter when you ask for less.

On the native side, give a save-specific usage string in Info.plist:

<key>NSPhotoLibraryAddUsageDescription</key>
<string>Used to save your chosen wallpaper to your photos. We never read your existing photos.</string>

The key detail is using NSPhotoLibraryAddUsageDescription (add-only) rather than NSPhotoLibraryUsageDescription (read/write). If you include the latter, you are declaring full-access intent for an app that only saves, which leaves room for a reviewer to ask why you need access to every photo.

✦

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
✦Saving with PHAccessLevel.addOnly so you never ask for full photo-library access
✦Why Live Photo wallpapers end up static, and the PHLivePhoto branch that fixes it
✦A measured 72% save-to-set completion rate across six apps, and the permission-timing change that moved it
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

◇ App Dev2026-04-26
Native iOS Apps with Rork: SwiftUI to TestFlight
New iPhone projects in Rork are generated in Swift and SwiftUI, and Rork Pro carries them all the way to the App Store. How to tell an old Expo project from a new one, costs in credits, the skeleton prompt, device testing, when to drop into Xcode, and TestFlight submission.
⬡ Dev Tools2026-05-18
Adapting Your Rork iOS App to iPhone Air and 17 Pro Series — Layout Patterns for 2026's New Resolutions
iPhone Air introduced a 420pt width that sits between the standard and Max models, quietly breaking layout conditionals in existing Rork apps. Based on updating four iOS apps at once, this covers device constant management, Safe Area handling, and full-screen image display fixes.
⬡ Dev Tools2026-04-23
Integrating Siri and Shortcuts into Rork Apps: App Intents with Expo, Without the Pitfalls
A production-grade guide to adding Siri Shortcuts and App Intents to a React Native app generated by Rork. Bridge native Swift via an Expo Config Plugin, model AppShortcut / AppEntity / EntityQuery correctly, and ship Donations and Control Center widgets without breaking Apple's conventions.