iOS share extension
Users tap Share in Safari, Photos or another app and pick yours. WebViewGold passes the content to your web app in the JavaScript variable sharedData: text and links as plain text, images as Base64 strings.
Bolt + share extension
A bookmarking tool, a recipe box or a moodboard is only useful if saving takes one tap. With WebViewGold your Bolt app appears in the iOS and Android share sheet, and whatever the user shares (a link, a piece of text, a photo) arrives in your web app as the JavaScript variable sharedData. Your code decides what happens next: prefill a form, save it to your backend, or open an editor.
From $109 one-time per platform, or let our team do it all from $698.
Users tap Share in Safari, Photos or another app and pick yours. WebViewGold passes the content to your web app in the JavaScript variable sharedData: text and links as plain text, images as Base64 strings.
Uncomment the prepared intent filters in AndroidManifest.xml (ACTION_SEND for text/plain and image/*, ACTION_SEND_MULTIPLE for several images) and the app icon shows up in Android's share dialog. Same variable, same handling: sharedData.
Check for sharedData when the page loads, tell links, text and images apart, and route the user to a prefilled save screen. Nothing is stored until your own code sends it to Supabase, Firebase or your own API, so the user stays in control.
Paste this into Bolt to implement the web-app side. Review the result, publish, then test inside the WebViewGold app.
Build a "save from the share sheet" flow for the WebViewGold app wrapper. Create src/lib/shareInbox.ts with readSharedContent(): if navigator.userAgent contains my WebViewGold token and the global sharedData is set, return { kind: "link" | "image" | "text", value }, treating values that start with http as links and long Base64 strings as images; in development also accept a ?debugShare= query parameter so I can test in the Bolt preview. Call it in main.tsx after the app mounts (once immediately and once after 1 second) and route to /save when something arrived. On /save, show a preview: for links call a Netlify Function link-preview that fetches the page title and image server-side; for images decode Base64 to a Blob, downscale to max 1600px on a canvas and show it. Save uploads the image to the Supabase Storage bucket shares (path user_id/uuid.jpg) and inserts a row into a saves table with row-level security. Remember the handled value in sessionStorage so a reload does not save it twice. If the user is signed out, keep the item in sessionStorage and resume after login.
WebViewGold has allowed us the shortest and most efficient time-to-market ever possible from among all the other app platforms we have ever tried during the past 5 years. I don’t know why I hadn’t discovered you sooner, but I am really, really glad I did. Currently nearing 6000 app downloads on both iOS App Store & Google Play Store without any problem!
A share target earns its place when one tap saves something the user would otherwise copy, switch apps and paste. Typical jobs:
Share an article from Safari or Chrome, the app fetches title and preview image server-side, the user adds a tag and taps Save.
A recipe link, a restaurant from a maps app, a product page: saved into a collection, a trip plan or a wishlist instead of a messy notes file.
A receipt photo into an expense tracker, a screenshot into a bug report, a room photo into a moodboard or inventory. The image arrives as Base64, ready to upload.
Share a job listing or a profile link into a tracker or CRM and land on a prefilled "New entry" form with the URL already parsed.
Highlighted text from any app becomes a note, a flashcard or a prompt for your AI feature, with the source link attached when the shared text contains one.
About an hour, most of it on the save screen in your web app.
Decide what a share does in your Bolt app: save a link, attach a photo, start a note. One clear action converts better than a menu of options.
Follow iOS documentation to switch the share extension on in the WebViewGold Xcode project, then install the build on a real iPhone. The share sheet lists extensions of installed apps only, so the simulator is not a good test.
In AndroidManifest.xml keep only the filters you actually handle: text/plain for links and text, image/* for one photo, SEND_MULTIPLE for several (Android documentation). A share target that accepts images but ignores them is a bad first impression.
Check typeof sharedData !== "undefined" on load and once more after a short delay. Values starting with http are links; long Base64 strings are images (JPEG data starts with /9j/, PNG with iVBORw0KGgo); everything else is text, possibly with a URL inside.
If the user is signed out, store the shared item in sessionStorage, send them through your sign-in flow and restore the save screen afterwards. Never drop a share silently.
Decode images to a Blob, resize and upload them, fetch link titles on the server and store the record in Supabase, Firebase or your own API, then show a clear success state (a successhaptic:// call feels right here).
Framework-neutral; call checkSharedContent() once your app has mounted. Replace YourAppToken with the custom user agent you set in Config.swift (useragent_iphone, useragent_ipad) and Config.java (USER_AGENT).
var inApp = navigator.userAgent.indexOf("YourAppToken") !== -1;
function classifyShared(raw) {
var value = String(raw).trim();
var b64 = value.replace(/^data:image\/[a-z+]+;base64,/i, "");
if (/^https?:\/\//i.test(value)) return { kind: "link", url: value };
if (b64.length > 1000 && /^[A-Za-z0-9+\/=\s]+$/.test(b64.slice(0, 4000))) {
return { kind: "image", base64: b64, mime: b64.indexOf("iVBORw0KGgo") === 0 ? "image/png" : "image/jpeg" };
}
var link = value.match(/https?:\/\/\S+/);
return { kind: "text", text: value, url: link ? link[0] : null };
}
function base64ToBlob(b64, mime) {
var bin = atob(b64.replace(/\s/g, ""));
var bytes = new Uint8Array(bin.length);
for (var i = 0; i < bin.length; i++) bytes[i] = bin.charCodeAt(i);
return new Blob([bytes], { type: mime });
}
function checkSharedContent() {
if (!inApp || typeof sharedData === "undefined" || !sharedData) return false;
var fingerprint = String(sharedData).length + ":" + String(sharedData).slice(0, 64);
if (sessionStorage.getItem("lastShare") === fingerprint) return false; // already handled
sessionStorage.setItem("lastShare", fingerprint);
sessionStorage.setItem("pendingShare", JSON.stringify(classifyShared(sharedData)));
window.location.href = "/save"; // your prefilled save screen
return true;
}
window.addEventListener("load", function () {
if (!checkSharedContent()) setTimeout(checkSharedContent, 1000);
});A share target is one of the native integrations a Safari tab cannot offer on iOS, which makes it a strong point for Guideline 4.2. A few rules come with it.
Show the share flow in a screenshot and mention it in the review notes ("Share a link from Safari to save it"). Reviewers only credit features they find.
Extensions should include real functionality, be disclosed accurately in your marketing text, and contain no marketing, advertising or in-app purchases. Keep the share flow a clean save action.
Extensions should relate to the content and functionality of the app. A recipe app that accepts recipe links fits; a share target that just opens the home page does not.
Shared photos and links can contain personal data. Upload only what the user confirmed, describe it in your privacy policy and declare it in App Privacy (photos, user content) and in the Google Play Data safety form.
Yes. iOS uses a share extension and Android uses share intents; in both cases WebViewGold passes the content to your web app in the same JavaScript variable, sharedData, so one handler covers both platforms.
Text and links, and images, which arrive as Base64 strings. Android also has a prepared intent filter for several images at once. Other file types, such as PDFs, are not part of the documented API.
On Android, an installed PWA can register as a share target through the Web Share Target API in Chromium-based browsers. On iOS, Safari offers no equivalent for web apps, so a native share extension is the way to appear in the iPhone share sheet.
Keep the shared item in sessionStorage, send the user through sign-in and bring them back to the save screen with the content still there. Losing a share after login is the most common bug in this flow.
No single feature does. It is a strong, visible native capability; combined with push notifications, offline handling and an app-like layout it makes the case that your Bolt app is more than a website.
Same result, different amount of work on your side. All three come with the approval guarantee and 24/7 human support.
$109 per platform, one-time
The WebViewGold license: a finished Xcode or Android Studio project. Paste your URL, set name and icon, switch on features, build and submit. Free updates forever.
See plans on the main page$349 per license, one-time add-on
No Mac, no Xcode, no Android Studio: configure in the browser, we build both apps in the cloud and hand them to App Store Connect and the Play Console.
How the Cloud Builder works Try the free demo$698 per platform $798
Send us your URL and icon. Our team configures, builds and delivers your app within 72 hours, white-label, with source projects. Both platforms for $1,158.
Full Service details Powered byWinter Sale prices valid until December 31, 2026.
App Store & Google Play approval guarantee – or your money back within 14 days
Rather hand it over? Full Service: we configure, build and deliver within 72 hours, from $698 per platform. Questions? Chat with us 24/7.
Refunds are granted under the conditions listed in our FAQ: a non-content rejection by Apple and/or Google, claimed within 14 days after purchase.