entregas_app/docs/CORRECAO_APLICATIVOS_EXTERN...

171 lines
6.5 KiB
Markdown
Raw Normal View History

# 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`:
```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
```typescript
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
```typescript
// 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
```bash
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
- [Android Package Visibility](https://developer.android.com/training/package-visibility)
- [React Native Linking](https://reactnative.dev/docs/linking)
- [WhatsApp Business API](https://developers.facebook.com/docs/whatsapp/cloud-api/reference/phone-numbers)
- [Waze URL Scheme](https://developers.google.com/waze/deep-links)