Reputation: 1731
I ran the debugger and axios is failing in sending the request. The same thing works perfectly in Android. As soon as it sends the request through axios then these red screens pop up on the emulator:
This is the code that is giving the error:
/*red screen here after request send*/return axios.get(config.backend_url + '/api/firebase-user/' + firebaseId)
.then((userDataFetchResult) => {
dispatch(setUserGeneralData(userDataFetchResult.data.data));
dispatch(authOperationFinished());
return userData;
})
.catch(err => {
console.log(err);
dispatch(authOperationFailed(err));
});
My package.json:
"dependencies": {
"axios": "^0.18.0",
"lodash": "^4.17.5",
"native-base": "^2.4.1",
"react": "16.3.1",
"react-native": "0.54.1",
"react-native-app-intro-slider": "^0.2.4",
"react-native-datepicker": "^1.7.1",
"react-native-fbsdk": "^0.7.0",
"react-native-firebase": "^4.0.0",
"react-native-image-picker": "^0.26.7",
"react-native-navigation": "^1.1.444",
"react-native-twitter-signin": "^1.0.2",
"react-native-vector-icons": "^4.6.0",
"react-redux": "^5.0.6",
"redux": "^3.7.2",
"redux-thunk": "^2.2.0"
}
My info.plist:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLSchemes</key>
<array>
<string>fbXXXXXXX</string>
</array>
</dict>
</array>
<key>LSApplicationQueriesSchemes</key>
<array>
<string>fbapi</string>
<string>fb-messenger-share-api</string>
<string>fbauth2</string>
<string>fbshareextension</string>
</array>
<key>NSCameraUsageDescription</key>
<string>Camera Permissions</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>Gallery Permissions</string>
<key>UIAppFonts</key>
<array>
<string>Ionicons.ttf</string>
</array>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleDisplayName</key>
<string>FFFF</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
</array>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
<key>NSLocationWhenInUseUsageDescription</key>
<string></string>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
<key>NSExceptionDomains</key>
<dict>
<key>localhost</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
</dict>
</dict>
</dict>
<key>FacebookAppID</key>
<string>XXXXXX</string>
<key>FacebookDisplayName</key>
<string>FF</string>
</dict>
</plist>
My AppDelegate.m:
#import "AppDelegate.h"
#import <React/RCTBundleURLProvider.h>
#import <FBSDKCoreKit/FBSDKCoreKit.h>
// **********************************************
// *** DON'T MISS: THE NEXT LINE IS IMPORTANT ***
// **********************************************
#import <TwitterKit/TwitterKit.h>
// IMPORTANT: if you're getting an Xcode error that RCCManager.h isn't found, you've probably ran "npm install"
// with npm ver 2. You'll need to "npm install" with npm 3 (see https://github.com/wix/react-native-navigation/issues/1)
#import <Firebase.h>
#import "RCCManager.h"
#import <React/RCTRootView.h>
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[FIRApp configure];
[[FBSDKApplicationDelegate sharedInstance] application:application
didFinishLaunchingWithOptions:launchOptions];
NSURL *jsCodeLocation;
#ifdef DEBUG
jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil];
#else
jsCodeLocation = [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
#endif
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.window.backgroundColor = [UIColor whiteColor];
[[RCCManager sharedInstance] initBridgeWithBundleURL:jsCodeLocation launchOptions:launchOptions];
return YES;
}
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
options:(NSDictionary<NSString *,id> *)options {
BOOL handled = [[FBSDKApplicationDelegate sharedInstance] application:application
openURL:url
sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey]
annotation:options[UIApplicationOpenURLOptionsAnnotationKey]
];
BOOL handledT = [[Twitter sharedInstance] application:application openURL:url options:options];
// Add any custom logic here.
return handled || handledT;
}
- (void)applicationDidBecomeActive:(UIApplication *)application {
[FBSDKAppEvents activateApp];
}
@end
Any idea of what could be the problem? Thank you very much!
EDIT: Aparently the request data arrives but it throws the red screen anyway. The render method of the component that calls it runs several times as well before throwing the error. Im calling it on componentDidMount. The render method is
render() {
let content = (
<CausesList
causes={this.props.causes}
onItemSelected={this.itemSelectedHandler}
onLoadMore={this.onLoadMoreHandler}
/>
);
let spinner = null;
if (this.props.causesFetchLoading || this.state.checkingFirebaseAuth) {
spinner = <ActivityIndicator />
}
return (
<View>
<SearchBar onSearch={this.onShearchHandler} />
<CauseCategoriesList causeCategories={this.props.causeCategories} onCategoryPressed={this.onCategoryPressedHandler} />
{content}
{spinner}
</View>
);
}
}
EDIT 2: It seems that is has nothing to do with networking. I've been following the program with the debugger and it fails when it renders the components. It must be doing some conversion that is accepted in android but not in ios....
Upvotes: 2
Views: 1981
Reputation: 1731
I solved it by doing a lot of digging with the debugger since the error message is really cryptic and not helpful at all. It's a shame that it doesn't show something more specific.
In the end, it wasn't something related to networking. The data arrived but at the moment of rendering it failed. I started to remove one component at a time to see what the problem could be until the problem pointed to a card component that had an image component.
The issue was that if you set the source of an image in React Native with a null value, Android will accept it with no problem. But if you do that in IOS then it will throw the error(red screen) that you see above.
The solution is to render conditionally the image if the path is not null. Here is how I solved it for future reference:
if(props.cause.pic_url){
image = (<Image source={{uri: props.cause.pic_url}} style={{height: 200, width: 200, flex: 1}}/>)
}
return (<TouchableOpacity onPress={props.onItemPressed}>
<Card style={{flex: 0}}>
<CardItem>
<Left>
{ thumbnail }
<Body>
<Text>{props.cause.name}</Text>
<Text>{props.cause.hashtag}</Text>
</Body>
</Left>
</CardItem>
<CardItem>
<Body>
{ image }
<Text>
{props.cause.short_description}
</Text>
</Body>
</CardItem>
<CardItem>
<Left>
<Button transparent textStyle={{color: '#87838B'}}>
<Icon name="logo-github" />
<Text>1,926 stars</Text>
</Button>
</Left>
</CardItem>
</Card>
</TouchableOpacity>)
Upvotes: 1