![Create React App Officially Deprecated Amid React 19 Compatibility Issues](https://cdn.sanity.io/images/cgdhsj6q/production/04fa08cf844d798abc0e1a6391c129363cc7e2ab-1024x1024.webp?w=400&fit=max&auto=format)
Security News
Create React App Officially Deprecated Amid React 19 Compatibility Issues
Create React App is officially deprecated due to React 19 issues and lack of maintenance—developers should switch to Vite or other modern alternatives.
expo-contacts
Advanced tools
If you're using Cocoapods, add the dependency to your Podfile
:
pod 'EXContacts'
and run pod install
.
Libraries
➜ Add Files to [your project's name]
node_modules
➜ expo-contacts
and add EXContacts.xcodeproj
libEXContacts.a
to your project's Build Phases
➜ Link Binary With Libraries
Cmd+R
).Append the following lines to android/settings.gradle
:
include ':expo-contacts'
project(':expo-contacts').projectDir = new File(rootProject.projectDir, '../node_modules/expo-contacts/android')
and if not already included
include ':expo-permissions-interface'
project(':expo-permissions-interface').projectDir = new File(rootProject.projectDir, '../node_modules/expo-permissions-interface/android')
include ':expo-filesystem-interface'
project(':expo-filesystem-interface').projectDir = new File(rootProject.projectDir, '../node_modules/expo-filesystem-interface/android')
Insert the following lines inside the dependencies block in android/app/build.gradle
:
compile project(':expo-contacts')
and if not already included
compile project(':expo-permissions-interface')
compile project(':expo-filesystem-interface')
Provides access to the phone's system contacts.
getContactsAsync(contactQuery: ContactQuery): Promise<ContactResponse>
Return a list of contacts that fit a given criteria. You can get all of the contacts by passing no criteria.
Parameters
Name | Type | Description |
---|---|---|
contactQuery | ContactQuery | Used to query contacts. |
Returns
Name | Type | Description |
---|---|---|
contactResponse | ContactResponse | Contacts returned from the query. |
Example
const { data } = await Contacts.getContactsAsync({
fields: [Contacts.Fields.Emails],
});
if (data.length > 0) {
const contact = data[0];
console.log(contact);
}
getContactByIdAsync(contactId: string, fields: FieldType[]): Promise<Contact>
Returns a contact matching the input id. Used for gathering precise data about a contact.
Parameters
Name | Type | Description |
---|---|---|
contactId | string | The ID of a system contact. |
fields | FieldType[] | If available the fields defined will be returned. If nil then all fields will be returned. |
Returns
Name | Type | Description |
---|---|---|
contact | Contact | Contact with an ID matching the input ID. |
Example
const contact = await Contacts.getContactByIdAsync('161A368D-D614-4A15-8DC6-665FDBCFAE55');
if (contact) {
console.log(contact);
}
iOS Only - temporary
addContactAsync(contact: Contact, containerId: string): Promise<string>
Creates a new contact and adds it to the system.
Parameters
Name | Type | Description |
---|---|---|
contact | Contact | A contact with the changes you wish to persist. The id parameter will not be used. |
containerId | string | IOS ONLY: The container that will parent the contact |
Returns
Name | Type | Description |
---|---|---|
contactId | string | ID of the new system contact. |
Example
const contact = {
[Contacts.Fields.FirstName]: 'Bird',
[Contacts.Fields.LastName]: 'Man',
[Contacts.Fields.Company]: 'Young Money',
};
const contactId = await Contacts.addContactAsync(contact);
iOS Only - temporary
updateContactAsync(contact: Contact): Promise<string>
Mutate the information of an existing contact.
On Android, you can use
presentFormAsync
to make edits to contacts. Do to an error with the Apple API,nonGregorianBirthday
cannot be modified.
Parameters
Name | Type | Description |
---|---|---|
contact | Contact | A contact with the changes you wish to persist. The contact must contain a vaild id |
Returns
Name | Type | Description |
---|---|---|
contactId | string | The ID of a system contact. |
Example
const contact = {
id: '161A368D-D614-4A15-8DC6-665FDBCFAE55',
[Contacts.Fields.FirstName]: 'Drake',
[Contacts.Fields.Company]: 'Young Money',
};
await Contacts.updateContactAsync(contact);
iOS Only - temporary
removeContactAsync(contactId: string): Promise<any>
Delete a contact from the system.
Parameters
Name | Type | Description |
---|---|---|
contactId | string | ID of the contact you want to delete. |
Example
await Contacts.removeContactAsync('161A368D-D614-4A15-8DC6-665FDBCFAE55');
writeContactToFileAsync(contactQuery: ContactQuery): Promise<string>
Query a set of contacts and write them to a local uri that can be used for sharing with ReactNative.Share
.
Parameters
Name | Type | Description |
---|---|---|
contactQuery | ContactQuery | Used to query contacts you want to write. |
Returns
Name | Type | Description |
---|---|---|
localUri | string | Shareable local uri |
Example
const localUri = await Contacts.writeContactToFileAsync({
id: '161A368D-D614-4A15-8DC6-665FDBCFAE55',
});
Share.share({ url: localUri, message: 'Call me!' });
iOS contacts have a multi-layered grouping system that you can access through this API.
presentFormAsync(contactId: string, contact: Contact, formOptions: FormOptions): Promise<any>
Present a native form for manipulating contacts
Parameters
Name | Type | Description |
---|---|---|
contactId | string | The ID of a system contact. |
contact | Contact | A contact with the changes you wish to persist. |
formOptions | FormOptions | Options for the native editor |
Example
// Edit contact
await Contacts.presentFormAsync('161A368D-D614-4A15-8DC6-665FDBCFAE55');
addExistingGroupToContainerAsync(groupId: string, containerId: string): Promise<any>
Add a group to a container.
Parameters
Name | Type | Description |
---|---|---|
groupId | string | The group you wish to target. |
containerId | string | The container you to add membership to. |
Example
await Contacts.addExistingGroupToContainerAsync(
'161A368D-D614-4A15-8DC6-665FDBCFAE55',
'665FDBCFAE55-D614-4A15-8DC6-161A368D'
);
createGroupAsync(groupName: string, containerId?: string): Promise<string>
Create a group with a name, and add it to a container. If the container is undefined, the default container will be targeted.
Parameters
Name | Type | Description |
---|---|---|
name | string | Name of the new group. |
containerId | string | The container you to add membership to. |
Returns
Name | Type | Description |
---|---|---|
groupId | string | ID of the new group. |
Example
const groupId = await Contacts.createGroupAsync('Sailor Moon');
updateGroupNameAsync(groupName: string, groupId: string): Promise<any>
Change the name of an existing group.
Parameters
Name | Type | Description |
---|---|---|
groupName | string | New name for an existing group. |
groupId | string | ID for the group you want to edit. |
Example
await Contacts.updateGroupName('Sailor Moon', '161A368D-D614-4A15-8DC6-665FDBCFAE55');
removeGroupAsync(groupId: string): Promise<any>
Delete a group from the device.
Parameters
Name | Type | Description |
---|---|---|
groupId | string | ID of the group. |
Example
await Contacts.removeGroupAsync('161A368D-D614-4A15-8DC6-665FDBCFAE55');
addExistingContactToGroupAsync(contactId: string, groupId: string): Promise<any>
Add a contact as a member to a group. A contact can be a member of multiple groups.
Parameters
Name | Type | Description |
---|---|---|
contactId | string | ID of the contact you want to edit. |
groupId | string | ID for the group you want to add membership to. |
Example
await Contacts.addExistingContactToGroupAsync(
'665FDBCFAE55-D614-4A15-8DC6-161A368D',
'161A368D-D614-4A15-8DC6-665FDBCFAE55'
);
removeContactFromGroupAsync(contactId: string, groupId: string): Promise<any>
Remove a contact's membership from a given group. This will not delete the contact.
Parameters
Name | Type | Description |
---|---|---|
contactId | string | ID of the contact you want to remove. |
groupId | string | ID for the group you want to remove membership of. |
Example
await Contacts.removeContactFromGroupAsync(
'665FDBCFAE55-D614-4A15-8DC6-161A368D',
'161A368D-D614-4A15-8DC6-665FDBCFAE55'
);
getGroupsAsync(query: GroupQuery): Promise<Group[]>
Query and return a list of system groups.
Parameters
Name | Type | Description |
---|---|---|
query | GroupQuery | Information regarding which groups you want to get. |
Returns
Name | Type | Description |
---|---|---|
groups | Group[] | Collection of groups that fit query. |
Example
const groups = await Contacts.getGroupsAsync({ groupName: 'sailor moon' });
const allGroups = await Contacts.getGroupsAsync({});
getDefaultContainerIdAsync(): Promise<string>
Get the default container's ID.
Returns
Name | Type | Description |
---|---|---|
containerId | string | Default container ID. |
Example
const containerId = await Contacts.getDefaultContainerIdAsync();
getContainersAsync(containerQuery: ContainerQuery): Promise<Container[]>
Query a list of system containers.
Parameters
Name | Type | Description |
---|---|---|
containerQuery | ContainerQuery | Information used to gather containers. |
Returns
Name | Type | Description |
---|---|---|
containerId | string | Collection of containers that fit query. |
Example
const allContainers = await getContainersAsync({
contactId: '665FDBCFAE55-D614-4A15-8DC6-161A368D',
});
A set of fields that define information about a single entity.
Name | Type | Description | iOS | Android |
---|---|---|---|---|
id | string | Immutable identifier used for querying and indexing. | ✅ | ✅ |
name | string | Full name with proper format. | ✅ | ✅ |
firstName | string | Given name. | ✅ | ✅ |
middleName | string | Middle name. | ✅ | ✅ |
lastName | string | Family name. | ✅ | ✅ |
maidenName | string | Maiden name. | ✅ | ✅ |
namePrefix | string | Dr. Mr. Mrs. Ect... | ✅ | ✅ |
nameSuffix | string | Jr. Sr. Ect... | ✅ | ✅ |
nickname | string | An alias to the proper name. | ✅ | ✅ |
phoneticFirstName | string | Pronunciation of the first name. | ✅ | ✅ |
phoneticMiddleName | string | Pronunciation of the middle name. | ✅ | ✅ |
phoneticLastName | string | Pronunciation of the last name. | ✅ | ✅ |
company | string | Organization the entity belongs to. | ✅ | ✅ |
jobTitle | string | Job description. | ✅ | ✅ |
department | string | Job department. | ✅ | ✅ |
note | string | Additional information. | ✅ | ✅ |
imageAvailable | boolean | Used for efficient retrieval of images. | ✅ | ✅ |
image | Image | Thumbnail image (ios: 320x320) | ✅ | ✅ |
rawImage | Image | Raw image without cropping, usually large. | ✅ | ✅ |
contactType | ContactType | Denoting a person or company. | ✅ | ✅ |
birthday | Date | Birthday information in JS format. | ✅ | ✅ |
dates | Date[] | A list of other relevant user dates. | ✅ | ✅ |
relationships | Relationship[] | Names of other relevant user connections | ✅ | ✅ |
emails | Email[] | Email addresses | ✅ | ✅ |
phoneNumbers | PhoneNumber[] | Phone numbers | ✅ | ✅ |
addresses | Address[] | Locations | ✅ | ✅ |
instantMessageAddresses | InstantMessageAddress[] | IM connections | ✅ | ✅ |
urlAddresses | UrlAddress[] | Web Urls | ✅ | ✅ |
nonGregorianBirthday | Date | Birthday that doesn't conform to the Gregorian calendar format | ✅ | ❌ |
socialProfiles | SocialProfile[] | Social networks | ✅ | ❌ |
thumbnail | Image | Deprecated: Use image | ❌ | ❌ |
previousLastName | string | Deprecated: Use maidenName | ❌ | ❌ |
iOS Only
A parent to contacts. A contact can belong to multiple groups.
To get a group's children you can query with getContactsAsync({ groupId })
Here are some different query operations:
getContactsAsync({ groupId })
getGroupsAsync({ containerId })
getContainersAsync({ groupName })
Name | Type | Description |
---|---|---|
id | string | Immutable id representing the group |
name | string | The editable name of a group |
iOS Only
A parent to contacts and groups. You can query the default container with getDefaultContainerIdAsync()
.
Here are some different query operations:
getContactsAsync({ containerId })
getGroupsAsync({ containerId })
getContainersAsync({ contactId })
getContainersAsync({ groupId })
getContainersAsync({ containerId })
Name | Type | Description |
---|---|---|
id | string | Immutable id representing the group |
name | string | The editable name of a group |
Name | Type | Description |
---|---|---|
day | number | Day. |
month | number | Month - adjusted for JS Date which starts at 0. |
year | number | Year. |
format | CalendarFormatType | Format for input date. |
id | string | Unique ID. |
label | string | Localized display name. |
Name | Type | Description |
---|---|---|
name | string | Name of related contact. |
id | string | Unique ID. |
label | string | Localized display name. |
Name | Type | Description |
---|---|---|
string | email address. | |
isPrimary | boolean | Primary email address. |
id | string | Unique ID. |
label | string | Localized display name. |
Name | Type | Description |
---|---|---|
number | string | Phone number. |
isPrimary | boolean | Primary phone number. |
digits | string | Phone number without format, ex: 8674305. |
countryCode | string | Country code, ex: +1. |
id | string | Unique ID. |
label | string | Localized display name. |
Name | Type | Description |
---|---|---|
street | string | Street name. |
city | string | City name. |
country | string | Country name. |
region | string | Region or state name. |
neighborhood | string | Neighborhood name. |
postalCode | string | Local post code. |
poBox | string | P.O. Box. |
isoCountryCode | string | Standard code. |
id | string | Unique ID. |
label | string | Localized display name. |
iOS Only
Name | Type | Description |
---|---|---|
service | string | Name of social app. |
username | string | Username in social app. |
localizedProfile | string | Localized name. |
url | string | Web URL. |
userId | string | UID for social app. |
id | string | Unique ID. |
label | string | Localized display name. |
Name | Type | Description |
---|---|---|
service | string | Name of social app. |
username | string | Username in IM app. |
localizedService | string | Localized name of app. |
id | string | Unique ID. |
label | string | Localized display name. |
Name | Type | Description |
---|---|---|
url | string | Web URL |
id | string | Unique ID. |
label | string | Localized display name. |
Information regarding thumbnail images.
Name | Type | iOS | Android |
---|---|---|---|
uri | string | ✅ | ✅ |
width | number | ✅ | ❌ |
height | number | ✅ | ❌ |
base64 | string | ✅ | ❌ |
Android: You can get dimensions using
ReactNative.Image.getSize
. Avoid using Base 64 in React Native
Denotes the functionality of a native contact form.
Name | Type | Description |
---|---|---|
displayedPropertyKeys | FieldType[] | The properties that will be displayed. iOS: Does nothing in editing mode. |
message | string | Controller title. |
alternateName | string | Used if contact doesn't have a name defined. |
cancelButtonTitle | string | The name of the left bar button. |
groupId | string | The parent group for a new contact. |
allowsEditing | boolean | Allows for contact mutation. |
allowsActions | boolean | Actions like share, add, create. |
shouldShowLinkedContacts | boolean | Shows similar contacts. |
isNew | boolean | Present the new contact controller - if false the unknown controller will be shown. |
preventAnimation | boolean | Prevents the controller from animating in. |
Used to query contacts from the user's device.
Name | Type | Description | iOS | Android |
---|---|---|---|---|
fields | FieldType[] | If available the fields defined will be returned. If nil then all fields will be returned. | ✅ | ✅ |
pageSize | number | The max number of contacts to return. If nil or 0 then all contacts will be returned. | ✅ | ✅ |
pageOffset | number | The number of contacts to skip before gathering contacts. | ✅ | ✅ |
id | string | Get contacts with a matching ID . | ✅ | ✅ |
sort | SortType | Sort method used when gathering contacts. | ❌ | ✅ |
name | string | Query contacts matching this name. | ✅ | ❌ |
groupId | string | Get all contacts that belong to the group matching this ID. | ✅ | ❌ |
containerId | string | Get all contacts that belong to the container matching this ID. | ✅ | ❌ |
rawContacts | boolean | Prevent unification of contacts when gathering. Default: false . | ✅ | ❌ |
iOS Only
Used to query native contact groups.
Name | Type | Description |
---|---|---|
groupName | string | Query all groups matching a name. |
groupId | string | Query the group with a matching ID. |
containerId | string | Query all groups that belong to a certain container. |
iOS Only
Used to query native contact containers.
Name | Type | Description |
---|---|---|
contactId | string | Query all the containers that parent a contact. |
groupId | string | Query all the containers that parent a group. |
containerId | string | Query a container from it's ID. |
The return value for queried contact operations like getContactsAsync
.
Name | Type | Description |
---|---|---|
data | Contact[] | An array of contacts that match a particular query. |
hasNextPage | boolean | This will be true if there are more contacts to retrieve beyond what is returned. |
hasPreviousPage | boolean | true if there are previous contacts that weren't retrieved due to pageOffset . |
number | Deprecated: use data.length to get the number of contacts returned. |
const contactField = Contact.Fields.FirstName;
Name | Value | iOS | Android |
---|---|---|---|
ID | 'id' | ✅ | ✅ |
Name | 'name' | ✅ | ✅ |
FirstName | 'firstName' | ✅ | ✅ |
MiddleName | 'middleName' | ✅ | ✅ |
LastName | 'lastName' | ✅ | ✅ |
NamePrefix | 'namePrefix' | ✅ | ✅ |
NameSuffix | 'nameSuffix' | ✅ | ✅ |
PhoneticFirstName | 'phoneticFirstName' | ✅ | ✅ |
PhoneticMiddleName | 'phoneticMiddleName' | ✅ | ✅ |
PhoneticLastName | 'phoneticLastName' | ✅ | ✅ |
Birthday | 'birthday' | ✅ | ✅ |
Emails | 'emails' | ✅ | ✅ |
PhoneNumbers | 'phoneNumbers' | ✅ | ✅ |
Addresses | 'addresses' | ✅ | ✅ |
InstantMessageAddresses | 'instantMessageAddresses' | ✅ | ✅ |
UrlAddresses | 'urlAddresses' | ✅ | ✅ |
Company | 'company' | ✅ | ✅ |
JobTitle | 'jobTitle' | ✅ | ✅ |
Department | 'department' | ✅ | ✅ |
ImageAvailable | 'imageAvailable' | ✅ | ✅ |
Image | 'image' | ✅ | ✅ |
Note | 'note' | ✅ | ✅ |
Dates | 'dates' | ✅ | ✅ |
Relationships | 'relationships' | ✅ | ✅ |
Nickname | 'nickname' | ✅ | ✅ |
RawImage | 'rawImage' | ✅ | ✅ |
MaidenName | 'maidenName' | ✅ | ✅ |
ContactType | 'contactType' | ✅ | ✅ |
SocialProfiles | 'socialProfiles' | ✅ | ❌ |
NonGregorianBirthday | 'nonGregorianBirthday' | ✅ | ❌ |
Thumbnail | Deprecated: use Image | ❌ | ❌ |
PreviousLastName | Deprecated: use MaidenName | ❌ | ❌ |
const formType = Contacts.FormTypes.New;
Name | Value | Description |
---|---|---|
New | 'new' | Creating a contact |
Unknown | 'unknown' | Displaying a contact with actions |
Default | 'default' | Information regarding a contact |
iOS Only
const contactType = Contacts.ContactTypes.Person;
Name | Value | Description |
---|---|---|
Person | 'person' | Contact is a human |
Company | 'company' | Contact is group or company |
const sortType = Contacts.SortTypes.FirstName;
Name | Value | Description | iOS | Android |
---|---|---|---|---|
FirstName | 'firstName' | Sort by first name in ascending order | ✅ | ✅ |
LastName | 'lastName' | Sort by last name in ascending order | ✅ | ✅ |
UserDefault | 'userDefault' | The user default method of sorting | ✅ | ❌ |
iOS Only
const containerType = Contacts.ContainerTypes.CardDAV;
Name | Value | Description |
---|---|---|
Local | 'local' | A local non-iCloud container |
Exchange | 'exchange' | In association with Email |
CardDAV | 'cardDAV' | cardDAV protocol used for sharing |
Unassigned | 'unassigned' | Unknown |
const calendarFormat = Contacts.CalendarFormats.Coptic;
This format denotes the common calendar format used to specify how a date is calculated in nonGregorianBirthday
fields.
Constant | value | iOS | Android |
---|---|---|---|
Gregorian | 'gregorian' | ✅ | ✅ |
Chinese | 'chinese' | ✅ | ❌ |
Hebrew | 'hebrew' | ✅ | ❌ |
Islamic | 'islamic' | ✅ | ❌ |
51.0.0 — 2024-05-07
expo-auth-session
expoClientId
field from auth proxy. (#28590 by @EvanBacon)expo-barcode-scanner
expo-barcode-scanner
is now deprecated. Please use expo-camera
instead. (#26025 by @alanjhughes)expo-constants
expo-face-detector
expo-face-detector
is now deprecated. We recommed using react-native-vision-camera instead. (#26026 by @alanjhughes)expo-location
expo-local-authentication
expo-modules-core
expo-sms
sendSMSAsync
now throws error code ERR_UNAVAILABLE
instead of E_SMS_UNAVAILABLE
. (#27437 by @EvanBacon)expo-sqlite
expo-barcode-scanner
BarCodeScannerResult
now returns an additional raw
field corresponding to the barcode value as it was encoded in the barcode without parsing. Will always be undefined on iOS. (#25391 by @ajacquierbret)expo-blur
expo-asset
expo-camera
BarCodeAnalyzer
now passes an additional raw
field to its onComplete
callback, corresponding to the barcode value as it was encoded in the barcode without parsing. Will always be undefined on iOS. (#25391 by @ajacquierbret)false
instead of permission messages. (#28107 by @EvanBacon)pictureSize
prop to CameraView
component. (#27664 by @alanjhughes)NSMicrophoneUsageDescription
and ignore the mute
prop if they don't intend to use video. (#28156 by @alanjhughes)animateShutter
prop to provide feedback when a picture is taken. Also added shutter sound on android. (#28211 by @alanjhughes)expo-constants
expo-crypto
expo-contacts
expo-font
expo-file-system
expo-haptics
rigid
and soft
impact types (#28169 by @rodperottoni)expo-image-picker
false
instead of permission messages. (#28107 by @EvanBacon)legacy
option to ImagePickerOptions
to allow using the legacy image picker on android. (#28514 by @alanjhughes)expo-image-manipulator
expo-linear-gradient
expo-keep-awake
expo-location
formattedAddress
to the LocationGeocodedAddress
. (#26342 by @whysetiawan & @lukmccall) (#26342 by @whysetiawan, @lukmccall) (#26342, #26342 by @whysetiawan, @lukmccall, @whysetiawan, @lukmccall)isAndroidForegroundServiceEnabled
config plugin option #27265 by @brentvatne)false
instead of permission messages. (#28107 by @EvanBacon)expo-localization
expo-local-authentication
expo-network
expo-modules-core
Date
type converter. (#26148 by @alanjhughes)PlatformColor
and DynamicColorIOS
color props. (#26724 by @dlindenkreuz)BarCodeScannerResult
interface now declares an additional raw
field corresponding to the barcode value as it was encoded in the barcode without parsing. Will always be undefined on iOS. (#25391 by @ajacquierbret)createWebModule
function to wrap web functionality with the NativeModule class. (#27739 by @aleqsio)expo.SharedObject
) with a simple mechanism to release native pointer from JS. (#27038 by @tsapeta & #27331 by @lukmccall) (#27038, #27331 by @tsapeta, @lukmccall)AnyExpoView
(#27284 by @dominicstop)startObserving
and stopObserving
in the new EventEmitter
class. (#27393 by @tsapeta)NativeModule
class that inherits from EventEmitter
. (#27510 by @tsapeta)OnStartObserving
and OnStopObserving
can now be attached to a specific event. (#27766 by @tsapeta)reloadAppAsync
to reload the app. (#28400 by @kudo)expo-media-library
expo-screen-capture
expo-secure-store
false
instead of permission messages. (#28107 by @EvanBacon)canUseBiometricAuthentication
function. (#26767 by @behenate)expo-store-review
StoreReview.isAvailableAsync()
on iOS now resolves to false
for apps distributed through TestFlight. (#25900 by @gabrieldonadel)expo-sqlite
SQLiteStatement.executeForRawResultAsync()
in expo-sqlite/next
API which returns array based raw values than key-value based row value. (#26073 by @kudo)expo.sqlite.customBuildFlags
gradle property to support custom sqlite3 building flags. (#27385 by @kudo)serializeAsync()
and deserializeDatabaseAsync()
to serialze and deserialize databases. (#27422 by @kudo)SQLiteProvider.assetSource
to import an existing database from assets. (#28291 by @kudo)expo-av
Events
to AVModule
to prevent event emitter warning. (#26434 by @alanjhughes)AVManager
. (#28159 by @lukmccall)HashMap cannot be cast to ReadableNativeMap
error on Android. (#28317 by @lukmccall)expo-blur
setNativeProps
being removed. (#27721 by @EvanBacon)expo-asset
unstable_path
in development. (#26084 by @EvanBacon)TypeError: (0, _ExpoAsset.downloadAsync) is not a function
when loading assets using Expo Web. (#28405 by @jamiees2)downloadAsync()
does not support Android resources from release builds. (#28604 by @kudo)expo-calendar
expo-camera
iOS
, barcode types were not converted correctly causing the scanner to not start immediately. (#26704 by @alanjhughes)iOS
, fix maxDuration
timescale on videos. (#26882 by @alanjhughes)Android
, fix the camera not being released when the view is destroyed. (#27086 by @alanjhughes)iOS
, fix the orientation value in onResponsiveOrientationChanged
when exif
is set to true. (#27314 by @alanjhughes)Android
, fix empty qualities being passed to QualitySelector (#27126 by @leonhh)web
, prevent creating a webworker when rendering on the server (#27222 by @marklawlor)iOS
, fix method call on an optional variable. (#27235 by @alanjhughes)flash
being passed to native. (#27394 by @alanjhughes)mute
prop is passed to native so it is correctly initialiased even when not provided from JS. (#27546 by @alanjhughes)iOS
, fix camera orientation on initial render. (#27545 by @alanjhughes)iOS
, fix an issue where the configuration can be interuppted when the dev menu is presented on intial launch. (#27572 by @alanjhughes)iOS
, fix getAvailablePictureSizes
in the legacy package. (#27642 by @alanjhughes)iOS
where the barcode types did not match the typescript representation. Also enabled scanning upc_a
codes on iOS
. (#28233 by @alanjhughes)iOS
, fixed regression where recording a video captures dark frames. Reduced frequency of camera initialization. (#28427 by @alanjhughes)expo-constants
expo-contacts
expo-device
Device.productName
now returns Build.PRODUCT
instead of Build.DEVICE
. (#27230 by @alex-fournier)expo-font
expo-file-system
iOS
, set httpMethod
on upload requests. (#26516 by @alanjhughes)iOS
, fix upload task requests. (#26880 by @alanjhughes)iOS
, fix an issue with copyAsync
where the copy fails if it is a photo library asset. (#27208 by @alanjhughes)iOS
, resolve the promise manually after copying a PHAsset file. (#27381 by @alanjhughes)CookieHandler
as it's no longer in the module registry and not necessary. (#28145 by @alanjhughes)expo-gl
react-native-reanimated
. (#28414 by @lukmccall)expo-image-picker
fileSize
was named filesize
which did not match the docs & typescript definition. (#27293 by @WookieFPV) (#27293 by @wookieFPV)expo-intent-launcher
double
. However, it must be int
. (#26164 by @Alperengozum)expo-location
expo-task-manager
module for methods that don't use it. (#26200 by @behenate)NullPointerException: it must not be null
. (#26688 by @lukmccall)Android
, prevent location service from starting when permission is not in the manifest. (#27355 by @alanjhughes)expo-localization
expo-modules-core
OnCreate
was called before the React
instance was ready. (#25866 by @lukmccall)SharedObjectRegistry
crash for accessing internal data structures from multi-threads. (#25997 by @kudo)SharedObject
leakage on Android. (#25995 by @kudo)Enumerable
. (#26108 by @alanjhughes)Serializable
types are not obfuscated. (#26545 by @alanjhughes)onCreate
before OnActivityEntersForeground
event. (#26944 by @lukmccall)RCTHost
is not retained on iOS bridgeless mode. (#27715 by @kudo)recreateRootViewWithBundleURL
parameters. (#27989 by @gabrieldonadel)ExpoBridgeModule.installModules()
is broken on Android and bridgeless mode. (#28065 by @kudo)expo::MethodMetadata::convertJSIArgsToJNI
. (#28163 by @lukmccall)TypeError: Cannot read property 'NativeModule' of undefined
exceptions on Android. (#28200 by @kudo)fallbackToCacheTimeout
. (#28227 by @kudo)EXJavaScriptObject
accesses to dangling pointers. (#28262 by @kudo)AppContext.onHostResume()
sometimes getting null currentActivity
on Android. (#28338 by @kudo)std::shared_ptr<JavaCalllback::CallbackContext>::__on_zero_shared
. (#28483 by @lukmccall)field operation on NULL object
when reloading the app. (#28555 by @lukmccall)expo-media-library
default
as sorting key. (#28328 by @aleqsio)expo-notifications
expo-notifications
requiring the expo-task-manager
module to start. (#26227 by @behenate)UnavailabilityError
when trying to use setNotificationCategoryAsync
on web. (#26511 by @marklawlor).native
hardcoded platform imports (#26511 by @marklawlor)Android
, added events to module definition to clear warnings. (#26654 by @alanjhughes)expo-screen-capture
DETECT_SCREEN_CAPTURE
permission. (#27148 by @alanjhughes)expo-screen-orientation
expo-sensors
Android
, add event name to definition in the DeviceMotionModule
. (#26679 by @alanjhughes)expo-store-review
expo-task-manager
Android
, added events to module definition to clear warnings. (#26654 by @alanjhughes)expo-sqlite
NativeStatementBinding
leakage on Android. (#25996 by @kudo)SQLiteDatabase.getAllAsync()
in expo-sqlite/next API. (#26344 by @kudo)expo-sqlite/next
cannot be imported from an ESM project. (#27423 by @kudo)NullPointerException
on Android when opening the same database multiple times. (#27748 by @kudo)expo-video-thumbnails
expo-web-browser
iOS
, fix an issue where rapidly opening and closing the browser would leave the module in a bad state, preventing opening the browser again. (#28452 by @alanjhughes)expo-application
expo-av
com.facebook.react:react-native:+
Android dependency with com.facebook.react:react-android
. (#26237 by @kudo)name
property. (#27437 by @EvanBacon)expo-background-fetch
name
property. (#27437 by @EvanBacon)expo-auth-session
expo-battery
name
property. (#27437 by @EvanBacon)expo-brightness
name
property. (#27437 by @EvanBacon)expo-barcode-scanner
name
property. (#27437 by @EvanBacon)expo-blur
expo-asset
downloadAsync
to a native implementation. (#27369 by @aleqsio)expo-calendar
name
property. (#27437 by @EvanBacon)expo-cellular
expo-camera
Barcode
consistent. (#26900 by @alanjhughes)name
property. (#27437 by @EvanBacon)Android
, requesting audio permissions was meant to be optional in the config plugin. (#27365 by @alanjhughes)Android
, only recreate camera after certain props have changed. (#27952 by @alanjhughes)next
package to stable. (#28226 by @alanjhughes)expo-clipboard
expo-constants
expo-crypto
name
property. (#27437 by @EvanBacon)https
. (#26729 by @EvanBacon)expo-contacts
name
property. (#27437 by @EvanBacon)ShareOptions
type for shareContactAsync
parameter typing. (#26208 by @Simek)expo-device
expo-document-picker
name
property. (#27437 by @EvanBacon)expo-font
name
property. (#27437 by @EvanBacon)expo-face-detector
name
property. (#27437 by @EvanBacon)expo-file-system
expo-gl
expo-haptics
name
property. (#27437 by @EvanBacon)expo-image-loader
expo-image-picker
name
property. (#27437 by @EvanBacon).jpeg
in the ImagePicker result. (#26419 by @NikitaDudin)expo-intent-launcher
name
property. (#27437 by @EvanBacon)expo-image-manipulator
name
property. (#27437 by @EvanBacon)expo-linear-gradient
expo-keep-awake
expo-location
expo-localization
expo-local-authentication
name
property. (#27437 by @EvanBacon)expo-mail-composer
expo-network
expo-modules-core
1.8.10
to 1.8.22
. (#25945 by @lukmccall)com.facebook.react:react-native:+
Android dependency with com.facebook.react:react-android
. (#26237 by @kudo)expo.modules.core.Promise
. (#27471 by @aleqsio)global.ExpoModules
. (#26027 by @tsapeta)ObjectDeallocator
is now a native state instead of a host object. (#26906 by @tsapeta)SharedObjectRegistry
being a singleton. (#27032 by @tsapeta)EXCreateReactBindingRootView
to create correct React Native setup for New Architecture mode. (#27216 by @kudo)AppContext
in ExpoBridgeModule
. (#27378 by @alanjhughes)EXReactRootViewFactory.createDefaultReactRootView:
to RCTAppDelegate.recreateRootViewWithBundleURL:
category. (#27945 by @kudo)ReactNativeHostHandler.onReactInstanceException()
for client to listen for exceptions on Android. (#27815 by @kudo)expo-font
and nothing else depends on them. (#26380 by @tsapeta)onDidCreateDevSupportManager
handler to support error recovery from expo-updates. (#28177 by @kudo)ExpoReactDelegateHandler.bundleURL
for clients to override newer bundleURL. (#28256 by @kudo)expo-media-library
name
property. (#27437 by @EvanBacon)ACCESS_MEDIA_LOCATION
Android permission should not pulled into by default and should be pulled through Config Plugins. (#28230 by @kudo)expo-notifications
expo-screen-capture
expo-print
name
property. (#27437 by @EvanBacon)expo-random
name
property. (#27437 by @EvanBacon)expo-screen-orientation
name
property. (#27437 by @EvanBacon)expo-sharing
name
property. (#27437 by @EvanBacon)expo-secure-store
name
property. (#27437 by @EvanBacon)expo-sms
name
property. (#27437 by @EvanBacon)expo-speech
expo-sensors
name
property. (#27437 by @EvanBacon)expo-store-review
name
property. (#27437 by @EvanBacon)expo-task-manager
expo-sqlite
onDatabaseChange
event from legacy API as it is not supported natively. (#26655 by @alanjhughes)name
property. (#27437 by @EvanBacon)expo-video-thumbnails
name
property. (#27437 by @EvanBacon)expo-web-browser
androidx.browser:browser
to 1.6.0
#26619 by @zoontekname
property. (#27437 by @EvanBacon)https
. (#26729 by @EvanBacon)compare-urls
and url
dependencies in favor of built-in URL support. (#26702 by @EvanBacon)unimodules-app-loader
FAQs
Provides access to the phone's system contacts.
The npm package expo-contacts receives a total of 7,408 weekly downloads. As such, expo-contacts popularity was classified as popular.
We found that expo-contacts demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 0 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
Create React App is officially deprecated due to React 19 issues and lack of maintenance—developers should switch to Vite or other modern alternatives.
Security News
Oracle seeks to dismiss fraud claims in the JavaScript trademark dispute, delaying the case and avoiding questions about its right to the name.
Security News
The Linux Foundation is warning open source developers that compliance with global sanctions is mandatory, highlighting legal risks and restrictions on contributions.