Cordova 深层链接 - 未从通用链接中检测到查询参数

Posted

技术标签:

【中文标题】Cordova 深层链接 - 未从通用链接中检测到查询参数【英文标题】:Cordova deeplinks - query parameter not detected from Universal Links 【发布时间】:2019-10-21 19:08:06 【问题描述】:

我正在尝试使用 ionic-plugin-deeplinks 插件将通用链接添加到 Cordova 应用程序。

根据this issue,查询参数应该是开箱即用的。

我的通用链接除了带有查询参数的链接外都能正常工作

例如。 https://my-site.com/?olddeeplinking=resetpassword&token=123

当我单击电子邮件中的链接时,queryString 字段始终为空字符串

我是否遗漏了什么,是否需要启用插件来检测查询参数?

这是我正在使用的代码:

const deepLinkRoutes = 
  '/user/login': 
    action: 'showLogin',
    resetUrl: '/',
  ,
  '/user/forgot-password': 
    action: 'showForgotPassword',
    resetUrl: '/',
  ,
  ...
;

export const _getIonicRoutes = () => Object.keys(deepLinkRoutes)
  .reduce((links, route) => 
    links[route] =  target: '', parent: '' ;
    return links;
  , );

export const handleUniversalLinks = () => 
  const ionicRoutes = _getIonicRoutes();
  const sy = obj => JSON.stringify(obj);
  const matchFn = ( $link, $route, $args ) => 
    console.log('Successfully matched route', $link, $route, $args);
    alert(`Successfully matched route: $sy($link), $sy($route), $sy($args)`);
    return history.push($link.path);
  ;
  const noMatchFn = ( $link, $route, $args ) => 
    console.log('NOT Successfully matched route', $link, $route, $args);
    alert(`NOT Successfully matched route: $sy($link), $sy($route), $sy($args)`);
    return history.push($link.path);
  ;
  window.IonicDeeplink.route(ionicRoutes, matchFn, noMatchFn);
;

更新: 看起来在 android 上收到的意图总是 /user/login 即使通用链接没有它。可能是什么原因造成的?

2019-10-21 17:22:47.107 30389-30389/? D/MessageViewGestureDetector: HitTestResult type=7, extra=https://nj.us.gpd.my_company-dev.com/user/login 2019-10-21 17:22:47.139 1128-1183/? I/ActivityManager: START u0 act=android.intent.action.VIEW dat=https://nj.us.gpd.williamhill-dev.com/... cmp=us.my_company.nj.sports.gpd/.MainActivity from uid 10147

【问题讨论】:

我会给帮助我解决这个问题的人提供 100 赏金。谢谢 更新:问题只是电子邮件中的所有链接都是从一个链接复制并编辑的。我生命中的 4 小时永远不会回来。需要睡觉。 【参考方案1】:

一条线索:

看起来 deeplinks 插件正在使用window.location.href 来检测查询参数。

由于我使用的是cordova-plugin-ionic-webview,href 始终是为应用程序内容提供服务的 Ionic 引擎的 localhost 的别名,因此永远找不到查询参数。

Deeplinks 插件代码:

https://github.com/ionic-team/ionic-plugin-deeplinks/blob/master/src/browser/DeeplinkProxy.js#L40

function locationToData(l) 
  return 
    url: l.href,
    path: l.pathname,
    host: l.hostname,
    fragment: l.hash,
        scheme: parseSchemeFromUrl(l.href),
        queryString: parseQueryStringFromUrl(l.href)
  


onDeepLink: function(callback) 
  // Try the first deeplink route
  setTimeout(function() 
    callback && callback(locationToData(window.location), 
      keepCallback: true
    );
  )
  // ...

这是问题所在,但尚不确定解决方案。

【讨论】:

我在应用启动时添加了一个alert(window.location.href),而href 正是Ionic 引擎使用的别名。 $link 参数虽然来自被点击的链接。这怎么可能?它正在使用 window.location.href .. 混淆)。那么为什么它无法从 href 中找到查询参数呢? :( 查看我在该问题下的最后评论。从来没有问题。

以上是关于Cordova 深层链接 - 未从通用链接中检测到查询参数的主要内容,如果未能解决你的问题,请参考以下文章

branch.io 深层链接 URL 未从 Facebook 广告在应用程序中传递数据

如何避免在cordova android应用程序上处理两次深层链接?

iOS 上的通用链接与深层链接(URL 方案)

向科尔多瓦应用程序添加深层链接

如何在iOS中为twitter和Facebook实现通用深层链接?

如何在 Cordova 应用程序中添加带有内容的通用链接