2017-04-25 14 views
5

Przeszedłem przez wiele postów próbujących skonfigurować macierzysty projekt reagowania przy użyciu cocoapods dla natywnych bibliotek ios, ale nieuchronnie mam do czynienia z błędem dla brakującego pliku w #import <React/RCTBundleURLProvider.h> oświadczeniu w moim pliku AppDelegate.m.Jaki jest właściwy sposób używania kokosów z React Native (0.43.4) w ios?

Jaki jest właściwy sposób wykorzystania kapsułek kakao z reakcją natywną? W chwili obecnej postu moja aktualna wersja RN to 0.43.4 i używam Xcode 8.2.1.

To był mój proces, nowoczesny, gdzie może być nie tak:

1) W terminalu, tworzę nowy projekt używając react-native init TestProject

2) biegnę pod init w katalogu ios tego projektu

3) dodać zależność w moim podFile i uruchomić pod install

4) proces instalacji zakończy się pomyślnie, ale widzę, że moje ostrzeżenia cele override the 'OTHER_LDFLAGS 'a Zalecane jest używanie $(inherit) w moich flagach linkerów w Xcode.

5) Tak więc na podstawie this SO post dodam $(inherited) do inwestycji> TestProject> BuildSettings łączące> Inne> Flagi Linker co było inaczej pusty. Sprawdziłem również i zobaczyłem, że $(inherited) był już obecny w Cele> TestProject> Ustawienia kompilacji> Łączenie> Inne Flagi Linker i Makra PreProcessor, jak również.

6) W tym momencie widzę React/RCTBundleURLProvider.h nie znaleziono pliku błąd na rachunku #import <React/RCTBundleURLProvider.h> w AppDelegate.m

7) Na podstawie this SO post I spróbuj usunąć katalog node modules iz powrotem w biegu terminala npm install i po ukończeniu 'react-native upgrade'. Kiedy zapyta mnie, czy chcę zastąpić pliki AppDelegate.m i project.pbxproj, mówię "tak".

8) Powrót w Xcode czyscic budować, ale nadal mają błąd z etapu 6 importowaniem <React/RCTBundleURLProvider.h>

Odpowiedz

2

Właśnie uczynić cały proces od początku z czystym projektu Xcode. Zwykle po prostu tworzę aplikację RN, wyrzucam, a następnie tłumaczę na cocoapods ios part. To w dużej mierze oparte na dokumentach RN: http://facebook.github.io/react-native/docs/0.51/integration-with-existing-apps.html

Tak więc środowisko: macOS Sierra, Xcode 9.2, RN 0.51.0

Nazwa projektu: MojaApl

Przygotuj

  • Tworzenie nowego projektu Xcode, z szablonu 'Widok pojedynczy app', nazwa produktu "MojaApl", języka Objective-C
  • Uruchom go zobaczyć działa
  • cd MyApp, mkdir ios, mv MyApp* ios (przeniesienie wszystkich plików związanych z iOS do iOS podfolderze)

zainstalować zależności KMP

Tworzenie package.json w folderze głównym projekcji (bardzo podstawowy)

{ 
    "name": "MyApp", 
    "version": "0.0.1", 
    "private": true, 
    "scripts": { 
    "start": "node node_modules/react-native/local-cli/cli.js start" 
    }, 
    "dependencies": { 
    "react": "16.0.0", 
    "react-native": "0.51.0" 
    }, 
    "devDependencies": { 
    "babel-jest": "22.0.4", 
    "babel-preset-react-native": "4.0.0" 
    } 
} 

Run npm install

Seup cocoapods

  • cd ios
  • pod init (Generować Podfile)
  • stwierdzenie, reaguje w zależności Podfile w MojaApl cel
pod 'React', :path => '../node_modules/react-native', :subspecs => [ 
    'Core', 
    'CxxBridge', 
    'RCTAnimation', 
    'RCTBlob', 
    'RCTText', 
    'RCTNetwork', 
    'RCTWebSocket', 
    'RCTImage', 
    'RCTLinkingIOS', 
    'DevSupport', 
    ] 
pod 'yoga', :path => '../node_modules/react-native/ReactCommon/yoga' 
pod 'DoubleConversion', :podspec => '../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec' 
pod 'GLog', :podspec => '../node_modules/react-native/third-party-podspecs/GLog.podspec' 
pod 'Folly', :podspec => '../node_modules/react-native/third-party-podspecs/Folly.podspec' 

można dodawania/usuwania React subspecs włączenie/usuwania funkcjonalność RN, jest trudne, ponieważ proces RN składniki nie są w pełni niezależne.

  • pod install (zintegrować strąków w projekt, stworzy MyApp.xcworkspace, powinno być wykorzystane do opracowania aplikacji)
  • open MyApp.xcworkspace, budować & bieg, aplikacja powinna nadal działać

HTML RN Korzeń View

Wymień ty AppDelegate.m z tym fragmencie:

#import "AppDelegate.h" 

#import <React/RCTBundleURLProvider.h> 
#import <React/RCTRootView.h> 
#if RCT_DEV 
#import <React/RCTDevLoadingView.h> 
#endif 

@implementation AppDelegate 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    RCTBundleURLProvider* provider = [RCTBundleURLProvider sharedSettings]; 
    NSURL* jsCodeLocation = [provider jsBundleURLForBundleRoot:@"index" fallbackResource:nil]; 

    RCTBridge *bridge = [[RCTBridge alloc] initWithBundleURL:jsCodeLocation moduleProvider:nil launchOptions:launchOptions]; 
#if RCT_DEV 
    [bridge moduleForClass:[RCTDevLoadingView class]]; 
#endif 
    RCTRootView *rootView = [[RCTRootView alloc] initWithBridge:bridge moduleName:@"MyApp" initialProperties:@{}]; 
    rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0f green:1.0f blue:1.0f alpha:1]; 

    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; 
    UIViewController *rootViewController = [UIViewController new]; 
    rootViewController.view = rootView; 
    self.window.rootViewController = rootViewController; 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 

@end 
  • Dodaj wyjątek ATS do Info.plist (lub MojaApl nie będzie w stanie połączyć się z serwerem HTTP) pakującego z
<key>NSAppTransportSecurity</key> 
<dict> 
    <key>NSExceptionDomains</key> 
    <dict> 
     <key>localhost</key> 
     <dict> 
      <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key> 
      <true/> 
     </dict> 
    </dict> 
</dict> 
  • kompilacji & metę w symulatorze, zobaczysz czerwony ekran z komunikatem "Brak adresu URL pakietu."(To dlatego, że żaden serwer Packager działa & nie skompilowany jsbundle istnieje)

obsługa JavaScript part

Tworzenie MyApp/index.js z tego kodu (to jest od RN szablonu):

import { AppRegistry } from 'react-native'; 
import App from './App'; 
AppRegistry.registerComponent('MyApp',() => App); 

Tworzenie MyApp/App.js:

import React from 'react'; 
import { StyleSheet, Text, View } from 'react-native'; 

export default class App extends React.Component { 
    render() { 
    return (
     <View style={styles.container}> 
     <Text style={styles.welcome}> 
      Welcome to React Native! 
     </Text> 
     </View> 
    ); 
    } 
} 

const styles = StyleSheet.create({ 
    container: { 
    flex: 1, 
    justifyContent: 'center', 
    alignItems: 'center', 
    backgroundColor: '#F5FCFF', 
    }, 
    welcome: { 
    fontSize: 20, 
    textAlign: 'center', 
    margin: 10, 
    }, 
}); 
  • rozpocząć Packager npm start z katalogu głównego projektu (MyApp)
  • uruchamiania aplikacji z Xcode, powinieneś zobaczyć wskaźnik ładowania, a następnie RN ekran wykonane z "Welcome to React Native!"

Packager

  • Powinieneś także dodać kompilator pakietu pakującego, aby osadzić skompilowane js w pakiecie aplikacji main.jsbundle, aby mógł być uruchamiany bez serwera programisty pakera.

krok dodawania skryptu MojaApl docelowego Budowanie fazy z tej treści:

export NODE_BINARY=node 
../node_modules/react-native/scripts/react-native-xcode.sh 

Ten kroki pracuje dla mnie.

Powiązane problemy