entregas_app/docs/CORRECAO_APLICATIVOS_EXTERN...

6.5 KiB

Correção para Abertura de Aplicativos Externos no Android

Problema Identificado

No Android, quando o usuário clicava nos botões de WhatsApp e Waze, recebia as mensagens:

  • "Erro não foi possível abrir o aplicativo"
  • "Erro Não foi possível abrir o WhatsApp"

Causa do Problema

O Android 11+ introduziu restrições mais rigorosas para abrir aplicativos externos através do sistema de "Package Visibility". A partir desta versão, os apps precisam declarar explicitamente quais aplicativos externos podem ser abertos.

Soluções Implementadas

1. Atualização do AndroidManifest.xml

Adicionadas as seguintes configurações no android/app/src/main/AndroidManifest.xml:

<!-- Permissões para abrir aplicativos externos -->
<queries>
  <!-- URLs HTTPS e HTTP -->
  <intent>
    <action android:name="android.intent.action.VIEW"/>
    <category android:name="android.intent.category.BROWSABLE"/>
    <data android:scheme="https"/>
  </intent>
  <intent>
    <action android:name="android.intent.action.VIEW"/>
    <category android:name="android.intent.category.BROWSABLE"/>
    <data android:scheme="http"/>
  </intent>
  
  <!-- Protocolos específicos -->
  <intent>
    <action android:name="android.intent.action.VIEW"/>
    <category android:name="android.intent.category.BROWSABLE"/>
    <data android:scheme="whatsapp"/>
  </intent>
  <intent>
    <action android:name="android.intent.action.VIEW"/>
    <category android:name="android.intent.category.BROWSABLE"/>
    <data android:scheme="waze"/>
  </intent>
  <intent>
    <action android:name="android.intent.action.VIEW"/>
    <category android:name="android.intent.category.BROWSABLE"/>
    <data android:scheme="tel"/>
  </intent>
  <intent>
    <action android:name="android.intent.action.VIEW"/>
    <category android:name="android.intent.category.BROWSABLE"/>
    <data android:scheme="telprompt"/>
  </intent>
  <intent>
    <action android:name="android.intent.action.VIEW"/>
    <category android:name="android.intent.category.BROWSABLE"/>
    <data android:scheme="geo"/>
  </intent>
  <intent>
    <action android:name="android.intent.action.VIEW"/>
    <category android:name="android.intent.category.BROWSABLE"/>
    <data android:scheme="maps"/>
  </intent>
  <intent>
    <action android:name="android.intent.action.VIEW"/>
    <category android:name="android.intent.category.BROWSABLE"/>
    <data android:scheme="intent"/>
  </intent>
  
  <!-- Pacotes específicos -->
  <package android:name="com.whatsapp"/>
  <package android:name="com.waze"/>
  <package android:name="com.google.android.apps.maps"/>
</queries>

2. Melhoria nas Funções de Abertura de Apps

WhatsApp (openWhatsApp)

  • URLs mais abrangentes: Adicionadas múltiplas variações de URLs
  • Protocolos alternativos: Incluídos intent:// para Android
  • Fallback para Play Store: Se o app não estiver instalado, oferece instalação
  • Timeout: Implementado timeout de 5 segundos para evitar travamentos
const whatsappUrls = [
  // URLs com protocolo whatsapp:// (mais confiáveis)
  `whatsapp://send?phone=${cleanNumber}&text=${encodeURIComponent(message)}`,
  `whatsapp://send?phone=${cleanNumber.replace('+', '')}&text=${encodeURIComponent(message)}`,
  
  // URLs com https://wa.me/ (fallback web)
  `https://wa.me/${cleanNumber.replace('+', '')}?text=${encodeURIComponent(message)}`,
  `https://wa.me/${cleanNumber}?text=${encodeURIComponent(message)}`,
  
  // URLs alternativas para Android
  `intent://send/${cleanNumber.replace('+', '')}#Intent;scheme=smsto;package=com.whatsapp;S.sms_body=${encodeURIComponent(message)};end`,
  `intent://send/${cleanNumber}#Intent;scheme=smsto;package=com.whatsapp;S.sms_body=${encodeURIComponent(message)};end`,
  
  // URLs com formato mais simples
  `whatsapp://send?phone=${cleanNumber.replace('+', '')}`,
  `whatsapp://send?phone=${cleanNumber}`,
];

Navegação (openNavigationApp)

  • Múltiplas URLs por app: Cada app de navegação tem várias opções de URL
  • Protocolos específicos: waze://, geo:, maps://
  • Intent URLs: URLs com formato intent:// para Android
  • Fallback inteligente: Se o app não estiver instalado, oferece instalação
// Exemplo para Waze
urls = [
  // URLs com protocolo waze:// (mais confiáveis)
  `waze://?q=${encodedAddress}&navigate=yes`,
  `waze://?ll=${latitude},${longitude}&navigate=yes`,
  
  // URLs com https://waze.com/ (fallback web)
  `https://waze.com/ul?q=${encodedAddress}&navigate=yes`,
  `https://waze.com/ul?ll=${latitude},${longitude}&navigate=yes`,
  
  // URLs com intent:// para Android
  `intent://waze.com/ul?q=${encodedAddress}&navigate=yes#Intent;scheme=https;package=com.waze;end`,
  `intent://waze.com/ul?ll=${latitude},${longitude}&navigate=yes#Intent;scheme=https;package=com.waze;end`,
];

3. Tratamento de Erros Melhorado

  • Timeout: Implementado timeout de 5 segundos para evitar travamentos
  • Fallback para Play Store: Se o app não estiver instalado, oferece instalação
  • Logs detalhados: Logs para debug de cada tentativa
  • Alertas informativos: Mensagens claras para o usuário

4. Correção de Linter

  • Propriedades faltantes: Adicionadas latFrom e lngFrom no tipo Delivery
  • Compatibilidade: Garantida compatibilidade com a interface Delivery

Como Testar

1. Build de Produção

npx expo run:android --variant release

2. Cenários de Teste

  • WhatsApp instalado: Deve abrir o WhatsApp com a mensagem
  • WhatsApp não instalado: Deve oferecer instalação na Play Store
  • Waze instalado: Deve abrir o Waze com a rota
  • Waze não instalado: Deve oferecer instalação na Play Store
  • Google Maps: Deve abrir o Google Maps com a rota

3. Logs de Debug

Os logs detalhados ajudarão a identificar qual URL funcionou:

=== DEBUG: ABRINDO WHATSAPP ===
Número original: +55 91 99999-9999
Número formatado: +5591999999999
URLs para tentar: [...]
Tentativa 1: whatsapp://send?phone=+5591999999999&text=...
URL 1 suportada: whatsapp://send?phone=+5591999999999&text=...

Compatibilidade

  • Android 11+
  • Android 10 e anteriores
  • iOS (mantida compatibilidade)
  • Expo SDK 53

Referências