【问题标题】:Exception:Google Maps SDK for iOS must be initialized via [GMSServices provideAPIKey:...] prior to use例外:Google Maps SDK for iOS 必须在使用前通过 [GMSServices provideAPIKey:...] 进行初始化
【发布时间】: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

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

【问题讨论】:

  • 你看我的回答,你需要在appdelegate中添加GMSPlacesClient.provideAPIKey("Your key")

标签: ios swift xcode google-maps google-maps-sdk-ios


【解决方案1】:

您需要在 didFinishLaunchingWithOptions 中都进行设置

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

【讨论】:

【解决方案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 密钥 控制台:

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

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

      AIzaSyBdVl-cTICSwYKrZ95SuvNw7dbMuDt1KG0

    5. 将您的 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/

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2018-03-09
                • 2013-07-18
                • 2021-06-09
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2015-09-29
                相关资源
                最近更新 更多