3

我正在使用 Uber API,它使用uber://?...URL 深度链接到 Uber 本机应用程序。我正在构建一个移动网站,并且正在构建这些 URL 之一,如此处所述

在 iOS 上一切正常,但在 Android 上,Uber 应用程序打开并且只获取其中一个参数product_id。所以我认为我如何编码 URL 以及 Android 系统如何打开它存在一些问题。这是我构建 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 应用程序会打开并且只有product_id正确的,而不是任何接送部分。

注意:我已经使用 jQuery 的params函数进行验证,但效果并没有更好,这就是我使用手动for (var key in params) {...}循环的原因。

4

2 回答 2

3

好吧,我发现这不是编码问题,而是 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 应用程序,但应用程序没有解析任何数据(它就像我点击启动器图标一样打开):

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 for android 启动的意图所需的内容(参考)。

所以总的来说,我认为这是 Uber 必须解决的问题。WebView现在看来,如果我想让它工作,我将不得不将我的网站打包到一个 Android 应用程序中。

于 2015-01-11T20:24:04.287 回答
2

您需要同时调用encodeUriComponentkey 和 params[key]。

于 2014-12-30T04:07:31.537 回答