Я создал собственный класс для обработки логики для Siri
Импорт Intents
class RideRequestHandler: NSObject, INRequestRideIntentHandling {дескриптор функции (намерение: INRequestRideIntent), завершение: @escaping (INRequestRideIntentResponse) -> Void) {let response = INRequestRideIntentResponse (code: .failureRequiringAppLaunchNoServiceInArea, userActivity: .none) завершение (ответ)}
func resolvePickupLocation(for intent: INRequestRideIntent, with completion: @escaping (INPlacemarkResolutionResult) -> Void) {
if let pickup = intent.pickupLocation {
completion(.success(with: pickup))
} else {
completion(.needsValue())
}
}
func resolveDropOffLocation(for intent: INRequestRideIntent, with completion: @escaping (INPlacemarkResolutionResult) -> Void) {
if let dropOff = intent.dropOffLocation {
completion(.success(with: dropOff))
} else {
completion(.needsValue())
}
}
} * 10161018 *
Intent Handler
import Intents
class IntentHandler: INExtension {
override func handler(for intent: INIntent) -> Any? {
if intent is INRequestRideIntent {
return RideRequestHandler()
}
return .none
}
}
некоторая логика в моем запросе через основное приложение включает
в моем TripPresenter.swift
func onPlaceTripRequestButtonPressed() {
guard let pickupPlace = pickupPlace, let dropoffPlace = dropoffPlace,
let selectedService = selectedService, viewMode == .estimate else { return }
if appMode == .go {
if let key = tripRequestKey { disposable.remove(for: key) }
view?.setTripRequestProgress(enabled: true)
tripRequestKey = disposable.insert(
source.placeTripRequest(from: pickupPlace, to: dropoffPlace,
forService: selectedService.id!,
isCash: paymentMethod == .cash)
.retry(.delayed(maxCount: 3, time: 2), shouldRetry: networkRetryPredicate)
.subscribe(onNext: { [weak self] response in
guard let presenter = self, let view = presenter.view else {return}
presenter.source.saveCurrentTrip(response.data!)
view.setTripEstimateView(visible: false)
view.setTripRequestProgress(enabled: false)
presenter.viewMode = .championAssign
view.clearMapView()
view.showChampionSearchPage()
}, onError: { [weak self] error in
guard let presenter = self, let view = presenter.view else {return}
if let error = error as? NetworkingError {
view.didShowStatusCode(code: error.httpResponse?.statusCode)
}
view.setTripRequestProgress(enabled: false)
view.showTripRequestError()
}))
} else {
view?.showOrderFormEntryPage(pickup: pickupPlace, dropoff: dropoffPlace)
// Delay reseting presenter/view state until animations/transitions are complete
_ = disposable.insert(Single<Int>.timer(1, scheduler: MainScheduler.instance)
.subscribe(onSuccess: { [weak self] _ in
guard let presenter = self, let view = presenter.view else {return}
presenter.viewMode = .normal
view.clearMapView()
view.setTripEstimateView(visible: false)
presenter.pickupPlace = nil
presenter.dropoffPlace = nil
view.showDefaultAddress(forPlace: .dropoff)
view.showDefaultAddress(forPlace: .pickup)
view.setInputFieldsVisible(true)
}))
}
}
любая помощь относительно того, как включить эту логику в Сири, будет принята с благодарностью.В приложении также есть ограничение местоположения для dropoffPlace
.