DEV Community

Idan Levi
Idan Levi

Posted on

Stop Asking Users for Contact Permissions in React Native

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" }
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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)