- backend: skip Expo alert push to iOS devices that already received VoIP push (CallKit + banner = double ring) - native: receiveIncoming no longer triggers InCallManager.startRingtone — CallKit/ConnectionService play their own ring. Dedup if same callId arrives twice (Realtime + VoIP-Push race).