React Native 如何修复与EAS构建在iPhone上的谷歌Map错误?

xkrw2x1b  于 2023-06-24  发布在  React
关注(0)|答案(2)|浏览(171)

我将Expo SDK 43管理工作流项目迁移到EAS Build。
我使用GoogleMap作为Android和iOS的默认Map选择,但当导航到带有Map的屏幕时,我收到此错误:

react-native-maps: AirGoogleMaps dir must be added to your xCode project to support GoogleMaps
 on iOS. at node_modules/react-native-maps/lib/components/decorateMapComponent.js:27:54 in <anonymous>

当我按照错误中的路径指向node_modules文件时,它会将我带到“decorateMapComponent.js”,这是一个包含以下代码的js文件。
需要修改哪些内容才能使iOS上的EAS接受GoogleMap?
下面是代码:

import PropTypes from 'prop-types';
import { requireNativeComponent, NativeModules, Platform } from 'react-native';
import { PROVIDER_DEFAULT, PROVIDER_GOOGLE } from './ProviderConstants';

export const SUPPORTED = 'SUPPORTED';
export const USES_DEFAULT_IMPLEMENTATION = 'USES_DEFAULT_IMPLEMENTATION';
export const NOT_SUPPORTED = 'NOT_SUPPORTED';

export function getAirMapName(provider) {
  if (Platform.OS === 'android') {
    return 'AIRMap';
  }
  if (provider === PROVIDER_GOOGLE) {
    return 'AIRGoogleMap';
  }
  return 'AIRMap';
}

function getAirComponentName(provider, component) {
  return `${getAirMapName(provider)}${component}`;
}

export const contextTypes = {
  provider: PropTypes.string,
};

export const createNotSupportedComponent = message => () => {
  console.error(message);
  return null;
};

function getViewManagerConfig(viewManagerName) {
  const UIManager = NativeModules.UIManager;
  if (!UIManager.getViewManagerConfig) {
    // RN < 0.58
    return UIManager[viewManagerName];
  }
  // RN >= 0.58
  return UIManager.getViewManagerConfig(viewManagerName);
}

export const googleMapIsInstalled = !!getViewManagerConfig(
  getAirMapName(PROVIDER_GOOGLE)
);

export default function decorateMapComponent(
  Component,
  { componentType, providers }
) {
  const components = {};

  const getDefaultComponent = () =>
    requireNativeComponent(getAirComponentName(null, componentType), Component);

  Component.contextTypes = contextTypes;

  Component.prototype.getAirComponent = function getAirComponent() {
    const provider = this.context.provider || PROVIDER_DEFAULT;
    if (components[provider]) {
      return components[provider];
    }

    if (provider === PROVIDER_DEFAULT) {
      components[PROVIDER_DEFAULT] = getDefaultComponent();
      return components[PROVIDER_DEFAULT];
    }

    const providerInfo = providers[provider];
    const platformSupport = providerInfo[Platform.OS];
    const componentName = getAirComponentName(provider, componentType);
    if (platformSupport === NOT_SUPPORTED) {
      components[provider] = createNotSupportedComponent(
        `react-native-maps: ${componentName} is not supported on ${Platform.OS}`
      );
    } else if (platformSupport === SUPPORTED) {
      if (
        provider !== PROVIDER_GOOGLE ||
        (Platform.OS === 'ios' && googleMapIsInstalled)
      ) {
        components[provider] = requireNativeComponent(componentName, Component);
      }
    } else {
      // (platformSupport === USES_DEFAULT_IMPLEMENTATION)
      if (!components[PROVIDER_DEFAULT]) {
        components[PROVIDER_DEFAULT] = getDefaultComponent();
      }
      components[provider] = components[PROVIDER_DEFAULT];
    }

    return components[provider];
  };

  Component.prototype.getUIManagerCommand = function getUIManagerCommand(name) {
    const componentName = getAirComponentName(
      this.context.provider,
      componentType
    );
    return getViewManagerConfig(componentName).Commands[name];
  };

  Component.prototype.getMapManagerCommand = function getMapManagerCommand(
    name
  ) {
    const airComponentName = `${getAirComponentName(
      this.context.provider,
      componentType
    )}Manager`;
    return NativeModules[airComponentName][name];
  };

  return Component;
}
nbysray5

nbysray51#

尝试添加“expoCli”:“4.13.0”,到你的eas.json像这样:

"cli": {
    "version": ">= 0.41.0"
  },
  "build": {
    "base": {
      "expoCli": "4.13.0",
    },
    "simulator": {
      "extends": "base",
      "android": {
        "buildType": "apk"
      },
      "ios": {
        "simulator": true
      }
    },
    "development": {
      "extends": "base",
      "developmentClient": true,
      "distribution": "internal"
    },
    "preview": {
      "extends": "base",
      "distribution": "internal"
    },
    "production": {
      "extends": "base",
      "releaseChannel": "production"
    }
  },
  "submit": {
  }
}

有同样的问题,为我工作。

mo49yndu

mo49yndu2#

简短回答:

检查您是否设置了ios.config.googleMapsApiKey(使用有效的iOS API密钥)。这是令人困惑的,因为对于android来说,它是android.config.googleMaps.apiKey
有关如何获取Google Maps的API密钥以及如何配置EAS的完整详细信息,请访问https://docs.expo.dev/versions/latest/sdk/map-view/#ios。

更长的答案/调试步骤:

我在Android上正确设置谷歌Map后得到了这个错误。
我在app.json中复制了相同的配置块,并对为什么会发生错误感到困惑,直到我检查了Expo站点上的“Run expo doctor”步骤的日志。
它显示:

• Field: ios/config - should NOT have additional property 'googleMaps'.

我已经复制了Android的配置,所以对于iOS来说,它基本上没有在正确的位置(ios.config.googleMapsApiKey)看到密钥,并因此给了我一个错误。

相关问题