-
Notifications
You must be signed in to change notification settings - Fork 15
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[Fix] #344- 콕 찌르기 1차 QA 반영 #345
The head ref may contain hidden characters: "fix/#344-Poke-QA-\uBC18\uC601"
Conversation
…대한 찌르기 버튼 비활성화
PokeCoordinator가 메모리에서 사라져 바텀 시트가 올라오지 않는 문제 해결
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
세진아!! 고생했어~~~ 코멘트 몇개 한번 봐주겠어?
@@ -64,6 +64,8 @@ public class Toast { | |||
guard let scene = UIApplication.shared.connectedScenes.first(where: { $0.activationState == .foregroundActive }) as? UIWindowScene else { return } | |||
guard let window = scene.windows.first(where: { $0.isKeyWindow }) else { return } | |||
|
|||
guard !window.subviews.contains(where: { $0 is MDSToast }) else { return } // 토스트가 중복으로 나오지 않도록 방지 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
세진아 이게 토스트는 계속 최신 정보를 보여주는게 좋을 것 같거든! 요걸 해결하는 몇개의 방법이 있을것 같아
- mdsToast가 있으면 dismiss해주고 show 로직을 다시 돌린다 (재귀적으로든 뭐든)
- MDSToastType이 현재 Toast와 다른 경우에만 dismiss하고 show 로직을 다시 돌린다
등등이 있겠는데 Toast라는 컴포넌트 특성상 빠르고 responsibility 있게 정보전달을 해줘야 하다 보니 1번이 어떨까 싶어~
기대하는 동작은 기존 토스트가 2초밖에 보여지지 않았더라도 즉각 dismiss 되고 새로운 토스트를 보여주는 동작이야!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
|
||
public func execute(with coordinator: Coordinator, queryItems: [URLQueryItem]?) -> Coordinator? { | ||
guard let coordinator = coordinator as? ApplicationCoordinator else { return nil } | ||
// 현재 Poke 메인 뷰로의 라우팅은 요구사항에 없지만 추후에 추가된다면 온보딩 뷰 대상 유저인지 파악이 필요해서 기획적인 논의가 필요 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
잘 이해한건지 알려주라~
- 알림이 왔다는 건 친구가 있다는것과 동치가 아니므로 알림이 왔어도 PokeMain으로 보내는 케이스가 있다면 온보딩으로 가야한다는 것
- 그런데 현재는 알림리스트로 단독으로 보낼수 있어서 문제가 없는것이고!
이런 경우라면 나는 이건 PokeMain으로 보내고, 여기에서 판단해서 다음 라우팅을 하는게 책임소지가 명확히 있는것 같아서 요게 어떨까 하는 생각이야~
(- 1. 딥링크로 여기까지 이동했다면 - 2. userId 기반으로 verification 하고 - 3. 필요에 따라 라우팅 하기(온보딩으로))
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
잘 이해한 거 맞아!!
그럼 PokeMain에서 뷰가 로드될 때 온보딩 유저인지 한 번 더 확인하고 온보딩 대상이면 자체적으로 온보딩 뷰로 전환을 시켜야 한다는 의미이지~? (PokeMain뷰에서 온보딩 대상 여부 확인 API 호출한다는 의미!)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
응 맞아~ 내 생각은 그러하고~ 그렇기 된다면 매 coordinator의 route 시에 하는건 좋지 않을것 같고 이니셜라이저에 boolean 같은 것으로 구분해서 e.g.) 'isRouteFromRoot': Bool - true일 때만 점검하도록 하면 어떨까 싶어!!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이런식으로 우선 PokeMain으로 보내고 서버 통신을 해서 온보딩 대상이라면 온보딩 뷰로 보내도록 구현했어!
영상에서는 아주 잠깐 PokeMain이 스치듯이 보여서 구분은 힘들겠다...ㅎㅎ
상세한 내용은 PR 내용에 적어뒀는데 괜찮은지 한 번 확인해줄 수 있을까~~? 🤗 @elesahich
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
넘 고생했씀니다~~ 💖
🌴 PR 요약
🌱 작업한 브랜치
🌱 PR Point
📌 참고 사항
6번 사항을 구현하기 위해 NotificationCenter를 활용했습니다.
총 3개의 뷰 (내 친구뷰, 내 친구 리스트뷰, 찌르기 알림 뷰)에서 찌르기를 했을 때 이벤트를 메인 뷰에서 받아와야 했는데 이 구조는 NotificationCenter가 적합하다고 생각했습니다. 즉, 위의 세 뷰에서 찌르기를 성공하면 NotificationCenter에 찌르기 당한 유저의 모델을 post하고 PokeMainView 모델은 Notification Publisher를 구독하고 있다가 기존 PokeResponse Output 스트림에 합쳐서 뷰로 전달합니다.
기존 pokedResponse 스트림을 유지하면서 업스트림을 추가한 방식이라 반응형 프로그래밍의 장점을 살리고자 했습니다.
딥링크 관련
현재 요구사항에서는 콕 찌르기 알림 리스트 뷰로의 딥링크만 존재합니다. 따라서 문제가 없지만 만약 콕 찌르기 메인 뷰로의 라우팅("home/poke")이 생긴다면 조금 애매해집니다.왜냐하면 현재 기획에서는 친구가 없는 유저는 메인 뷰로 접근하지 못하고 온보딩에 묶어두어야 하기 때문입니다. -> 딥링크 만으로는 유저가 온보딩 대상인지 알지 못하는 문제가 있습니다.
이 문제는 온보딩에서 묶어두는 상황을 제거하여 기획적으로 풀면 제일 좋을 것 같고 그것이 힘들다면 기술적으로는 딥링크 쿼리로 온보딩 대상인지 받아와서 분기처리 하는 방법이 있습니다. 하지만 친구 관계라는 것이 상대방이 답장을 언제 하냐에 따라 푸시 알림 전송시에는 온보딩 대상이지만 유저가 딥링크로 이동할 당시에는 온보딩 대상이 아니게 될 수 있기 때문에 정확성이 떨어진다는 단점이 있습니다.또는 라우팅을 시도할 때마다 서버 통신을 해서 온보딩 대상인지 받아오는 방법도 있지만 네트워크 모듈에 딥링크 관련 객체들이 접근해야 한다는 문제점이 있습니다.🥕 추가 수정 사항 (01.01 기준)
앞서 딥링크 관련하여 콕 찌르기 메인 뷰로 라우팅해야 할 때 온보딩 대상 유져를 식별할 수 없는 문제가 있다고 했는데 @elesahich 승호형이 제안한 방식으로 문제를 해결했습니다.
그전에 딥링크 로직을 조금 수정했습니다.
DeepLinkTreeNode에 isDestination: Bool 속성을 추가하여 해당 딥링크 구현체가 최종 종착지 뷰인지를 저장하도록 했습니다.
만약 "home/poke/notification-list" 형태의 URL로 딥링크가 온다면 [HomeDeeplink(), PokeDeepLink(), PokeNotificationListDeepLink()] 형태로 구현체가 파싱됩니다. (이전 PR 참고)
이제 이 배열에서 마지막 객체인 PokeNotificationListDeepLink에만 isDestination를 true로 설정하여 나머지 객체들인 HomeDeepLink, PokeDeepLink는 종착지가 아니라 경로 뷰임을 알 수 있게 했습니다.
이로 인해 앞으로 딥링크 라우팅을 할 때 전체 flow를 전부 뷰에 쌓는 것이 아니라 종착지 뷰임을 확인하고 종착지 뷰만 쌓을 수 있게 되었습니다.
다시 본론으로 돌아와서 Poke 메인 뷰가 종착지인 딥링크가 도착하면 우선 Poke 메인 뷰를 띄우고 API를 호출하여 온보딩 대상인지 확인합니다. 맞다면 온보딩 뷰로 rootModule을 온보딩 뷰로 변경하여 dismiss 없이 온보딩 뷰로 전환합니다..!
📸 스크린샷
📮 관련 이슈