如何针对华为特定用户代理进行定位

4

我一直在尝试找到一种针对华为移动设备的方法,以便将它们重定向到华为应用商店,但似乎找不到解决方案。 我目前想到的一个解决方案是编写正则表达式来检查从 navigator.userAgent 对象返回的字符串中是否包含 HUAWEI | Huawei | huawei ,但我不确定它是否适用于所有这些设备,即使这就是我查看这些 示例userAgents 后得出的结论。

是否有模拟器或类似 browserstack 的工具可以尝试此操作?

4个回答

8
您可以查询用户代理以确定当前设备是否为华为手机。
目前,华为浏览器根据HMS或GMS设备类型提供UA。以下是示例(浏览器版本号、HMS版本号、GMS版本号和设备信息将相应更改):
1. HMS和GMS都已安装。以下是示例:
Mozilla/5.0(Linux;Android 6.0.1;LYA-AL00;HMSCore / 4.0.0 GMS / 10.4)AppleWebKit / 537.36(KHTML,like Gecko)Chrome / 70.0.3538.64 HuaweiBrowser / 10.0.3.102 Mobile Safari / 537.36
2.仅安装了HMS,则以下是示例:
Mozilla/5.0(Linux;Android 6.0.1;LYA-AL00;HMSCore / 4.0.0)AppleWebKit / 537.36(KHTML,like Gecko)Chrome / 70.0.3538.64 HuaweiBrowser / 10.0.3.102 Mobile Safari / 537.36
3.仅安装了GMS,则以下是示例:
Mozilla/5.0(Linux;Android 6.0.1;LYA-AL00;GMS / 10.4)AppleWebKit / 537.36(KHTML,like Gecko)Chrome / 70.0.3538.64 HuaweiBrowser / 10.0.3.102 Mobile Safari / 537.36
4.没有HMS或GMS。以下是示例:
Mozilla/5.0(Linux;Android 6.0.1;LYA-AL00)AppleWebKit / 537.36(KHTML,like Gecko)Chrome / 70.0.3538.64 HuaweiBrowser / 10.0.3.102 Mobile Safari / 537.36

这看起来不错,但为了确保我们获取到华为设备,我认为应该检查设备型号的userAgent,对于上面的情况,设备型号应该是“LYA-AL00”..所以应该有一个polyfill或类似的东西吗? - Kolyo Peev
你好,Кольо Пеев,你可以从 ro.product.brand 获取品牌信息,通常情况下该值将是华为或荣耀,适用于华为手机。 - zhangxaochen
2
@Кольо Пеев,如果是关于检查应用商店兼容性的问题,这是一个非常好的答案,因为如果您可以确保手机具有HMSCore而不是GMS,则应重定向到应用库而不是Google Play。 - ceyquem

2

我不知道如何针对特定类型的手机进行定位,但是你可以测试用户代理字符串:

/**
 * Determine the mobile operating system.
 * This function returns one of 'iOS', 'Android', 'Windows Phone', or 'unknown'.
 *
 * @returns {String}
 */
function getMobileOperatingSystem() {
  var userAgent = navigator.userAgent || navigator.vendor || window.opera;

      // Windows Phone must come first because its UA also contains "Android"
    if (/windows phone/i.test(userAgent)) {
        return "Windows Phone";
    }

    if (/android/i.test(userAgent)) {
        return "Android";
    }

    // iOS detection from: https://dev59.com/EGox5IYBdhLWcg3wr2To#9039885
    if (/iPad|iPhone|iPod/.test(userAgent) && !window.MSStream) {
        return "iOS";
    }

    return "unknown";
}

0

这个解决方案在我的nginx服务器上运行良好。我创建了一个PC下载页面/download/。在链接/downloads/中,服务器会将用户重定向。

  location /downloads/ {
    if ($http_user_agent ~* '(iPhone|iPod|blackberry)') {
      return 301 https://apps.apple.com/us/app/man-errors/id1581826209;
          }

    if ($http_user_agent ~* '(huawei)') {
      return 301 https://appgallery.huawei.com/app/C105589651;
          }

    if ($http_user_agent ~* '(android)') {
      return 301 https://play.google.com/store/apps/details?id=com.manerrors.truck;
          }
    return 301 /download/;
  }

0

最简单和最短的检查方法:(不包括平板电脑)

navigator.userAgent.match(/"ALP-"|"AMN-"|"ANA-"|"ANE-"|"ANG-"|"AQM-"|"ARS-"|"ART-"|"ATU-"|"BAC-"|"BLA-"|"BRQ-"|"CAG-"|"CAM-"|"CAN-"|"CAZ-"|"CDL-"|"CDY-"|"CLT-"|"CRO-"|"CUN-"|"DIG-"|"DRA-"|"DUA-"|"DUB-"|"DVC-"|"ELE-"|"ELS-"|"EML-"|"EVA-"|"EVR-"|"FIG-"|"FLA-"|"FRL-"|"GLK-"|"HMA-"|"HW-"|"HWI-"|"INE-"|"JAT-"|"JEF-"|"JER-"|"JKM-"|"JNY-"|"JSC-"|"LDN-"|"LIO-"|"LON-"|"LUA-"|"LYA-"|"LYO-"|"MAR-"|"MED-"|"MHA-"|"MLA-"|"MRD-"|"MYA-"|"NCE-"|"NEO-"|"NOH-"|"NOP-"|"OCE-"|"PAR-"|"PIC-"|"POT-"|"PPA-"|"PRA-"|"RNE-"|"SEA-"|"SLA-"|"SNE-"|"SPN-"|"STK-"|"TAH-"|"TAS-"|"TET-"|"TRT-"|"VCE-"|"VIE-"|"VKY-"|"VNS-"|"VOG-"|"VTR-"|"WAS-"|"WKG-"|"WLZ-"|"YAL"/i)

此方法使用前缀和破折号作为指纹,从提供在this github repo.的设备ID列表中检测华为设备。

例如:华为P Smart 2019设备ID:"POT-LX1AF","POT-LX2J","POT-LX1RUA","POT-LX3"列表,但使用POT-进行检测。 注意:我们假设这个前缀是华为唯一的。如果具有相同前缀的不同品牌的设备发送设备ID,也将被视为华为。

关于“HUAWEI”字符串检查方法的说明,检查此字符串并不能保证设备是华为。

如果访问者使用第三方浏览器,如Chrome,则发送的用户代理不包含此字符串。当访问者来自应用内浏览器视图时,例如Twitter或Instagram(当您单击这些应用程序中的链接时,网站会在Web视图中打开)。它还随着一些应用程序的访问而发送,例如Petal Search应用程序(华为的官方搜索引擎应用程序)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接