Определить, установлен ли WhatsApp - PullRequest
5 голосов
/ 07 января 2020

Используя Android или браузер на рабочем столе, перейдите на тестовую страницу WhatsApp и нажмите кнопку Send. Если WhatsApp не установлен, он покажет вам сообщение.

Как работает обнаружение кода на этой странице? Я попробовал следующее, но ничего не происходит.

try {
  location.href = 'whatsapp://send/?phone=62812345678&text=test';
} catch (e) {
  console.log(e);
}

Ответы [ 3 ]

8 голосов
/ 07 января 2020

Глядя на страницу, кажется, что, по крайней мере, на Chrome они программно открывают iframe с sr c, равным whatsapp://send/?phone=<number>&text=test. Затем они запускают тайм-аут 1000 мс, после чего «Похоже, у вас не установлен WhatsApp!» текст отображается. Этот тайм-аут отменяется обработчиком событий blur, что означает, что их проверка основана на открытии WhatsApp вашего устройства при загрузке этого URL, что приводит к размытию окна.

При IE они используют window.navigator.msLaunchUri, который принимает noHandlerCallback.

Убедитесь сами, открыв devtools вашего браузера и выполнив поиск WhatsAppApiOpenUrl. На Chrome Поиск можно найти из меню devtools:

screenshot of where the Search tool can be found in Chrome's devtools

Редактировать : Вот пример кода. Я с трудом заставляю iframe фактически запускать WhatsApp на мобильном устройстве в CodeSandbox, , но я надеюсь, что неработающий пример все еще немного помогает. - См. Более позднее редактирование рабочего примера, Посмотрите, работает ли он у вас локально.

const detectWhatsapp = (phone, text) => {
  const uri = `whatsapp://send/?phone=${encodeURIComponent(
    phone
  )}&text=${encodeURIComponent(text)}`

  const onIE = () => {
    return new Promise(resolve => {
      window.navigator.msLaunchUri(
        uri,
        () => resolve(true),
        () => resolve(false)
      )
    })
  }

  const notOnIE = () => {
    return new Promise(resolve => {
      const frame = document.createElement('iframe')
      frame.style.display = 'none'
      document.body.appendChild(frame)
      frame.src = uri

      const start = Date.now()
      const timeoutToken = setTimeout(() => {
        if (Date.now() - start > 1250) {
          resolve(true)
        } else {
          resolve(false)
        }
      }, 1000)

      const handleBlur = () => {
        clearTimeout(timeoutToken)
        resolve(true)
      }
      window.addEventListener('blur', handleBlur)
    })
  }

  return window.navigator.msLaunchUri ? onIE() : notOnIE()
}

РЕДАКТИРОВАТЬ 2: Эта версия notOnIE создает элемент привязки и щелкает по нему программно. Эта версия работает для меня в CodeSandbox.

Обратите внимание, что, как и в предыдущем примере, эта программа добавляет прослушиватель событий при каждом вызове. Если вы внедряете это в производство, используйте window.removeEventListener, чтобы удалить handleBlur после того, как обещание будет выполнено. Он также создает узел DOM, если это важно для вас.

const notOnIE = () => {
  return new Promise(resolve => {
    const a =
      document.getElementById('wapp-launcher') || document.createElement('a')
    a.id = 'wapp-launcher'
    a.href = uri
    a.style.display = 'none'
    document.body.appendChild(a)

    const start = Date.now()
    const timeoutToken = setTimeout(() => {
      if (Date.now() - start > 1250) {
        resolve(true)
      } else {
        resolve(false)
      }
    }, 1000)

    const handleBlur = () => {
      clearTimeout(timeoutToken)
      resolve(true)
    }
    window.addEventListener('blur', handleBlur)

    a.click()
  })
}

Пример использования:

detectWhatsapp('<your number here>', 'test').then(hasWhatsapp =>
  alert('You ' + hasWhatsapp ? "don't have WhatsApp" : 'have WhatsApp')
)
1 голос
/ 07 января 2020

Здесь мое тестирование на Android:

  • Built-in Browser (Webview) and Firefox если установлен WA. Вы можете использовать iframe для автоматического открытия WhatsApp

  • Chrome and Opera Требуется действие щелчка пользователя

но, к счастью, мне нужен только этот простой код, чтобы определить, установлен ли WhatsApp

document.querySelector('#openWA').addEventListener('click', function() {
  var f = Date.now(),
    j = setTimeout(function() {
      if (Date.now() - f > 1250)
        return;
      alert('WA not installed')
    }, 1e3);
})
<a href="whatsapp://send/?phone=62812345678&amp;text=test" id="openWA">Send to WhatsApp</button>

<!-- Auto open on WebView and Firefox -->
<iframe id="launcher" src="whatsapp://send/?phone=62812345678&amp;text=test" style="display: none;"></iframe>
0 голосов
/ 15 апреля 2020

Если у вас есть jquery, основываясь на приведенном выше коде, если приложение whats не открывается, откройте новую страницу с помощью веб-сайта WhatsApp вместо запуска iframe:

$('a[href^="whatsapp://send?"]').click(function() {
    var button = this,
     f = Date.now(),
    j = setTimeout(function() {
        if (Date.now() - f > 1025){
            return;
        }else{
            var newLink = button.getAttribute('href').replace("whatsapp://send?", "https://web.whatsapp.com/send?");
            button.setAttribute('href', newLink); 
            button.setAttribute('target', "_blank"); 
            $(button).closest('div').append('<a class="hide new" href="' + newLink + '" target="_blank" ></a>');
            $(button).closest('div').find('a.new')[0].click();
        }
    }, 1e3);        

})  
...