Проблемы с местом получения Uber deeplink на iOS

В своем приложении я использую диплинк Uber и Lyft. Функциональность заключается в том, что когда пользователь нажимает кнопку «Поездка с uber» или «Поездка с Lyft», он открывает приложение Uber или Lyft и отправляет координаты места посадки и пункта назначения в Uber/Lyft, а приложение Uber/Lyft обрабатывает поездку.

Я использовал стандартный deeplink для Uber. Все работает нормально, когда Uber уже открыт и работает в фоновом режиме. Когда Uber не работает в фоновом режиме, место получения становится текущим местоположением пользователя (что неверно, поскольку пользователь хочет указать место получения, а не текущее местоположение). Однако эта проблема не возникает в Lyft.

Это мой код:

class ViewController: UIViewController {

    @IBOutlet weak var uberBtn: UIButton!
    @IBOutlet weak var lyftBtn: UIButton!

    @IBAction func uberClicked(_ sender: Any) {
        if isInstalledOf(app: "uber") {
            open(scheme: "uber://?action=setPickup&client_id=7r6zjXf5e1p4nqYkX17d9R44estKs-na&product_id=a12ab23b-66f0-4028-9bb9-856dbcfdbbc7&pickup[formatted_address]=5874%20Newberry%20Street%2C%20Romulus%2C%20MI%2C%20USA&pickup[latitude]=42.265570&pickup[longitude]=-83.387391&dropoff[formatted_address]=15609%20Regina%20Avenue%2C%20Allen%20Park%2C%20MI%2C%20USA&dropoff[latitude]=42.253737&dropoff[longitude]=-83.211945")
        } else {
            open(scheme: "https://m.uber.com/ul/")
        }
    }

    @IBAction func lyftClicked(_ sender: Any) {
        if isInstalledOf(app: "lyft") {
            open(scheme: "lyft://ridetype?id=lyft&pickup[latitude]=42.265570&pickup[longitude]=-83.387391&destination[latitude]=42.253737&destination[longitude]=-83.211945")
        } else {
            open(scheme: "https://www.lyft.com/signup/SDKSIGNUP?clientId=IcEuyAmFO7Gp&sdkName=iOS_direct")
        }
    }

    // check if the app is installed
    func isInstalledOf(app: String) -> Bool {
        return UIApplication.shared.canOpenURL(URL(string: "\(app)://")!)
    }

    func open(scheme: String) {
        if let url = URL(string: scheme) {
            if #available(iOS 10, *) {
                UIApplication.shared.open(url, options: [:], completionHandler: nil)
            } else {
                UIApplication.shared.openURL(url)
            }
        }
    }
}

person Steve    schedule 23.10.2018    source источник
comment
Попробуйте использовать пользовательский SDK github.com/uber/rides-ios-sdk, а не чем делать свои собственные реализации. Было бы легко отладить... Если нет, вместо использования глубоких ссылок используйте универсальные глубокие ссылки...   -  person Harsh    schedule 23.10.2018
comment
Пробовал использовать UberRides SDK и универсальный deeplink, ни один из них не смог решить эту проблему :( Все работает нормально, кроме места получения   -  person Steve    schedule 23.10.2018
comment
Я полагаю, это было создано вами... github.com/uber/rides- ios-sdk/issues/249... Это определенно похоже на ошибку в приложении Uber... Я бы сказал, подождите, пока кто-нибудь из Uber не ответит...   -  person Harsh    schedule 23.10.2018
comment
Спасибо за ссылку. Это не я создал, но у меня точно такая же проблема, как и у него.   -  person Steve    schedule 23.10.2018
comment
Следите за темой.. Кто-то обязательно откликнется, если она массовая..   -  person Harsh    schedule 23.10.2018


Ответы (2)


Используйте Uber SDK и передайте необходимые параметры для deeplink. Чтобы решить проблему с местом получения, вам необходимо передать имя и адрес получения.

        let pickupLocation          = CLLocation(latitude: <pickup latitude>, longitude: <pickup longitude>)
        let dropoffLocation         = CLLocation(latitude: <destination latitude>, longitude: <destination longitude>)
        let builder                 = RideParametersBuilder()
        builder.pickupLocation      = pickupLocation
        builder.pickupNickname      = <pickup nickname>
        builder.pickupAddress       = <pickup address>
        builder.dropoffLocation     = dropoffLocation
        builder.dropoffNickname     = <dropof nickname>
        builder.dropoffAddress      = <dropof address>
        builder.productID           = productId
        let deeplink                = RequestDeeplink(rideParameters: builder.build(), fallbackType: .appStore)
        deeplink.execute()
person mahesh    schedule 04.03.2019
comment
Используйте Uber SDK и передайте необходимые параметры для deeplink. Чтобы решить проблему с местом получения, вам необходимо передать имя и адрес получения. - person mahesh; 04.03.2019

Я получил подтверждение (29.10.2018) от Uber, что эта проблема является внутренней. Эта проблема возникает, когда Uber не открыт, и у Android нет этой проблемы. В настоящее время они работают над устранением этой проблемы, но, к сожалению, пока нет ETA. Вот сообщение от Uber:

Спасибо за отчет. Я вижу проблему на Github: https://github.com/uber/rides-ios-sdk/issues/249 … Я могу подтвердить проблему. Он корректно работает на Android, но некорректно работает на IOS, когда приложение не открыто. К сожалению, нет ожидаемого времени прибытия, но я постараюсь правильно направить это внутренне.

person Steve    schedule 02.11.2018
comment
Подтверждение проблемы на Github от инженера, который будет над ней работать: github. com/uber/rides-ios-sdk/issues/249 Спасибо, что сообщили об этой проблеме. В настоящее время мы изучаем его и скоро предоставим обновление. - person Kyle Davis; 07.11.2018