useEffect(() => {
console.log("Checking current user...");
if (auth.currentUser) {
const uid = auth.currentUser.uid;
fetchUserData(uid)
.then((data) => {
console.log("User data fetched:", data);
setUser(data as User);
fetchContacts();
})
.catch((error) => console.log("Error fetching user data:", error));
}
}, [auth.currentUser]);
const fetchContacts = async () => {
try {
console.log("Requesting contacts permission...");
const { status } = await Contacts.requestPermissionsAsync();
console.log("Contacts permission status:", status);
setPermissionStatus(status);
if (status === "granted") {
console.log("Fetching contacts...");
const { data } = await Contacts.getContactsAsync({
rawContacts: true,
});
// const { data } = await Contacts.getContactsAsync({
// fields: [Contacts.Fields.FirstName, Contacts.Fields.LastName, Contacts.Fields.PhoneNumbers, Contacts.Fields.Emails],
// });
console.log(`Contacts fetched: ${data.length} contacts.`);
setContacts(data);
} else {
console.log("Contacts permission denied");
setError("Contacts permission denied");
Alert.alert("Permission Denied", "Contacts permission not granted.");
}
} catch (error: any) {
console.error("Error fetching contacts:", error);
setError(error.message);
Alert.alert("Error", error.message);
}(error: any) => {
console.error("Error fetching contacts:", error);
setError(error.message);
Alert.alert("Error", error.message);
}
};
With this code, I get the following console.log:
LOG Form submission initiated with values: {"email": "[email protected]", "password": "xxx"}
LOG Set loading action dispatched with isLoading: true
LOG Handling setLoading in reducer
LOG Handling login request in reducer
LOG Dispatching loginSuccess action...
LOG Handling login success in reducer
LOG Handling hideLoading in reducer
LOG Checking current user...
LOG User data fetched: {"consentReceiveEmailSMS": true, "email": "[email protected]", "emailVerified": true, "firstName": "aaa", "lastLoggedIn": {"nanoseconds": 960000000, "seconds": 1716267809}, "lastName": "bbb", "phoneNumber": "(ccc)ccc-cccc", "phoneNumberVerified": true, "registeredOn": "2023-09-24T18:30:41.071Z", "username": "xxx"}
LOG Requesting contacts permission...
LOG Contacts permission status: granted
LOG Fetching contacts...
LOG Contacts fetched: 857 contacts.
However, if I change to filter for specific fields, then my app crashes without any further warning messages. Here is the modified code block:
useEffect(() => {
console.log("Checking current user...");
if (auth.currentUser) {
const uid = auth.currentUser.uid;
fetchUserData(uid)
.then((data) => {
console.log("User data fetched:", data);
setUser(data as User);
fetchContacts();
})
.catch((error) => console.log("Error fetching user data:", error));
}
}, [auth.currentUser]);
const fetchContacts = async () => {
try {
console.log("Requesting contacts permission...");
const { status } = await Contacts.requestPermissionsAsync();
console.log("Contacts permission status:", status);
setPermissionStatus(status);
if (status === "granted") {
console.log("Fetching contacts...");
const { data } = await Contacts.getContactsAsync({
fields: [Contacts.Fields.FirstName, Contacts.Fields.LastName, Contacts.Fields.PhoneNumbers, Contacts.Fields.Emails],
});
console.log(`Contacts fetched: ${data.length} contacts.`);
setContacts(data);
} else {
console.log("Contacts permission denied");
setError("Contacts permission denied");
Alert.alert("Permission Denied", "Contacts permission not granted.");
}
} catch (error: any) {
console.error("Error fetching contacts:", error);
setError(error.message);
Alert.alert("Error", error.message);
}(error: any) => {
console.error("Error fetching contacts:", error);
setError(error.message);
Alert.alert("Error", error.message);
}
};
Console logs are as follows:
LOG Checking current user...
LOG User data fetched: {"consentReceiveEmailSMS": true, "email": "[email protected]", "emailVerified": true, "firstName": "aaa", "lastLoggedIn": {"nanoseconds": 960000000, "seconds": 1716267809}, "lastName": "bbb", "phoneNumber": "(ccc)ccc-cccc", "phoneNumberVerified": true, "registeredOn": "2023-09-24T18:30:41.071Z", "username": "xxx"}
LOG Requesting contacts permission...
LOG Contacts permission status: granted
LOG Fetching contacts..
According to expo-contacts documentation, this is the right way to request these fields. My app.json looks as follows and has according to my understanding also the right permissions:
{
"expo": {
"plugins": [
[
"expo-contacts",
{
"contactsPermission": "Allow xxx to access your contacts."
}
]
],
"name": "xxx",
"slug": "xxx",
"version": "1.0.0",
"orientation": "portrait",
"icon": "./assets/color_logo_with_background.png",
"userInterfaceStyle": "light",
"splash": {
"image": "./assets/splash.png",
"resizeMode": "contain",
"backgroundColor": "#ffffff"
},
"assetBundlePatterns": ["**/*"],
"ios": {
"supportsTablet": true,
"bundleIdentifier": "com.xxx.zzz",
"infoPlist": {
"NSContactsUsageDescription": "xxx"
}
},
"android": {
"adaptiveIcon": {
"foregroundImage": "./assets/adaptive-icon.png",
"backgroundColor": "#ffffff"
},
"permissions": ["READ_CONTACTS"]
},
"web": {
"favicon": "./assets/favicon.png"
},
"extra": {
"eas": {
"projectId": "aaa"
}
},
"sdkVersion": "51.0.0"
}
}
I’ve added every log I can think of, but I don’t know how to further debug this situation. I’m using ExpoGo.
The other thing is, that on an iPhone8, the code works without problems, on newer generations (12 and above) it doesn’t. Both devices run the same iOS version (17.5.1)
Any advice is appreciated.