iOS
Requirements: iOS 15+, Swift 5.9+, Xcode 15+. Source and issues: github.com/vrsoai/verso-connect-ios.Install
Swift Package Manager. In Xcode: File › Add Package Dependencies, enterhttps://github.com/vrsoai/verso-connect-ios, dependency rule “Up to Next Major Version” from 0.1.0. Or in Package.swift:
Use
Your backend signs a connect link withsignLink() exactly as for the web (purpose: "connect") and returns its url to the app (example below). The app secret never ships in the app. Collect the user’s consent in your own UI before this point, as with the hosted page.
VersoConnect.present(link:from:completion:), exists for code that is not async.
present opens a sheet with the provider’s login, waits for the user to log in, captures the session and dismisses the sheet itself in every case. It returns the connectionId; your backend receives connection.created with the user’s userRef at the same time, exactly as with the hosted page, and the first sync starts within a minute.
The link is single use and valid 15 minutes: fetch a fresh one each time the user taps your button. The login itself must complete within one hour.
Errors
Android
Requirements: Android 7.0+ (API 24), Kotlin, AndroidX. Source and issues: github.com/vrsoai/verso-connect-android.Install
The library is served by JitPack. Add the repository once, insettings.gradle.kts, then the dependency in your app module:
Use 0.1.2 or later. Earlier versions cleared the app’s whole WebView cookie jar around the login, which signed users out of apps that keep their own session in a WebView. 0.1.2 clears the provider’s cookies and storage only.
Use
Same contract as on iOS: your backend signs the link and returns itsurl to the app (example below); the app secret never ships in the app; consent is collected in your UI first.
VersoConnectContract() and launch(Uri.parse(link)); the result is the same Result<VersoConnection>.
The screen closes itself in every case and the callback runs once, on the main thread. The link is single use and valid 15 minutes; the login itself must complete within one hour.
Errors
Your backend
The app asks your backend for a link right before showing the flow, the same way it would ask for any other short-lived credential. The whole backend side is one endpoint. This version runs as a Cloudflare Worker;signLink from @versoai/core also runs on Node 18+ or any runtime with Web Crypto.
VersoConnect.present with that url. Links live at most 15 minutes and are consumed on first use, so mint one per tap rather than ahead of time. Your backend learns the outcome through the connection.created webhook, keyed by the same userRef.
What the SDK does
- Sends the link’s token to
POST /api/connect-nativewithaction: "start". Verso verifies and consumes the link, creates the user record if needed, sendsconnect.started, and answers with the provider’s login URL, the name of the session cookie to watch, and a one-time capture credential. - Opens the provider’s login in the platform’s WebView presenting itself as the system browser (a non-persistent
WKWebViewwith the Mobile Safari user agent on iOS, aWebViewwith the Chrome user agent on Android, with the provider’s cookies and storage cleared before and after, and only those: your app’s own WebView session is left alone), so the provider treats it as a browser. Nothing of the provider session remains on the device afterwards. - Watches the WebView’s cookies. Once the session cookie is present and the session is usable, sends it to Verso with
action: "capture". Verso encrypts the credential with a key that exists only for this connection, creates the connection, folds a previous connection of the same account into it (Reconnecting), refuses an account already connected by another user of your app, sendsconnection.createdand starts the first sync.
React Native
@versoai/react-native-connect wraps the two native SDKs behind one call: the same in-app login screen, the same contract. iOS 15+, Android 7+, autolinking on both platforms. With Expo, use a development build or expo prebuild; Expo Go cannot load native modules.
present rejects with a VersoConnectError carrying the native codes: invalid_link, cancelled, rejected (with status, Verso’s HTTP status), timed_out, network, plus no_presenter when nothing is on screen to present from and unavailable when the native module is not linked.
Flutter
Theverso_connect package wraps the two native SDKs behind one call: the same in-app login screen, the same contract. iOS 15+, Android 7+.
present throws a VersoConnectException carrying the native codes: invalid_link, cancelled, rejected (with status, Verso’s HTTP status), timed_out, network, plus no_presenter when nothing is on screen to present from and unavailable when the plugin’s native side is not registered.