79585983

Date: 2025-04-22 08:24:29
Score: 0.5
Natty:
Report link

What’s actually crashing on Android? On modern Android (targetSdk 31+/API 30+), any time you fire off an ACTION_VIEW intent (which is exactly what Linking.openURL() does under the hood), the system first checks your app’s package visibility. If you haven’t told Android “Hey, I might want to open web URLs,” it can’t find any browser to handle that intent—and you get an uncaught ActivityNotFoundException that kills your WebView (often silently in Expo builds).

- Emulator often uses more‑permissive settings or older WebView versions. - iOS has no such restriction at all. - Real Android devices in production builds enforce it strictly.

Always guard your openURL calls

import { Linking, Alert } from 'react-native';

async function openExternal(url) {
  try {
    const supported = await Linking.canOpenURL(url);
    if (supported) {
      await Linking.openURL(url);
    } else {
      Alert.alert('Oops!', `Cannot open this URL: ${url}`);
    }
  } catch (err) {
    console.error('Failed to open URL:', err);
    Alert.alert('Error', 'Couldn’t open the link.');
  }
}

Prevents crashes if there’s no browser or handler.

Lets you show a friendly message instead of a hard crash.

import React, { useRef } from 'react';
import { WebView } from 'react-native-webview';

export default function MyInertiaWebView() {
  const webviewRef = useRef(null);

  return (
    <WebView
      ref={webviewRef}
      source={{ uri: 'https://your-inertia-app.com' }}
      originWhitelist={['*']}
      // iOS + (newer) Android
      onShouldStartLoadWithRequest={({ url }) => {
        const isExternal = !url.startsWith('https://your-inertia-app.com');
        if (isExternal) {
          openExternal(url);
          return false; // stop WebView
        }
        return true;
      }}
      // fallback for older Android
      onNavigationStateChange={(navState) => {
        const { url } = navState;
        if (url.startsWith('http') && !url.startsWith('https://your-inertia-app.com')) {
          openExternal(url);
          webviewRef.current.stopLoading();
        }
      }}
    />
  );
}

Guard every Linking.openURL with canOpenURL + try/catch.

Intercept external links in your WebView callbacks and call your safe openExternal() wrapper.

Declare HTTP/HTTPS intent queries in your Android manifest (via Expo plugin or by editing AndroidManifest.xml).

Reasons:
  • Long answer (-1):
  • Has code block (-0.5):
  • Contains question mark (0.5):
  • Starts with a question (0.5): What
  • Low reputation (1):
Posted by: Hadi Dev