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:
Matthew Raymer
2025-11-11 01:30:31 -08:00
parent fbd9ad338d
commit a166f3be9a
6 changed files with 1001 additions and 0 deletions

View 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)

View 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)

View 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

View 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"