Articles · App ExamplesUpdated September 2026

To add a share sheet to an app you hand the system what to share, and it draws the rest.

To add a share sheet to an app you build a small payload, call one function and let the operating system draw the panel. On iOS that presents a UIActivityViewController. On Android it is an ACTION_SEND intent passed through the system chooser. In React Native both sit behind a single Share.share call, so the feature itself is usually an afternoon. The limit belongs at the top rather than the end: the sheet is a system component. You do not design it, you do not order the apps inside it, and you cannot promise a user that any particular app will be there. That is good news if sharing is part of your plan for getting more downloads, because the panel people already trust is the one they will actually use.

This page covers what each platform lets you change, what the payload can carry, what comes back after the user picks an app, and whether a share button is worth building at all. The second honest limit matters more than the first. The sheet does not carry your app with it. Whatever you put in that message is all the other person receives, so the link inside it does more work than the button that opened it.

See what each platform receives

The short version

The sheet belongs to the phone, the payload belongs to you.

Everything a user sees in the native share dialog comes from the operating system. The target apps, their order, the suggested people, the copy and save actions. You supply the items being shared, a few optional hints, and on a tablet the place to anchor the panel. You present it and you dismiss it. That is the whole contract, on both platforms.

So the design work is not in the sheet. It is in deciding what the shared thing is, what the person on the other end sees when it arrives, and what happens when they tap it. A share button that sends a bare store link is doing about a tenth of the job.

What you control, and what the system keeps

Apple describes UIActivityViewController as a view controller you use to offer standard services from your app. The system provides the standard ones: copying to the pasteboard, posting to social sites, sending by mail or by SMS. Your app is responsible for configuring, presenting and dismissing it, and configuring it means naming the data objects the controller should act on. Apps can also define custom services. Nothing on that list is layout.

One presentation rule is not a suggestion. Apple's documentation says you must present the view controller using the appropriate means for the current device: a popover on iPad, modally on iPhone. In practice a tablet build has to give the panel an anchor, which is why a share button that behaves on a phone can fall over on an iPad. React Native exposes exactly that as an anchor option.

What you are left with is real but small. The payload, a handful of options, the ability to hide activities you do not want, and the anchor. You cannot reorder the sheet, restyle it, or count on a given app being installed. Interface copy that says tap WhatsApp will be wrong for a good share of your users, so write the button as share and let the system fill in the rest.

Apple, UIActivityViewController: what your app configures, and the iPad popover rule

What each platform lets you change

On Android you create an intent with the action ACTION_SEND, set the most specific MIME type for what you are sending, then pass that intent to Intent.createChooser so the Sharesheet always appears. Google's guidance about the alternative is blunt. Do not display your app's own list of share targets, and do not create your own variations of the sheet. The system sheet ranks and suggests targets using information about app and user activity that only the system has, so a hand built row of icons is worse at the one job it exists for.

The customisation you do get is bounded, and worth knowing before you promise anyone a design. From Android 10 the sheet can show a preview of shared text, with a title and a thumbnail you provide. On Android 14 and later an app can add custom actions, which appear as small icons at the top of the sheet. You can supply up to two custom chooser targets and up to two initial intents, although the documentation warns that every custom target you add reduces the number the system suggests, and generally discourages adding them. You can also exclude components you control, which is how you keep your own app out of its own share sheet.

Feedback is where the two platforms genuinely differ. Android can tell you which target the user picked if you pass an IntentSender into the chooser and read the chooser result in a broadcast receiver. iOS reports the activity type when the sheet completes. A cross platform wrapper usually gives you the weaker of the two, which is the next section.

Android, send data to other apps: the Sharesheet, custom actions and chooser results

What actually goes in the payload

In a React Native app the whole feature is Share.share with a content object, and the documented fields are narrow. message goes to both platforms. url is iOS only. title is Android only. The options object adds a dialog title on Android, and on iOS a subject, a tint colour, a list of excluded activity types and the iPad anchor. The practical consequence catches people in testing: a link has to sit inside the message string, or Android users share an empty message.

What comes back is asymmetric in a way that quietly breaks analytics. On iOS the promise resolves with an action and an activity type, and a dismissed sheet still resolves, with the dismissed action. On Android the promise always resolves with the shared action. So on Android you cannot tell a real share from someone who opened the sheet and changed their mind, and you never learn the target. Count what the link does afterwards, not what the promise said.

Files take a different route. The text call handles a message, a link and a subject, nothing more. To share content from your app as an actual file, an image, a PDF, an export you generated, Expo's sharing package shares a local file by URI on both Android and iOS. Going the other way, so other apps can share into your app, needs a share extension on iOS and an intent filter on Android. That is native configuration and a rebuild rather than a JavaScript change, and Expo documents that direction as experimental.

Whatever sits in the message, the link is the real product. It should open the app when the app is installed and a web page when it is not, which is mobile app deep linking, and it should land the recipient on the exact thing that was shared rather than a home screen they have to navigate out of.

Try it

What each platform actually receives

One call, two payloads. The fields follow the React Native Share API, so the same code hands each system something different.

iOS

  • url carries the link and the sheet previews it
  • the result names the activity the user picked

Android

  • there is no url field, so the link rides inside message
  • the result says shared even when the user backs out

Is a share button worth building

For an app that already exists, a share sheet is a button, a payload and a test on real hardware. The cost is small, so the question is rarely whether you can and almost always what sits behind the link. If the shared link opens a login wall, an app store page with no context, or a blank screen, the share is spent and nothing comes back from it.

Sharing works when a user has a reason to send something to one specific person: a result they are pleased with, an invitation, a photo, a document, a place to meet. It works badly as a growth channel on its own. If you need people to bring other people, the share button is the easy half, and a structured app referral program with a reward and a tracked link is the half that moves the numbers.

Measure it on the link rather than the sheet. Count taps on the share button and clicks on the link that came out of it, and accept that the middle is dark on Android. Setting that up properly is its own subject, and measuring what gets shared covers the instrumentation in detail.

What each way of sharing gives you

ApproachUses the system sheetReaches every appTells you where it wentWhat you build
System share sheetYesYesiOS names the app, Android does notone call and a payload
Copy link buttonNowherever they paste itNoabout two lines
Your own row of app iconsNoonly the ones you wire upYesan integration each, then upkeep
Share sheet with a tracked linkYesYesfrom the link, not the sheeta redirect and a link builder
Share sheet with custom actionsYesYesiOS names the app, Android does notAndroid 14 and later only

Building it into an app you own

If the app already exists, this is an afternoon. If it does not exist yet, the share sheet is the smallest piece of what you are making, and the real question is how to get a real mobile app around it without spending a month on scaffolding first.

Newly is an AI app builder. You describe the app in plain English and it writes a real React Native and Expo project that you own, runs it on a cloud iPhone or Android simulator while it builds, and ships it to TestFlight and to Google Play internal testing. Plans are $25 a month and there is no free plan. Sharing text and links needs no extra native code, so it lands like any other edit. Sharing files pulls in a package with native configuration, which triggers a rebuild before the simulator picks it up.

Test the share sheet on real hardware before you call it finished. React Native's documentation notes that some share options will not appear or work on the iOS simulator, and the same caution applies to any simulator, cloud hosted or sitting on your desk. Install a TestFlight build or a Google Play internal testing build and send something to a real messaging app. The project stays yours either way: two way GitHub sync from the Deploy tab creates a repository that keeps in step both ways, and Settings exports the whole project as a ZIP.

Questions people ask about share sheets

It is the panel the operating system shows when a user taps share: a list of apps, people and actions that can receive what you are sending. Both mobile platforms provide one. Your app supplies the content and asks for the panel, and the system decides what appears in it and in what order.

Describe the app the share button belongs to

Write down what one person sends and what the other person sees when the link opens, then build the screen around that answer rather than around the button.

Start building