Приложение React Native Expo аварийно завершает работу при публикации в Testflight

У меня есть собственное приложение Expo, которое использует разрешения Location. Он отлично работает на моем устройстве и на симуляторах, поэтому перехожу к следующему этапу распространения - TestFlight. Когда я загружаю ipa в Testflight, а затем пытаюсь запустить приложение, приложение работает до того момента, когда я запрашиваю у пользователя разрешение. (Итак, приложение загружается, аутентификация работает, ссылки на мой сервер и БД работают и т. Д.).

В момент, когда код запрашивает разрешение на местоположение пользователя, обычное предупреждение «Разрешить при использовании приложения, Разрешать всегда, не разрешать» мигает на экране в течение нескольких миллисекунд, затем приложение вылетает, и я получаю возможность поделиться комментариями с Тестовый полет.

Код, запрашивающий разрешение, находится здесь:

import * as Location from 'expo-location';
import * as Permissions from 'expo-permissions';
import createDataContext from '../../Context/createDataContext';

const deviceLocationReducer = (state, action) => {
  switch (action.type) {
    case 'get_device_location':
      return action.payload;
    default:
      return state;
  }
};

const getDeviceLocation = dispatch => async () => {
  let deviceLocation = null;
  try {
    // Ask User permission for location
    const { status } = await Permissions.askAsync(Permissions.LOCATION);
    console.log('\n***\nDeviceLocationContext.js: Permission status', status);
    if (status === 'granted') {
      // Permission granted, get user location
      deviceLocation = await Location.getCurrentPositionAsync({});
      console.log('DeviceLocationContext.js: Setting Context', deviceLocation);
    } else {
      console.log(
        'DeviceLocationContext.js: Permission to access location denied'
      );
    }

    dispatch({
      type: 'get_device_location',
      payload: deviceLocation,
    });
  } catch ({ message }) {
    console.log(
      `DeviceLocationContext.js: Get Device Location Error: ${message}`
    );
  }
};

export const { Context, Provider } = createDataContext(
  deviceLocationReducer,
  { getDeviceLocation },
  null
);

app.json здесь

{
  "expo": {
    "name": "MyApp",
    "description": "MyApp Description",
    "slug": "client",
    "privacy": "public",
    "sdkVersion": "35.0.0",
    "platforms": ["ios", "android"],
    "version": "0.0.7",
    "orientation": "portrait",
    "icon": "./assets/images/icon.png",
    "splash": {
      "image": "./assets/images/splash.png",
      "resizeMode": "contain",
      "backgroundColor": "#ffffff"
    },
    "updates": {
      "fallbackToCacheTimeout": 0
    },
    "assetBundlePatterns": ["**/*"],
    "ios": {
      "supportsTablet": true,
      "bundleIdentifier": "com.reachout.myapp",
      "icon": "./assets/images/icon.png",
      "infoPlist": {
        "NSCameraUsageDescription": "Please allow access to add your photo.",
        "NSPhotoLibraryUsageDescription": "Please allow access to select an image from your photo library.",
        "NSLocationWhenInUseUsageDescription": "Please allow access to show venues near you"
      },
      "buildNumber": "0.0.7"
    },
    "android": {
      "permissions": [
        "CAMERA",
        "ACCESS_COARSE_LOCATION",
        "ACCESS_FINE_LOCATION"
      ],
      "versionCode": 7,
      "icon": "./assets/images/icon.png"
    }
  }
}

package.json здесь

{
  "main": "node_modules/expo/AppEntry.js",
  "scripts": {
    "start": "expo start",
    "android": "expo start --android",
    "ios": "expo start --ios",
    "web": "expo start --web",
    "eject": "expo eject"
  },
  "dependencies": {
    "@expo/vector-icons": "^10.0.6",
    "axios": "^0.19.0",
    "expo": "^35.0.0",
    "expo-camera": "^7.0.0",
    "expo-constants": "~7.0.0",
    "expo-font": "^7.0.0",
    "expo-image-picker": "~7.0.0",
    "expo-location": "~7.0.0",
    "expo-permissions": "^7.0.0",
    "lodash": "^4.17.15",
    "react": "16.8.3",
    "react-dom": "16.8.3",
    "react-native": "https://github.com/expo/react-native/archive/sdk-35.0.0.tar.gz",
    "react-native-elements": "^1.2.7",
    "react-native-gesture-handler": "^1.3.0",
    "react-native-image-picker": "^1.1.0",
    "react-native-map-clustering": "^3.0.6",
    "react-native-maps": "^0.26.1",
    "react-native-paper": "^3.1.1",
    "react-native-ratings": "^6.5.0",
    "react-native-reanimated": "^1.2.0",
    "react-native-web": "^0.11.7",
    "react-navigation": "^4.0.10",
    "react-navigation-stack": "^1.9.4",
    "react-navigation-tabs": "^2.5.6"
  },
  "devDependencies": {
    "babel-eslint": "^9.0.0",
    "babel-preset-expo": "^7.0.0",
    "eslint": "^5.16.0",
    "eslint-config-airbnb": "^17.1.1",
    "eslint-config-prettier": "^4.3.0",
    "eslint-config-wesbos": "0.0.19",
    "eslint-plugin-html": "^5.0.5",
    "eslint-plugin-import": "^2.18.2",
    "eslint-plugin-jsx-a11y": "^6.2.3",
    "eslint-plugin-prettier": "^3.1.1",
    "eslint-plugin-react": "^7.16.0",
    "eslint-plugin-react-hooks": "^1.7.0",
    "prettier": "^1.19.1"
  },
  "private": true
}

У кого-нибудь есть какие-либо идеи? Я рисую полный пробел - я запустил сборку из expo как в производстве, так и в разработке, я очистил кеши expo, я удалил приложение со своего устройства и снова загрузился - все безрезультатно.

Итак, у меня есть «рабочее» приложение, которое я не могу раздать для тестирования. Помощь!!

Также - я понятия не имею, как отлаживать или получать доступ к данным сбоев в Testflight для приложения, созданного с помощью expo - опять же - любая помощь очень ценится. Спасибо.


person TeamBeamo    schedule 03.12.2019    source источник


Ответы (2)


Решено :) - оставлю здесь на всякий случай, если у кого-то еще возникнет такая проблема, так как из-за этого я застрял на несколько дней и строил.

Моя проблема заключалась в том, что я запрашивал местоположение пользователя в хуке useEffect от компонента, который также смонтировал Mapview. В Mapview я установил опору provider на google.

Если вы это сделаете, вы должны добавить ключ gogleMapApi в свой информационный список. Чтобы быть справедливым по отношению к Expo, на самом деле это указано в документации MapView, но это прямо внизу, в стороне после документации Android. Я осознал свою проблему и решение из этого потока после того, как часами просматривал мои журналы и обнаружил, что проблема была ошибкой google api, а НЕ местоположением разрешения.

[https://forums.expo.io/t/how-to-set-googlemaps-with-gmsservices-provideapikey/17770][1pting

Надеюсь, это кому-то поможет!

person TeamBeamo    schedule 03.12.2019
comment
Ух ты, СПАСИБО! - person ekatz; 08.12.2020

Я также столкнулся с проблемой невозможности идентифицировать ошибку JS, и я хотел поделиться, как можно отладить это.

Для iOS вы можете создать автономное приложение с опцией симулятора, и журналы сбоев хранятся здесь:

~/Library/Logs/DiagnosticReports/

Подробнее об этом я написал здесь.

/medium.com/@tak215/expo-rash-on-standalone-app-only-how-to-debug-29c88c69c821?sk=babf382671e1c8c5bf97a74773d4f4f5

person tsuz    schedule 11.01.2020