Skip to content
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

[Feat] #640 - 푸시알림별 화면 전환 #641

Merged
merged 9 commits into from
Sep 21, 2022

Conversation

yangsubinn
Copy link
Member

🔥Pull requests

⛳️ 작업한 브랜치

👷 작업한 내용

푸시알림별 화면 전환

🚨참고 사항

foreground 상태일때 푸시알림 탭한 경우 -> AppDelegate > didReceive

  • recordId가 있는 경우 : MainTBC > feed 탭
  • recordId가 없는 경우 : rootVC를 mainTBC로 바꾼 뒤, 가장 위에 올라온 뷰컨(HomeVC)에서 HabitRoomVC로 푸시

background 상태일때 푸시알림 탭한 경우 -> SceneDelegate > willConnectTo
- 스플래시 후 홈에서 시작하기 때문에 노티를 MainTBC(탭 전환) 와 HomeVC(습관방으로 푸시)에서 받도록 했습니다.

  • recordId가 있는 경우 : MainTBC > feed 탭
  • recordId가 없는 경우 : HomeVC > HabitRoomVC로 푸시

스크린샷 2022-09-19 오전 1 19 51

📸 스크린샷

foreground -> 습관방
https://user-images.githubusercontent.com/81167570/190918032-1d34a53e-2c75-458c-a8f0-82371ca5ce0b.MP4

foreground -> 피드
https://user-images.githubusercontent.com/81167570/190918558-48eb0e32-5372-46f7-97e5-bacd1b30ed48.MP4

background -> 습관방
https://user-images.githubusercontent.com/81167570/190918103-2ecf298b-d9ae-4d42-a116-7dc9560d7b55.MP4

background -> 피드
https://user-images.githubusercontent.com/81167570/190918301-ec62eced-b0ad-4efa-8dcb-cd3df16b3f29.MP4

📟 관련 이슈

@yangsubinn yangsubinn added 🦹t없e맑은水빈 우리 선배 이젠 타이니하지 않아 🖐help_wanted🖐 도움이 필요해요~! labels Sep 18, 2022
@yangsubinn yangsubinn self-assigned this Sep 18, 2022
Copy link
Member

@L-j-h-c L-j-h-c left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

잘 봤습니다!! 푸시알림을 통한 화면전환은 이렇게 하면 되는군요~~! 👍 👍

Copy link
Member

@hyun99999 hyun99999 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

사용하지 않는 홈으로의 화면전환이나 @objc 키워드 붙여둔경우는 모든뷰에서 홈으로 갈때 사용하려고 하신 것 같은데 이때는 background 에서 푸시알림을 통해 앱을 런치하는 경우라고 생각이 들거든용?
이때 지금 스플래시에서 이동하는 것이 아니라서 스플래시에서 홈으로 화면 전환할 때 분기처리를 통해서 습관방으로의 화면전환을 추가해줘도 될거 같은생각이 들어요! 그래서 모든 뷰에서 노티를 받을 준비는 안하셔도 될 것 같아요!

let roomId: String = userInfo["roomId"] as? String else { return }
guard let mainTBC = UIStoryboard(name: Const.Storyboard.Name.mainTabBar, bundle: nil).instantiateViewController(withIdentifier: Const.ViewController.Identifier.mainTabBar) as? MainTBC else { return }

guard let window = UIApplication.shared.windows.first else { return }
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

windows 가 deprecated 된다고 하니 대체를 알아봐야할 것 같아요 (오-열)

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

제 windows 돌려주세요

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

에?? 그럼뭘주는거야

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

UIView.transition(with: window, duration: 0.5, options: .transitionCrossDissolve, animations: nil)

if recordId.isEmpty {
guard let nextVC = UIStoryboard(name: Const.Storyboard.Name.habitRoom, bundle: nil).instantiateViewController(withIdentifier: Const.ViewController.Identifier.habitRoom) as? HabitRoomVC else { return }
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

의미를 부여하기 위해서 nextVC 변수명을 habitRoomVC 로 변경해도 좋을 것 같아요!(물론 내가 짠 변수명임 ㅋㅋㅋㅋㅋㅋ쿠ㅜ 생각해보니 변경하면 좋을 것 같네여)

Comment on lines 286 to 302
@objc
private func dismissToHomeVC() {
// switch vcType {
// case .photoTimer:
// self.dismiss(animated: true) {
// self.presentingViewController?.navigationController?.popViewController(animated: true)
// }
// case .photoOnly:
// self.dismiss(animated: true)
// default:
//
// }
self.dismiss(animated: true) {
self.presentingViewController?.navigationController?.popViewController(animated: true)
}
}

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

분기처리가 유효해보이는뎅 테스트중인가용?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

노티로 보냈을 때 뷰를 내리기 위해 사용했던 분기처리였는데,
AppDelegate나 SceneDelegate에서 루트를 변경해서 화면 전환하는 경우에는 필요 없어서 주석처리해뒀습니다!
삭제해버린다는 것을 깜빡했네요..

Comment on lines 335 to 343
if UIApplication.getMostTopViewController() == self || notification.name == .startHabitRoom {
navigationController?.pushViewController(nextVC, animated: true)
} else {
self.popToHomeVC {
self.navigationController?.pushViewController(nextVC, animated: true)
}
}
}
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

homeVC 에서 notification 을 받으면 homeVC 일텐데 else 로 빠지는 경우는 어떤 시나리오를 예상하고 고려해두셨을까용?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

아 이것두 이전에 모두 노티 보내서 처리하려고 했을 때,
노티 보낸 당시 가장 맨 위의 뷰가 homeVC가 아니면(습관방이라던가 보관함, 피드 탭이라던가 보관함 상세라던가 등등)
홈으로 보낸 뒤 습관방으로 push 하기 위해 넣었던 부분인데
이제 필요없을 것 같습니당
삭제하겠습니다 !

Comment on lines +150 to +158
/// 푸시알림 종류에 따라 탭(feed/home) 이동
@objc
func showTab(_ notification: Notification) {
if let userInfo = notification.userInfo {
if let recordId = userInfo["recordID"] as? String {
selectedIndex = recordId.isEmpty ? 1 : 0
}
}
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

좋은 로직 같습니당! 🧑‍🏭

@hyun99999
Copy link
Member

hyun99999 commented Sep 19, 2022

// active, inactive, background enum 케이스로 존재해서 씬델리게이트 말구 앱델리게이트에서 처리해주어도 될거 같아요!
// 지금 씬 델리게이트 코드를 주석처리해도 피드뷰로 이동하네용 
// 만약에 분리할거라면 여기서는 active 랑 inactive 에서만 실행되도록 해줘야할거 같아요
let applicationState = UIApplication.shared.applicationState

if applicationState == .background {
     let info: [String: Any] = ["recordID": recordId, "roomID": roomId]

    DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 2.0) {
        NotificationCenter.default.post(name: .pushNotificationTapped, object: nil, userInfo: info)
    }
}

// 씬델리게이트 코드를 유지할 것이라면 여기서 active, inactive 설정해주어야 제대로 분기처리가 될거 같아요!
if recordId.isEmpty {
     guard let nextVC = UIStoryboard(name: Const.Storyboard.Name.habitRoom, bundle: nil).instantiateViewController(withIdentifier: Const.ViewController.Identifier.habitRoom) as? HabitRoomVC else { return }
    nextVC.roomID = Int(roomId)
            
    DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.5) {
        let topVC = UIApplication.getMostTopViewController()
         topVC?.navigationController?.pushViewController(nextVC, animated: true)
    }
} else {
     let info: [String: Any] = ["recordID": recordId, "roomID": roomId]
    NotificationCenter.default.post(name: .pushNotificationTapped, object: nil, userInfo: info)
}

- 서버에서 recordId 는 "" 빈문자열로 넘어오기 떄문에 nil 값을 가질 수 없다. 그래서 조건문자체가 먹히지 않았다.
- 삭제한 조건문은 popToHomeVC 를 사용할 시나리오가 없을거라 생각하고 삭제했다.
@yangsubinn
Copy link
Member Author

코드리뷰 반영 수정하고, #642 풀 받아서 푸시해뒀습니다 !
확인 부탁드립니다🙇‍♀️ @hyun99999

Comment on lines 152 to 155
guard let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene else { return }
let window = windowScene.windows.first
window?.rootViewController = mainTBC
UIView.transition(with: window ?? UIWindow(), duration: 0.5, options: .transitionCrossDissolve, animations: nil)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

해결방법까지.. 코드 잘 보고 갑니다.
window 도 guard let 구문에서 옵셔널 바인딩 해주어도 좋을 것 같네용

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이것까지 수정해서 머지할게여 !

Comment on lines 256 to 262

@objc
private func dismissToHomeVC() {
self.dismiss(animated: true) {
self.presentingViewController?.navigationController?.popViewController(animated: true)
}
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

요 부분 아직 안지워진거 같아요!

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

아고 지워서 푸시하겠습니다!

@yangsubinn yangsubinn merged commit 8b1ec65 into TeamSparker:develop Sep 21, 2022
@yangsubinn yangsubinn deleted the feature/#640 branch October 11, 2022 02:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
🖐help_wanted🖐 도움이 필요해요~! 🦹t없e맑은水빈 우리 선배 이젠 타이니하지 않아
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[Feat] 푸시알림 카테고리별 화면 전환
3 participants