MKLocalSearchCompleter
を使用するネイティブモジュールを使用して、React Nativeアプリケーションでアドレス補完を実装しようとしています。簡単なデリゲートメソッドを持つシンプルなクラスですが、私のアプリから結果を得ることはできません。関連する単体テストを実行することさえできませんし、私はなぜそれがわかりません。iOS MapKit completerDidUpdateResultsが呼び出されていない
私は.queryFragment
プロパティを部分文字列に設定しています。これは、完了したとき、またはエラーがある場合に、代理人に通知する検索を自動的に開始するはずです。リクエストを行う前にデリゲートを適切に設定しましたが、デリゲートのcompleterDidUpdateResults(_ completer: MKLocalSearchCompleter)
またはcompleter(_ completer: MKLocalSearchCompleter, didFailWithError error: Error)
メソッドが呼び出されることはありません。
.isSearching
プロパティは、初期化後にfalseに設定され、.queryFragment
がtrueになると、内部的に動作しているように見えます。新しいプロジェクトを作成して同じクラスと単体テストでドラッグすると、テストは正常に実行され、問題なく結果が得られます。テストは約0.25秒で完了しますが、実際のアプリケーションプロジェクトでは、テストは30秒のタイムアウトになります私は応答を得る前に失敗します。
私はこの問題に見つけることができる唯一の他の質問は9月
から無応答と私と同じような状況を説明するのAppleデベロッパフォーラムの質問はここに私のコードやテストだた:
class AddressUtils: NSObject, MKLocalSearchCompleterDelegate {
let searchCompleter = MKLocalSearchCompleter()
var results: [MKLocalSearchCompletion]?
var onSuggestionsReceived: (([String]) -> Void)?
public override init() {
super.init()
searchCompleter.delegate = self
}
public func getAddressSuggestions(address: String!, completion: @escaping ([String]) -> Void) {
self.onSuggestionsReceived = completion
searchCompleter.queryFragment = address
if searchCompleter.isSearching {
print("Searching") // Prints
}
}
func completerDidUpdateResults(_ completer: MKLocalSearchCompleter) {
self.results = completer.results
let results = completer.results.flatMap { (result) -> String? in
return result.title + " " + result.subtitle
}
onSuggestionsReceived?(results)
}
func completer(_ completer: MKLocalSearchCompleter, didFailWithError error: Error) {
onSuggestionsReceived?([])
}
}
class UtilityTests: XCTestCase {
func testAddressAutocomplete() {
let expectation = self.expectation(description: "Perform search")
let query = "11 Farns"
let utils = AddressUtils()
utils.getAddressSuggestions(address: query) { (results) in
expectation.fulfill()
}
wait(for: [expectation], timeout: 30)
}
}