我可以在不使用 Objective-C(纯 swift)的情况下向 React Native 公开 Swift 函数吗?
Can I expose a Swift function to React Native without using Objective-C (pure swift)?
我想知道我是否可以将我的 func navigateToLoginWidget
暴露给 React Native。这样就可以从RN触发了。
我已经设法将 React Native 附带的 Objective-C 模板更改为 Swift,如下所示:
import Foundation
import IBMCloudAppID
import BMSCore
import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
var bridge: RCTBridge!
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// initializing App ID SDK
let region = AppID.REGION_SOMEWHERE
let backendGUID = "MY_TENANT_ID_FROM_IBM"
AppID.sharedInstance.initialize(tenantId: backendGUID, region: region)
// Initializing React Native front-end with Swift instead of Obj-c template
let jsCodeLocation: URL
jsCodeLocation = RCTBundleURLProvider.sharedSettings().jsBundleURL(forBundleRoot: "index.js", fallbackResource:nil)
let rootView = RCTRootView(bundleURL: jsCodeLocation, moduleName: "MY_PROJECT_NAME", initialProperties: nil, launchOptions: launchOptions)
let rootViewController = UIViewController()
rootViewController.view = rootView
self.window = UIWindow(frame: UIScreen.main.bounds)
self.window?.rootViewController = rootViewController
self.window?.makeKeyAndVisible()
return true
}
func application(_ application: UIApplication, open url: URL, options :[UIApplication.OpenURLOptionsKey : Any]) -> Bool {
return AppID.sharedInstance.application(application, open: url, options: options)
}
func navigateToLoginWidget(_ sender : Any) {
print("clicked")
AppID.sharedInstance.loginWidget?.launch(delegate: SigninDelegate)
}
}
我通常会在另一个名为 SigninDelegate.swift 的模块中使用此函数,但出于解释目的,我将其包含在同一个 class 中。
Swift doesn't have support for macros so exposing it to React Native
requires a bit more setup but works relatively the same.
是的,这是可能的,但需要一些设置。查看上面 link 中的文档,了解您需要遵循的设置步骤。
我想知道我是否可以将我的 func navigateToLoginWidget
暴露给 React Native。这样就可以从RN触发了。
我已经设法将 React Native 附带的 Objective-C 模板更改为 Swift,如下所示:
import Foundation
import IBMCloudAppID
import BMSCore
import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
var bridge: RCTBridge!
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// initializing App ID SDK
let region = AppID.REGION_SOMEWHERE
let backendGUID = "MY_TENANT_ID_FROM_IBM"
AppID.sharedInstance.initialize(tenantId: backendGUID, region: region)
// Initializing React Native front-end with Swift instead of Obj-c template
let jsCodeLocation: URL
jsCodeLocation = RCTBundleURLProvider.sharedSettings().jsBundleURL(forBundleRoot: "index.js", fallbackResource:nil)
let rootView = RCTRootView(bundleURL: jsCodeLocation, moduleName: "MY_PROJECT_NAME", initialProperties: nil, launchOptions: launchOptions)
let rootViewController = UIViewController()
rootViewController.view = rootView
self.window = UIWindow(frame: UIScreen.main.bounds)
self.window?.rootViewController = rootViewController
self.window?.makeKeyAndVisible()
return true
}
func application(_ application: UIApplication, open url: URL, options :[UIApplication.OpenURLOptionsKey : Any]) -> Bool {
return AppID.sharedInstance.application(application, open: url, options: options)
}
func navigateToLoginWidget(_ sender : Any) {
print("clicked")
AppID.sharedInstance.loginWidget?.launch(delegate: SigninDelegate)
}
}
我通常会在另一个名为 SigninDelegate.swift 的模块中使用此函数,但出于解释目的,我将其包含在同一个 class 中。
Swift doesn't have support for macros so exposing it to React Native requires a bit more setup but works relatively the same.
是的,这是可能的,但需要一些设置。查看上面 link 中的文档,了解您需要遵循的设置步骤。