Complete Examples
Copy-paste complete app examples for Swift, React Native, and Flutter.
Updated 24 January 2026
mobileflutterswiftreact-nativeexamplescode
Complete App Examples
Copy-paste these complete examples to get started quickly.
Swift (iOS) - Complete UIKit Example
import UIKit
import OnairosSDK
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
setupOnairos()
}
func setupOnairos() {
// Initialize SDK
Task {
try? await OnairosSDK.shared.initializeWithApiKey("your_api_key")
await MainActor.run {
addConnectButton()
}
}
}
func addConnectButton() {
let button = OnairosSDK.shared.createConnectButton { [weak self] result in
switch result {
case .success(let data):
self?.handleSuccess(data)
case .failure(let error):
self?.handleError(error)
}
}
view.addSubview(button)
button.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
button.centerXAnchor.constraint(equalTo: view.centerXAnchor),
button.centerYAnchor.constraint(equalTo: view.centerYAnchor)
])
}
func handleSuccess(_ data: OnboardingData) {
print("API URL: \(data.apiURL)")
print("Token: \(data.token)")
// Make inference request
guard let url = URL(string: data.apiURL) else { return }
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.setValue("Bearer \(data.token)", forHTTPHeaderField: "Authorization")
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
let input: [String: Any] = [
"Input": [
"item1": ["text": "Example content", "category": "general"]
]
]
request.httpBody = try? JSONSerialization.data(withJSONObject: input)
URLSession.shared.dataTask(with: request) { data, _, error in
if let data = data,
let json = try? JSONSerialization.jsonObject(with: data) {
print("Result: \(json)")
}
}.resume()
}
func handleError(_ error: OnairosError) {
let alert = UIAlertController(
title: "Error",
message: error.localizedDescription,
preferredStyle: .alert
)
alert.addAction(UIAlertAction(title: "OK", style: .default))
present(alert, animated: true)
}
}
Swift (iOS) - Complete SwiftUI Example
import SwiftUI
import OnairosSDK
@main
struct MyApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
struct ContentView: View {
@State private var isConnected = false
@State private var platforms: [String] = []
@State private var errorMessage: String?
var body: some View {
VStack(spacing: 24) {
Text("Welcome")
.font(.largeTitle.bold())
if isConnected {
VStack {
Image(systemName: "checkmark.circle.fill")
.font(.system(size: 60))
.foregroundColor(.green)
Text("Connected!")
Text(platforms.joined(separator: ", "))
.foregroundColor(.secondary)
}
} else {
OnairosButtonWrapper { result in
switch result {
case .success(let data):
platforms = Array(data.connectedPlatforms.keys)
isConnected = true
case .failure(let error):
errorMessage = error.localizedDescription
}
}
}
}
.padding()
.alert("Error", isPresented: .constant(errorMessage != nil)) {
Button("OK") { errorMessage = nil }
} message: {
Text(errorMessage ?? "")
}
.task {
try? await OnairosSDK.shared.initializeWithApiKey("your_api_key")
}
}
}
struct OnairosButtonWrapper: UIViewRepresentable {
let onComplete: (Result<OnboardingData, OnairosError>) -> Void
func makeUIView(context: Context) -> UIButton {
OnairosSDK.shared.createConnectButton { result in
if case .success(.success(let data)) = result {
onComplete(.success(data))
} else if case .failure(let error) = result {
onComplete(.failure(error))
}
}
}
func updateUIView(_ uiView: UIButton, context: Context) {}
}
React Native - Complete Example
import React, { useState, useEffect } from 'react';
import { View, Text, StyleSheet, Alert } from 'react-native';
import { OnairosButton, initializeApiKey } from '@onairos/react-native';
export default function App() {
const [isConnected, setIsConnected] = useState(false);
const [userData, setUserData] = useState(null);
useEffect(() => {
initializeApiKey({ apiKey: 'your_api_key' });
}, []);
const handleComplete = async (data) => {
console.log('API URL:', data.apiURL);
console.log('Token:', data.token);
// Make inference request
try {
const response = await fetch(data.apiURL, {
method: 'POST',
headers: {
'Authorization': `Bearer ${data.token}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
Input: {
item1: { text: 'Example content', category: 'general' }
}
}),
});
const result = await response.json();
setUserData(result);
setIsConnected(true);
} catch (error) {
Alert.alert('Error', error.message);
}
};
const handleError = (error) => {
if (error.code !== 'USER_CANCELLED') {
Alert.alert('Error', error.message);
}
};
return (
<View style={styles.container}>
<Text style={styles.title}>Welcome</Text>
{isConnected ? (
<View style={styles.success}>
<Text style={styles.successText}>Connected!</Text>
{userData && (
<Text>{JSON.stringify(userData, null, 2)}</Text>
)}
</View>
) : (
<OnairosButton
AppName="MyApp"
onResolved={handleComplete}
onError={handleError}
requestData={{
personality_traits: {
name: "Personality",
description: "AI analysis for personalization",
reward: "Better recommendations"
}
}}
/>
)}
</View>
);
}
const styles = StyleSheet.create({
container: { flex: 1, justifyContent: 'center', alignItems: 'center', padding: 20 },
title: { fontSize: 32, fontWeight: 'bold', marginBottom: 40 },
success: { alignItems: 'center' },
successText: { fontSize: 24, color: 'green', marginBottom: 10 },
});
Flutter - Complete Example
import 'package:flutter/material.dart';
import 'package:onairos/onairos.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Onairos Demo',
home: HomeScreen(),
);
}
}
class HomeScreen extends StatefulWidget {
@override
_HomeScreenState createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
bool isConnected = false;
Map<String, dynamic>? userData;
Future<void> onResolved(String apiUrl, String token) async {
print('API URL: $apiUrl');
print('Token: $token');
try {
final response = await http.post(
Uri.parse(apiUrl),
headers: {
'Authorization': 'Bearer $token',
'Content-Type': 'application/json',
},
body: jsonEncode({
'Input': {
'item1': {'text': 'Example content', 'category': 'general'}
}
}),
);
if (response.statusCode == 200) {
setState(() {
userData = jsonDecode(response.body);
isConnected = true;
});
}
} catch (e) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Error: $e')),
);
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Onairos Demo')),
body: Center(
child: isConnected
? Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(Icons.check_circle, size: 80, color: Colors.green),
SizedBox(height: 16),
Text('Connected!', style: TextStyle(fontSize: 24)),
if (userData != null)
Padding(
padding: EdgeInsets.all(16),
child: Text(jsonEncode(userData)),
),
],
)
: OnairosButtonWrapper1(
webpageName: 'MyApp',
requestData: {
'personality_traits': {
'name': 'Personality',
'description': 'AI analysis for personalization',
'reward': 'Better recommendations',
}
},
returnLink: 'myapp://callback',
autoFetch: false,
onResolved: onResolved,
inferenceData: {},
proofMode: false,
textColor: 'black',
textLayout: 'right',
),
),
);
}
}
Next Steps
See the Inference Response docs to understand the data format you'll receive.