我将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;
}
2条答案
按热度按时间nbysray51#
尝试添加“expoCli”:“4.13.0”,到你的eas.json像这样:
有同样的问题,为我工作。
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”步骤的日志。它显示:
我已经复制了Android的配置,所以对于iOS来说,它基本上没有在正确的位置(
ios.config.googleMapsApiKey
)看到密钥,并因此给了我一个错误。