6.5 KiB
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
latFromelngFromno tipoDelivery - 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