例外:Google Maps SDK for iOS 必须在使用前通过 [GMSServices provideAPIKey:...] 进行初始化

Posted

技术标签:

【中文标题】例外:Google Maps SDK for iOS 必须在使用前通过 [GMSServices provideAPIKey:...] 进行初始化【英文标题】:Exception:Google Maps SDK for iOS must be initialized via [GMSServices provideAPIKey:...] prior to use 【发布时间】:2015-11-19 06:25:55 【问题描述】:

我正在尝试使用 Swift 2.0 将 Google Maps SDK 实施到我的项目中。我遵循这个,但是在运行这个时,我的应用程序收到以下错误:

2015-08-25 19:05:17.337 googleMap[1919:54102] *** Terminating app due to uncaught exception 'GMSServicesException', reason: 'Google Maps SDK for ios must be initialized via [GMSServices provideAPIKey:...] prior to use
*** First throw call stack:
(
    0   CoreFoundation    0x00000001058499b5 __exceptionPreprocess + 165
...
...
...
    31  UIKit             0x000000010606699e UIApplicationMain + 171
    32  googleMap         0x00000001034b720d main + 109
    33  libdyld.dylib     0x0000000107fba92d start + 1
    34  ???               0x0000000000000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException

我已经尝试了 *** 中所有可能的解决方案。

【问题讨论】:

你看我的回答,你需要在appdelegate中添加GMSPlacesClient.provideAPIKey("Your key") 【参考方案1】:

您需要在 didFinishLaunchingWithOptions 中都进行设置

GMSPlacesClient.provideAPIKey("Your key")
GMSServices.provideAPIKey("Your key")

【讨论】:

还有来自 Google 的 migration note。【参考方案2】:

只是添加到 Rajasekaran Gopal

记得添加

import GoogleMaps
import GooglePlaces

然后

GMSPlacesClient.provideAPIKey("Your key")
GMSServices.provideAPIKey("Your key")

在 didFinishLaunchingWithOptions 中

【讨论】:

【参考方案3】:

我也遇到了同样的问题。我创建了一个 GMSMapView 对象,并在可能读取 api 密钥之前对其进行了初始化。所以我把它移到 viewDidLoad 方法中,问题就解决了。

之前:

class ViewController: ..... 

let mapView = GMSMapView()

之后:

class ViewController: ..... 

var mapView : GMSMapView?

override viewDidLoad()
    mapView = GMSMapView()

【讨论】:

和我一样的问题。谢谢【参考方案4】:

这是 Swift 的 Google 地图教程:

http://www.appcoda.com/google-maps-api-tutorial/

以下引自谷歌地图文档:

第 5 步:获取 iOS API 密钥

使用 API 密钥可让您监控应用程序的 API 使用情况, 并确保 Google 可以就您的申请与您联系,如果 必要的。密钥是免费的,您可以将它与任何您的 调用 Google Maps SDK for iOS 的应用程序,它支持 无限数量的用户。您从 Google 获取 API 密钥 开发者控制台,提供您的应用程序的包标识符。

如果您的项目还没有 iOS 应用程序的密钥, 按照以下步骤从 Google Developers 创建 API 密钥 控制台:

    在左侧边栏中,选择凭据。 如果您的项目还没有 iOS API 密钥,现在通过选择添加凭据 > API 密钥 > iOS 密钥创建一个。 在出现的对话框中,输入您的应用程序包标识符。例如:com.example.hellomap

    点击创建

    您的新 iOS API 密钥出现在您的 API 密钥列表中 项目。 API 密钥是一串字符,如下所示:

    AIzaSyBdVl-cTICSwYKrZ95SuvNw7dbMuDt1KG0

    将您的 API 密钥添加到您的 AppDelegate.m,如下所示:

    添加以下导入语句:

    @import GoogleMaps;

    将以下内容添加到您的应用程序中:didFinishLaunchingWithOptions: 方法,将 API_KEY 替换为您的 API 密钥:

    [GMSServices provideAPIKey:@"API_KEY"];

Source

【讨论】:

是的,我做了所有这些......但仍然得到那个例外 是的,我已经链接了上面链接中提到的所有内容。 @iBeginner 我面临同样的问题。您能否详细说明您的解决方案。 我实际上看到了同样的事情。我什至收到了来自provideAPIKeytrue 响应,远远超出了尝试使用 API 的范围。这看起来像是框架中的一个错误,当前使用版本1.11.1【参考方案5】:

如果您已经在界面构建器中将GMSMapView 类设置为您的视图,请在包含GMSMapView 的viewController 的初始化方法中设置GMSServices.provideAPIKey("API key")

【讨论】:

【参考方案6】:

如果您的初始视图控制器使用 GoogleMaps,您应该在设置 AppDelgate 中的 UIWindow 之前设置 API 密钥。

例如:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool 
        //MARK: Google Maps setup
        GMSServices.provideAPIKey("YOUR API KEY")
        GMSPlacesClient.provideAPIKey("YOUR API KEY")

        let window = UIWindow(frame: UIScreen.main.bounds)
        window.backgroundColor = UIColor.white
        window.makeKeyAndVisible()
        window.rootViewController = ViewController()
        self.window = window
        return true
    

【讨论】:

【参考方案7】:

在我的应用程序中,我在 AppDelegate -didFinishLaunchingWithOptions 中为 GMSPlacesClient 提供了密钥

Ex:
@import GooglePlaces;
@import GoogleMaps; 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
    [GMSServices provideAPIKey:@"You key"];
    [GMSPlacesClient provideAPIKey:@"Your key"];

对于斯威夫特:

import GoogleMaps
import GooglePlaces

//in application(_:didFinishLaunchingWithOptions:)

GMSServices.provideAPIKey("YOUR_API_KEY")
GMSPlacesClient.provideAPIKey("YOUR_API_KEY")

【讨论】:

【参考方案8】:

在我的情况下 --didFinishLaunchingWithOptions-- 方法没有调用,因为我更新了 swift 版本。首先确保该方法调用正常。就我而言,我不需要 GMSPlacesClient.provideAPIKey("Your key")。但是您可以在初始视图控制器中初始化 GMSServices(如果它不包含地图或相关对象)

【讨论】:

【参考方案9】:

XCODE 12.0.1、Swift 5

我通过像这样初始化 GMSMapView 来对 Google Map View 应用约束:-

private var googleMapsView : GMSMapView = 
    let mainView = GMSMapView()
    mainView.translatesAutoresizingMaskIntoConstraints = false
    mainView.isMyLocationEnabled = true
    return mainView
()

& 我遇到了同样的错误,所以我尝试将其设为惰性属性:-

lazy private var googleMapsView : GMSMapView = 
    let mainView = GMSMapView()
    mainView.translatesAutoresizingMaskIntoConstraints = false
    mainView.isMyLocationEnabled = true
    return mainView
()

瞧!它就像一个魅力。

【讨论】:

【参考方案10】:

您正在 AppDelegate 检查项目中跳过 provideAPIKey

Your_PROJECT -> ios -> Runner -> AppDelegate.m

用下面的sn-p替换你的文件代码添加你的APIKEY

#include "AppDelegate.h"
#include "GeneratedPluginRegistrant.h"
#import "GoogleMaps/GoogleMaps.h"

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application
    didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
  [GMSServices provideAPIKey:@"GOOGLE_API_KEY"];
  [GeneratedPluginRegistrant registerWithRegistry:self];
  return [super application:application didFinishLaunchingWithOptions:launchOptions];

@end

Google Maps SDK for iOS 必须通过 [GMSServices provideAPIKey:...] 进行初始化

【讨论】:

由于问题被标记为“swift”,因此 objc 代码 sn-p 不是一个合适的答案。 当我被困在这个问题上时,我已经在这个话题上工作了我找到了【参考方案11】:

确保您添加到 AppDelegate.m 的行实际上正在执行。

由于在 react-native v0.62 前后与 Flipper 集成,AppDelegate.m 文件的一部分由ifdef FB_SONARKIT_ENABLED 保护。如果由于某种原因未启用 Flipper,则不会执行 ifdef 和结束 endif 行之间的任何代码。确保将#import 粘贴到ifdef 上方,并在didFinishLaunchingWithOptions 方法中将[GMSServices] 行粘贴在左大括号() 之后。

更多关于 React Native 中 Flipper 的信息:https://fbflipper.com/docs/features/react-native/

【讨论】:

以上是关于例外:Google Maps SDK for iOS 必须在使用前通过 [GMSServices provideAPIKey:...] 进行初始化的主要内容,如果未能解决你的问题,请参考以下文章

flutter 新版 Google Maps SDK for iOS 可用:4.1.0.0

GMSCoordinateBounds 包括坐标在 Google Maps SDK for iOS 中无法正常工作

在 Google Maps SDK for native iOS/objective C 中的 InfoWindow/Marker 上添加 Click 事件

google-maps-sdk-ios - 适用于 iOS 的 Google 地图 1.4.3 的 arm 7/iphone 5 问题

iOS 中使用 nativescript-google-maps-sdk 的地图中心错误

如何更新 Google Maps SDK iOS