reactjsr aplicación nativa puramente en swift

Creé mi primera aplicación nativa con el siguiente command.

react-native init PropertyFinder 

Esto creó un proyecto para ios en Objective-C . El problema es que no conozco Objective-C, pero trabajo con Swift.

Esta idea muestra cómo vincular componentes de reacción a un proyecto rápido. ¿Pero hay una manera de crear directamente el proyecto en lenguaje Swift ?

Encontré una muy buena publicación que resolvió el problema.

Solución

  1. Puente de cabecera
 #import "RCTBridgeModule.h" #import "RCTBridge.h" #import "RCTEventDispatcher.h" #import "RCTRootView.h" #import "RCTUtils.h" #import "RCTConvert.h" 
  1. AppDelegate.Swift
 var bridge: RCTBridge! func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. /** * Loading JavaScript code - uncomment the one you want. * * OPTION 1 * Load from development server. Start the server from the repository root: * * $ npm start * * To run on device, change `localhost` to the IP address of your computer * (you can get this by typing `ifconfig` into the terminal and selecting the * `inet` value under `en0:`) and make sure your computer and iOS device are * on the same Wi-Fi network. */ let jsCodeLocation = NSURL(string: "http://localhost:8081/index.ios.bundle?platform=ios&dev=true") /** * OPTION 2 * Load from pre-bundled file on disk. The static bundle is automatically * generated by "Bundle React Native code and images" build step. */ // jsCodeLocation = NSBundle.mainBundle().URLForResource("main", withExtension: "jsbundle") let rootView = RCTRootView(bundleURL:jsCodeLocation as URL!, moduleName: "PropertyFinder", initialProperties: nil, launchOptions:launchOptions) self.bridge = rootView?.bridge self.window = UIWindow(frame: UIScreen.main.bounds) let rootViewController = UIViewController() rootViewController.view = rootView self.window!.rootViewController = rootViewController; self.window!.makeKeyAndVisible() return true } 
  1. Eliminar AppDelegate.h, AppDelegate.m y file principal

  2. Limpiar y build

Lo analicé y la funcionalidad no es compatible con react-native .

Lo que hace react-native init es tomar una plantilla y cambiar algunas properties en ella.

La plantilla está escrita en Objective-C, por lo que no puede hacer nada además de modificar el resultado manualmente.

Sin embargo, eso no debería preocuparte realmente. Puede usar Swift incluso en proyectos Objective-C. No es necesario volver a escribir los files en Swift.

Esto realmente funciona para mí:

 import Foundation import UIKit @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? var bridge: RCTBridge! func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { let jsCodeLocation: URL jsCodeLocation = RCTBundleURLProvider.shanetworkingSettings().jsBundleURL(forBundleRoot: "index.ios", fallbackResource:nil) let rootView = RCTRootView(bundleURL: jsCodeLocation, moduleName: "REPLACE_WITH_YOUR_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 } }