원클릭으로
ios-native-bridge
Expert in bridging native iOS code (Swift/Objective-C) with React Native and Flutter applications.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Expert in bridging native iOS code (Swift/Objective-C) with React Native and Flutter applications.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
End-to-end orchestrated execution. Takes a feature description and drives the entire pipeline — plan, plan review (3 fresh reviewers), WU decomposition, 4-phase execution loop per WU, final review, COMMIT-READY emit. Honors user's git policy (no auto-commit).
`--default-domain` comes from the project-detect framework signal (orchestrator Step 5b / project-context); it only decides how UI files with no strong path marker are classified. `--risk-tier` is the WU's `risk_tier` fi
**Capture the WU baseline ONCE per WU, before attempt 1 (NOT on retries).** This is what makes file-scope checks correct across a multi-WU run where the user has not yet committed prior WUs (per the `ben yapacagim` git p
This gate has **two interchangeable execution paths that MUST emit the identical aggregated verdict object** (Step 3). The prose path below is the canonical fallback and the single source of truth for reviewer prompts an
A baton-based system for building mobile features across multiple Claude Code sessions with persistent progress tracking and simulator verification between steps.
Set up end-to-end testing framework with CI integration
| name | ios-native-bridge |
| description | Expert in bridging native iOS code (Swift/Objective-C) with React Native and Flutter applications. |
| source_type | agent |
| source_file | agents/ios-native-bridge.md |
Migrated from agents/ios-native-bridge.md.
references/... or workflow/..., are packaged beside this SKILL.md.agents/..., commands/..., scripts/..., resources/..., rules/..., hooks/..., or templates/..., are packaged at this plugin root.skills/orchestration/...) is packaged under source/skills/orchestration/... for exact-reference lookups; all other Telar skills exist here only as the generated adapters under the plugin-root skills/ directory.../.. when reading support files or running packaged scripts..codex/agents/ in the source repository.Expert in bridging native iOS code (Swift/Objective-C) with React Native and Flutter applications.
Follow the clean-code skill: reuse existing shared units before writing new ones; unify duplication only when sites change together for the same reason (do not force-merge coincidental similarity); keep to simplicity-first (no speculative abstraction). The Maintainability reviewer enforces this.
Swift Module Setup:
// CalendarModule.swift
import Foundation
import EventKit
@objc(CalendarModule)
class CalendarModule: NSObject {
private let eventStore = EKEventStore()
@objc
func createEvent(
_ title: String,
startDate: Double,
endDate: Double,
resolver resolve: @escaping RCTPromiseResolveBlock,
rejecter reject: @escaping RCTPromiseRejectBlock
) {
eventStore.requestAccess(to: .event) { granted, error in
if let error = error {
reject("CALENDAR_ERROR", error.localizedDescription, error)
return
}
guard granted else {
reject("PERMISSION_DENIED", "Calendar access denied", nil)
return
}
let event = EKEvent(eventStore: self.eventStore)
event.title = title
event.startDate = Date(timeIntervalSince1970: startDate / 1000)
event.endDate = Date(timeIntervalSince1970: endDate / 1000)
event.calendar = self.eventStore.defaultCalendarForNewEvents
do {
try self.eventStore.save(event, span: .thisEvent)
resolve(["eventId": event.eventIdentifier])
} catch {
reject("SAVE_ERROR", error.localizedDescription, error)
}
}
}
@objc
static func requiresMainQueueSetup() -> Bool {
return false
}
}
// CalendarModule.m (Bridging)
#import <React/RCTBridgeModule.h>
@interface RCT_EXTERN_MODULE(CalendarModule, NSObject)
RCT_EXTERN_METHOD(createEvent:(NSString *)title
startDate:(double)startDate
endDate:(double)endDate
resolver:(RCTPromiseResolveBlock)resolve
rejecter:(RCTPromiseRejectBlock)reject)
@end
Event Emitter (Swift):
@objc(LocationEmitter)
class LocationEmitter: RCTEventEmitter {
private var locationManager: CLLocationManager?
private var hasListeners = false
override func supportedEvents() -> [String]! {
return ["onLocationUpdate", "onLocationError"]
}
override func startObserving() {
hasListeners = true
}
override func stopObserving() {
hasListeners = false
}
@objc
func startTracking() {
DispatchQueue.main.async {
self.locationManager = CLLocationManager()
self.locationManager?.delegate = self
self.locationManager?.requestWhenInUseAuthorization()
self.locationManager?.startUpdatingLocation()
}
}
private func sendLocation(_ location: CLLocation) {
guard hasListeners else { return }
sendEvent(withName: "onLocationUpdate", body: [
"latitude": location.coordinate.latitude,
"longitude": location.coordinate.longitude,
"accuracy": location.horizontalAccuracy
])
}
}
Swift Method Channel:
// AppDelegate.swift
import Flutter
@UIApplicationMain
class AppDelegate: FlutterAppDelegate {
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
let controller = window?.rootViewController as! FlutterViewController
let batteryChannel = FlutterMethodChannel(
name: "com.myapp/battery",
binaryMessenger: controller.binaryMessenger
)
batteryChannel.setMethodCallHandler { [weak self] call, result in
switch call.method {
case "getBatteryLevel":
self?.getBatteryLevel(result: result)
default:
result(FlutterMethodNotImplemented)
}
}
// Event channel for streaming data
let eventChannel = FlutterEventChannel(
name: "com.myapp/battery_stream",
binaryMessenger: controller.binaryMessenger
)
eventChannel.setStreamHandler(BatteryStreamHandler())
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
private func getBatteryLevel(result: FlutterResult) {
UIDevice.current.isBatteryMonitoringEnabled = true
let batteryLevel = Int(UIDevice.current.batteryLevel * 100)
result(batteryLevel)
}
}
// Stream handler
class BatteryStreamHandler: NSObject, FlutterStreamHandler {
private var eventSink: FlutterEventSink?
func onListen(withArguments arguments: Any?, eventSink: @escaping FlutterEventSink) -> FlutterError? {
self.eventSink = eventSink
// Start monitoring and send updates via eventSink
return nil
}
func onCancel(withArguments arguments: Any?) -> FlutterError? {
eventSink = nil
return nil
}
}
Keychain Storage:
import Security
class KeychainHelper {
static func save(key: String, data: Data) -> Bool {
let query: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrAccount as String: key,
kSecValueData as String: data,
kSecAttrAccessible as String: kSecAttrAccessibleWhenUnlockedThisDeviceOnly
]
SecItemDelete(query as CFDictionary)
let status = SecItemAdd(query as CFDictionary, nil)
return status == errSecSuccess
}
static func load(key: String) -> Data? {
let query: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrAccount as String: key,
kSecReturnData as String: true,
kSecMatchLimit as String: kSecMatchLimitOne
]
var result: AnyObject?
let status = SecItemCopyMatching(query as CFDictionary, &result)
return status == errSecSuccess ? result as? Data : nil
}
}