
푸시 알림 기능을 구현하면서 흥미로운 문제 상황을 마주했습니다.
매칭 참여자들에게 메시지를 전달하는 푸시 알림 시스템을 구축했지만, 정작 많은 사용자들이 푸시 알림 권한을 허용하지 않은 상태라는 것을 발견했죠.
처음에는 단순히 로그인 직후에 권한을 요청하는 방식을 사용했지만, 이는 사용자들에게 '왜 이 권한이 필요한지'에 대한 충분한 맥락을 제공하지 못했습니다.
이 문제를 어떻게 해결할 수 있을까 고민하다가, 사용자가 실제로 메시지의 필요성을 느끼는 시점에 권한을 요청하는 방식을 떠올리게 되었습니다.
// 로그인 성공 후 바로 권한 요청
const handleLoginSuccess = async () => {
await requestPushPermission();
navigation.navigate('MainScreen');
};
// 메시지 컴포넌트
const MessageCenter = () => {
const [messages, setMessages] = useState([]);
const [isPushEnabled, setIsPushEnabled] = useState(false);
useEffect(() => {
checkPushPermission();
fetchMessages();
}, []);
const checkPushPermission = async () => {
const { status } = await Notifications.getPermissionsAsync();
setIsPushEnabled(status === 'granted');
};
const requestPushPermission = async () => {
const { status: existingStatus } = await Notifications.getPermissionsAsync();
if (existingStatus !== 'granted') {
const { status } = await Notifications.requestPermissionsAsync();
setIsPushEnabled(status === 'granted');
if (status === 'granted') {
const token = await Notifications.getExpoPushTokenAsync();
// 서버에 토큰 저장
await saveTokenToServer(token);
}
}
};
const handleNewMessage = () => {
if (!isPushEnabled) {
Alert.alert(
"새로운 메시지가 도착했습니다",
"실시간으로 메시지를 받아보시려면 푸시 알림을 허용해주세요.",
[
{
text: "나중에",
style: "cancel"
},
{
text: "허용하기",
onPress: requestPushPermission
}
]
);
}
};
return (
<View style={styles.container}>
{!isPushEnabled && (
<View style={styles.banner}>
<Text style={styles.bannerText}>
실시간 알림을 받고 중요한 메시지를 놓치지 마세요!
</Text>
<TouchableOpacity
style={styles.bannerButton}
onPress={requestPushPermission}
>
<Text style={styles.bannerButtonText}>
푸시 알림 설정
</Text>
</TouchableOpacity>
</View>
)}
<MessageList messages={messages} />
</View>
);
};
적절한 타이밍
명확한 가치 제안
부드러운 UX
이러한 접근 방식을 통해 다음과 같은 효과를 얻을 수 있습니다:
1. 푸시 알림 권한 수락률 증가
2. 사용자 경험 개선
3. 메시지 전달률 향상
이러한 전략적 접근을 통해 사용자들에게 더 나은 경험을 제공하면서도 필요한 권한을 효과적으로 얻을 수 있습니다.