2016-08-05 63 views
13

官方React Native文件,以使用脫機捆綁的iOS設備上運行的應用程序的反應原生的iOS設備上的應用說運行使用脫機捆綁

開放IOS/YourApp/AppDelegate.m

取消對線, jsCodeLocation = [[一個NSBundle mainBundle] ...

採用了最新react-native 0.30.0,這條線是在默認AppDelegate.m文件不再存在。從默認的摘錄AppDelegate.m文件

NSURL *jsCodeLocation; 

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

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

如果我嘗試使用jsCodeLocation因爲它曾經在以前的版本中,它返回爲空

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

我不知道爲什麼是針對URL main.jsbundle返回爲null。它不是由包裝商創建的嗎?如果應該使用最新版本創建,我該如何確認?

如果您使用脫機包在iOS設備上運行了react-native 0.30.0應用程序,請分享相關說明。謝謝!

回答

23

編輯:在最新發布的react-native版本中,整個ip檢測應該是自動的。如果您在xcode do build and run上選擇了您的設備並運行該應用一次。它應該在手機上保存一個脫機捆綁包,這樣如果它找不到一個包裝服務器運行,它將使用脫機捆綁包。

來源:https://github.com/facebook/react-native/commit/8c29a52c54392ce52148e7d3aa9f835537453aa4


如果您更改爲release方案,同時建立你的應用程序,這將編譯你的應用程序與脫機捆綁包。

Product> Scheme> Edit Scheme> set build configuration to Release

不確定爲什麼他們沒有更新Appdelegate.m方法的文檔。看起來線路仍然存在於信號源中。 [編輯:這裏有一個pull request]

+0

非常感謝你的回覆。發佈說明中未提及此更改,因爲我更改了應用中的'AppDelegate'文件,所以我在'react-native'升級之後將其替換了,並且文檔未更新,這些更改讓事情更加混亂。請注意 - 如果我在設備上運行應用程序而不更改「Build Configuration」到「Release」,那麼只要連接到Mac,我就可以運行該應用程序。如果我停止該應用程序,請斷開手機並嘗試再次運行,但不啓動。在這種情況下,將「構建配置」設置爲「發佈」。再次感謝! –

+0

我希望我可以upvote多次:)的答案。我昨天花了太多時間才弄明白。 –

+0

乾杯,男人!難道不是你的回答,我不會知道我自己。 :)我還沒有嘗試過,但看到它的來源。一旦我嘗試一下就會更新。 – nabn

1

唯一的解決方法我能得到的工作作出反應本地0.37是要回去的手工編輯jsCodeLocationAppDelegate.m的「老派」的方法。調試很好!

確保您的設備和開發機器位於相同的Wi-Fi網絡上,並且可能會斷開任何有線以太網,直到您獲得它的工作。

- (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; dr請確保您的本地主機IP地址在主機文件中明確聲明,並且您的主機文件沒有被損壞。

所以我們的團隊不斷遇到這個問題。事實證明,React Native會讀取計算機上的主機文件以查找要存儲的URL,以便它可以讓js創建脫機包,或者在應用在設備上運行時直接聯繫打包程序。

我們實際上並沒有試圖將它作爲一個離線軟件包,只是在ios模擬器中,所以我們真的只是在撓頭。我們找到了修復程序,因爲所需的修復程序也導致了其他原生問題。我們在mac上的etc/hosts文件沒有明確聲明的localhost ip。我補充說,問題似乎消失了。請原諒我,因爲我對osx和dns分辨率瞭解不多,但似乎有了新的自動ip檢測功能,現在就有必要了。

我不知道如何反應本地獲取IP,如果它正在讀取主機文件,或主機文件正在props中的其他osx,正在閱讀,但如果上述修復程序不適用於您,我會查看主機文件本身是否被損壞,導致某些字符不能被讀取。在尋找解決此問題的解決方案時,我遇到了很多關於格式錯誤的主機文件的帖子和問題,這些問題導致localhost正常解決問題。

此外,似乎有更新ip檢測的工作正在進行中,但我不太瞭解obj c知道這個問題是否會被新代碼糾正。也許有人可以看看? https://github.com/facebook/react-native/pull/8789

另還,清除OSX DNS緩存可以幫助https://coolestguidesontheplanet.com/clear-the-local-dns-cache-in-osx/

+1

+1 ..真棒研究!我只對某些路由器有這個問題。 (我移動了很多)。但指向主持人的路線已被註釋掉。 把 127.0.0.1本地主機 進入我的hosts文件修復了這個問題!非常感謝!我正在尋找解決問題的時間。 –

+1

@Fralcon謝謝。 – TA3

0

對我來說,問題是,我曾與Info.plist的撥弄和刪除本地主機應用程序傳輸安全例外。把它加回到Info.plist中爲我修好:

<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>