iOS native runtime implementation for Capacitor that bridges JavaScript and native iOS APIs.
npx @tessl/cli install tessl/npm-capacitor--ios@7.4.0Capacitor iOS provides the native iOS runtime implementation for Capacitor applications, enabling web developers to build native iOS apps using JavaScript, HTML, and CSS. This package contains Swift and Objective-C implementations that bridge web applications with native iOS APIs and device capabilities.
npm install @capacitor/iosSwift:
import CapacitorObjective-C:
@import Capacitor;import UIKit
import Capacitor
class ViewController: CAPBridgeViewController {
override func instanceDescriptor() -> InstanceDescriptor {
let descriptor = InstanceDescriptor()
descriptor.appLocation = Bundle.main.url(forResource: "public", withExtension: nil)!
return descriptor
}
override func viewDidLoad() {
super.viewDidLoad()
// Capacitor bridge is automatically initialized
}
}Capacitor iOS is built around several key components:
CAPBridgeViewController and CapacitorBridge manage JavaScript-to-native communicationCAPPlugin base class and CAPBridgedPlugin protocol for extending functionalityInstanceDescriptor and InstanceConfiguration for runtime configurationJSTypes system providing type-safe JavaScript-to-Swift data conversionNotificationRouter for handling push and local notificationsCore bridge setup and view controller integration for embedding Capacitor web applications in iOS apps.
open class CAPBridgeViewController: UIViewController {
open func instanceDescriptor() -> InstanceDescriptor
open func webViewConfiguration(for instanceConfiguration: InstanceConfiguration) -> WKWebViewConfiguration
open func capacitorDidLoad()
public var bridge: CAPBridgeProtocol? { get }
public var webView: WKWebView? { get }
public var isStatusBarVisible: Bool { get set }
public var statusBarStyle: UIStatusBarStyle { get set }
public var supportedOrientations: [Int] { get set }
}Instance configuration system for customizing Capacitor behavior, webview settings, and runtime options.
@objc(CAPInstanceDescriptor)
public class InstanceDescriptor: NSObject {
public init()
public init(at appURL: URL, configuration configURL: URL?, cordovaConfiguration cordovaURL: URL?)
// Core Configuration
public var appLocation: URL
public var appStartPath: String?
public var serverURL: String?
public var urlScheme: String?
public var urlHostname: String?
// WebView Configuration
public var backgroundColor: UIColor?
public var scrollingEnabled: Bool
public var zoomingEnabled: Bool
public var allowLinkPreviews: Bool
public var isWebDebuggable: Bool
// Security & Navigation
public var allowedNavigationHostnames: [String]
public var limitsNavigationsToAppBoundDomains: Bool
// Plugin Configuration
public var pluginConfigurations: NSDictionary
}Comprehensive plugin development framework for creating custom native functionality accessible from JavaScript.
@interface CAPPlugin : NSObject
- (void)load;
- (void)addEventListener:(NSString *)eventName listener:(CAPPluginCall *)listener;
- (void)notifyListeners:(NSString *)eventName data:(NSDictionary<NSString *, id> *)data;
- (void)checkPermissions:(CAPPluginCall *)call;
- (void)requestPermissions:(CAPPluginCall *)call;
@property (nonatomic, weak, nullable) WKWebView *webView;
@property (nonatomic, weak, nullable) id<CAPBridgeProtocol> bridge;
@property (nonatomic, strong, nonnull) NSString *pluginId;
@property (nonatomic, strong, nonnull) NSString *pluginName;
@end
@protocol CAPBridgedPlugin <NSObject>
@property (nonnull, readonly) NSString *identifier;
@property (nonnull, readonly) NSString *jsName;
@property (nonnull, readonly) NSArray<CAPPluginMethod *> *pluginMethods;
@endType-safe JavaScript-to-native method invocation with structured parameter access and response handling.
@objc(CAPPluginCall)
public class CAPPluginCall: NSObject {
public let callbackId: String
public let methodName: String
public let options: NSDictionary
public var keepAlive: Bool
// Response Methods
public func resolve()
public func resolve(_ data: PluginCallResultData?)
public func reject(_ message: String, _ code: String?, _ error: Error?, _ data: PluginCallResultData?)
public func unimplemented(_ message: String)
public func unavailable(_ message: String)
// Type-Safe Accessors
public func getString(_ key: String, _ defaultValue: String?) -> String?
public func getBool(_ key: String, _ defaultValue: Bool) -> Bool
public func getInt(_ key: String, _ defaultValue: Int) -> Int
public func getObject(_ key: String, _ defaultValue: JSObject?) -> JSObject?
public func getArray(_ key: String, _ defaultValue: JSArray?) -> JSArray?
}Comprehensive notification routing system for managing push notifications and local notifications with plugin integration.
@objc(CAPNotificationRouter)
public class NotificationRouter: NSObject, UNUserNotificationCenterDelegate {
public weak var pushNotificationHandler: NotificationHandlerProtocol?
public weak var localNotificationHandler: NotificationHandlerProtocol?
public var handleApplicationNotifications: Bool { get set }
}
@objc(CAPNotificationHandlerProtocol)
public protocol NotificationHandlerProtocol {
func willPresent(notification: UNNotification) -> UNNotificationPresentationOptions
func didReceive(response: UNNotificationResponse)
}@objc public protocol CAPBridgeProtocol {
var webView: WKWebView? { get }
var config: InstanceConfiguration { get }
var notificationRouter: NotificationRouter { get }
func plugin(withName name: String) -> CAPPlugin?
func registerPluginType(_ pluginType: CAPPlugin.Type)
func eval(js: String)
}
public typealias JSObject = [String: JSValue]
public typealias JSArray = [JSValue]
public typealias PluginCallResultData = JSObject
public protocol JSValue {}
extension String: JSValue {}
extension Bool: JSValue {}
extension Int: JSValue {}
extension Float: JSValue {}
extension Double: JSValue {}
extension NSNumber: JSValue {}
extension NSString: JSValue {}
extension NSArray: JSValue {}
extension NSDictionary: JSValue {}public enum InstanceType: Int {
case fixed
case variable
}
public struct InstanceWarning: OptionSet {
public static let missingAppDir = InstanceWarning(rawValue: 1 << 0)
public static let missingFile = InstanceWarning(rawValue: 1 << 1)
public static let invalidFile = InstanceWarning(rawValue: 1 << 2)
public static let missingCordovaFile = InstanceWarning(rawValue: 1 << 3)
public static let invalidCordovaFile = InstanceWarning(rawValue: 1 << 4)
}
public struct InstanceLoggingBehavior: OptionSet {
public static let none = InstanceLoggingBehavior(rawValue: 1 << 0)
public static let debug = InstanceLoggingBehavior(rawValue: 1 << 1)
public static let production = InstanceLoggingBehavior(rawValue: 1 << 2)
}@objc(CAPPluginMethod)
public class CAPPluginMethod: NSObject {
public init(name: String, returnType: CAPPluginReturnType)
public let name: String
public let selector: Selector
public let returnType: CAPPluginReturnType
}
public enum CAPPluginReturnType: Int {
case none
case callback
case promise
}
@objc(CAPPluginCallResult)
public class CAPPluginCallResult: NSObject {
public let data: PluginCallResultData?
}
@objc(CAPPluginCallError)
public class CAPPluginCallError: NSObject {
public let message: String
public let code: String?
public let error: Error?
public let data: PluginCallResultData?
}