iOS/React Native development with Expo. Use when working on mobile app, running builds, debugging device issues, or setting up development environment including tethering.
Scanned 2/10/2026
Install via CLI
openskills install majiayu000/claude-skill-registry---
name: ios-dev
description: iOS/React Native development with Expo. Use when working on mobile app, running builds, debugging device issues, or setting up development environment including tethering.
---
# iOS Development Guide
## Project Structure
```
mobile/
├── app/ # Expo Router pages
│ ├── _layout.tsx
│ ├── index.tsx # Home screen
│ └── room/[id].tsx # Voice call room
├── src/
│ ├── components/ # UI components
│ ├── hooks/ # Custom hooks (WebRTC, Socket, Speech)
│ └── types/
├── ios/ # Native iOS project (generated by prebuild)
└── .env # Environment variables
```
## Key Commands
```bash
cd mobile
# Development (WiFi - same network as Mac)
npx expo start --dev-client
# Development (Tethering - requires tunnel)
npx expo start --dev-client --tunnel
# Build for specific device
npx expo run:ios --device "DEVICE_NAME"
# Clean rebuild (after config changes)
npx expo prebuild --platform ios --clean
# List available devices
xcrun xctrace list devices
```
## Environment Configuration
```bash
# WiFi development
EXPO_PUBLIC_SIGNALING_SERVER_URL=http://192.168.x.x:3001
# Production (Render server)
EXPO_PUBLIC_SIGNALING_SERVER_URL=https://webrtc-signaling-xxxx.onrender.com
```
## Tethering Development
When Mac is connected to iPhone's Personal Hotspot:
1. **Problem**: iPhone cannot directly access devices on its own hotspot
2. **Solution**: Use ngrok tunnel
```bash
# Install ngrok (first time)
npm install -g @expo/ngrok@^4.1.0
# Start with tunnel
npx expo start --dev-client --tunnel
# Get tunnel URL
curl -s http://127.0.0.1:4040/api/tunnels | grep -o '"public_url":"https://[^"]*"'
```
**Important**: Use **HTTPS** URL (iOS App Transport Security requirement)
## Troubleshooting
| Issue | Solution |
|-------|----------|
| "Device is busy" | Unlock iPhone, reconnect USB |
| Metro connection fails | Check IP address, or use `--tunnel` |
| "main" not registered | Restart Metro with `--clear` |
| Build fails after config change | Run `npx expo prebuild --clean` |
| Simulator no audio | Use real device for audio testing |
## Development Workflow
1. Start signaling server: `cd server && npm run dev`
2. Start Metro: `cd mobile && npx expo start --dev-client`
3. Open app on iPhone, enter Metro URL
4. For code changes: Hot reload automatic
5. For native changes: Rebuild with `npx expo run:ios --device`
No comments yet. Be the first to comment!