Add integration guides and update API documentation with new Android diagnostic methods. Emphasize critical NotifyReceiver registration requirement that was causing notification delivery failures. Documentation Updates: - API.md: Document isAlarmScheduled(), getNextAlarmTime(), testAlarm() - README.md: Add Quick Integration section and Android diagnostic methods - notification-testing-procedures.md: Add BroadcastReceiver troubleshooting New Integration Guides: - QUICK_INTEGRATION.md: Step-by-step guide for human developers - AI_INTEGRATION_GUIDE.md: Machine-readable guide with verification steps - TODO.md: Task tracking for pending improvements Key Improvements: - Explicit NotifyReceiver registration requirement highlighted - Complete troubleshooting flow for BroadcastReceiver issues - Diagnostic method examples for debugging alarm scheduling - AI-friendly integration instructions with verification commands Fixes notification delivery issues caused by missing NotifyReceiver registration in host app AndroidManifest.xml files.
7.4 KiB
Daily Notification Plugin - Quick Integration Guide
Author: Matthew Raymer
Version: 2.2.0
Last Updated: 2025-11-06
Overview
This guide provides a quick, step-by-step process for integrating the Daily Notification Plugin into any Capacitor application. For detailed documentation, see README.md and API.md.
For AI Agents: See AI_INTEGRATION_GUIDE.md for explicit, machine-readable integration instructions with verification steps and error handling.
Prerequisites
- Capacitor 6.0+ project
- Android Studio (for Android development)
- Xcode 14+ (for iOS development)
- Node.js 18+
Step 1: Install the Plugin
npm install @timesafari/daily-notification-plugin
Or install from Git:
npm install git+https://github.com/timesafari/daily-notification-plugin.git
Step 2: Sync Capacitor
npx cap sync android
npx cap sync ios
Step 3: Android Configuration
3.1 Update AndroidManifest.xml
⚠️ CRITICAL: You must add the NotifyReceiver registration to your app's AndroidManifest.xml. Without it, alarms will fire but notifications won't be displayed.
Add to android/app/src/main/AndroidManifest.xml:
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Required permissions -->
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" />
<uses-permission android:name="android.permission.USE_EXACT_ALARM" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<application>
<!-- ... your existing application components ... -->
<!-- Daily Notification Plugin Receivers -->
<!-- REQUIRED: NotifyReceiver for AlarmManager-based notifications -->
<receiver
android:name="com.timesafari.dailynotification.NotifyReceiver"
android:enabled="true"
android:exported="false">
</receiver>
<!-- BootReceiver for reboot recovery (optional but recommended) -->
<receiver
android:name="com.timesafari.dailynotification.BootReceiver"
android:enabled="true"
android:exported="false">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
</application>
</manifest>
3.2 Update build.gradle (if needed)
The plugin should work with standard Capacitor setup. If you encounter dependency issues, ensure these are in android/app/build.gradle:
dependencies {
// ... your existing dependencies ...
// Plugin dependencies (usually auto-added by Capacitor sync)
implementation "androidx.room:room-runtime:2.6.1"
implementation "androidx.work:work-runtime-ktx:2.9.0"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3"
annotationProcessor "androidx.room:room-compiler:2.6.1"
}
Step 4: iOS Configuration
4.1 Update Info.plist
Add to ios/App/App/Info.plist:
<key>UIBackgroundModes</key>
<array>
<string>background-app-refresh</string>
<string>background-processing</string>
</array>
<key>BGTaskSchedulerPermittedIdentifiers</key>
<array>
<string>com.timesafari.dailynotification.content-fetch</string>
<string>com.timesafari.dailynotification.notification-delivery</string>
</array>
4.2 Enable Capabilities
In Xcode:
- Select your app target
- Go to "Signing & Capabilities"
- Enable "Background Modes"
- Check "Background App Refresh" and "Background Processing"
Step 5: Use the Plugin
Basic Usage
import { DailyNotification } from '@timesafari/daily-notification-plugin';
// Configure the plugin
await DailyNotification.configure({
storage: 'tiered',
ttlSeconds: 1800,
enableETagSupport: true
});
// Schedule a daily notification
await DailyNotification.scheduleDailyNotification({
title: 'Daily Update',
body: 'Your daily content is ready',
schedule: '0 9 * * *' // 9 AM daily (cron format)
});
Request Permissions
// Check permissions
const status = await DailyNotification.checkPermissions();
console.log('Notification permission:', status.notifications);
// Request permissions
if (status.notifications !== 'granted') {
await DailyNotification.requestPermissions();
}
Schedule a Simple Reminder
// Schedule a static daily reminder (no network required)
await DailyNotification.scheduleDailyReminder({
id: 'morning_checkin',
title: 'Good Morning!',
body: 'Time to check your updates',
time: '09:00', // HH:mm format
sound: true,
vibration: true,
priority: 'normal'
});
Diagnostic Methods (Android)
// Check if an alarm is scheduled
const result = await DailyNotification.isAlarmScheduled({
triggerAtMillis: scheduledTime
});
console.log('Alarm scheduled:', result.scheduled);
// Get next alarm time
const nextAlarm = await DailyNotification.getNextAlarmTime();
if (nextAlarm.scheduled) {
console.log('Next alarm:', new Date(nextAlarm.triggerAtMillis));
}
// Test alarm delivery (schedules alarm for 10 seconds from now)
await DailyNotification.testAlarm({ secondsFromNow: 10 });
Step 6: Verify Installation
Check Plugin Registration
// Verify plugin is available
if (window.Capacitor?.Plugins?.DailyNotification) {
console.log('✅ Plugin is registered');
} else {
console.error('❌ Plugin not found');
}
Test Notification
// Schedule a test notification for 10 seconds from now
await DailyNotification.testAlarm({ secondsFromNow: 10 });
// Or schedule a regular notification
await DailyNotification.scheduleDailyReminder({
id: 'test',
title: 'Test Notification',
body: 'This is a test',
time: new Date(Date.now() + 60000).toTimeString().slice(0, 5) // 1 minute from now
});
Troubleshooting
Notifications Not Appearing
- Check NotifyReceiver Registration: Verify
NotifyReceiveris in yourAndroidManifest.xml(see Step 3.1) - Check Permissions: Ensure notification permissions are granted
- Check Logs: Use ADB to check logs:
adb logcat | grep -E "DNP-|NotifyReceiver|Notification" - Use Diagnostic Methods: Use
isAlarmScheduled()andgetNextAlarmTime()to verify alarms
Common Issues
Android: "Alarm fires but notification doesn't appear"
- Solution: Ensure
NotifyReceiveris registered in your app'sAndroidManifest.xml(not just the plugin's manifest)
Android: "Permission denied" errors
- Solution: Request
POST_NOTIFICATIONSandSCHEDULE_EXACT_ALARMpermissions
iOS: Background tasks not running
- Solution: Ensure Background Modes are enabled in Xcode capabilities
Plugin not found
- Solution: Run
npx cap syncand rebuild the app
Next Steps
- Read the API Reference for complete method documentation
- Check README.md for advanced usage examples
- Review docs/notification-testing-procedures.md for testing guidance
Support
For issues or questions:
- Check the troubleshooting section above
- Review the API documentation
- Check docs/notification-testing-procedures.md for debugging steps