React Native app purely in Swift

后端 未结 6 541
生来不讨喜
生来不讨喜 2020-12-24 03:42

I created my first react native app using the following command.

react-native init PropertyFinder

This created a project for ios in

相关标签:
6条回答
  • 2020-12-24 04:01

    1) Open Worksapce project in Xcode

    2) Delete these files:

    • AppDelegate.h
    • AppDelegate.m
    • main.m

    3) Create a new Swift file with the name AppDelegate & on next also click on create Bridging header

    4) Copy below in AppDelegate.swift

    import Foundation
    import UIKit
    
    @UIApplicationMain
    class AppDelegate: UIResponder, UIApplicationDelegate {
      var window: UIWindow?
      var bridge: RCTBridge!
    
      func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        let jsCodeLocation: URL
    
        jsCodeLocation = RCTBundleURLProvider.sharedSettings().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
      }
    }
    

    5) Copy below code in Bridging header file

    #import "React/RCTBridgeModule.h"
    #import "React/RCTBridge.h"
    #import "React/RCTEventDispatcher.h"
    #import "React/RCTRootView.h"
    #import "React/RCTUtils.h"
    #import "React/RCTConvert.h"
    #import "React/RCTBundleURLProvider.h"
    

    6) Run your project now

    0 讨论(0)
  • 2020-12-24 04:06

    This excellent post helped me solving the problem.

    Solution

    1. Add Bridging Header
    #import "RCTBridgeModule.h"
    #import "RCTBridge.h"
    #import "RCTEventDispatcher.h"
    #import "RCTRootView.h"
    #import "RCTUtils.h"
    #import "RCTConvert.h"
    
    1. Add 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. Remove the AppDelegate.h, AppDelegate.m and the main file.

    2. Clean and build your project.

    0 讨论(0)
  • 2020-12-24 04:08

    I looked into it and the functionality is not supported by react-native.

    What react-native init is doing is taking a template and changing some properties in it.

    The template is written in Objective-C so there is nothing you can do beside modifying the result manually.

    However, that shouldn't really concern you. You can use Swift even in Objective-C projects. No need to rewrite the files to Swift.

    0 讨论(0)
  • 2020-12-24 04:20

    This actually works for me:

    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.sharedSettings().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
      }
    }
    
    0 讨论(0)
  • 2020-12-24 04:24

    If you're having trouble with the imports

    #import "RCTBridgeModule.h"
    #import "RCTBridge.h"
    #import "RCTEventDispatcher.h"
    #import "RCTRootView.h"
    #import "RCTUtils.h"
    #import "RCTConvert.h"
    

    try

    #import <React/RCTBridgeModule.h>
    #import <React/RCTBridge.h>
    #import <React/RCTEventDispatcher.h>
    #import <React/RCTRootView.h>
    #import <React/RCTUtils.h>
    #import <React/RCTConvert.h>
    
    0 讨论(0)
  • 2020-12-24 04:26

    This what worked for me:

    import UIKit
    
    @UIApplicationMain
    class AppDelegate: UIResponder, UIApplicationDelegate, RCTBridgeDelegate {
        func sourceURL(for bridge: RCTBridge!) -> URL! {
            #if DEBUG
                return RCTBundleURLProvider.sharedSettings().jsBundleURL(forBundleRoot: "index", fallbackResource:nil)
            #else
                return Bundle.main.url(forResource:"main", withExtension:"jsbundle")
            #endif
    }
    
    var window: UIWindow?
    var bridge: RCTBridge!
    
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        self.bridge = RCTBridge(delegate: self, launchOptions: launchOptions)
    
        let rootView = RCTRootView(bridge: self.bridge, moduleName: "SolutoPartnersApp", initialProperties: nil)
    
        self.window = UIWindow(frame: UIScreen.main.bounds)
        let rootViewController = UIViewController()
    
        rootViewController.view = rootView
    
        self.window!.rootViewController = rootViewController;
        self.window!.makeKeyAndVisible()
    
        return true
    }
    
    func applicationWillResignActive(_ application: UIApplication) {
        // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
        // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
    }
    
    func applicationDidEnterBackground(_ application: UIApplication) {
        // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
        // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
    }
    
    func applicationWillEnterForeground(_ application: UIApplication) {
        // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
    }
    
    func applicationDidBecomeActive(_ application: UIApplication) {
        // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
    }
    
    func applicationWillTerminate(_ application: UIApplication) {
        // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
    }
    

    }

    0 讨论(0)
提交回复
热议问题