Глубокая привязка от Chrome к родному приложению

Я работаю с Uber API, который использует URL-адреса uber://?... для глубокой ссылки в собственное приложение Uber. Я создаю мобильный сайт, и я строю один из этих URL, как описано здесь ;

На iOS все работает нормально, но на Android открывается приложение Uber и получает только один из параметров product_id . Поэтому я думаю, что есть некоторая проблема с тем, как я кодирую URL-адрес и как система Android открывает его. Вот мой JS для создания URL-адреса:

 uber.createURL = function() { var params = { "client_id": uber.CLIENT_ID, "product_id": maps.product_id, "pickup[latitude]": maps.noSurgeMarker.getPosition().lat(), "pickup[longitude]": maps.noSurgeMarker.getPosition().lng(), "dropoff[latitude]": maps.destMarker.getPosition().lat(), "dropoff[longitude]": maps.destMarker.getPosition().lng(), "pickup[formatted_address]": $('#pickup').val(), "dropoff[formatted_address]": $('#destination').val() }; var url = 'uber://?action=setPickup'; for (var key in params) { if (params.hasOwnProperty(key)) { url += ('&' + key + '=' + encodeURIComponent(params[key])); } } return url; }; 

Затем я вызываю следующий код, чтобы открыть ссылку:

 var url = uber.createURL(); window.location.href = url; 

Мне что-то не хватает? Опять же, это работает на iOS, но не на Android. Также странно, что если я createURL URL-адрес с помощью createURL на компьютере, отправьте его на свое Android-устройство с помощью PushBullet, и его открытие отлично работает. Но, если я получаю URL-адрес через Chrome для Android, приложение Uber открывается и имеет только product_id , а не какие-либо элементы для загрузки или выключения.

Примечание. Я уже использовал функцию params jQuery, но это не сработало, поэтому я перешел к руководству for (var key in params) {...} loop.

    Хорошо, я понял, что это не проблема кодирования, а скорее, как Chrome запускает намерения для приложений. Вот намерение от Pushbullet, это прекрасно работает:

     I/ActivityManager( 942): START u0 {act=android.intent.action.VIEW dat=uber://? client_id=REDACTED& action=setPickup& product_id=a1111c8c-c720-46c3-8534-2fcdd730040d& pickup[latitude]=37.780654& pickup[longitude]=-122.405599& dropoff[latitude]=37.7970558& dropoff[longitude]=-122.43199099999998 flg=0x10000000 cmp=com.ubercab/.client.feature.launch.LauncherActivity} from pid 19023 оставите I/ActivityManager( 942): START u0 {act=android.intent.action.VIEW dat=uber://? client_id=REDACTED& action=setPickup& product_id=a1111c8c-c720-46c3-8534-2fcdd730040d& pickup[latitude]=37.780654& pickup[longitude]=-122.405599& dropoff[latitude]=37.7970558& dropoff[longitude]=-122.43199099999998 flg=0x10000000 cmp=com.ubercab/.client.feature.launch.LauncherActivity} from pid 19023 оставите I/ActivityManager( 942): START u0 {act=android.intent.action.VIEW dat=uber://? client_id=REDACTED& action=setPickup& product_id=a1111c8c-c720-46c3-8534-2fcdd730040d& pickup[latitude]=37.780654& pickup[longitude]=-122.405599& dropoff[latitude]=37.7970558& dropoff[longitude]=-122.43199099999998 flg=0x10000000 cmp=com.ubercab/.client.feature.launch.LauncherActivity} from pid 19023 

    Вот намерение от Chrome, это запускает приложение Uber, но ни одно из данных не анализируется приложением (оно просто открывается, как если бы я щелкнул значок запуска):

     I/ActivityManager( 942): START u0 {act=android.intent.action.VIEW cat=[android.intent.category.BROWSABLE] dat=uber://? client_id=REDACTED& action=setPickup& product_id=a1111c8c-c720-46c3-8534-2fcdd730040d& pickup[latitude]=37.780654& pickup[longitude]=-122.405599& dropoff[latitude]=37.7970558& dropoff[longitude]=-122.43199099999998 flg=0x10000000 cmp=com.ubercab/.client.feature.launch.LauncherActivity (has extras)} from pid 26446 оставите I/ActivityManager( 942): START u0 {act=android.intent.action.VIEW cat=[android.intent.category.BROWSABLE] dat=uber://? client_id=REDACTED& action=setPickup& product_id=a1111c8c-c720-46c3-8534-2fcdd730040d& pickup[latitude]=37.780654& pickup[longitude]=-122.405599& dropoff[latitude]=37.7970558& dropoff[longitude]=-122.43199099999998 flg=0x10000000 cmp=com.ubercab/.client.feature.launch.LauncherActivity (has extras)} from pid 26446 оставите I/ActivityManager( 942): START u0 {act=android.intent.action.VIEW cat=[android.intent.category.BROWSABLE] dat=uber://? client_id=REDACTED& action=setPickup& product_id=a1111c8c-c720-46c3-8534-2fcdd730040d& pickup[latitude]=37.780654& pickup[longitude]=-122.405599& dropoff[latitude]=37.7970558& dropoff[longitude]=-122.43199099999998 flg=0x10000000 cmp=com.ubercab/.client.feature.launch.LauncherActivity (has extras)} from pid 26446 

    Вы можете видеть, что единственным отличием является добавленный cat=[android.intent.category.BROWSABLE] который является тем, что требуется для намерений, запущенных из Chrome для android ( ссылка ).

    Поэтому в целом я думаю, что это то, что нужно решить Уберу. На данный момент похоже, что мне придется упаковать свой веб-сайт в WebView в приложении для Android, если я хочу, чтобы он работал.

    Вам нужно вызвать encodeUriComponent на оба ключа и params [key].