我正在使用适用于 IOS 的 Google 地图 API 开发 iOS 应用程序。我为我的项目安装了 CocoaPod,并根据 Google Developer 上的教程进行配置。然而,当我运行我的项目时,它说
*** 由于未捕获的异常“GMSServicesException”而终止应用程序,原因:“iOS 版 Google 地图 SDK 必须在使用前通过 [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,所以我创建了一个 Bridging Header 来导入该库。
我尝试在 [application:didFinishLaunchingWithOption] 上设置断点。但在运行该函数之前它会引发异常,我认为这很奇怪。
对此很困惑。预先感谢。
问题终于解决了,原因是我在一个模型类中使用 Google Maps 库初始化了一个字段,并且它将在应用程序运行之前创建。所以就会出现这个错误。当我将此变量移动到方法中时,问题解决了。以下是导致错误的代码:
class PlaceManager {
let placeClient = GMSPlacesClient()
...
func getSuggestions(queryString:String) -> [String]{
...
}
}
之后
class PlaceManager {
func getSuggestions(queryString:String) -> [String]{
let placeClient = GMSPlacesClient()
...
}
}
将调用移至 willFinishLaunchingWithOptions,而不是 didFinishLaunchingWithOptions。在状态恢复发生之后但在呈现应用程序的窗口和其他 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()
在你的 appDelegate.m 的 didFinishLaunchingWithOptions 中添加这些 GMSService 行和 api 密钥,对我来说它有效。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[GMSServices provideAPIKey:@"**************"];
[FIRApp configure];
}
并在顶部添加此导入
#import <GoogleMaps/GoogleMaps.h>