mirror of https://github.com/usememos/memos.git
341 lines
9.0 KiB
Markdown
341 lines
9.0 KiB
Markdown
# Memos iOS App Guide
|
|
|
|
This guide explains how to build and run Memos as a native iOS application on your iPhone or iPad.
|
|
|
|
## Quick Start
|
|
|
|
```bash
|
|
# 1. Build the iOS framework
|
|
./scripts/build-ios.sh
|
|
|
|
# 2. Open in Xcode
|
|
open ios/Memos.xcodeproj
|
|
|
|
# 3. Select your device and run (Cmd+R)
|
|
```
|
|
|
|
## What is the iOS App?
|
|
|
|
The Memos iOS app runs the **full Memos backend server** directly on your iOS device, packaged as a native app. This means:
|
|
|
|
- ✅ All your data stays on your device
|
|
- ✅ No internet connection required
|
|
- ✅ Complete feature parity with desktop
|
|
- ✅ Optional network access for other devices
|
|
- ✅ Native iOS interface with SwiftUI
|
|
|
|
## How It Works
|
|
|
|
We use **gomobile** to compile the Go backend into an iOS framework that runs natively on iOS devices. The app displays the React web UI in a WKWebView, communicating with the local Go server.
|
|
|
|
```
|
|
┌────────────────────────────┐
|
|
│ iOS Device │
|
|
│ ┌──────────────────────┐ │
|
|
│ │ SwiftUI App │ │
|
|
│ │ ├─ WKWebView (UI) │ │
|
|
│ │ └─ Go Server │ │
|
|
│ │ └─ SQLite DB │ │
|
|
│ └──────────────────────┘ │
|
|
└────────────────────────────┘
|
|
```
|
|
|
|
## Features
|
|
|
|
### Local-First
|
|
|
|
All data is stored in SQLite on your device in the app's Documents directory. No cloud required.
|
|
|
|
### Network Access (Optional)
|
|
|
|
Enable "Allow Network Access" in settings to let other devices on your local network connect to your Memos instance:
|
|
|
|
1. Open Settings (⚙️ icon)
|
|
2. Toggle "Allow Network Access"
|
|
3. Share the displayed network URL with other devices
|
|
|
|
**Example**: If your iPhone's IP is `192.168.1.50`, other devices can access Memos at `http://192.168.1.50:5230`
|
|
|
|
### Full Feature Support
|
|
|
|
The iOS app runs the complete Memos backend, so all features work:
|
|
|
|
- ✅ Memo creation and editing
|
|
- ✅ Markdown support
|
|
- ✅ File attachments
|
|
- ✅ Tags and search
|
|
- ✅ User management
|
|
- ✅ API access
|
|
- ✅ RSS feeds
|
|
|
|
## Building from Source
|
|
|
|
### Prerequisites
|
|
|
|
- macOS with Xcode 15+
|
|
- Go 1.21+
|
|
- iOS device or simulator
|
|
|
|
### Step 1: Build the Framework
|
|
|
|
```bash
|
|
./scripts/build-ios.sh
|
|
```
|
|
|
|
This compiles the Go backend to `ios/Frameworks/Mobile.xcframework`. First build takes 5-10 minutes.
|
|
|
|
### Step 2: Configure Xcode
|
|
|
|
1. Open `ios/Memos.xcodeproj`
|
|
2. Select the "Memos" project → "Signing & Capabilities"
|
|
3. Choose your Apple Developer team
|
|
4. Xcode will handle provisioning automatically
|
|
|
|
### Step 3: Build and Run
|
|
|
|
- Select your target device (iPhone/iPad or Simulator)
|
|
- Press `Cmd+R` or click the Play button
|
|
- App will install and launch automatically
|
|
|
|
## Development Workflow
|
|
|
|
### Making Backend Changes
|
|
|
|
After modifying Go code:
|
|
|
|
```bash
|
|
# Rebuild the framework
|
|
./scripts/build-ios.sh
|
|
|
|
# Rebuild in Xcode
|
|
# (Cmd+B or Cmd+R)
|
|
```
|
|
|
|
### Making iOS UI Changes
|
|
|
|
Edit Swift files in `ios/Memos/`:
|
|
- `MemosApp.swift` - App entry point
|
|
- `ContentView.swift` - Main UI and WebView
|
|
- `ServerManager.swift` - Server control logic
|
|
|
|
Changes are reflected immediately on rebuild (Cmd+R).
|
|
|
|
### Debugging
|
|
|
|
View Go server logs in Xcode's debug console. To enable verbose logging, edit `ServerManager.swift`:
|
|
|
|
```swift
|
|
// Change "prod" to "dev"
|
|
let url = MobileNewServer(dataDir, port, addr, "dev", &serverError)
|
|
```
|
|
|
|
## Architecture Details
|
|
|
|
### File Structure
|
|
|
|
```
|
|
ios/
|
|
├── Memos/ # iOS app source
|
|
│ ├── MemosApp.swift # SwiftUI app definition
|
|
│ ├── ContentView.swift # Main view with WebView
|
|
│ ├── ServerManager.swift # Go server interface
|
|
│ ├── Assets.xcassets/ # Icons and images
|
|
│ └── Info.plist # App configuration
|
|
├── Memos.xcodeproj/ # Xcode project
|
|
└── Frameworks/ # Generated (gitignored)
|
|
└── Mobile.xcframework # Compiled Go backend
|
|
|
|
mobile/
|
|
└── server.go # Go → iOS binding layer
|
|
```
|
|
|
|
### How the Binding Works
|
|
|
|
The `mobile/server.go` package exposes a simple interface for iOS:
|
|
|
|
```go
|
|
// Start server, returns URL
|
|
func NewServer(dataDir, port, addr, mode string) (string, error)
|
|
|
|
// Stop server
|
|
func StopServer() error
|
|
|
|
// Check if running
|
|
func IsServerRunning() bool
|
|
```
|
|
|
|
Swift code in `ServerManager.swift` calls these functions via the gomobile-generated framework.
|
|
|
|
### Data Storage
|
|
|
|
App data location: `Documents/memos-data/`
|
|
|
|
```
|
|
Documents/
|
|
└── memos-data/
|
|
├── memos_prod.db # SQLite database
|
|
└── assets/ # Uploaded files
|
|
```
|
|
|
|
This directory is:
|
|
- Persistent across app launches
|
|
- Backed up to iCloud (if enabled)
|
|
- Accessible via Files app (if configured)
|
|
|
|
## Network Access Details
|
|
|
|
### Localhost Mode (Default)
|
|
|
|
Server binds to `""` (empty string), accessible only from the device:
|
|
- URL: `http://localhost:5230`
|
|
- Only the iOS app can connect
|
|
- No firewall or network configuration needed
|
|
|
|
### Network Mode (Optional)
|
|
|
|
Server binds to `0.0.0.0`, accessible from any device on the network:
|
|
- URL: `http://<device-ip>:5230`
|
|
- Any device on the same WiFi can connect
|
|
- Requires local network permission (iOS 14+)
|
|
|
|
**Security Considerations:**
|
|
- Only enable on trusted networks
|
|
- Set a strong password in Memos
|
|
- iOS will show "Local Network" permission prompt
|
|
- Server stops when app is backgrounded
|
|
|
|
## Limitations
|
|
|
|
### Background Execution
|
|
|
|
iOS suspends apps in the background. The Memos server **stops** when you switch apps or lock your device.
|
|
|
|
**Workaround**: Keep the app in foreground or use Split View on iPad.
|
|
|
|
**Future**: Could use Background Modes for limited background execution.
|
|
|
|
### Network Availability
|
|
|
|
Other devices can only connect when:
|
|
- App is in foreground
|
|
- Device is awake
|
|
- Network access is enabled
|
|
- Both devices on same network
|
|
|
|
### Performance
|
|
|
|
Mobile hardware is less powerful than desktop. Expect:
|
|
- Slower initial database migrations
|
|
- Slightly slower search on large datasets
|
|
- Limited by iOS memory constraints
|
|
|
|
## Troubleshooting
|
|
|
|
### "gomobile: command not found"
|
|
|
|
Install gomobile:
|
|
```bash
|
|
go install golang.org/x/mobile/cmd/gomobile@latest
|
|
gomobile init
|
|
```
|
|
|
|
### Framework Build Fails
|
|
|
|
Ensure you have Go 1.21+ installed:
|
|
```bash
|
|
go version # Should show 1.21 or higher
|
|
```
|
|
|
|
### Xcode Can't Find Framework
|
|
|
|
Make sure you ran `./scripts/build-ios.sh` first to generate `Mobile.xcframework`.
|
|
|
|
### Server Won't Start
|
|
|
|
Check Xcode console for errors. Common issues:
|
|
- Data directory permissions
|
|
- Database corruption (delete app and reinstall)
|
|
- Insufficient storage
|
|
|
|
### Can't Connect from Other Devices
|
|
|
|
1. Verify "Allow Network Access" is ON
|
|
2. Check both devices are on same WiFi network
|
|
3. Try disabling VPN on client device
|
|
4. Check firewall settings on client
|
|
5. Verify iOS granted "Local Network" permission
|
|
|
|
### Blank WebView
|
|
|
|
- Wait 5-10 seconds for server startup
|
|
- Check Xcode console for "Server started" message
|
|
- Force quit and restart app
|
|
- Clear app data (delete and reinstall)
|
|
|
|
## Frequently Asked Questions
|
|
|
|
**Q: Does this require an internet connection?**
|
|
A: No, everything runs locally on your device.
|
|
|
|
**Q: Is my data uploaded to any cloud?**
|
|
A: No, all data stays on your device unless you enable iCloud backup.
|
|
|
|
**Q: Can I use this with the desktop version?**
|
|
A: They use separate databases. To sync, you'd need to set up manual export/import.
|
|
|
|
**Q: Does it work on iPad?**
|
|
A: Yes, universal app supports iPhone and iPad.
|
|
|
|
**Q: Can multiple devices connect simultaneously?**
|
|
A: Yes, when network access is enabled, any number of devices can connect.
|
|
|
|
**Q: What happens to the server when I background the app?**
|
|
A: iOS suspends the app and server stops. It restarts when you return to the app.
|
|
|
|
**Q: Can I change the port number?**
|
|
A: Currently hardcoded to 5230 for consistency. You can modify `ServerManager.swift` to change it.
|
|
|
|
**Q: How much storage does it use?**
|
|
A: Base app is ~50MB. Database grows with your memos and attachments.
|
|
|
|
## Future Enhancements
|
|
|
|
Potential improvements:
|
|
|
|
- [ ] Background execution using Background Tasks framework
|
|
- [ ] Bonjour/mDNS service discovery
|
|
- [ ] Share extension for quick memo creation
|
|
- [ ] Siri shortcuts integration
|
|
- [ ] Home screen widgets
|
|
- [ ] Apple Watch companion app
|
|
- [ ] iCloud sync between multiple iOS devices
|
|
- [ ] Export/import database backups
|
|
- [ ] Face ID/Touch ID app lock
|
|
|
|
## Contributing
|
|
|
|
To contribute to iOS app development:
|
|
|
|
1. Make your changes to `mobile/*.go` or `ios/Memos/*`
|
|
2. Test on both iPhone and iPad simulators
|
|
3. Test on physical device
|
|
4. Submit PR with description of changes
|
|
|
|
## More Information
|
|
|
|
- Full iOS README: [ios/README.md](ios/README.md)
|
|
- Main Memos docs: [CLAUDE.md](CLAUDE.md)
|
|
- Build script: [scripts/build-ios.sh](scripts/build-ios.sh)
|
|
- Mobile binding: [mobile/server.go](mobile/server.go)
|
|
|
|
## Support
|
|
|
|
For iOS-specific issues, please include:
|
|
- iOS version
|
|
- Device model
|
|
- Xcode version
|
|
- Go version
|
|
- Error messages from Xcode console
|
|
|
|
File issues at: https://github.com/usememos/memos/issues
|