FAQ & Troubleshooting
Frequently asked questions and solutions for common io.Connect development scenarios.
General
What is the difference between io.Connect Browser and io.Connect Desktop?
io.Connect Browser is a zero-install, browser-native platform where the Main App acts as the hub and client apps connect as iframes or separate tabs. It uses@interopio/browser-platform for the host and @interopio/browser for clients.
io.Connect Desktop is a native runtime for Windows and macOS with deep OS integration. It provides advanced window management (sticky windows, frameless mode, workspaces), native bridges for .NET, Java, and COM applications, global layouts, application lifecycle control, and notifications.
Which frameworks are supported?
The core io.Connect libraries (@interopio/browser, @interopio/desktop) are framework-agnostic and work with vanilla JavaScript. Framework-specific packages include:
@interopio/react-hooks— React provider and hooks@interopio/ng— Angular module and services
Vue, Svelte, and any other framework can use the core APIs directly.
Do I need a license key?
io.Connect Browser Platform requires a license key for initialization. Contact interop.io to request an evaluation license. io.Connect Desktop includes a license with the installation package.
Is io.Connect FDC3 compliant?
Yes. io.Connect is certified conformant with FDC3 2.0/2.2. Channels map to FDC3 User Channels, Shared Contexts map to FDC3 App Channels, and Intents follow the FDC3 standard. This enables out-of-the-box interoperability with any FDC3-compliant application.
Data Sharing
When should I use Shared Contexts vs. Channels?
Shared Contexts are programmatically controlled — ideal for automatic state sync between known applications (e.g., publishing a selected client from a list app to a portfolio app).
Channels are user-driven — the end user decides which windows are linked using the color-coded Channel Selector UI. Use Channels when the linking decision should be in the user's hands.
When should I use Interop Methods vs. Shared Contexts?
Shared Contexts are stateful and persistent — data remains available even after the publisher disconnects. Use them for state that multiple apps need to reference at any time.
Interop Methods are stateless request/response calls — ideal for querying data on demand, triggering actions, or building service-oriented patterns where the caller needs an immediate result.
When should I use Intents?
Use Intents for late-binding workflow orchestration where the caller doesn't need to know which app will handle the action. For example, raising a ViewChart intent lets the platform resolve the best handler, optionally showing the Intent Resolver UI if multiple handlers are registered.
React Integration
How do I access the io object in React?
Use React's built-in useContext hook:
import { useContext } from "react";
import { IOConnectContext } from "@interopio/react-hooks";
function MyComponent() {
const io = useContext(IOConnectContext);
// io.contexts, io.channels, io.interop, io.intents
}Why does initialization fail with React.StrictMode?
React.StrictMode in development mode causes effects to execute twice, which triggers a double initialization of the io.Connect Platform. Remove the StrictMode wrapper aroundIOConnectProvider to resolve this.
Common Errors
useIOConnectContext is not exported
The correct pattern uses React's useContext hook directly:
import { useContext } from "react";
import { IOConnectContext } from "@interopio/react-hooks";
const io = useContext(IOConnectContext);type must be imported using type-only import
When verbatimModuleSyntax is enabled in tsconfig.json, type-only imports must use the import type syntax:
import type { IOConnectInitSettings } from "@interopio/react-hooks";
import { IOConnectProvider } from "@interopio/react-hooks";White screen / Blank iframe
Possible causes:
- Incorrect iframe
srcURL — verify the port matches the actual dev server - Platform initialization error — check the browser console for details
- CORS mismatch — hosting the Platform and clients on incompatible origins
Debug by opening the iframe URL directly in a new browser tab to verify the app loads independently.
Method already registered
This occurs when io.interop.register() is called multiple times without proper cleanup. Ensure your React effect returns a cleanup function:
useEffect(() => {
if (!io) return;
io.interop.register("MyMethod", handler);
return () => {
io.interop.unregister("MyMethod");
};
}, [io]);