You know that moment when your app asks for contact permissions and the user just... closes the dialog? Yeah. Me too.
Most contact picker libraries for React Native require READ_CONTACTS — which means your app gets access to the entire address book. Every name, every number, every email. All of it.
Your app just needed one phone number.
There's a better way
Both iOS and Android have native contact pickers that let the user choose a single contact — and your app only sees what they picked. No permission dialog. No full address book access. The OS handles everything.
I built react-native-pick-contact to make this dead simple:
import { pickContact } from 'react-native-pick-contact';
const contact = await pickContact();
// { name: "John Appleseed", phone: "+1 (555) 012-3456" }
That's it. No permissions to configure. No Info.plist keys. No AndroidManifest.xml entries.
The difference
Traditional library react-native-pick-contact
───────────────────── ─────────────────────────
1. User taps "Pick Contact" 1. User taps "Pick Contact"
2. 🔒 Permission dialog appears 2. 📱 Native picker opens instantly
3. 😬 User hesitates / denies 3. User picks a contact
4. ...or grants full address book 4. ✅ App receives name + phone
5. App reads entire contact list
6. App finds the one contact
Permissions: READ_CONTACTS Permissions: NONE
Data exposed: EVERYTHING Data exposed: 1 contact
How it works under the hood
iOS uses CNContactPickerViewController — an out-of-process system UI. Your app never touches the Contacts database. The picker runs in a separate process, and only the selected contact's data is passed back.
Android uses ActivityResultContracts.PickContact(). The system picker grants a temporary URI permission scoped to the single selected contact. Once you read it, the permission expires.
In both cases, the OS is the gatekeeper — not your app.
Built for the New Architecture
If you've upgraded to React Native 0.76+, you've probably noticed that some older contact libraries just... broke. The legacy Bridge is gone, and libraries that didn't migrate to TurboModules stopped working.
react-native-pick-contact is built from scratch for the New Architecture:
- TurboModule native module with Codegen type-safe specs
- No
NativeModules["..."]hacks - No manual bridging
Install it. Run pod install. Done.
Install
npm install react-native-pick-contact
cd ios && pod install
No other setup needed. Seriously.
Why this matters
- Users trust your app more — no scary permission dialogs
- App Store reviewers don't flag you — no justification needed for contact access
- Less data = less liability — you never see contacts the user didn't pick
- Better conversion — users who deny permissions can't use the feature. Zero permissions = zero drop-off.
Try it out
GitHub: github.com/idanlevi1/react-native-pick-contact
NPM: npmjs.com/package/react-native-pick-contact
If you find it useful, a ⭐ on GitHub helps other developers find it too.
Got questions or ideas? Open an issue — happy to chat.
Top comments (0)