由于API密钥无效(格式错误或丢失),操作失败

时间:2019-08-18 07:27:05

标签: ios swift google-maps google-places-api

使用autocomplete

中所述的IOS的Google代码

在用户在搜索框中输入的第一个字符时,发生错误:

Error:  The operation couldn’t be completed. Operation failed due to an invalid (malformed or missing) API key. See the developer's guide (https://developers.google.com/places/ios-sdk/start) for information on creating and using an API key.
despite that calls to the API were successful:
GMS Services Key Valid:  true
GMS Services SDK version:  3.3.0
GMS Places Key Valid:  true
GMS Places SDK version:  3.3.0

这是应用程序的踪迹:

2019-08-17 16:46:52.056351-0400 GPDemo[345:15310] [DYMTLInitPlatform] platform initialization successful
Entering AppDelegate.swift now...
Sending API key to Google Services and Places Client
GMS Services Key Valid:  true
GMS Services SDK version:  3.3.0
GMS Places Key Valid:  true
GMS Places SDK version:  3.3.0
Leaving AppDelegate.swift now...
warning: could not execute support code to read Objective-C class data in the process. This may reduce the quality of type information available.
Entering viewDidLoad now...
Leaving viewDidLoad now...
2019-08-17 16:51:54.281297-0400 GPDemo[345:15082] [MC] System group container for systemgroup.com.apple.configurationprofiles path is /private/var/containers/Shared/SystemGroup/systemgroup.com.apple.configurationprofiles
2019-08-17 16:51:54.283666-0400 GPDemo[345:15082] [MC] Reading from public effective user settings.
Entering didUpdateAutocompletePredictions function now...
Leaving didUpdateAnyAutocompletePredictions function now...
2019-08-17 16:51:55.829602-0400 GPDemo[345:15082] [framework] CUIThemeStore: No theme registered with id=0
Entering didRequestAutocompletePredictions function now...
Leaving didRequestAutocompletePredictions function now...
Entering didUpdateAutocompletePredictions function now...
Leaving didUpdateAnyAutocompletePredictions function now...
Entering resultsContoller didFailAutocomplete function now...
Error:  The operation couldn’t be completed. Operation failed due to an invalid (malformed or missing) API key. See the developer's guide (https://developers.google.com/places/ios-sdk/start) for information on creating and using an API key.
Leaving resultsController didFailAutocomplete function now...
2019-08-17 16:54:13.293721-0400 GPDemo[345:15869] [BoringSSL] nw_protocol_boringssl_get_output_frames(1301) [C1.1:2][0x105e40a60] get output frames failed, state 8196
2019-08-17 16:54:13.297185-0400 GPDemo[345:15869] [BoringSSL] nw_protocol_boringssl_get_output_frames(1301) [C1.1:2][0x105e40a60] get output frames failed, state 8196
2019-08-17 16:54:13.299238-0400 GPDemo[345:15869] TIC Read Status [1:0x0]: 1:57
2019-08-17 16:54:13.300271-0400 GPDemo[345:15869] TIC Read Status [1:0x0]: 1:57

感谢您的帮助。

使用相同的密钥访问Map API可以正常工作!

//  AppDelegate.swift
//  GPDemo
//



    import UIKit
    import GoogleMaps
    import GooglePlaces

    @UIApplicationMain
    class AppDelegate: UIResponder, UIApplicationDelegate {

        var window: UIWindow?


        func application(_ application: UIApplication, 
        didFinishLaunchingWithOptions launchOptions: 
        [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.

        print("Entering AppDelegate.swift now...")

        print("Sending API key to Google Services and Places Client")

        //// Maps API
        // JpDimoi "kiquoa-ios-places" key... 8/9/19
        let GMSServicesKeyValid = 
        GMSServices.provideAPIKey("MY_API_KEY")
        // JpDimoi "kiquoa-ios" key...

        let GMSServicesSDKVer = GMSServices.sdkVersion()
        print("GMS Services Key Valid: ", GMSServicesKeyValid)
        print("GMS Services SDK version: ", GMSServicesSDKVer)

        //// Places API
        // JpDimoi "kiquoa-ios-places" key... 8/9/19
        let GMSPlacesKeyValid =      


        GMSPlacesClient.provideAPIKey(
         "MY_API_KEY")
        // JpDimoi "kiquoa-ios" key...

        let GMSPlacesSDKVer = GMSPlacesClient.sdkVersion()
        print("GMS Places Key Valid: ", GMSPlacesKeyValid)
        print("GMS Places SDK version: ", GMSPlacesSDKVer)

        print("Leaving AppDelegate.s`enter code here`wift now...")

        return true
        }

        func applicationWillResignActive(_ application: UIApplication) {
            // Sent when the application is about to move from active to 
            // inactive state. This can occur for certain types of temporary 
            // interruptions (such as an incoming phone call or SMS message) 
            // or when the user quits the application and it begins the 
            // transition to the background state.
            // Use this method to pause ongoing tasks, disable timers, and 
            // invalidate graphics rendering callbacks. Games should use this 
            // method to pause the game.
        }

        func applicationDidEnterBackground(_ application: UIApplication) {
            // Use this method to release shared resources, save user data, 
            // invalidate timers, and store enough application state 
    //information to 
            // restore your application to its current state in case it is 
    //terminated 
            // later.
            // If your application supports background execution, this method 
            // is called instead of applicationWillTerminate: when the user 
    // quits.
        }

        func applicationWillEnterForeground(_ application: UIApplication) {
            // Called as part of the transition from the background to the 
            // active state; here you can undo many of the changes made on 
    // entering 
            // the background.
        }

        func applicationDidBecomeActive(_ application: UIApplication) {
            // Restart any tasks that were paused (or not yet started) while 
            // the application was inactive. If the application was 
            // previously in the  
            // background, optionally refresh the user interface.
        }

        func applicationWillTerminate(_ application: UIApplication) {
            // Called when the application is about to terminate. Save data 
            // if appropriate. See also applicationDidEnterBackground:.
        }


    }

    //  GPDemo ViewController.swift
    //
    //  Exact copy of code for results view controller
    //  when adding a searchBar to the top of the view
    //  Ref: https://developers.google.com/places/ios-sdk/autocomplete

    import UIKit
    import GooglePlaces

    class ViewController: UIViewController {

        var resultsViewController: GMSAutocompleteResultsViewController?
        var searchController: UISearchController?
        var resultView: UITextView?

        override func viewDidLoad() {

            print("Entering viewDidLoad now...")
            super.viewDidLoad()

            resultsViewController = GMSAutocompleteResultsViewController()
            resultsViewController?.delegate = self

            searchController = UISearchController(searchResultsController: 
            resultsViewController)
            searchController?.searchResultsUpdater = resultsViewController

            let subView = UIView(frame: CGRect(x: 0, y: 65.0, width: 350.0, 
            height: 45.0))

            subView.addSubview((searchController?.searchBar)!)
            view.addSubview(subView)
            searchController?.searchBar.sizeToFit()
            searchController?.hidesNavigationBarDuringPresentation = false

            // When UISearchController presents the results view, present it 
            // in
            // this view controller, not one further up the chain.
            definesPresentationContext = true

            print("Leaving viewDidLoad now...")
        }
    }

    // Handle the user's selection.
    extension ViewController: GMSAutocompleteResultsViewControllerDelegate {
        func resultsController(_ resultsController: 
         GMSAutocompleteResultsViewController,
         didAutocompleteWith place: GMSPlace) {
            searchController?.isActive = false
            print("Entering resultsController didAutocompleteWith place 
                  function now...")
            // Do something with the selected place.
            //print("Place name: \(place.name)")
            print("Place address: \(String(describing:     
            place.formattedAddress))")
            //print("Place attributions: \(place.attributions)")
            print("Leaving resultsController didAutocompleteWith place 
                 function now...")
        }

        func resultsController(_ resultsController: 
            GMSAutocompleteResultsViewController,
            didFailAutocompleteWithError error: Error){
            // TODO: handle the error.
            print("Entering resultsContoller didFailAutocomplete function 
                  now...")
            print("Error: ", error.localizedDescription)
            print("Leaving resultsController didFailAutocomplete function 
                  now...")
        }

        // Turn the network activity indicator on and off again.
        func didRequestAutocompletePredictions(forResultsController 
            resultsController: GMSAutocompleteResultsViewController) {
            print("Entering didRequestAutocompletePredictions function 
                  now...")
            UIApplication.shared.isNetworkActivityIndicatorVisible = true
            print("Leaving didRequestAutocompletePredictions function 
                  now...")
        }

        func didUpdateAutocompletePredictions(forResultsController 
            resultsController: GMSAutocompleteResultsViewController) {
            print("Entering didUpdateAutocompletePredictions function 
                  now...")
            UIApplication.shared.isNetworkActivityIndicatorVisible = false
            print("Leaving didUpdateAnyAutocompletePredictions function 
                  now...")

        }
    }

期望提案列表可以完成地址。

4 个答案:

答案 0 :(得分:1)

即使按照指南启用了Places API并生成了密钥,我仍然遇到相同的错误。但是我没有为此API设置计费帐户。设置好之后,API即可正常工作。只要确保您设置了文档中的所有内容 https://developers.google.com/places/ios-sdk/start

答案 1 :(得分:0)

您遇到的此错误很可能是由您的Cloud项目配置引起的,而不是您自己的代码实现引起的,尤其是考虑到在使用Google的示例代码时也会遇到相同的错误(如果您使用有效的代码,则完全可以使用有效项目的API密钥。)

首先,必须在项目上启用 billing (计费),才能使Maps API完全起作用,无论您当前是否处于开发阶段。

第二,不推荐使用旧的iOS版Places SDK。要使用新的iOS版Places SDK,您需要启用并添加到API密钥的API限制中的API是 Places API

我建议您仔细阅读Google的入门指南,以正确设置您的项目和API密钥,以用于新的iOS版Places SDK:
https://developers.google.com/maps/gmp-get-started
https://developers.google.com/places/ios-sdk/start

希望这会有所帮助。

答案 2 :(得分:0)

我启用了Places API,这对我有所帮助。 在文档

中执行以下操作

https://developers.google.com/places/ios-sdk/start

答案 3 :(得分:0)

我遇到了同样的问题。该文档没有完全说明如何激活API密钥。这就是我想出来的...

  • 确保您已在Google Cloud Platform上启用计费功能
  • 转到您在Google Cloud Platform上的项目
  • 转到 API和服务 =>
  • 搜索 Places API
  • 点击启用
  • 然后按照此处的步骤限制您的API ... https://developers.google.com/places/ios-sdk/get-api-key
  • 您可以在 API的服务 => 凭据
  • 下找到您的API

那对我有用!