بنقرة واحدة
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
}
}