android - 从 Chrome 到 native 应用程序的深度链接

标签 android ios google-chrome deep-linking uber-api

我正在使用 Uber API,它使用 uber://?... URL 深度链接到 Uber native 应用程序。我正在构建一个移动网站,并且正在构建这些 URL 之一 as described here ;

在 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 设备,打开它时效果很好。但是,如果我通过 Android 版 Chrome 获取 URL,Uber 应用程序将打开,并且只有 product_id 正确,而不是任何上车或下车部分。

注意:我已经使用了 jQuery 的 params 函数,但效果并不好,这就是为什么我去看手册 for (var key in params) {... } 循环。

最佳答案

好吧,我发现这不是编码问题,而是 Chrome 如何向应用启动 intent。这是 Pushbullet 的一个 Intent ,这个很好用:

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 的一个 intent,这个 intent 启动了 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],这是从 Android 版 Chrome (reference) 启动的 Intent 所必需的。

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

关于android - 从 Chrome 到 native 应用程序的深度链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27699158/

相关文章:

iphone - CorePlot - 设置 y 轴范围以包括所有数据点

javascript - window.open 在 Chrome 中使用目标 "_blank"

css - 谷歌浏览器 tbody 插入阴影不起作用

javascript - Chrome扩展异步问题

java - 无法解析符号 'Spinner'

android BuildConfig.BUILD_TYPE 始终处于发布状态

ios - Swift - 这段代码是错误的还是我应该使用 UserDefaults?

android - 如何指定 Get-Request 编码(Retrofit + OkHttp)

android - 在微调项中显示列表数组以替换可绘制图像如何实现

ios - 在 sprite kit 中使用渐变效果将 fps 从 60 降低到 30