我正在一个搜索地址的应用程序中实现自动完成(每个新角色添加一个搜索),我不断获取MKErrorDomain error 3
,这是MKErrorLoadingThrottled
.根据Apple dev的说法,这个错误发生在
未加载数据,因为数据限制有效.如果应用程序在短时间内频繁请求数据,则会发生此错误.
我确切地知道有多少请求正在进行,一个用于搜索查询中的每个新charachter(就像您希望自动完成工作一样).当然,我是一个快速的人,但只有10或15个请求后能够达到极限似乎是荒谬的.看看以下两个源代码引用,我不明白为什么我一直受到限制.
根据Apple开发:
每个应用程序或开发人员ID没有请求限制,因此编写良好的正确应用程序应该不会遇到任何问题.但是,在创建大量请求的应用程序写得不好的情况下,可能会出现限制.
正如詹姆斯霍华德在WWDC上所说:
我想谈的另一件事就是这个API的使用限制.因此,我很高兴地宣布,没有应用程序或开发人员标识符的广泛使用限制.所以,如果你的应用程序拥有大量用户并且你想要做很多请求,那就没问题了.
它会工作的.
我们所拥有的限制实际上只是防范错误应用程序的第一道防线.因此,如果您将路线请求或本地搜索请求置于无限循环中,您就会遇到错误,最终您将受到限制.
但是,如果你做了一些合理的事情,你会说哦,我只会做一些回应用户输入的指示,你知道你可以做一些,因为我们向他们展示了这个例子.
就像我们针对一个用户输入做了两个方向请求一样,这很好.但是,你知道如果你每次用户点击屏幕时你都做了10,000,那么你就会受到限制.但是,只要保持合理,你就没事了.
任何想法为什么会发生这种情况?
我已经从采用大多数的概念从MKlocalSearch苹果的示例代码做了一个实现此
目前,对于自动完成,每次用户在搜索栏内输入时,我都会在我指定的位置发送新请求:
MkLocalSearchRequest.naturalLanguageQuery = searchBar.text
MkLocalSearchRequest.region = userlocation.region
Run Code Online (Sandbox Code Playgroud)
但是,与Apple的默认地图应用程序相比,我得到了与服务器完全不同的响应集,如下图所示
然后我捕获流量并发现我的请求转到https://gsp-ssl.ls.apple.com/search.arpc而Apple转到 https://gsp-ssl.ls.apple.com/auto_complete.arpc
有没有办法调整MkLocalSearchRequest
以获得相同的响应对象集?
我目前使用MapKit
的MKLocalSearchCompleter
为用户提供搜索我的iOS应用程序的位置自动完成一样的功能,但是我正在与我找回结果一些严重的问题.更具体地说,我的应用程序正在处理纽约中部及周边地区的位置信息,我正在努力将结果提供给纽约州内的地点/地址.但由于某种原因,在大多数情况下输入一个单词会产生远离澳大利亚的结果.
MKLocalSearchCompleter
提供了一个region
属性,用于影响对象返回指定区域附近的结果,但即便如此也没有多大帮助.
还有什么我可以做的吗?或者我应该考虑退出并转移到Google的Maps API吗?我知道Apple Maps因质量低劣而臭名昭着,但我不认为在告诉他们的API坚持纽约之后我只会在德克萨斯州和澳大利亚获得位置结果...
我有一个表格,用户可以在其中输入他们的地址。虽然他们总是可以手动输入,但我还想为他们提供一种具有自动完成功能的简单解决方案,以便他们可以开始输入地址,然后从列表中点击正确的地址并让它自动填充各个字段。
我首先使用 jnpdx 的 Swift5 解决方案 - /sf/answers/4699196351/
但是,有两个问题我似乎无法解决:
我需要将结果仅限于美国(不仅仅是美国大陆,而是整个美国,包括阿拉斯加、夏威夷和波多黎各)。我知道 MKCooperativeRegion 如何与中心点一起使用,然后缩放扩展,但它似乎不适用于地址搜索的结果。
结果的返回仅提供标题和副标题,我需要实际提取所有单独的地址信息并填充我的变量(即地址、城市、州、邮政编码和邮政编码分机号)。如果用户有公寓号或套房号,他们会自己填写。我的想法是创建一个在点击按钮时运行的函数,以便根据用户的选择分配变量,但我不知道如何提取所需的各种信息。苹果的文档一如既往地糟糕,我还没有找到任何解释如何做到这一点的教程。
这是针对最新的 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) 我想MKLocalSearch
用于在地图中搜索.此功能在iOS 6.1+中可用.有谁知道如何使用这个或任何人都可以举例说明如何使用MKLocalSearch
?
我想允许用户搜索街道名称并将结果显示在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) 我希望能够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) 我的应用程序目前有一个本地搜索,可以为搜索结果添加注释.我想设置它,当您选择注释并单击调出按钮时,它将在地图应用程序中打开,其中包含指向当前设备位置注释的说明.我遇到了一些问题.
首先,我的注释按钮没有出现.其次,我认为我没有正确检测选定的注释.
这是我的搜索和选择注释的代码:
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) 是否可以在不提供naturalLanguageQuery的情况下使用MKLocalSearchRequest显示附近的地方?
我知道典型的路线是使用foursquare或google.我用过这两个.
我使用 MKLocalSearchCompleter搜索地点,并在选择 tableView 单元格时优化结果。当选择 MKLocalSearchCompletion 并启动 MKLocalSearch.Request() 时,我收到以下错误(示例选择洛杉矶):\n根据我的研究,这是一个非常罕见的问题?!
\n这些是 TableViewController 中的实例变量:
\nvar searchCompleter = MKLocalSearchCompleter()\nvar searchResults = [MKLocalSearchCompletion]()\n
Run Code Online (Sandbox Code Playgroud)\n每次更改搜索词时都会运行此代码:
\nsearchCompleter.queryFragment = text\nsearchCompleter.resultTypes = .address\nsearchCompleter.region = region\n
Run Code Online (Sandbox Code Playgroud)\n在 tableView \xe2\x80\xa6 didSelectRowAt\xe2\x80\xa6 中执行以下代码:
\nlet 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) mklocalsearch ×10
mapkit ×8
ios ×5
swift ×3
objective-c ×2
annotations ×1
apple-maps ×1
arrays ×1
attribution ×1
cllocation ×1
iphone ×1
mkmapview ×1
object ×1
swiftui ×1
xcode ×1