작성
·
72
·
수정됨
0
안녕하세요. 새로 올려주신 강의를 흥미롭게 듣고 있습니다. 저는 아이폰을 이용해서 테스트 중인데, 안드로이드와는 좀 다른 움직임이 있어서 질의드립니다.
권한 설정화면 Link되면 저희가 구성한 하이브리드 앱이 웹뷰로 더 이상 연결되지 않는것처럼 보입니다. 이 부분 어떻게 해결할수 있을까요?
그리고 권한 설정화면으로 이동하여 권한을 수정한 후 제거하고 ( 해당 화면은 권한을 설정한다고 해서 사라지거나 하지 않습니다 ) expo로 돌아오면 active가 들어와야 하는데 그렇지 않습니다. 코드에 setInterval을 줬으니 뭔가 주기적으로 수행하지 않을까 싶어서 로그를 줘봤으나 전혀 구동하지 않았습니다.
여러가지 테스트를 해보았는데, 앱권한 설정페이지로 이동하는 쿼리인 openDeviceSystemForSettingSet을 호출하면 앱의 권한 화면이 Link되고, 그러면서 기존의 하이브리드 앱이 웹뷰로 연결되지 않는것 같습니다.
제 코드가 잘못되었나 싶어서 setInterval을 없애고 fetch의 순서를 바꿔봤습니다. openDeviceSystemForSettingSet을 맨뒤에 배치해봤을때는 모든 결과가 잘 들어왔습니다. 그러나 6-2와 같이 openDeviceSystemForSettingSet를 먼저 호출하고 이후에 fetchDeviceLocationforPermissionSet이나 fetchDeviceSystemForAppStateSet의 fetch를 수행하려 하면 작동하지 않습니다.
인공지능에게 문의하니 상태 구독을 하라고 하여 아래와 같이 구독을 mobile의 index.tsx에 추가하였습니다.
React.useEffect(() => {
const subscription = AppState.addEventListener("change", (nextAppState) => {
if (nextAppState === "active") {
console.log("✅ 앱이 다시 활성화됨. WebView에 메시지 전송!");
webviewRef.current?.postMessage("APP_ACTIVE");
}
});
그리고 page.tsx에는 app이 active가 되면 이를 받아올수 있도록 함수를 구성하고 그 안에서 fetchDeviceLocationforPermissionSet이나 fetchDeviceSystemForAppStateSet를 받아오도록 변경했습니다.
useEffect(() => {
const handleMessage = (event) => {
if (event.data === "APP_ACTIVE") {
console.log(
"🔄 WebView에서 APP_ACTIVE 메시지 수신! fetchApp 다시 실행"
);
checkPermissions();
}
};
window.addEventListener("message", handleMessage);
return () => {
window.removeEventListener("message", handleMessage);
};
}, []);
const checkPermissions = async () => {
try {
console.log("📡 위치 권한 상태 확인 요청");
const result = await fetchApp({
query: "fetchDeviceLocationforPermissionSet",
});
const status = result.data.fetchDeviceLocationforPermissionSet.status;
webviewlog(` 위치 권한 상태: ${status}`);
const appStateResult = await fetchApp({
query: "fetchDeviceSystemForAppStateSet",
});
const isForeground =
appStateResult.data.fetchDeviceSystemForAppStateSet.isForeground;
webviewlog(` 앱 활성화 상태: ${isForeground}`);
} catch (error) {
console.error(" fetch 요청 실패:", error);
}
};
이렇게 하니 앱이 활성화되면 이벤트 리스너를 통해 결과가 전달되어져 오기는 합니다.
강의에서 해주셨던 setInterval설정이 훨씬 간편하지라 아이폰에서 구성하려면 어떻게 해야할지 어떤 이유로 이렇게 되는지 궁금하여 질의드립니다.
2. 그리고, 원두님이 안드로이드를 통해 보여주신 것과 같이 허용함을 다시 묻지 않는데 이런 설정을 별도로 추가해야 하는걸까요?
제가 뭔가 누락한 건지 모르겠습니다.
원두님은 관련코드를 구성하지 않으셔도 사용에 대한 질의가 나타나는데, 저의 경우는 권한 설정기능이 바로 띄워집니다. 일반적인 앱들을 사용하다보면 권한 허용 질의 이후(모달창??)에 허용을 누르고 , 권한설정을 한 후 지도로 들어가고 그렇게 구성되는데 그런 구성이 누락되어 , 웹뷰 연동이 안되는것일까
답변 1
0
안녕하세요, 인프런 AI 인턴입니다. 이지은 님.
아이폰의 권한 설정과 관련된 질문에 대해 살펴보시려면 아래의 답변 링크들이 도움이 될 수 있습니다. iOS와 Android는 권한 처리 방식이 다를 수 있으며, 특히 iOS에서는 앱이 배경으로 가면서 권한 설정 화면이 나올 때 앱의 제어권에 민감할 수 있습니다.
권한 설정 시 앱의 제어 문제: 아이폰에서는 권한 설정 후 앱이 다시 활성화되면 특정 이벤트 리스너를 통해 앱의 상태를 확인할 수 있습니다. 이미 추가하신 AppState
의 이벤트 리스너는 권한 설정 후 앱이 다시 활성화될 때 API 호출을 수행하는 데 유용합니다.
setInterval의 대안으로 상태 구독 활용: iOS의 권한 변경 시점에 일정한 주기 검사(setInterval)를 사용하는 대신, 상태 변화를 감지하는 이벤트 리스너를 활용하는 것이 더 안정적일 수 있습니다. 이렇게 설정하신 방식처럼 이벤트 리스너로 AppState
를 구독하여 상태 변화를 대응하는 것이 권장됩니다.
권한 설정 화면과 허용 점검: 강의에서는 Android 환경을 기준으로 설명되었을 수도 있으나, iOS에서는 초기 권한 요청 이후 재확인 과정 없이 바로 설정 화면으로 이동하는 경우가 있을 수 있습니다. 권한이 이미 부여된 상태이면 설정 작업이 바로 진행되는 것이 일반적입니다.
관련 질문 URL:
- 강의 재생 중, 알림 설정 확인 방법 문의 - iOS 환경에서 앱 상태 및 권한 처리 관련된 기존 답변 확인
- 권한 설정 관련 이슈 해결 방법 안내 - 권한 처리 방식에 대한 일반적인 지침과 해결책
문제 해결을 위해 설정이 이미 허용된 경우를 대비하여 필요 시 재검토 요청 메뉴얼을 구체화하는 것이 도움이 될 수 있습니다. 안드로이드와 달리 아이폰에서는 사용자가 수동으로 설정 상태를 변경해야 할 수 있습니다. 또한, iOS의 참조 문서를 확인하여 최신 변경 사항과 권장 방식을 참고하시는 것을 추천드립니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.