【问题标题】:google places for iOS empty referreriOS 空推荐人的谷歌地方
【发布时间】:2016-05-06 11:08:54
【问题描述】:

我在 google maps sdk 和 places api 上工作得很好。昨天我的代码运行得很好。但是今天早上醒来,做了一些修改,然后遇到了一堆问题,这似乎很容易解决,但花了几个小时试图弄清楚发生了什么。我正在尝试开发一个 iPhone 应用程序。

我已经回去了,在开发者控制台中创建了一个“新项目” 重新生成了一个新的 iOS 密钥。 在 info.plist 中输入了新的捆绑包 ID 在委托文件和 url 的搜索参数中输入了新的 api 密钥。

我正在使用 alamofire 和 swiftyjson 来解析数据

但仍然遇到同样的问题。

2016-01-28 13:15:55.683 Google Maps SDK for iOS 版本:1.11.21919.0

{ "error_message" : "此 IP、站点或移动应用程序无权使用此 API 密钥。从 IP 地址 "myIPAddress" 收到请求,引用者为空", “结果”:[

], “状态”:“REQUEST_DENIED”, “html_attributions”:[

] }

func downloadRestaurantDetails(completed: DownloadComplete) {
    let URL_Search = "https://maps.googleapis.com/maps/api/place/nearbysearch/json?"
    let API_iOSKey = "My iOS API Key"

    let urlString = "\(URL_Search)location=\(clLatitude),\(clLongitude)&radius=\(searchRadius)&types=\(searchType)&key=\(API_iOSKey)"
    let url = NSURL(string: urlString)!

    Alamofire.request(.GET,url).responseJSON { (response) -> Void in
        if let value  = response.result.value {
            let json = JSON(value)
            print(json)

            if let results = json["results"].array {
                for result in results {
                    if let placeIDs = result["place_id"].string {
                        self.placeIDArray.append(placeIDs)
                    }
                }
            }
        }

        completed()

    }
}

【问题讨论】:

  • “昨天我的代码运行得非常好......做了一些修改然后遇到了问题的编译雪球” - 尝试将您的代码恢复到昨天的状态。您遇到的这些问题一定来自您所做的修改。
  • 我从来不知道这个功能,谢谢,但我只是看看如何做到这一点,在 Xcode > 窗口 > 项目 > 悬停在我的项目上,没有可用的“快照” .这似乎很奇怪,因为我经常保存
  • 定期保存不同于拍摄快照。对于此类情况,拍摄快照会在特定时间点保存您的项目。如果你定期拍摄快照,你可以恢复到以前的工作版本并从那里开始......
  • 现在,我建议查看以前的 Time Machine 备份(您使用 Time Machine 对吗?)。从那里你可以从以前的日期复制有问题的文件的内容并使用它来恢复你的代码......
  • 我没有让您轻松帮助您,抱歉 :( 但我不使用时间机器我没有任何类型的外部硬盘驱动器。我只是不明白我得到“空引用者”的错误。可能源于什么。我已经编码回修改之前的内容。所以它与 api 键有关。我 99% 确定我已经完成了我的工作假设为了获取 JSON 数据............ 1)在开发者控制台中创建一个新项目 2)创建 iOS API 密钥 3)确保包标识符匹配 4)将 iOS 密钥放在委托中并在 searchURL 的参数内

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


【解决方案1】:

您的 API 密钥配置错误。

首先,您的问题在于Google Places API Web Service,它只能用于Server keys 而不是iOS 键。您正在调用 Web 服务 (https://maps.googleapis.com/maps/place/...),因此 iOS 密钥和 bundleID 密钥限制在这里不起作用(并且可能会造成混淆)。

因此,您需要按照https://developers.google.com/places/web-service/get-api-key 的说明,在开发者控制台中启用“Google Places API Web 服务”(与“iOS 版 Google Places API”不同)创建一个服务器密钥。为了在电话上有用,您可能不想设置任何 IP 限制(并且 IP 限制是服务器密钥唯一可能的类型)。在您的 HTTP 请求中使用该密钥。

其他任何事情都会出现 REQUEST_DENIED 错误。

【讨论】:

  • 啊,非常有帮助,谢谢,我非常感谢!一个关于使用服务器密钥的问题,我真的需要设置一个个人“服务器”来用于这个唯一目的吗?我对此没有任何经验;/
  • 您不必这样做,它可以正常工作。但是在您的移动应用程序中拥有服务器密钥并不是很好,因为它无法设置任何有用的限制,这使得某人可以相对容易地从您的应用程序中提取密钥并使用您的 API 在自己的应用程序中使用它配额。这就是为什么如果可以的话,最好使用支持 iOS 密钥的 iOS SDK 的原因之一。如果您不能使用 iOS SDK,您应该考虑添加一种简单的方法来将更新的服务器密钥推送到您的应用程序,以便您可以撤销有人滥用的密钥。
  • 所以本质上,虽然 Google Places SDK 可以通过 Bundle id 限制到 iOS 应用程序,但其他 Google Maps API 密钥,例如距离矩阵 API,必须使用服务器密钥,不能限制到 iOS应用程序包?但是为什么控制台会显示一个通过应用程序包 ID 限制它的选项呢?对我来说似乎违反直觉并且非常混乱。 google 的 Key 限制思想是防止通过滥用 API Key 来滥用配额,这适用于基于 SDK 的 API 和基于 Webservice 的 API。
【解决方案2】:

此错误听起来像是您生成了浏览器密钥而不是 iOS 密钥。尝试在 Cloud Console 中生成 iOS 密钥,并确保您的捆绑包 ID 已列入白名单。

【讨论】:

  • 我添加了列表的快照并显示 iOS 密钥?想知道它怎么可能是浏览器密钥。如何将 API 密钥列入白名单?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-31
  • 1970-01-01
  • 1970-01-01
  • 2014-03-15
相关资源
最近更新 更多