Skip to content

Commit cd6cbbf

Browse files
committed
[BOOK-293] fix: 사진 접근 권한 재요청 로직 추가
1 parent 7e4934c commit cd6cbbf

2 files changed

Lines changed: 54 additions & 9 deletions

File tree

src/Projects/BKPresentation/Sources/MainFlow/BookDetail/View/SentenceCardViewController.swift

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,16 @@ final class SentenceCardViewController: BaseViewController<SentenceCardView> {
8282
}
8383
.store(in: &cancellables)
8484

85+
viewModel.statePublisher
86+
.map(\.requestAccess)
87+
.removeDuplicates()
88+
.filter { $0 == true }
89+
.receive(on: DispatchQueue.main)
90+
.sink { [weak self] _ in
91+
self?.presentSettingsAlert()
92+
}
93+
.store(in: &cancellables)
94+
8595
viewModel.statePublisher
8696
.map { $0.isLoading }
8797
.removeDuplicates()
@@ -95,7 +105,6 @@ final class SentenceCardViewController: BaseViewController<SentenceCardView> {
95105
}
96106
.store(in: &cancellables)
97107
}
98-
99108
}
100109

101110
extension SentenceCardViewController {
@@ -118,4 +127,27 @@ extension SentenceCardViewController {
118127

119128
self.present(activityViewController, animated: true, completion: completion)
120129
}
130+
131+
private func presentSettingsAlert() {
132+
let dialog = BKDialog(
133+
title: "접근 권한 필요",
134+
subtitle: "설정에서 사진 추가 권한을 허용해주세요.",
135+
config: .init(
136+
leftButtonTitle: "취소",
137+
leftButtonAction: { [weak self] in
138+
self?.viewModel.send(.settingsAlertDismissed)
139+
},
140+
rightButtonTitle: "설정으로 이동",
141+
rightButtonAction: { [weak self] in
142+
self?.viewModel.send(.settingsAlertDismissed)
143+
if let url = URL(string: UIApplication.openSettingsURLString) {
144+
UIApplication.shared.open(url)
145+
}
146+
}
147+
)
148+
)
149+
150+
let dialogViewController = BKDialogViewController(dialog: dialog)
151+
present(dialogViewController, animated: true)
152+
}
121153
}

src/Projects/BKPresentation/Sources/MainFlow/BookDetail/ViewModel/SentenceCardViewModel.swift

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,15 @@ import Foundation
77
import Photos
88
import UIKit
99

10+
enum PhotoAccessError: Error {
11+
case denied
12+
}
13+
1014
final class SentenceCardViewModel: BaseViewModel {
1115
struct State {
1216
var data: BookDetailItem?
1317
var alertInfo: String?
18+
var requestAccess: Bool = false
1419
var isLoading: Bool = false
1520
}
1621

@@ -19,6 +24,7 @@ final class SentenceCardViewModel: BaseViewModel {
1924
case didTapSaveButton(image: UIImage)
2025
case saveImageResult(Result<Void, Error>)
2126
case alertDismissed
27+
case settingsAlertDismissed
2228
case prepareToSaveImage
2329
}
2430

@@ -60,11 +66,16 @@ final class SentenceCardViewModel: BaseViewModel {
6066
case .success:
6167
newState.alertInfo = "이미지를 저장했습니다!"
6268
case .failure(let error):
63-
// TODO : error는 로그로 찍어서 수집하기
64-
newState.alertInfo = "[저장 실패] 잠시 후 다시 시도해주세요."
69+
if error is PhotoAccessError {
70+
newState.requestAccess = true
71+
} else {
72+
newState.alertInfo = "[저장 실패] 잠시 후 다시 시도해주세요."
73+
}
6574
}
6675
case .alertDismissed:
6776
newState.alertInfo = nil
77+
case .settingsAlertDismissed:
78+
newState.requestAccess = false
6879
case .prepareToSaveImage:
6980
newState.isLoading = true
7081
}
@@ -108,12 +119,14 @@ final class SentenceCardViewModel: BaseViewModel {
108119
if status == .notDetermined {
109120
status = await PHPhotoLibrary.requestAuthorization(for: .addOnly)
110121
}
111-
guard status == .authorized || status == .limited else {
112-
throw NSError(
113-
domain: "PhotoLibrary",
114-
code: 2,
115-
userInfo: [NSLocalizedDescriptionKey: "포토 라이브러리 접근 권한이 필요합니다."]
116-
)
122+
123+
switch status {
124+
case .authorized, .limited:
125+
return
126+
case .denied, .restricted:
127+
throw PhotoAccessError.denied
128+
default:
129+
throw PhotoAccessError.denied
117130
}
118131
}
119132
}

0 commit comments

Comments
 (0)