feat(ios): create iOS test app structure and synchronization documentation
Created standalone iOS test app structure matching android-test-app: - Added ios-test-app directory with README, setup guide, and build scripts - Created comprehensive iOS synchronization status documentation - Documented API method gaps between Android (52) and iOS (9 methods) - Added iOS setup guide for Vue 3 test app New files: - test-apps/ios-test-app/ - Standalone iOS test app structure - docs/IOS_SYNC_STATUS.md - Detailed API comparison and status tracking - docs/IOS_SYNC_SUMMARY.md - Summary of iOS synchronization work - test-apps/daily-notification-test/docs/IOS_SETUP.md - Vue app iOS setup iOS test environments are now ready for setup. Test apps need Xcode project generation via Capacitor CLI or copying from ios/App. Next steps: Generate Xcode projects and implement missing API methods.
This commit is contained in:
224
docs/IOS_SYNC_STATUS.md
Normal file
224
docs/IOS_SYNC_STATUS.md
Normal file
@@ -0,0 +1,224 @@
|
|||||||
|
# iOS Plugin Synchronization Status
|
||||||
|
|
||||||
|
**Author**: Matthew Raymer
|
||||||
|
**Date**: 2025-11-04
|
||||||
|
**Status**: 🟡 **IN PROGRESS**
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
This document tracks the synchronization of the iOS plugin implementation with the merged Android version, and the setup of iOS test environments.
|
||||||
|
|
||||||
|
## Current Status
|
||||||
|
|
||||||
|
### ✅ Completed
|
||||||
|
|
||||||
|
1. **iOS Plugin Compilation** - All Swift compilation errors resolved
|
||||||
|
2. **Basic Plugin Structure** - Core plugin files in place
|
||||||
|
3. **iOS Development App** - `ios/App` structure exists with basic setup
|
||||||
|
4. **Build Scripts** - Native build scripts support iOS
|
||||||
|
|
||||||
|
### 🟡 In Progress
|
||||||
|
|
||||||
|
1. **API Method Parity** - iOS plugin has fewer methods than Android
|
||||||
|
2. **Standalone Test App** - `ios-test-app` structure being created
|
||||||
|
3. **Vue Test App Integration** - `daily-notification-test` iOS module configuration
|
||||||
|
|
||||||
|
### ❌ Pending
|
||||||
|
|
||||||
|
1. **Full API Implementation** - Many Android methods not yet in iOS
|
||||||
|
2. **Test App Setup** - iOS test app needs Xcode project generation
|
||||||
|
3. **Documentation** - iOS-specific testing guides
|
||||||
|
|
||||||
|
## API Method Comparison
|
||||||
|
|
||||||
|
### Android Plugin Methods (52 total)
|
||||||
|
|
||||||
|
Core methods:
|
||||||
|
- `configure()`
|
||||||
|
- `configureNativeFetcher()`
|
||||||
|
- `scheduleDailyNotification()`
|
||||||
|
- `getNotificationStatus()`
|
||||||
|
- `checkPermissions()`
|
||||||
|
- `requestPermissions()`
|
||||||
|
- And 46 more...
|
||||||
|
|
||||||
|
### iOS Plugin Methods (9 total)
|
||||||
|
|
||||||
|
Current methods:
|
||||||
|
- `configure()`
|
||||||
|
- `scheduleContentFetch()`
|
||||||
|
- `scheduleUserNotification()`
|
||||||
|
- `scheduleDualNotification()`
|
||||||
|
- `getDualScheduleStatus()`
|
||||||
|
- `scheduleDailyReminder()`
|
||||||
|
- `cancelDailyReminder()`
|
||||||
|
- `getScheduledReminders()`
|
||||||
|
- `updateDailyReminder()`
|
||||||
|
|
||||||
|
### Missing iOS Methods
|
||||||
|
|
||||||
|
The following Android methods need iOS implementations:
|
||||||
|
|
||||||
|
**Configuration:**
|
||||||
|
- `configureNativeFetcher()` - Native fetcher configuration
|
||||||
|
- `setActiveDidFromHost()` - ActiveDid management
|
||||||
|
- `updateStarredPlans()` - Starred plans management
|
||||||
|
|
||||||
|
**Scheduling:**
|
||||||
|
- `scheduleDailyNotification()` - Main scheduling method
|
||||||
|
- `isAlarmScheduled()` - Alarm status check
|
||||||
|
- `getNextAlarmTime()` - Next alarm query
|
||||||
|
- `testAlarm()` - Test alarm functionality
|
||||||
|
|
||||||
|
**Status & Permissions:**
|
||||||
|
- `getNotificationStatus()` - Notification status
|
||||||
|
- `checkPermissionStatus()` - Permission status
|
||||||
|
- `requestNotificationPermissions()` - Permission request
|
||||||
|
- `getExactAlarmStatus()` - Exact alarm status (iOS equivalent needed)
|
||||||
|
- `openExactAlarmSettings()` - Settings opener (iOS equivalent needed)
|
||||||
|
|
||||||
|
**Content Management:**
|
||||||
|
- `getContentCache()` - Content cache access
|
||||||
|
- `clearContentCache()` - Cache clearing
|
||||||
|
- `getContentHistory()` - History access
|
||||||
|
|
||||||
|
**Database Access:**
|
||||||
|
- `getSchedules()` - Schedule queries
|
||||||
|
- `createSchedule()` - Schedule creation
|
||||||
|
- `updateSchedule()` - Schedule updates
|
||||||
|
- `deleteSchedule()` - Schedule deletion
|
||||||
|
- `getContentCacheById()` - Cache queries
|
||||||
|
- `saveContentCache()` - Cache saving
|
||||||
|
- `getConfig()` / `setConfig()` - Configuration management
|
||||||
|
- `getCallbacks()` / `registerCallbackConfig()` - Callback management
|
||||||
|
- `getHistory()` - History queries
|
||||||
|
|
||||||
|
**Power & Battery:**
|
||||||
|
- `getBatteryStatus()` - Battery status
|
||||||
|
- `getPowerState()` - Power state
|
||||||
|
- `requestBatteryOptimizationExemption()` - Battery optimization (iOS equivalent needed)
|
||||||
|
|
||||||
|
**Rolling Window:**
|
||||||
|
- `maintainRollingWindow()` - Window maintenance
|
||||||
|
- `getRollingWindowStats()` - Window statistics
|
||||||
|
|
||||||
|
**Reboot Recovery:**
|
||||||
|
- `getRebootRecoveryStatus()` - Recovery status
|
||||||
|
|
||||||
|
**Reminders:**
|
||||||
|
- All reminder methods exist ✅
|
||||||
|
|
||||||
|
**Callbacks:**
|
||||||
|
- `registerCallback()` - Callback registration
|
||||||
|
- `unregisterCallback()` - Callback unregistration
|
||||||
|
- `getRegisteredCallbacks()` - Callback listing
|
||||||
|
|
||||||
|
**Other:**
|
||||||
|
- `triggerImmediateFetch()` - Immediate fetch trigger
|
||||||
|
- `setPolicy()` - Policy configuration
|
||||||
|
- `enableNativeFetcher()` - Native fetcher enable/disable
|
||||||
|
|
||||||
|
## Test App Status
|
||||||
|
|
||||||
|
### Standalone iOS Test App (`ios-test-app`)
|
||||||
|
|
||||||
|
**Status**: 🟡 Structure created, needs Xcode project
|
||||||
|
|
||||||
|
**Files Created:**
|
||||||
|
- `README.md` - Documentation
|
||||||
|
- `SETUP.md` - Setup guide
|
||||||
|
- Directory structure prepared
|
||||||
|
|
||||||
|
**Next Steps:**
|
||||||
|
1. Generate Xcode project using Capacitor CLI or copy from `ios/App`
|
||||||
|
2. Copy test HTML interface from Android test app
|
||||||
|
3. Configure Podfile with plugin dependency
|
||||||
|
4. Create build scripts
|
||||||
|
5. Test plugin integration
|
||||||
|
|
||||||
|
### Vue 3 Test App (`daily-notification-test`)
|
||||||
|
|
||||||
|
**Status**: 🟡 iOS module exists, needs verification
|
||||||
|
|
||||||
|
**Current State:**
|
||||||
|
- iOS module exists at `test-apps/daily-notification-test/ios/` (if generated by Capacitor)
|
||||||
|
- Or uses `ios/App` from root (needs verification)
|
||||||
|
- Build script exists: `scripts/build-and-deploy-ios.sh`
|
||||||
|
|
||||||
|
**Next Steps:**
|
||||||
|
1. Verify iOS module location and structure
|
||||||
|
2. Ensure plugin is properly integrated via CocoaPods
|
||||||
|
3. Test build and run process
|
||||||
|
4. Verify plugin detection and functionality
|
||||||
|
|
||||||
|
## Synchronization Plan
|
||||||
|
|
||||||
|
### Phase 1: Test App Setup (Current)
|
||||||
|
|
||||||
|
1. ✅ Create `ios-test-app` structure
|
||||||
|
2. ✅ Create setup documentation
|
||||||
|
3. 🟡 Generate/copy Xcode project
|
||||||
|
4. 🟡 Copy test HTML interface
|
||||||
|
5. 🟡 Create build scripts
|
||||||
|
6. ❌ Test standalone app
|
||||||
|
|
||||||
|
### Phase 2: API Method Implementation
|
||||||
|
|
||||||
|
1. ❌ Implement missing configuration methods
|
||||||
|
2. ❌ Implement missing scheduling methods
|
||||||
|
3. ❌ Implement missing status/permission methods
|
||||||
|
4. ❌ Implement missing content management methods
|
||||||
|
5. ❌ Implement missing database access methods
|
||||||
|
6. ❌ Implement missing power/battery methods
|
||||||
|
7. ❌ Implement missing utility methods
|
||||||
|
|
||||||
|
### Phase 3: Testing & Verification
|
||||||
|
|
||||||
|
1. ❌ Test all implemented methods
|
||||||
|
2. ❌ Verify parity with Android
|
||||||
|
3. ❌ Update TypeScript definitions if needed
|
||||||
|
4. ❌ Create iOS-specific test cases
|
||||||
|
5. ❌ Document iOS-specific behaviors
|
||||||
|
|
||||||
|
## Platform Differences
|
||||||
|
|
||||||
|
### Android-Specific Features
|
||||||
|
|
||||||
|
- Exact Alarm permissions
|
||||||
|
- Battery optimization exemptions
|
||||||
|
- Wake locks
|
||||||
|
- Boot receivers
|
||||||
|
- WorkManager background tasks
|
||||||
|
|
||||||
|
### iOS-Specific Features
|
||||||
|
|
||||||
|
- Background App Refresh
|
||||||
|
- BGTaskScheduler
|
||||||
|
- UNUserNotificationCenter
|
||||||
|
- Scene-based lifecycle
|
||||||
|
- No exact alarm equivalent (uses BGTaskScheduler)
|
||||||
|
|
||||||
|
### Cross-Platform Equivalents
|
||||||
|
|
||||||
|
| Android | iOS |
|
||||||
|
|---------|-----|
|
||||||
|
| `AlarmManager` | `BGTaskScheduler` + `UNUserNotificationCenter` |
|
||||||
|
| `WorkManager` | `BGTaskScheduler` |
|
||||||
|
| `POST_NOTIFICATIONS` permission | `UNUserNotificationCenter` authorization |
|
||||||
|
| Battery optimization | Background App Refresh settings |
|
||||||
|
| Boot receiver | App launch + background task registration |
|
||||||
|
|
||||||
|
## Next Actions
|
||||||
|
|
||||||
|
1. **Immediate**: Complete iOS test app setup
|
||||||
|
2. **Short-term**: Implement critical missing methods (scheduling, status, permissions)
|
||||||
|
3. **Medium-term**: Implement all missing methods for full parity
|
||||||
|
4. **Long-term**: iOS-specific optimizations and testing
|
||||||
|
|
||||||
|
## Resources
|
||||||
|
|
||||||
|
- [Android Test App](../test-apps/android-test-app/README.md)
|
||||||
|
- [iOS Native Interface](ios-native-interface.md)
|
||||||
|
- [Plugin API Definitions](../../src/definitions.ts)
|
||||||
|
- [iOS Build Guide](../test-apps/daily-notification-test/docs/IOS_BUILD_QUICK_REFERENCE.md)
|
||||||
|
|
||||||
167
docs/IOS_SYNC_SUMMARY.md
Normal file
167
docs/IOS_SYNC_SUMMARY.md
Normal file
@@ -0,0 +1,167 @@
|
|||||||
|
# iOS Synchronization Summary
|
||||||
|
|
||||||
|
**Author**: Matthew Raymer
|
||||||
|
**Date**: 2025-11-04
|
||||||
|
**Status**: ✅ **TEST APP SETUP COMPLETE**
|
||||||
|
|
||||||
|
## What Was Done
|
||||||
|
|
||||||
|
### 1. iOS Test App Structure Created
|
||||||
|
|
||||||
|
Created standalone `ios-test-app` matching `android-test-app` structure:
|
||||||
|
|
||||||
|
- ✅ `test-apps/ios-test-app/README.md` - Main documentation
|
||||||
|
- ✅ `test-apps/ios-test-app/SETUP.md` - Setup guide with two options
|
||||||
|
- ✅ `test-apps/ios-test-app/scripts/build-and-deploy.sh` - Build script
|
||||||
|
- ✅ Directory structure prepared
|
||||||
|
|
||||||
|
### 2. Documentation Created
|
||||||
|
|
||||||
|
- ✅ `docs/IOS_SYNC_STATUS.md` - Comprehensive status tracking
|
||||||
|
- ✅ `test-apps/daily-notification-test/docs/IOS_SETUP.md` - Vue test app iOS setup
|
||||||
|
- ✅ Build scripts and setup guides
|
||||||
|
|
||||||
|
### 3. API Comparison Completed
|
||||||
|
|
||||||
|
- ✅ Identified all Android methods (52 total)
|
||||||
|
- ✅ Identified all iOS methods (9 total)
|
||||||
|
- ✅ Documented missing methods and gaps
|
||||||
|
- ✅ Created platform comparison table
|
||||||
|
|
||||||
|
### 4. Test App Configuration
|
||||||
|
|
||||||
|
- ✅ Standalone iOS test app structure ready
|
||||||
|
- ✅ Vue 3 test app iOS setup documented
|
||||||
|
- ✅ Build scripts created for both scenarios
|
||||||
|
|
||||||
|
## Current State
|
||||||
|
|
||||||
|
### iOS Plugin
|
||||||
|
|
||||||
|
**Status**: ✅ Compiles successfully
|
||||||
|
**Methods**: 9 implemented, 43 missing
|
||||||
|
**Priority**: High - many critical methods missing
|
||||||
|
|
||||||
|
### Test Apps
|
||||||
|
|
||||||
|
**Standalone iOS Test App** (`ios-test-app`):
|
||||||
|
- ✅ Structure created
|
||||||
|
- ✅ Documentation complete
|
||||||
|
- 🟡 Needs Xcode project generation (use Capacitor CLI or copy from `ios/App`)
|
||||||
|
|
||||||
|
**Vue 3 Test App** (`daily-notification-test`):
|
||||||
|
- ✅ Build script exists
|
||||||
|
- ✅ Configuration documented
|
||||||
|
- 🟡 Needs `npx cap add ios` to create iOS module
|
||||||
|
|
||||||
|
## Next Steps
|
||||||
|
|
||||||
|
### Immediate (Test App Setup)
|
||||||
|
|
||||||
|
1. **Standalone iOS Test App**:
|
||||||
|
```bash
|
||||||
|
cd test-apps/ios-test-app
|
||||||
|
# Option 1: Use Capacitor CLI
|
||||||
|
npx @capacitor/create-app@latest App --template blank
|
||||||
|
# Option 2: Copy from ios/App
|
||||||
|
cp -r ../../ios/App App
|
||||||
|
# Then follow SETUP.md
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Vue 3 Test App**:
|
||||||
|
```bash
|
||||||
|
cd test-apps/daily-notification-test
|
||||||
|
npx cap add ios
|
||||||
|
npx cap sync ios
|
||||||
|
# Then build and test
|
||||||
|
```
|
||||||
|
|
||||||
|
### Short-term (API Implementation)
|
||||||
|
|
||||||
|
Priority methods to implement:
|
||||||
|
|
||||||
|
1. **Configuration**:
|
||||||
|
- `configureNativeFetcher()` - Critical for background fetching
|
||||||
|
- `setActiveDidFromHost()` - TimeSafari integration
|
||||||
|
|
||||||
|
2. **Scheduling**:
|
||||||
|
- `scheduleDailyNotification()` - Main scheduling method
|
||||||
|
- `getNotificationStatus()` - Status checking
|
||||||
|
|
||||||
|
3. **Permissions**:
|
||||||
|
- `checkPermissionStatus()` - Permission checking
|
||||||
|
- `requestNotificationPermissions()` - Permission requests
|
||||||
|
|
||||||
|
4. **Content Management**:
|
||||||
|
- `getContentCache()` - Cache access
|
||||||
|
- `clearContentCache()` - Cache management
|
||||||
|
|
||||||
|
### Medium-term (Full Parity)
|
||||||
|
|
||||||
|
Implement remaining 40+ methods for full API parity with Android.
|
||||||
|
|
||||||
|
## Files Created/Modified
|
||||||
|
|
||||||
|
### New Files
|
||||||
|
|
||||||
|
1. `test-apps/ios-test-app/README.md`
|
||||||
|
2. `test-apps/ios-test-app/SETUP.md`
|
||||||
|
3. `test-apps/ios-test-app/scripts/build-and-deploy.sh`
|
||||||
|
4. `docs/IOS_SYNC_STATUS.md`
|
||||||
|
5. `docs/IOS_SYNC_SUMMARY.md` (this file)
|
||||||
|
6. `test-apps/daily-notification-test/docs/IOS_SETUP.md`
|
||||||
|
|
||||||
|
### Modified Files
|
||||||
|
|
||||||
|
None (all new documentation)
|
||||||
|
|
||||||
|
## Testing Checklist
|
||||||
|
|
||||||
|
### Standalone iOS Test App
|
||||||
|
|
||||||
|
- [ ] Generate/copy Xcode project
|
||||||
|
- [ ] Install CocoaPods dependencies
|
||||||
|
- [ ] Copy test HTML interface
|
||||||
|
- [ ] Build and run in simulator
|
||||||
|
- [ ] Test plugin availability
|
||||||
|
- [ ] Test basic plugin methods
|
||||||
|
|
||||||
|
### Vue 3 Test App
|
||||||
|
|
||||||
|
- [ ] Run `npx cap add ios`
|
||||||
|
- [ ] Verify plugin integration
|
||||||
|
- [ ] Build and run in simulator
|
||||||
|
- [ ] Test plugin from Vue interface
|
||||||
|
- [ ] Verify plugin detection
|
||||||
|
- [ ] Test TimeSafari integration
|
||||||
|
|
||||||
|
## Platform Differences Summary
|
||||||
|
|
||||||
|
| Feature | Android | iOS |
|
||||||
|
|---------|---------|-----|
|
||||||
|
| **Background Tasks** | WorkManager | BGTaskScheduler |
|
||||||
|
| **Notifications** | AlarmManager + NotificationManager | UNUserNotificationCenter |
|
||||||
|
| **Permissions** | Runtime permissions | UNUserNotificationCenter authorization |
|
||||||
|
| **Battery** | Battery optimization | Background App Refresh |
|
||||||
|
| **Boot Recovery** | BootReceiver | App launch + task registration |
|
||||||
|
|
||||||
|
## Resources
|
||||||
|
|
||||||
|
- [iOS Sync Status](IOS_SYNC_STATUS.md) - Detailed status tracking
|
||||||
|
- [iOS Test App Setup](../test-apps/ios-test-app/SETUP.md) - Setup guide
|
||||||
|
- [Vue Test App iOS Setup](../test-apps/daily-notification-test/docs/IOS_SETUP.md) - Vue app setup
|
||||||
|
- [Android Test App](../test-apps/android-test-app/README.md) - Reference implementation
|
||||||
|
|
||||||
|
## Success Criteria
|
||||||
|
|
||||||
|
✅ **Test App Setup**: Complete
|
||||||
|
🟡 **API Parity**: In progress (9/52 methods)
|
||||||
|
🟡 **Testing**: Ready to begin once test apps are generated
|
||||||
|
|
||||||
|
## Notes
|
||||||
|
|
||||||
|
- iOS test app structure is ready but needs Xcode project generation
|
||||||
|
- Vue test app needs `npx cap add ios` to create iOS module
|
||||||
|
- All documentation and build scripts are in place
|
||||||
|
- API implementation is the next major milestone
|
||||||
|
|
||||||
163
test-apps/daily-notification-test/docs/IOS_SETUP.md
Normal file
163
test-apps/daily-notification-test/docs/IOS_SETUP.md
Normal file
@@ -0,0 +1,163 @@
|
|||||||
|
# iOS Setup for Daily Notification Test App
|
||||||
|
|
||||||
|
**Author**: Matthew Raymer
|
||||||
|
**Date**: 2025-11-04
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
This guide explains how to set up the iOS platform for the Vue 3 test app (`daily-notification-test`).
|
||||||
|
|
||||||
|
## Initial Setup
|
||||||
|
|
||||||
|
### Step 1: Add iOS Platform
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd test-apps/daily-notification-test
|
||||||
|
npx cap add ios
|
||||||
|
```
|
||||||
|
|
||||||
|
This will:
|
||||||
|
- Create `ios/` directory
|
||||||
|
- Generate Xcode project structure
|
||||||
|
- Set up CocoaPods configuration
|
||||||
|
- Configure Capacitor integration
|
||||||
|
|
||||||
|
### Step 2: Install CocoaPods Dependencies
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd ios/App
|
||||||
|
pod install
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 3: Verify Plugin Integration
|
||||||
|
|
||||||
|
The plugin should be automatically included via Capacitor when you run `npx cap sync ios`. Verify in `ios/App/Podfile`:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
pod 'DailyNotificationPlugin', :path => '../../../ios'
|
||||||
|
```
|
||||||
|
|
||||||
|
If not present, add it manually.
|
||||||
|
|
||||||
|
### Step 4: Build and Run
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# From test-apps/daily-notification-test
|
||||||
|
npm run build
|
||||||
|
npx cap sync ios
|
||||||
|
npx cap run ios
|
||||||
|
```
|
||||||
|
|
||||||
|
Or use the build script:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./scripts/build-and-deploy-ios.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
## Plugin Configuration
|
||||||
|
|
||||||
|
The plugin is configured in `capacitor.config.ts`:
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
plugins: {
|
||||||
|
DailyNotification: {
|
||||||
|
debugMode: true,
|
||||||
|
enableNotifications: true,
|
||||||
|
// ... TimeSafari configuration
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
This configuration is automatically synced to iOS when you run `npx cap sync ios`.
|
||||||
|
|
||||||
|
## iOS-Specific Configuration
|
||||||
|
|
||||||
|
### Info.plist
|
||||||
|
|
||||||
|
After `npx cap add ios`, verify `ios/App/App/Info.plist` includes:
|
||||||
|
|
||||||
|
- `NSUserNotificationsUsageDescription` - Notification permission description
|
||||||
|
- `UIBackgroundModes` - Background modes (fetch, processing)
|
||||||
|
- `BGTaskSchedulerPermittedIdentifiers` - Background task identifiers
|
||||||
|
|
||||||
|
### Podfile
|
||||||
|
|
||||||
|
Ensure `ios/App/Podfile` includes the plugin:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
platform :ios, '13.0'
|
||||||
|
use_frameworks!
|
||||||
|
|
||||||
|
def capacitor_pods
|
||||||
|
pod 'Capacitor', :path => '../../node_modules/@capacitor/ios'
|
||||||
|
pod 'CapacitorCordova', :path => '../../node_modules/@capacitor/ios'
|
||||||
|
pod 'DailyNotificationPlugin', :path => '../../../ios'
|
||||||
|
end
|
||||||
|
|
||||||
|
target 'App' do
|
||||||
|
capacitor_pods
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
|
## Build Process
|
||||||
|
|
||||||
|
1. **Build Web Assets**: `npm run build`
|
||||||
|
2. **Sync with iOS**: `npx cap sync ios`
|
||||||
|
3. **Install Pods**: `cd ios/App && pod install`
|
||||||
|
4. **Build iOS**: Use Xcode or `xcodebuild`
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### iOS Directory Missing
|
||||||
|
|
||||||
|
If `ios/` directory doesn't exist:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npx cap add ios
|
||||||
|
```
|
||||||
|
|
||||||
|
### Plugin Not Found
|
||||||
|
|
||||||
|
1. Ensure plugin is built:
|
||||||
|
```bash
|
||||||
|
./scripts/build-native.sh --platform ios
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Verify Podfile includes plugin path
|
||||||
|
|
||||||
|
3. Reinstall pods:
|
||||||
|
```bash
|
||||||
|
cd ios/App
|
||||||
|
pod deintegrate
|
||||||
|
pod install
|
||||||
|
```
|
||||||
|
|
||||||
|
### Build Errors
|
||||||
|
|
||||||
|
1. Clean build folder in Xcode (⌘⇧K)
|
||||||
|
2. Delete derived data
|
||||||
|
3. Rebuild
|
||||||
|
|
||||||
|
### Sync Issues
|
||||||
|
|
||||||
|
If `npx cap sync ios` fails:
|
||||||
|
|
||||||
|
1. Check `capacitor.config.ts` is valid
|
||||||
|
2. Ensure `dist/` directory exists (run `npm run build`)
|
||||||
|
3. Check plugin path in `package.json`
|
||||||
|
|
||||||
|
## Testing
|
||||||
|
|
||||||
|
Once set up, you can test the plugin:
|
||||||
|
|
||||||
|
1. Build and run: `npx cap run ios`
|
||||||
|
2. Open app in simulator
|
||||||
|
3. Navigate to plugin test views
|
||||||
|
4. Test plugin functionality
|
||||||
|
|
||||||
|
## See Also
|
||||||
|
|
||||||
|
- [iOS Build Quick Reference](IOS_BUILD_QUICK_REFERENCE.md)
|
||||||
|
- [Plugin Detection Guide](PLUGIN_DETECTION_GUIDE.md)
|
||||||
|
- [Main README](../../README.md)
|
||||||
|
|
||||||
148
test-apps/ios-test-app/README.md
Normal file
148
test-apps/ios-test-app/README.md
Normal file
@@ -0,0 +1,148 @@
|
|||||||
|
# iOS Test App for DailyNotification Plugin
|
||||||
|
|
||||||
|
**Author**: Matthew Raymer
|
||||||
|
**Date**: 2025-11-04
|
||||||
|
**Version**: 1.0.0
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
Standalone iOS test application for the DailyNotification Capacitor plugin. This app provides an interactive testing interface for all plugin features, similar to the Android test app (`android-test-app`).
|
||||||
|
|
||||||
|
## Structure
|
||||||
|
|
||||||
|
```
|
||||||
|
ios-test-app/
|
||||||
|
├── App/ # Xcode project directory
|
||||||
|
│ ├── App/ # Main app source
|
||||||
|
│ │ ├── AppDelegate.swift
|
||||||
|
│ │ ├── ViewController.swift
|
||||||
|
│ │ ├── SceneDelegate.swift
|
||||||
|
│ │ ├── Info.plist
|
||||||
|
│ │ └── public/ # Web assets
|
||||||
|
│ │ └── index.html
|
||||||
|
│ ├── App.xcodeproj/ # Xcode project
|
||||||
|
│ ├── App.xcworkspace/ # CocoaPods workspace
|
||||||
|
│ └── Podfile # CocoaPods dependencies
|
||||||
|
├── scripts/ # Build scripts
|
||||||
|
└── README.md # This file
|
||||||
|
```
|
||||||
|
|
||||||
|
## Prerequisites
|
||||||
|
|
||||||
|
- Xcode 14.0 or later
|
||||||
|
- CocoaPods (`gem install cocoapods`)
|
||||||
|
- Node.js (for Capacitor CLI)
|
||||||
|
- iOS 13.0+ deployment target
|
||||||
|
|
||||||
|
## Setup
|
||||||
|
|
||||||
|
### 1. Install CocoaPods Dependencies
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd test-apps/ios-test-app/App
|
||||||
|
pod install
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Build Plugin First
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# From project root
|
||||||
|
./scripts/build-native.sh --platform ios
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Open in Xcode
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd test-apps/ios-test-app/App
|
||||||
|
open App.xcworkspace
|
||||||
|
```
|
||||||
|
|
||||||
|
## Building
|
||||||
|
|
||||||
|
### Using Xcode
|
||||||
|
|
||||||
|
1. Open `App.xcworkspace` in Xcode
|
||||||
|
2. Select target device/simulator
|
||||||
|
3. Build and run (⌘R)
|
||||||
|
|
||||||
|
### Using Command Line
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Build for simulator
|
||||||
|
xcodebuild -workspace App.xcworkspace \
|
||||||
|
-scheme App \
|
||||||
|
-configuration Debug \
|
||||||
|
-sdk iphonesimulator \
|
||||||
|
-destination 'platform=iOS Simulator,name=iPhone 15 Pro' \
|
||||||
|
clean build
|
||||||
|
|
||||||
|
# Install on simulator
|
||||||
|
APP_PATH=$(find build -name "*.app" -type d | head -1)
|
||||||
|
xcrun simctl install booted "$APP_PATH"
|
||||||
|
xcrun simctl launch booted com.timesafari.dailynotification
|
||||||
|
```
|
||||||
|
|
||||||
|
### Using Build Script
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd test-apps/ios-test-app
|
||||||
|
./scripts/build-and-deploy.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
## Plugin Integration
|
||||||
|
|
||||||
|
The plugin is integrated via CocoaPods:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
# Podfile
|
||||||
|
pod 'DailyNotificationPlugin', :path => '../../../ios'
|
||||||
|
```
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- Interactive plugin testing interface
|
||||||
|
- Plugin diagnostics and status checking
|
||||||
|
- Notification scheduling and management
|
||||||
|
- Permission testing and management
|
||||||
|
- Comprehensive logging and debugging
|
||||||
|
|
||||||
|
## Testing
|
||||||
|
|
||||||
|
The test interface is available at `App/App/public/index.html` and provides buttons for:
|
||||||
|
|
||||||
|
- Plugin availability testing
|
||||||
|
- Configuration
|
||||||
|
- Status checking
|
||||||
|
- Notification scheduling
|
||||||
|
- Permission management
|
||||||
|
- Channel management
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### Plugin Not Found
|
||||||
|
|
||||||
|
Ensure the plugin is built first:
|
||||||
|
```bash
|
||||||
|
./scripts/build-native.sh --platform ios
|
||||||
|
```
|
||||||
|
|
||||||
|
### CocoaPods Issues
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd test-apps/ios-test-app/App
|
||||||
|
pod deintegrate
|
||||||
|
pod install
|
||||||
|
```
|
||||||
|
|
||||||
|
### Build Errors
|
||||||
|
|
||||||
|
1. Clean build folder in Xcode (⌘⇧K)
|
||||||
|
2. Delete derived data
|
||||||
|
3. Rebuild
|
||||||
|
|
||||||
|
## See Also
|
||||||
|
|
||||||
|
- [Android Test App](../android-test-app/README.md)
|
||||||
|
- [Vue 3 Test App](../daily-notification-test/README.md)
|
||||||
|
- [Plugin Documentation](../../README.md)
|
||||||
|
|
||||||
156
test-apps/ios-test-app/SETUP.md
Normal file
156
test-apps/ios-test-app/SETUP.md
Normal file
@@ -0,0 +1,156 @@
|
|||||||
|
# iOS Test App Setup Guide
|
||||||
|
|
||||||
|
**Author**: Matthew Raymer
|
||||||
|
**Date**: 2025-11-04
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
This guide explains how to set up the standalone iOS test app for the DailyNotification plugin. The iOS test app mirrors the Android test app (`android-test-app`) functionality.
|
||||||
|
|
||||||
|
## Option 1: Use Capacitor CLI (Recommended)
|
||||||
|
|
||||||
|
### Step 1: Generate iOS App
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd test-apps/ios-test-app
|
||||||
|
npx @capacitor/create-app@latest App --template blank
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 2: Configure Plugin
|
||||||
|
|
||||||
|
Edit `App/Podfile`:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
platform :ios, '13.0'
|
||||||
|
use_frameworks!
|
||||||
|
|
||||||
|
def capacitor_pods
|
||||||
|
pod 'Capacitor', :path => '../../../node_modules/@capacitor/ios'
|
||||||
|
pod 'CapacitorCordova', :path => '../../../node_modules/@capacitor/ios'
|
||||||
|
pod 'DailyNotificationPlugin', :path => '../../../ios'
|
||||||
|
end
|
||||||
|
|
||||||
|
target 'App' do
|
||||||
|
capacitor_pods
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 3: Install Dependencies
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd App
|
||||||
|
pod install
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 4: Copy Test Interface
|
||||||
|
|
||||||
|
Copy the test HTML from `test-apps/android-test-app/app/src/main/assets/public/index.html` to `App/App/public/index.html`.
|
||||||
|
|
||||||
|
### Step 5: Configure Capacitor
|
||||||
|
|
||||||
|
Edit `App/App/capacitor.config.json`:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"appId": "com.timesafari.dailynotification",
|
||||||
|
"appName": "DailyNotification Test App",
|
||||||
|
"webDir": "public",
|
||||||
|
"plugins": {
|
||||||
|
"DailyNotification": {
|
||||||
|
"debugMode": true,
|
||||||
|
"enableNotifications": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Option 2: Copy from ios/App (Quick Start)
|
||||||
|
|
||||||
|
If `ios/App` already exists, you can copy it:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# From project root
|
||||||
|
cp -r ios/App test-apps/ios-test-app/App
|
||||||
|
cd test-apps/ios-test-app/App
|
||||||
|
pod install
|
||||||
|
```
|
||||||
|
|
||||||
|
Then update:
|
||||||
|
- `App/Info.plist` - Bundle ID: `com.timesafari.dailynotification`
|
||||||
|
- `App/capacitor.config.json` - App ID and name
|
||||||
|
- `App/public/index.html` - Copy test interface from Android test app
|
||||||
|
|
||||||
|
## Build and Run
|
||||||
|
|
||||||
|
### Using Xcode
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd test-apps/ios-test-app/App
|
||||||
|
open App.xcworkspace
|
||||||
|
# Then build and run in Xcode
|
||||||
|
```
|
||||||
|
|
||||||
|
### Using Command Line
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd test-apps/ios-test-app/App
|
||||||
|
xcodebuild -workspace App.xcworkspace \
|
||||||
|
-scheme App \
|
||||||
|
-configuration Debug \
|
||||||
|
-sdk iphonesimulator \
|
||||||
|
-destination 'platform=iOS Simulator,name=iPhone 15 Pro' \
|
||||||
|
clean build
|
||||||
|
```
|
||||||
|
|
||||||
|
### Using Build Script
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd test-apps/ios-test-app
|
||||||
|
./scripts/build-and-deploy.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
## Plugin Registration
|
||||||
|
|
||||||
|
The plugin is automatically registered via Capacitor when included in `Podfile`. No manual registration needed.
|
||||||
|
|
||||||
|
## Test Interface
|
||||||
|
|
||||||
|
The test interface (`App/App/public/index.html`) provides buttons for:
|
||||||
|
|
||||||
|
- Plugin availability testing
|
||||||
|
- Configuration
|
||||||
|
- Status checking
|
||||||
|
- Notification scheduling
|
||||||
|
- Permission management
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### Plugin Not Found
|
||||||
|
|
||||||
|
Ensure plugin is built:
|
||||||
|
```bash
|
||||||
|
./scripts/build-native.sh --platform ios
|
||||||
|
```
|
||||||
|
|
||||||
|
### CocoaPods Issues
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd test-apps/ios-test-app/App
|
||||||
|
pod deintegrate
|
||||||
|
pod install
|
||||||
|
```
|
||||||
|
|
||||||
|
### Build Errors
|
||||||
|
|
||||||
|
1. Clean build folder in Xcode (⌘⇧K)
|
||||||
|
2. Delete derived data: `rm -rf ~/Library/Developer/Xcode/DerivedData`
|
||||||
|
3. Rebuild
|
||||||
|
|
||||||
|
## Next Steps
|
||||||
|
|
||||||
|
1. Build plugin: `./scripts/build-native.sh --platform ios`
|
||||||
|
2. Generate or copy iOS app structure
|
||||||
|
3. Install CocoaPods dependencies
|
||||||
|
4. Build and run in Xcode or simulator
|
||||||
|
5. Test plugin functionality
|
||||||
|
|
||||||
143
test-apps/ios-test-app/scripts/build-and-deploy.sh
Executable file
143
test-apps/ios-test-app/scripts/build-and-deploy.sh
Executable file
@@ -0,0 +1,143 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# iOS Test App Build and Deploy Script
|
||||||
|
# Builds and deploys the DailyNotification iOS test app to iOS Simulator
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Colors for output
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
BLUE='\033[0;34m'
|
||||||
|
NC='\033[0m' # No Color
|
||||||
|
|
||||||
|
log_info() {
|
||||||
|
echo -e "${GREEN}[INFO]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
log_warn() {
|
||||||
|
echo -e "${YELLOW}[WARN]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
log_error() {
|
||||||
|
echo -e "${RED}[ERROR]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
log_step() {
|
||||||
|
echo -e "${BLUE}[STEP]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Check if we're in the right directory
|
||||||
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
TEST_APP_DIR="$(dirname "$SCRIPT_DIR")"
|
||||||
|
|
||||||
|
if [ ! -d "$TEST_APP_DIR/App" ]; then
|
||||||
|
log_error "App directory not found at $TEST_APP_DIR/App"
|
||||||
|
log_info "Please run setup first (see SETUP.md)"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
cd "$TEST_APP_DIR"
|
||||||
|
|
||||||
|
# Check prerequisites
|
||||||
|
log_step "Checking prerequisites..."
|
||||||
|
|
||||||
|
if ! command -v xcodebuild &> /dev/null; then
|
||||||
|
log_error "xcodebuild not found. Install Xcode command line tools:"
|
||||||
|
log_info " xcode-select --install"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pod &> /dev/null; then
|
||||||
|
log_error "CocoaPods not found. Install with:"
|
||||||
|
log_info " gem install cocoapods"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Get simulator device (default to iPhone 15 Pro)
|
||||||
|
SIMULATOR_DEVICE="${1:-iPhone 15 Pro}"
|
||||||
|
log_info "Using simulator: $SIMULATOR_DEVICE"
|
||||||
|
|
||||||
|
# Boot simulator
|
||||||
|
log_step "Booting simulator..."
|
||||||
|
if xcrun simctl list devices | grep -q "$SIMULATOR_DEVICE.*Booted"; then
|
||||||
|
log_info "Simulator already booted"
|
||||||
|
else
|
||||||
|
if xcrun simctl boot "$SIMULATOR_DEVICE" 2>/dev/null; then
|
||||||
|
log_info "✓ Simulator booted"
|
||||||
|
else
|
||||||
|
log_warn "Could not boot simulator automatically"
|
||||||
|
log_info "Opening Simulator app... (you may need to select device manually)"
|
||||||
|
open -a Simulator
|
||||||
|
sleep 5
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Install CocoaPods dependencies
|
||||||
|
log_step "Installing CocoaPods dependencies..."
|
||||||
|
cd App
|
||||||
|
if [ ! -f "Podfile.lock" ] || [ "Podfile" -nt "Podfile.lock" ]; then
|
||||||
|
pod install
|
||||||
|
else
|
||||||
|
log_info "CocoaPods dependencies up to date"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Build iOS app
|
||||||
|
log_step "Building iOS app..."
|
||||||
|
WORKSPACE="App.xcworkspace"
|
||||||
|
SCHEME="App"
|
||||||
|
CONFIG="Debug"
|
||||||
|
SDK="iphonesimulator"
|
||||||
|
|
||||||
|
xcodebuild -workspace "$WORKSPACE" \
|
||||||
|
-scheme "$SCHEME" \
|
||||||
|
-configuration "$CONFIG" \
|
||||||
|
-sdk "$SDK" \
|
||||||
|
-destination "platform=iOS Simulator,name=$SIMULATOR_DEVICE" \
|
||||||
|
-derivedDataPath build/derivedData \
|
||||||
|
CODE_SIGN_IDENTITY="" \
|
||||||
|
CODE_SIGNING_REQUIRED=NO \
|
||||||
|
CODE_SIGNING_ALLOWED=NO \
|
||||||
|
clean build
|
||||||
|
|
||||||
|
# Find built app
|
||||||
|
APP_PATH=$(find build/derivedData -name "*.app" -type d -path "*/Build/Products/*-iphonesimulator/*.app" | head -1)
|
||||||
|
|
||||||
|
if [ -z "$APP_PATH" ]; then
|
||||||
|
log_error "Could not find built app"
|
||||||
|
log_info "Searching in: build/derivedData"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
log_info "Found app: $APP_PATH"
|
||||||
|
|
||||||
|
# Install app on simulator
|
||||||
|
log_step "Installing app on simulator..."
|
||||||
|
if xcrun simctl install booted "$APP_PATH"; then
|
||||||
|
log_info "✓ App installed"
|
||||||
|
else
|
||||||
|
log_error "Failed to install app"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Get bundle identifier
|
||||||
|
BUNDLE_ID=$(plutil -extract CFBundleIdentifier raw App/Info.plist 2>/dev/null || echo "com.timesafari.dailynotification")
|
||||||
|
log_info "Bundle ID: $BUNDLE_ID"
|
||||||
|
|
||||||
|
# Launch app
|
||||||
|
log_step "Launching app..."
|
||||||
|
if xcrun simctl launch booted "$BUNDLE_ID"; then
|
||||||
|
log_info "✓ App launched"
|
||||||
|
else
|
||||||
|
log_warn "App may already be running"
|
||||||
|
fi
|
||||||
|
|
||||||
|
log_info ""
|
||||||
|
log_info "✅ Build and deploy complete!"
|
||||||
|
log_info ""
|
||||||
|
log_info "To view logs:"
|
||||||
|
log_info " xcrun simctl spawn booted log stream"
|
||||||
|
log_info ""
|
||||||
|
log_info "To uninstall app:"
|
||||||
|
log_info " xcrun simctl uninstall booted $BUNDLE_ID"
|
||||||
|
|
||||||
Reference in New Issue
Block a user