UNPKG

progresspulse-pwa

Version:

A modern PWA for tracking progress and achieving goals with iPhone-style design

274 lines (223 loc) 8.31 kB
# APK Deployment Guide for ProgressPulse ## Issues Fixed ### 🔔 Push Notifications Not Working in APK **Problem**: Push notifications stop working when app is converted to APK **Root Cause**: Service worker registration and Firebase configuration issues in APK environment **Solutions Applied**: 1. **Enhanced Service Worker Registration** - Added proper service worker registration in `pwa-init.ts` - Added fallback registration methods - Enhanced Firebase messaging service worker with APK-specific settings 2. **Firebase Configuration Updates** - Updated `firebase-messaging-sw.js` with enhanced APK support - Added proper error handling and fallbacks - Added vibration and enhanced notification options 3. **Manifest Updates** - Created `manifest.json` with proper permissions - Added `gcm_sender_id` for Firebase messaging - Added notification permissions ### 🔐 Fingerprint Authentication Not Working in APK **Problem**: WebAuthn/Fingerprint setup fails in APK environment **Root Cause**: WebAuthn API differences in WebView vs native browser **Solutions Applied**: 1. **Enhanced WebAuthn Detection** - Added proper platform authenticator detection - Added fallback for older WebView versions - Enhanced error handling for APK environment 2. **Improved Credential Creation** - Added proper challenge generation using `crypto.getRandomValues()` - Added multiple algorithm support (ES256, RS256) - Added proper RP ID configuration for APK environment - Increased timeout to 60 seconds for mobile devices 3. **Better Error Handling** - Added specific error messages for APK environment - Added fallback authentication methods - Improved user feedback ## Deployment Steps ### 1. Build for Production ```bash npm run build ``` ### 2. Test PWA Features Before converting to APK, test these features in browser: - Push notifications permission - Service worker registration - Fingerprint authentication setup - Offline functionality ### 3. APK Conversion Tools #### Option A: PWA Builder (Recommended) 1. Go to https://www.pwabuilder.com/ 2. Enter your PWA URL 3. Download Android package 4. Sign and distribute #### Option B: Capacitor ```bash npm install @capacitor/core @capacitor/cli npx cap init npx cap add android npx cap copy npx cap open android ``` #### Option C: Cordova ```bash npm install -g cordova cordova create progresspulse cordova platform add android cordova build android ``` ### 4. APK-Specific Configuration #### Android Manifest Permissions Add to `android/app/src/main/AndroidManifest.xml`: ```xml <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.USE_FINGERPRINT" /> <uses-permission android:name="android.permission.USE_BIOMETRIC" /> <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> ``` #### WebView Configuration Add to `MainActivity.java` or `MainActivity.kt`: ```java // Enable JavaScript webView.getSettings().setJavaScriptEnabled(true); // Enable DOM storage webView.getSettings().setDomStorageEnabled(true); // Enable database webView.getSettings().setDatabaseEnabled(true); // Enable geolocation webView.getSettings().setGeolocationEnabled(true); // Allow mixed content (for HTTPS/HTTP) webView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); ``` ## Testing in APK Environment ### 1. Push Notifications ```javascript // Test push notification registration const testPushNotifications = async () => { try { const permission = await Notification.requestPermission(); console.log('Permission:', permission); if (permission === 'granted') { const registration = await navigator.serviceWorker.ready; console.log('Service Worker ready:', registration); // Test notification registration.showNotification('Test Notification', { body: 'Push notifications are working!', icon: '/pwa-192x192.png', vibrate: [200, 100, 200] }); } } catch (error) { console.error('Push notification test failed:', error); } }; ``` ### 2. Fingerprint Authentication ```javascript // Test biometric authentication const testBiometric = async () => { try { const isSupported = await navigator.credentials.isUserVerifyingPlatformAuthenticatorAvailable(); console.log('Biometric supported:', isSupported); if (isSupported) { // Test credential creation const credential = await navigator.credentials.create({ publicKey: { challenge: crypto.getRandomValues(new Uint8Array(32)), rp: { name: 'ProgressPulse', id: window.location.hostname }, user: { id: new TextEncoder().encode('test-user'), name: 'test-user', displayName: 'Test User' }, pubKeyCredParams: [{ alg: -7, type: 'public-key' }], authenticatorSelection: { authenticatorAttachment: 'platform', userVerification: 'required' }, timeout: 60000 } }); console.log('Biometric setup successful:', credential); } } catch (error) { console.error('Biometric test failed:', error); } }; ``` ## Troubleshooting Common Issues ### Issue 1: Service Worker Not Registering **Symptoms**: Push notifications don't work, offline features fail **Solutions**: - Check if `firebase-messaging-sw.js` is accessible - Verify HTTPS context (required for service workers) - Check browser console for registration errors ### Issue 2: WebAuthn Fails in WebView **Symptoms**: Fingerprint setup throws errors **Solutions**: - Ensure WebView supports WebAuthn API - Check if device has biometric hardware - Verify secure context (HTTPS or localhost) ### Issue 3: Notifications Not Showing **Symptoms**: Notifications permission granted but no notifications appear **Solutions**: - Check Android notification settings for the app - Verify Firebase configuration - Test with simple notification first ### Issue 4: App Crashes on Startup **Symptoms**: APK crashes when opened **Solutions**: - Check WebView version compatibility - Verify all required permissions are granted - Check for JavaScript errors in WebView console ## Performance Optimization for APK ### 1. Reduce Bundle Size ```bash # Analyze bundle npm run build -- --analyze # Use dynamic imports for large components const LazyComponent = lazy(() => import('./LargeComponent')); ``` ### 2. Optimize Images - Use WebP format for better compression - Implement lazy loading for images - Use appropriate image sizes for mobile ### 3. Cache Strategy - Implement proper service worker caching - Use IndexedDB for offline data storage - Minimize network requests ## Security Considerations ### 1. Content Security Policy Add to `index.html`: ```html <meta http-equiv="Content-Security-Policy" content=" default-src 'self'; script-src 'self' 'unsafe-inline' https://www.gstatic.com; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; connect-src 'self' https://fcm.googleapis.com; "> ``` ### 2. Secure Storage - Use encrypted storage for sensitive data - Implement proper session management - Validate all user inputs ## Final Checklist Before releasing APK: - [ ] Push notifications working - [ ] Fingerprint authentication working - [ ] Offline functionality working - [ ] All permissions properly configured - [ ] App tested on multiple Android versions - [ ] Performance optimized - [ ] Security measures implemented - [ ] Error handling robust - [ ] User experience smooth ## Support If you encounter issues: 1. Check browser console for errors 2. Test in Chrome DevTools mobile emulation 3. Verify all configuration files are correct 4. Test on actual Android device before APK conversion