标签: mklocalsearch

iOS应用程序受到本地搜索的限制

我正在一个搜索地址的应用程序中实现自动完成(每个新角色添加一个搜索),我不断获取MKErrorDomain error 3,这是MKErrorLoadingThrottled.根据Apple dev的说法,这个错误发生在

未加载数据,因为数据限制有效.如果应用程序在短时间内频繁请求数据,则会发生此错误.

我确切地知道有多少请求正在进行,一个用于搜索查询中的每个新charachter(就像您希望自动完成工作一样).当然,我是一个快速的人,但只有10或15个请求后能够达到极限似乎是荒谬的.看看以下两个源代码引用,我不明白为什么我一直受到限制.

根据Apple开发:

每个应用程序或开发人员ID没有请求限制,因此编写良好的正确应用程序应该不会遇到任何问题.但是,在创建大量请求的应用程序写得不好的情况下,可能会出现限制.

正如詹姆斯霍华德在WWDC上所说:

我想谈的另一件事就是这个API的使用限制.因此,我很高兴地宣布,没有应用程序或开发人员标识符的广泛使用限制.所以,如果你的应用程序拥有大量用户并且你想要做很多请求,那就没问题了.

它会工作的.

我们所拥有的限制实际上只是防范错误应用程序的第一道防线.因此,如果您将路线请求或本地搜索请求置于无限循环中,您就会遇到错误,最终您将受到限制.

但是,如果你做了一些合理的事情,你会说哦,我只会做一些回应用户输入的指示,你知道你可以做一些,因为我们向他们展示了这个例子.

就像我们针对一个用户输入做了两个方向请求一样,这很好.但是,你知道如果你每次用户点击屏幕时你都做了10,000,那么你就会受到限制.但是,只要保持合理,你就没事了.

任何想法为什么会发生这种情况?

mapkit ios mklocalsearch

13
推荐指数
1
解决办法
3655
查看次数

如何在Apple的原生地图应用程序中执行本地搜索自动完成功能?

我已经从采用大多数的概念从MKlocalSearch苹果的示例代码做了一个实现

目前,对于自动完成,每次用户在搜索栏内输入时,我都会在我指定的位置发送新请求:

MkLocalSearchRequest.naturalLanguageQuery = searchBar.text
MkLocalSearchRequest.region = userlocation.region
Run Code Online (Sandbox Code Playgroud)

但是,与Apple的默认地图应用程序相比,我得到了与服务器完全不同的响应集,如下图所示

我的应用 Apple Maps应用

然后我捕获流量并发现我的请求转到https://gsp-ssl.ls.apple.com/search.arpc而Apple转到 https://gsp-ssl.ls.apple.com/auto_complete.arpc

有没有办法调整MkLocalSearchRequest以获得相同的响应对象集?

iphone mapkit ios mklocalsearch

12
推荐指数
2
解决办法
5345
查看次数

MKLocalSearchCompleter添加区域不会扭曲结果

我目前使用MapKitMKLocalSearchCompleter为用户提供搜索我的iOS应用程序的位置自动完成一样的功能,但是我正在与我找回结果一些严重的问题.更具体地说,我的应用程序正在处理纽约中部及周边地区的位置信息,我正在努力将结果提供给纽约州内的地点/地址.但由于某种原因,在大多数情况下输入一个单词会产生远离澳大利亚的结果.

MKLocalSearchCompleter提供了一个region属性,用于影响对象返回指定区域附近的结果,但即便如此也没有多大帮助.

还有什么我可以做的吗?或者我应该考虑退出并转移到Google的Maps API吗?我知道Apple Maps因质量低劣而臭名昭着,但我不认为在告诉他们的API坚持纽约之后我只会在德克萨斯州和澳大利亚获得位置结果...

mapkit ios apple-maps mklocalsearch

10
推荐指数
0
解决办法
290
查看次数

SwiftUI 使用 MapKit 实现地址自动完成

我有一个表格,用户可以在其中输入他们的地址。虽然他们总是可以手动输入,但我还想为他们提供一种具有自动完成功能的简单解决方案,以便他们可以开始输入地址,然后从列表中点击正确的地址并让它自动填充各个字段。

我首先使用 jnpdx 的 Swift5 解决方案 - /sf/answers/4699196351/

但是,有两个问题我似乎无法解决:

  1. 我需要将结果仅限于美国(不仅仅是美国大陆,而是整个美国,包括阿拉斯加、夏威夷和波多黎各)。我知道 MKCooperativeRegion 如何与中心点一起使用,然后缩放扩展,但它似乎不适用于地址搜索的结果。

  2. 结果的返回仅提供标题和副标题,我需要实际提取所有单独的地址信息并填充我的变量(即地址、城市、州、邮政编码和邮政编码分机号)。如果用户有公寓号或套房号,他们会自己填写。我的想法是创建一个在点击按钮时运行的函数,以便根据用户的选择分配变量,但我不知道如何提取所需的各种信息。苹果的文档一如既往地糟糕,我还没有找到任何解释如何做到这一点的教程。

这是针对最新的 SwiftUI 和 XCode (ios15+)。

我创建了一个用于测试的虚拟表单。这是我所拥有的:

import SwiftUI
import Combine
import MapKit

class MapSearch : NSObject, ObservableObject {
    @Published var locationResults : [MKLocalSearchCompletion] = []
    @Published var searchTerm = ""
    
    private var cancellables : Set<AnyCancellable> = []
    
    private var searchCompleter = MKLocalSearchCompleter()
    private var currentPromise : ((Result<[MKLocalSearchCompletion], Error>) -> Void)?
    
    override init() {
        super.init()
        searchCompleter.delegate = self
        searchCompleter.region = MKCoordinateRegion()
        searchCompleter.resultTypes = MKLocalSearchCompleter.ResultType([.address])
        
        $searchTerm
            .debounce(for: .seconds(0.5), scheduler: …
Run Code Online (Sandbox Code Playgroud)

mapkit mkcoordinateregion mklocalsearch swiftui

10
推荐指数
1
解决办法
5042
查看次数

使用MKLocalSearch搜索地图上的位置

我想MKLocalSearch用于在地图中搜索.此功能在iOS 6.1+中可用.有谁知道如何使用这个或任何人都可以举例说明如何使用MKLocalSearch

MKLocalSearchResponse文档

objective-c mapkit mkmapview ios mklocalsearch

9
推荐指数
2
解决办法
1万
查看次数

Objective-C - 根据用户输入的查询搜索街道

我想允许用户搜索街道名称并将结果显示在UITableView中.目前该地区并不重要,它可以来自任何地区.

我在搜索中找不到任何相关示例,我不知道是否应该使用CLLocation或MKLocalSearch.

根据文档,我应该使用MKLocalSearch:

虽然本地搜索和地理编码类似,但它们支持不同的用例.如果要在地图坐标和结构化地址(例如地址簿地址)之间进行转换,请使用地理编码.如果要查找与用户输入匹配的一组位置,请使用本地搜索.

但我尝试了两种方法,它只给了我一个结果(即使 - 虽然有一个NSArray返回.

这是CLGeocoder方法:

CLGeocoder *geocoding = [[CLGeocoder alloc] init];
[geocoding geocodeAddressString:theTextField.text completionHandler:^(NSArray *placemarks, NSError *error) {
    if (error) {
        NSLog(@"%@", error);
    } else {
        NSLog(@"%i", [placemarks count]);
        for(CLPlacemark *myStr in placemarks) {
            NSLog(@"%@", myStr);
    }
    }
}];
Run Code Online (Sandbox Code Playgroud)

这是我的MKLocalSearch尝试:

MKLocalSearchRequest *request = [[MKLocalSearchRequest alloc] init];
request.naturalLanguageQuery = theTextField.text;
request.region = self.region;

localSearch = [[MKLocalSearch alloc] initWithRequest:request];

[localSearch startWithCompletionHandler:^(MKLocalSearchResponse *response, NSError *error){

    if (error != nil) {
        [[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Map Error",nil)
                                    message:[error localizedDescription]
                                   delegate:nil
                          cancelButtonTitle:NSLocalizedString(@"OK",nil) otherButtonTitles:nil] show]; …
Run Code Online (Sandbox Code Playgroud)

xcode objective-c cllocation mklocalsearch

8
推荐指数
1
解决办法
976
查看次数

将项添加到对象中

我希望能够MKLocationSearchCompletion array在用户搜索搜索栏时找到个人位置.但是,我无法理解项目如何存储到对象中以及是否可以将地标对象(或位置信息)添加到MKLocationSearch对象中.我从文档中获得的是MKLocalSearchCompleter对象存储当用户在搜索栏中键入部分字符串时访问的字符串.但我不知道在哪里可以访问此阵列并添加新位置.

以下是代码的结构,以显示搜索完成结果:

var searchCompleter = MKLocalSearchCompleter()
var searchResults = [MKLocalSearchCompletion]()

@IBOutlet weak var searchBar: UISearchBar!

override func viewDidLoad() {
    searchCompleter.delegate = self
    searchBar.delegate = self
}

extension ViewController: MKLocalSearchCompleterDelegate {
    func completerDidUpdateResults(_ completer: MKLocalSearchCompleter) {
        searchResults = completer.results
        searchResultsTableView.reloadData()
    }

    func completer(_ completer: MKLocalSearchCompleter, didFailWithError error: Error) {
        // handle error
    }
}

extension ViewController: UITableViewDataSource {
    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: …
Run Code Online (Sandbox Code Playgroud)

arrays object mklocalsearch mklocalsearchrequest swift

8
推荐指数
1
解决办法
227
查看次数

Swift - 从地图中的当前位置选择注释的方向

我的应用程序目前有一个本地搜索,可以为搜索结果添加注释.我想设置它,当您选择注释并单击调出按钮时,它将在地图应用程序中打开,其中包含指向当前设备位置注释的说明.我遇到了一些问题.

首先,我的注释按钮没有出现.其次,我认为我没有正确检测选定的注释.

这是我的搜索和选择注释的代码:

func performSearch() {

    matchingItems.removeAll()
    let request = MKLocalSearchRequest()
    request.naturalLanguageQuery = searchText.text
    request.region = mapView.region

    let search = MKLocalSearch(request: request)

    search.startWithCompletionHandler({(response:
        MKLocalSearchResponse!,
        error: NSError!) in

        if error != nil {
            println("Error occured in search: \(error.localizedDescription)")
        } else if response.mapItems.count == 0 {
            println("No matches found")
        } else {
            println("Matches found")

            for item in response.mapItems as! [MKMapItem] {
                println("Name = \(item.name)")
                println("Phone = \(item.phoneNumber)")

                self.matchingItems.append(item as MKMapItem)
                println("Matching items = \(self.matchingItems.count)")

                var annotation = MKPointAnnotation()
                var coordinates = annotation.coordinate …
Run Code Online (Sandbox Code Playgroud)

annotations mapkit mklocalsearch swift

7
推荐指数
1
解决办法
5718
查看次数

MKLocalsearchRequest附近的地方没有naturalLanguageQuery字符串

是否可以在不提供naturalLanguageQuery的情况下使用MKLocalSearchRequest显示附近的地方?

我知道典型的路线是使用foursquare或google.我用过这两个.

mapkit ios mklocalsearch mklocalsearchrequest

6
推荐指数
1
解决办法
1131
查看次数

MKLocalSearch 产生 SearchAttribution 错误和错误 Domain=GEOErrorDomain Code=-8

我使用 MKLocalSearchCompleter搜索地点,并在选择 tableView 单元格时优化结果。当选择 MKLocalSearchCompletion 并启动 MKLocalSearch.Request() 时,我收到以下错误(示例选择洛杉矶):\n根据我的研究,这是一个非常罕见的问题?!

\n
    \n
  • [SearchAttribution] 未找到\norg.volunteermatch\n...(+4 个其他域)的匹配归因源
  • \n
  • 从 \ngeod 加载标识符 org.volunteermatch 的归因信息时出错:错误 Domain=GEOErrorDomain Code=-8“未找到 org.volunteermatch 的匹配归因\n源” UserInfo={NSDebugDescription=未找到 \norg.volunteermatch}\ 的匹配归因源n...(+4 个其他域)
  • \n
\n

这些是 TableViewController 中的实例变量:

\n
var searchCompleter = MKLocalSearchCompleter()\nvar searchResults = [MKLocalSearchCompletion]()\n
Run Code Online (Sandbox Code Playgroud)\n

每次更改搜索词时都会运行此代码:

\n
searchCompleter.queryFragment = text\nsearchCompleter.resultTypes = .address\nsearchCompleter.region = region\n
Run Code Online (Sandbox Code Playgroud)\n

在 tableView \xe2\x80\xa6 didSelectRowAt\xe2\x80\xa6 中执行以下代码:

\n
let selectedItem = searchResults[indexPath.row]\n        \nlet searchRequest = MKLocalSearch.Request()\nsearchRequest.naturalLanguageQuery = selectedItem.title\nsearchRequest.resultTypes = .address\n        \nlet search = MKLocalSearch(request: searchRequest)\nsearch.start { …
Run Code Online (Sandbox Code Playgroud)

mapkit mklocalsearch swift attribution

6
推荐指数
1
解决办法
509
查看次数