Adil
05/08/2024, 12:59 PMexpect object AnalyticsManager {
fun logEvent(eventType: String, params: Map<String, Any>? = null)
}
iOS (Kotlin)
actual object AnalyticsManager {
// posting notification's of events with information about the data that needs to be delegated to swift
actual fun logEvent(
eventType: String,
params: Map<String, Any>?
) {
val notificationCenter = NSNotificationCenter.defaultCenter
val userInfo = params?.mapKeys { it.key as Any? }?.mapValues { it.value }
val notification = NSNotification(eventType, null, userInfo)
notificationCenter.postNotification(notification)
}
}
iOS(Swift)
func analyticsListener(){
// listening to sender notification's of kotlin code and executing code block in swift
NotificationCenter.default.addObserver(self, selector: #selector(self.logAnalytics(_:)), name: NSNotification.Name(rawValue: "LOGIN_SUCCESS_EVENT"), object: nil)
}
@objc func logAnalytics(_ notification: NSNotification) {
let data = notification.userInfo?.compactMapValues { value -> Any? in
guard let key = value as? String else { return nil }
return key
}
Analytics.logEvent("LOGIN_SUCCESS_EVENT", parameters: data as? [String: Any])
}
steve h
05/08/2024, 2:24 PM:shared
Kotlin Interface without actual/expect, instantiate the object in iOS using the Interface signature, then pass the object directly back to Kotlin by like an initWithNativeComponents(iosAnalyticsManager)
that's called before a shared App.main()
in Kotlin is called (or wherever your entry point is).
Something like this:
Kotlin:
interface AnalyticsManager {
fun logEvent(eventType: String, params: Map<String, Any>? = null)
}
class AnalyticsManagerImplAndroid : AnalyticsManager {
override fun logEvent(eventType: String, params: Map<String, Any>?) {
// log event
}
}
iOS/Swift::
class AnalyticsManagerImpliOS:AnalyticsManager {
func logEvent(eventType: String, params: [String : Any]?) {
print(params)
}
}
let iosAnalyticsManager = AnalyticsManagerImpliOS()
SharedKotlinApp().instance().initWithNativeComponente(analyticsManager:iosAnalyticsManager)
then
SharedKotlinApp().instance().main()
(to start shared app)
It's not the most practical in terms of scalable dependency injection but might could get you further alongAdil
05/08/2024, 2:28 PM