2016-08-05 11 views
13

oficjalnej dokumentacji React Native uruchomić aplikację na urządzeniu z systemem iOS w trybie offline przy użyciu wiązki mówiBieg reagować natywną aplikację na urządzenia z iOS za pomocą nieaktywny wiązkę

Otwartych ios/YourApp/AppDelegate.m

odkomentuj linię jsCodeLocation = [[NSBundle mainBundle] ...

Korzystanie najnowszy react-native 0.30.0, linia ta nie jest już obecny w domyślnym pliku AppDelegate.m. Wyciąg z domyślnie AppDelegate.m plik

NSURL *jsCodeLocation; 

    jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index.ios" fallbackResource:nil]; 

    RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation 
                 moduleName:@"TestAppDelete" 
               initialProperties:nil 
                launchOptions:launchOptions]; 

Gdy próbuję użyć jsCodeLocation jak kiedyś w poprzednich wersjach, jest zwracany jako wartość null

jsCodeLocation = [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"]; 

Nie jestem pewien, dlaczego jest URL main.jsbundle zwrócił jako null. Czy nie jest już tworzony przez program pakujący. Jeśli powinien on zostać utworzony przy użyciu najnowszej wersji, jak mogę to potwierdzić?

Jeśli korzystasz z aplikacji react-native 0.30.0 na urządzeniu z systemem iOS przy użyciu pakietu offline, udostępnij instrukcje, aby to zrobić. Dzięki!

Odpowiedz

23

EDIT: Wykrywanie całego pakietu IP powinno być automatyczne w najnowszej wersji systemu reagowania natywnego. Jeśli wybierzesz urządzenie na xcode, wykonaj build and run i uruchom aplikację raz. Powinien zapisywać pakiet offline w telefonie, więc jeśli nie znajdzie serwera pakującego, będzie korzystał z pakietu offline.

źródło: https://github.com/facebook/react-native/commit/8c29a52c54392ce52148e7d3aa9f835537453aa4


Jeśli zmieni się schemat release budując swoją aplikację, która będzie skompilować aplikację z pakietu offline.

Produkt> Schemat> Edytuj schemat> zestaw build configuration na Release.

Nie wiem, dlaczego nie zaktualizowano dokumentacji dla metody Appdelegate.m. Wygląda na to, że linia wciąż znajduje się w źródłach. [Edytuj: do tego jest pull request]

+0

Wielkie dzięki za odpowiedź. Ta zmiana nie została wymieniona w uwagach do wydania i od czasu, gdy zmieniłem plik 'AppDelegate' w mojej aplikacji, po prostu zmieniłem go po aktualizacji' native-native', a dokumentacja nie została zaktualizowana, co dodatkowo dezorientuje. Tylko uwaga - jeśli uruchomię aplikację na urządzeniu bez zmiany "Build Configuration" na "Release", to mogę uruchomić aplikację tak długo, jak długo jest ona podłączona do mac. Jeśli zatrzymam aplikację, odłącz telefon i spróbuj ponownie uruchomić, nie uruchamia się. Ustawienie "Build Configuration" na "Release" pomogło w tym przypadku. Dzięki jeszcze raz! –

+0

Mam nadzieję, że mogę wielokrotnie odpowiedzieć na to pytanie :). Po prostu spędziłem wczoraj zbyt wiele czasu, aby to zrozumieć. –

+0

Pozdrawiam, człowieku! Gdyby nie twoja odpowiedź, nie wiedziałbym o tym. :) Nie próbowałem tego, ale widziałem to na źródłach. Aktualizacja nastąpi po wypróbowaniu. – nabn

1

Jedyna poprawka mogłem dostać się do pracy na reagować rodzimy 0,37 było wrócić do „starej szkoły” metody ręcznej edycji jsCodeLocation w AppDelegate.m. Debugowanie jest znowu dobre!

Upewnij się, że twoje urządzenie i programista działają na tym samym sprzęcie Wi-Fi i może odłączyć przewodową sieć Ethernet, dopóki nie zacznie działać.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    NSURL *jsCodeLocation; 

    // Comment-out, cannot get past error: bundleURL must be non-nil when not implementing loadSourceForBridge 
    //jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index.ios" fallbackResource:nil]; 

#if DEBUG 
    NSLog(@"AppDelegate:DEBUG"); 

#if TARGET_IPHONE_SIMULATOR 
    NSLog(@"AppDelegate:DEBUG:TARGET_IPHONE_SIMULATOR"); 
    jsCodeLocation = [NSURL URLWithString:@"http://localhost:8081/index.ios.bundle"]; 
#else 
    NSLog(@"AppDelegate:DEBUG:!TARGET_IPHONE_SIMULATOR"); 
    NSLog(@"To device debug, open RCTWebSocketExecutor.m & replace localhost with MacBook IP."); 
    // Get dev host IP Address: 
    // ifconfig | grep inet\ | tail -1 | cut -d " " -f 2 
    jsCodeLocation = [NSURL URLWithString:@"http://192.16.29.213:8081/index.ios.bundle"]; 
#endif 

#else 
    NSLog(@"AppDelegate:RELEASE jsbundle"); 
    jsCodeLocation = [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"]; 
#endif 

    NSLog(@"jsCodeLocation = %@",jsCodeLocation); 


    RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation 
                 moduleName:@"BluetoothConnect" 
               initialProperties:nil 
                launchOptions:launchOptions]; 
    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; 
} 
3

tl; Upewnij się, że adres IP lokalnego hosta jest wyraźnie określony w pliku hosts, a plik hosts nie został uszkodzony.

Tak więc nasz zespół ciągle uderzał w ten problem. Okazuje się, że React Native czyta plik hosta na twoim komputerze, szukając adresu URL do zapisania, tak aby mógł wyciągnąć js, aby utworzyć pakiet offline, lub po prostu dotrzeć do pakowacza, gdy aplikacja jest uruchomiona na twoim urządzeniu.

W rzeczywistości nie próbowaliśmy uruchomić tego jako pakietu offline, tylko w symulatorze ios, więc zostaliśmy naprawdę drapiąc nasze głowy. Znaleźliśmy poprawkę, ponieważ wymagana poprawka powodowała również inne problemy z reagowaniem natywnym. Nasz plik etc/hosts na mac nie miał jawnie podanego localhost ip. Dodałem to i problem zniknął. Wybaczcie mi, ponieważ nie wiem zbyt wiele o rozdzielczości osx i dns, ale wydaje się, że z nowym automatycznym wykrywaniem IP jest to teraz konieczne.

Nie jestem pewien, jak reaguje natywne pobieranie IP, czy czyta plik hosts, czy plik hosta propaguje coś innego w osxie, które czyta rn, ale jeśli powyższa poprawka nie działa dla ciebie, ja sprawdzi, czy plik hosts sam w sobie jest uszkodzony niektórymi znakami, które sprawiają, że nie jest on czytany. W moich poszukiwaniach rozwiązania tego problemu natknąłem się na wiele postów i pytań dotyczących zniekształconych plików hostów, które powodowały problemy z prawidłowym rozwiązywaniem localhost.

Wydaje się również, że trwają prace nad aktualizacją wykrywania IP, ale nie jestem wystarczająco zorientowany w obj c, aby wiedzieć, czy problem zostałby poprawiony przez nowy kod. Może ktoś może rzucić okiem? https://github.com/facebook/react-native/pull/8789

Innym też, wyczyścić pamięć podręczną DNS OSX może pomóc https://coolestguidesontheplanet.com/clear-the-local-dns-cache-in-osx/

+1

+1 .. Niesamowite badania! Miałem ten problem tylko z niektórymi routerami. (Dużo się poruszam). Ale wiersz do wskazania w hostach został skomentowany. Umieszczenie 127.0.0.1 localhost w moim pliku hostów rozwiązaniu problemu! Dziękuję bardzo! Szukałem godzin na poprawkę. –

+1

@Fralcon Dzięki. – TA3

0

Dla mnie problemem było to, że bawił się z Info.plist i usunęła wyjątek bezpieczeństwa transportu localhost aplikacji. Dodanie tego z powrotem do Info.plist poprawiło to dla mnie:

<key>NSAppTransportSecurity</key> 
<!--See http://ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10-11/ --> 
<dict> 
    <key>NSExceptionDomains</key> 
    <dict> 
     <key>localhost</key> 
     <dict> 
      <key>NSExceptionAllowsInsecureHTTPLoads</key> 
      <true/> 
     </dict> 
    </dict> 
</dict> 
Powiązane problemy