适用于iOS的Google Maps API API密钥的例外情况

我正在使用适用于IOS的Google Maps API开发iOS应用。 我为我的项目安装了CocoaPod并根据Google Developer上的教程进行配置。 但是,当我运行我的项目时,它说

***由于未捕获的exception’GMSServicesException’而终止应用程序,原因是:’Google Maps SDK for iOS必须>在使用之前通过[GMSServices provideAPIKey:…]进行初始化

但我已经在AppDelegate.swift上调用了“GMSServices.provideAPIKey。以下是代码:

.... func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { GMSServices.provideAPIKey("***********************") return true } .... 

(**************)是我的API密钥。

由于Google Maps API使用Objective C,因此我创建了一个桥接头来导入库。

我试图在[application:didFinishLaunchingWithOption]上设置断点。 但它会在运行该函数之前引发exception,我认为这很奇怪。

对此感到困惑。 提前致谢。

问题最终解决了,原因是我在一个模型类中使用Google Maps库初始化字段,它将在应用程序运行之前创建。 所以这个错误发生了。 当我将此变量移动到方法中时,问题就解决了。 以下是导致错误的代码:

 class PlaceManager { let placeClient = GMSPlacesClient() ... func getSuggestions(queryString:String) -> [String]{ ... } } 

 class PlaceManager { func getSuggestions(queryString:String) -> [String]{ let placeClient = GMSPlacesClient() ... } } 

而不是didFinishLaunchingWithOptions ,将调用移动到willFinishLaunchingWithOptions 。 在状态恢复发生之后但在应用程序的窗口和其他UI已呈现之前调用此方法。 (在您的情况下,可能是使用Google Map API的UI)

 func application(application: UIApplication, willFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { // Override point for customization after application launch. GMSServices.provideAPIKey("***********************") return true } 

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

之前:

 class ViewController: ..... { let mapView = GMSMapView() 

之后:

 class ViewController: ..... { var mapView : GMSMapView? override viewDidLoad(){ mapView = GMSMapView()