Closed nigelAt8Seats closed 1 month ago
Hey there, @nigelAt8Seats and thank you for opening this issue. To better understand what's happening here, do you have some frontend code you can share that details how/where you're calling identitfyUser()
? And is this happening with every user within your app or just intermittently after you tried to remove Analytics?
Hiya, I believe our code is the equivalent to that in the react-native documentation.
const CognitoUserProvider = ({ children }: { children: ReactNode }) => {
const [cognitoUser, setCognitoUser] = useState<AuthUser | undefined>();
const { showNoConnection } = useShowNoConnection(cognitoUser);
const { deviceToken } = useContext(DeviceTokenContext);
const checkForLoggedInUser = useCallback(async () => {
const user = await getCurrentUser().catch(() => null);
logger.debug('>>>>>>>>> user::', user);
if (user) {
setCognitoUser(user);
logger.debug('bootstrapping user session successful.');
} else {
setCognitoUser(undefined);
}
}, [setCognitoUser]);
useEffect(() => {
if (cognitoUser) {
const identifyUserInput: IdentifyUserInput = {
// E.g. user-id
options: {
address: deviceToken,
optOut: 'NONE', // Either ALL or NONE
},
userId: cognitoUser.userId,
userProfile: {},
};
identifyUser(identifyUserInput);
postHogTrack('New Device Token Received', {
user: cognitoUser?.userId ?? '',
token: deviceToken ?? '',
});
logger.debug('identifying user successful');
}
}, [cognitoUser, deviceToken]);
useEffect(() => {
checkForLoggedInUser()
.catch((err: any) => {
logger.warn('warn::checkForLoggedInUser::', err);
setCognitoUser(undefined);
})
.finally(() => {
BootSplash.hide({ fade: true });
});
}, [checkForLoggedInUser]);
return (
<CognitoUserContext.Provider
value={{
checkForLoggedInUser,
cognitoUser,
setCognitoUser,
}}>
{showNoConnection ? <NoConnection /> : children}
</CognitoUserContext.Provider>
);
};
export default CognitoUserProvider;
We have a cognito user provider.
export const DeviceTokenContext = createContext<{
deviceToken?: string;
}>({
deviceToken: undefined,
});
export const DeviceTokenProvider = ({ children }: { children: ReactNode }) => {
const [deviceToken, setDeviceToken] = useState<string | undefined>();
useEffect(() => {
const tokenListener = onTokenReceived(async token => {
logger.debug('deviceTokenProvider:: token received:', token);
setDeviceToken(token);
});
return () => {
tokenListener.remove();
};
}, [setDeviceToken]);
return (
<DeviceTokenContext.Provider value={{ deviceToken }}>
{children}
</DeviceTokenContext.Provider>
);
};
#also
const initSignIn = async () => {
const user = await getCurrentUser();
logger.debug('user', user);
const localUserId = await AsyncStorage.getItem('8seats::userId');
if (localUserId !== user.userId) {
await DataStore.clear();
await AsyncStorage.setItem('8seats::userId', user.userId);
}
const identifyUserInput: IdentifyUserInput = {
// E.g. user-id
options: {
optOut: 'NONE', // Either ALL or NONE
},
userId: user.userId,
userProfile: {},
};
await identifyUser(identifyUserInput);
return user;
};
The problem has existed for months... Turning off Analytics has made it less frequent; but still possible.
Disabling analytics
disable(); // analytics
Amplify.configure(amplifyconfig); # << I took all the analytics stuff out of the config too.
configureAutoTrack({
enable: false,
type: 'session', # << react native so autotracking is only for session
});
initializePushNotifications();
// also called when the process is Terminated
onNotificationReceivedInBackground(
NotificationsService.onNotificationReceivedInBackgroundOrTerminatedHandler,
);
@nigelAt8Seats, appreciate the sample code. Just to confirm, is this all areas where identifyUser()
is called?
Updating this issue to be a bug and we are actively investigating this further. It looks like the root problem is with the UpdateEndpoint util in core where we are using a fallback value that changes what is set when calling an API like identifyUser()
.
We'll update this issue as we make progress.
Hi @nigelAt8Seats
Amplify JS v6.3.1 has just been released. It should contain the following fixes: https://github.com/aws-amplify/amplify-js/issues/13174 https://github.com/aws-amplify/amplify-js/pull/13353
We believe these fixes should resolve your issue of the endpoint being overwritten by the device registration. Could you please help us by verifying if this is indeed the case by updating to the latest Amplify version? Thank you
We moved to using firebase cloud messaging instead of pinpoint to avoid the issue entirely.
@nigelAt8Seats, we appreciate the follow up comment and will close the issue as resolved at this point. Feel free to let us know if you're able to validate fixes and come back to Analytics/Pinpoint at any time!
Before opening, please confirm:
JavaScript Framework
React Native
Amplify APIs
Analytics, Push Notifications
Amplify Version
v6
Amplify Categories
analytics, notifications
Backend
Amplify CLI
Environment information
Describe the bug
React Native app. We send pinpoint push notifications and analytics.
We
PushNotifications.identitfyUser
as soon as we have the cognito sub. We always use the cognito sub. Logging shows we never call it incorrectly... but the endpoints keeps getting their user id set to the identityId. This breaks notifications as we can't look up the endpoints using the user id any more.I've experimented with turning off all the analytics I can. I can still create the problem intermittently by minimising the app while it's loading... before the user id has been set.
Expected behavior
The user id in the endpoints should stay set to the cognito user id.
Reproduction steps
I can still create the problem intermittently by minimising the app while it's loading... before the user id has been set.
Code Snippet
Log output
aws-exports.js
No response
Manual configuration
No response
Additional configuration
No response
Mobile Device
No response
Mobile Operating System
No response
Mobile Browser
No response
Mobile Browser Version
No response
Additional information and screenshots
No response