---
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`
