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.
ChatGPT & Codex + share extension
A bookmarking tool, a recipe box or a moodboard is only useful if saving takes one tap. With WebViewGold your ChatGPT & Codex 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 Your own API or serverless functions, so the user stays in control.
Paste this into ChatGPT & Codex to implement the web-app side. Review the result, publish, then test inside the WebViewGold app.
Prompt for Codex: Implement a share-target flow for the WebViewGold native app and open a pull request. When navigator.userAgent contains my custom WebViewGold token, read the global sharedData on page load and again after one second; classify it as link (starts with http), image (long Base64 string, optionally with a data:image prefix) or text, and skip values already handled in this session. Navigate to a /save page that previews the item and offers Save and Cancel. Add a server endpoint POST /api/saves that requires the logged-in user, fetches link titles server-side with a timeout, stores images as files with our existing storage and writes a saves record. Add an optional Summarize toggle that uses our existing server-side OpenAI integration and stores the summary with the item after the user confirms it. Add unit tests for the classifier and an AGENTS.md section describing the sharedData contract. Never touch sharedData in regular browsers.

With a good optimized version of your web app you can have a stunning mobile app within a couple of minutes. Additionally to that the customer service is very nice and very helpful! I can just recommend WebViewGold :-)
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 ChatGPT & Codex 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 Your own API or serverless functions, 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 ChatGPT & Codex 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.