Android 从Chrome到本机应用程序的深度链接
我正在使用Uber API,它使用Android 从Chrome到本机应用程序的深度链接,android,ios,google-chrome,deep-linking,uber-api,Android,Ios,Google Chrome,Deep Linking,Uber Api,我正在使用Uber API,它使用Uber://?…URL深入链接到Uber原生应用程序。我正在建设一个移动网站,我正在建设这些网址之一 在iOS上,一切正常,但在Android上,Uber应用程序打开,只获取一个参数product\u id。因此,我认为我如何编码URL以及Android系统如何打开URL存在一些问题。以下是我构建URL的JS: uber.createURL = function() { var params = { "client_id": uber
Uber://?…
URL深入链接到Uber原生应用程序。我正在建设一个移动网站,我正在建设这些网址之一
在iOS上,一切正常,但在Android上,Uber应用程序打开,只获取一个参数product\u id
。因此,我认为我如何编码URL以及Android系统如何打开URL存在一些问题。以下是我构建URL的JS:
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,然后使用PushBullet将其发送到我的Android设备,打开它就可以完美地工作。但是如果我通过Chrome for Android获取URL,Uber应用程序就会打开,并且只有产品id
正确,没有任何收货或放货部分
注意:我已经使用jQuery的
params
函数实现了trued,但这并没有起到更好的作用,这就是为什么我去手动for(var-key-in-params){…}
循环的原因。您需要在key和params[key]上调用encodeUriComponent
.好吧,我发现这不是编码问题,而是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
这是Chrome的一个意图,它启动了Uber应用程序,但应用程序没有解析任何数据(它只是打开,就像我单击了启动器图标一样):
您可以看到唯一的区别是添加了cat=[android.intent.category.BROWSABLE]
,这是从Chrome for android()启动intent所必需的
所以总体而言,我认为这是优步必须解决的问题。现在看来,如果我想让我的网站正常运行,我必须把它打包成Android应用程序中的
WebView
这实际上让事情变得更糟了。现在,当我手动将它复制到手机上时,它甚至不起作用。嗯,可能是它意外地编码了=或&或?尝试url+=('&'+encodeURIComponent(key)+'='+encodeURIComponent(params[key])代码>。我认为方括号很麻烦。下面是@GregEnnis的答案。它不起作用…现在,当你等待uber修复他们的东西(解码他们的uri)的时候。。。还有一件事你可以试试。在源代码中有另一种表示法(用于文档末尾的web服务)使用下划线而不是方括号,即picku\u latitude
而不是picku[latitude]
。如果这不起作用,我就没有主意了。@hatboysam如果你能准确地看到优步的意图是什么样子的,这会有帮助吗?@Alexandrusianu这是个好主意,不幸的是它不会拦截这个主意。不过,我会在未来的开发中大量使用该应用程序,这很有帮助。他们已将
添加到与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