SiriKit логика Свифт - PullRequest
       8

SiriKit логика Свифт

0 голосов
/ 23 апреля 2019

Я только начал с SiriKit в своем приложении бронирования поездки, где пользователи заказывают поездку и выбирают способ оплаты.Основное приложение хорошо работает со своей собственной логикой с архитектурой MVP.Тестирование базового SiriKit также хорошо работает, но сейчас я не могу выполнить ту же логику с Siri.

Ниже приведено то, что я сделал для Siri

  1. Я добавилнамерение Сири
  2. Я создал собственный класс для обработки логики для 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.

...