feat(share): "Biz Connect" in the iOS share sheet — share a photo/file into a chat
Adds the reverse direction: share FROM Photos/Files/Safari INTO a Biz Connect conversation. An app can only appear in the iOS share sheet as an app-extension target, so this is real native work, not a web change. Pieces: - mobile/ios-share/ShareViewController.swift: a UI-less Share Extension. It stages the shared items into the App Group container and opens bizconnect://share. It deliberately does NOT reimplement the chat picker — that lives in the app, which already has the chat list, search and upload progress. Appends to the manifest (never overwrites), so sharing twice before opening the app loses nothing. - mobile/scripts/add-share-extension.rb: injects the extension target into the Capacitor-generated Xcode project on every CI build (Codemagic checks out fresh), using the xcodeproj gem that ships with CocoaPods. Embeds it, sets the bundle id <app>.share, and MERGES the App Group into the app's entitlements rather than clobbering them (push's aps-environment must survive). Idempotent. - mobile/plugins/share-inbox: getPending()/clear() to read that manifest — the App Group container isn't one of Filesystem's known directories, so it needs a bridge. - home.html: on bizconnect://share (and every resume, and cold-launch), read the inbox and show a "Send to…" picker over the chat list; chosen files run the SAME upload + /api/messages send as an in-app attachment. Reuses convertFileSrc to read the staged bytes with no base64 marshalling. - ios-patch.sh registers the bizconnect URL scheme; codemagic.yaml fetches a profile for the .share bundle id too. One-time manual gate (CI cannot toggle App capabilities): the App Group group.com.bizgaze.connect must be created and enabled on both App IDs in the Apple portal — documented in mobile/IOS_SETUP.md. Without it the two processes can't see each other's files and sharing silently no-ops; everything else still works. Validated cross-file: pod-name/jsName/method wiring for all three plugins, App Group id identical in all 4 files, URL scheme consistent across extension/plist/web, entitlement-merge preserves push. Needs a new iOS build (new targets + plugins). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -89,3 +89,29 @@ listing yet — see the follow-up below (you can still *view* a screen someone e
|
||||
- Mobile **web** can't switch the audio output route (`setSinkId` is unimplemented on iOS/Android), so the
|
||||
in-meeting speaker/earpiece/Bluetooth control is web-only where it works and hidden where it doesn't.
|
||||
- True routing on iOS needs a small native plugin driving `AVAudioSession`. Phase-2 native task.
|
||||
|
||||
---
|
||||
|
||||
## Share Extension ("Biz Connect" in the iOS share sheet) — one-time Apple portal setup
|
||||
|
||||
The app now has a **Share Extension** target (`com.bizgaze.connect.share`) so users can share a photo /
|
||||
video / file FROM the Photos or Files app INTO a Biz Connect conversation. The Codemagic build injects the
|
||||
target and fetches a profile for it automatically, but two things can ONLY be done once, by hand, in the
|
||||
Apple Developer portal — CI cannot toggle App capabilities:
|
||||
|
||||
1. **Create the App Group** (developer.apple.com → Identifiers → App Groups → +):
|
||||
identifier **`group.com.bizgaze.connect`**.
|
||||
2. **Enable the App Groups capability on BOTH App IDs** and assign them to that group:
|
||||
- `com.bizgaze.connect` (the app)
|
||||
- `com.bizgaze.connect.share` (the extension — create this App ID if the first build hasn't yet;
|
||||
`fetch-signing-files --create` will register it, then edit it to add App Groups)
|
||||
After enabling the capability, the provisioning profiles must be regenerated — the next Codemagic build
|
||||
does that via `fetch-signing-files`, so just re-run it once the capability is on.
|
||||
|
||||
If the App Group isn't set up, the app and the extension can't see each other's files: sharing will appear
|
||||
to do nothing (the extension stages the file, but the app finds an empty inbox). Everything else — download
|
||||
to the Files folder, the Photos "Connect" album, Manage storage — works without it.
|
||||
|
||||
Also enabled by this change (main app Info.plist, done automatically by `ios-patch.sh`):
|
||||
- `UIFileSharingEnabled` + `LSSupportsOpeningDocumentsInPlace` → the **Biz Connect** folder in Files.
|
||||
- `CFBundleURLTypes` scheme **`bizconnect`** → lets the extension bounce back into the app after staging.
|
||||
|
||||
Reference in New Issue
Block a user