
RedactionReasons ์์๋ณด๊ธฐ
๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์ ํด๋น redactionReason๋ฅผ ์ฌ์ฉํ๋ฉด ์ข์ต๋๋ค!
invalidated
- ๋ฐ์ดํฐ๊ฐ ์๋ชป๋์๊ฑฐ๋ ๋ฌดํจ์ผ ๋ ์๋ก์ด ์ ๋ฐ์ดํธ๊ฐ ํ์ํจ์ ๋ํ๋ผ ๊ฒฝ์ฐ
- API ์๋ต์ด ๋ณ๊ฒฝ๋๊ฑฐ๋, ์ฝํ ์ธ ๊ฐ ์ต์ ์ํ๊ฐ ์๋์ด์ ์ ๋ฐ์ดํธ๊ฐ ํ์ํ ๊ฒฝ์ฐ
placeholder
- ๋ฐ์ดํฐ๊ฐ ๋ก๋ ์ค์ผ ๋ ๋ก๋ฉ ์ํ๋ฅผ ํ์ํ๋ ๊ฒฝ์ฐ
privacy
- ๊ฐ์ธ์ ๋ณด๋ฅผ ๋ณดํธํ๊ธฐ ์ํด ์ผ๋ถ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๋ฆด ๊ฒฝ์ฐ
- ์ฌ์ฉ์์ ๊ณ์ข ์ ๋ณด๋ ๊ฑฐ๋ ๋ด์ญ์ ๊ฐ๋ฆด ๊ฒฝ์ฐ
- ์ฑ์ ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ์ ํํ๊ฑฐ๋ ์บก์ฒ๊ฐ ๊ฐ์ง๋ ๋ ์ ๋ณด๋ฅผ ๊ฐ๋ฆด ๊ฒฝ์ฐ
๋ด์ฉ์ด ๋ง์ง ์์์, ์ฝ๋์ ์ฃผ์์ผ๋ก ๋ฐ๋ก ์์ํ๊ฒ ์ต๋๋ค !!
// MARK: - privacy redaction
VStack(alignment: .leading) {
Text("privacy")
Text("privacy")
.privacySensitive() // (1) ๋ฏผ๊ฐํ ์ ๋ณด๋ฅผ ํฌํจํ๊ณ ์์์ ์๋ฆผ
}
.redacted(reason: .privacy) // (2) privacy ์ค์ ์ผ๋ก privacySensitive ํด๋ ํ์ ๋ทฐ๊ฐ ์๋ค๋ฉด, ๋ง์คํน ์ฒ๋ฆฌ
// MARK: - placeholder redaction
VStack(alignment: .leading) {
Text("placeholder")
.unredacted() // (3) ์์ ๋ทฐ์ redaction ํจ๊ณผ๋ฅผ ๋ฌด์ํ๊ณ ํ
์คํธ๋ฅผ ํ์ํจ
Text("placeholder") // (4) 5๋ฒ์ ์ํด ๋ง์คํน ์ฒ๋ฆฌ
}
.redacted(reason: .placeholder) // (5) ํ์ ๋ทฐ๋ฅผ ๋ง์คํน ์ฒ๋ฆฌ(ํ๋ ์ด์ค ํ๋ ์ฒ๋ฆฌ)
// MARK: - invalidated redaction
VStack(alignment: .leading) {
Text("invalidated")
Text("invalidated")
.invalidatableContent() // (6) ์ปจํ
์ธ ๊ฐ ๋ฌดํจํ๋ ์ ์์์ ๋ํ๋
}
.redacted(reason: .invalidated) // (7) invalidated ์ค์ ์ผ๋ก invalidatableContent๋ฅผ ํด๋ ํ์ ๋ทฐ๊ฐ ์๋ค๋ฉด, ๊น๋นก์ ์ฒ๋ฆฌ
์ฌ์ฉ ์์
์ฑ์ ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ์ ํํ๊ฑฐ๋ ์บก์ฒ๊ฐ ๊ฐ์ง๋๋ฉด, ์ฌ์ฉ์์ ๋ฏผ๊ฐ ์ ๋ณด๋ฅผ privacy๋ฅผ ์ฌ์ฉํด ๊ฐ๋ฆด ์ ์์ต๋๋ค.
struct AccountView: View {
@State private var isPrivacyMode: Bool = true
var body: some View {
VStack(alignment: .leading) {
Text("์ด๋ฆ: ํ๊ธธ๋")
Text("๊ณ์ข ์๊ณ : 120,000์")
.privacySensitive() // ๋ฏผ๊ฐ ์ ๋ณด๋ก ํ์
}
.redacted(reason: isPrivacyMode ? .privacy : []) // Privacy ๋ชจ๋ ํ์ฑํ ์ ์ ๋ณด ๊ฐ๋ฆผ
.onAppear {
// Privacy ๋ชจ๋ ํ์ฑํ ์กฐ๊ฑด
isPrivacyMode = UIApplication.shared.applicationState != .active
}
}
}


์ต์ ์ฃผ๊ธฐ (๋ณตํฉ์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ)
์ด๋ค ๊ฒฝ์ฐ์ ์ฌ์ฉํ ์ ์์์ง ์ ๋ชจ๋ฅด๊ฒ ์ง๋ง, ์๋์ฒ๋ผ ์ต์ ์ ๋ ์กฐํฉํ ์๋ ์์ต๋๋ค.
VStack {
Text("placeholder union invalidated")
.unredacted()
Text("placeholder union invalidated")
.invalidatableContent()
Text("placeholder union invalidated")
}
.redacted(reason: .placeholder.union(.invalidated))
ํ๊ฒฝ ๋ณ์ ์ฌ์ฉํ๊ธฐ
privacySensitive์ ํ์ฉํ์ฌ ๋ง์คํน ์ฒ๋ฆฌํ๋ ๋์ ๋ค๋ฅธ ๋ทฐ๋ฅผ ๋์ฐ๋๋ก ํ ์๋ ์๋ค.
struct ContentView: View {
var body: some View {
VStack(alignment: .leading) {
SubView()
SubView()
.redacted(reason: .privacy)
}
}
}
struct SubView: View {
@Environment(\.redactionReasons) var redactionReasons // ๋ทฐ ๊ณ์ธต์ ํ์ฌ ์ ์ฉ๋ ๋ ๋ค์
์ด์ ๋ค์ ๊ฐ์ง๊ณ ์์
var body: some View {
if redactionReasons.contains(.privacy) {
Text("It's privacy, you can't see")
} else {
Text("It's not privacy")
}
}
}

'๐ Apple > SwiftUI' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[SwiftUI] Sheet ๋์ด ๊ณ ์ ์๋๋ ๋ฌธ์ ํด๊ฒฐํ๊ธฐ(presentationDetents) (0) | 2025.02.12 |
---|---|
[SwiftUI] redacted๋ฅผ ์ฌ์ฉํ ์ค์ผ๋ ํค ํ๋ฉด ๊ตฌํํ๊ธฐ (0) | 2025.01.06 |
[SwiftUI] ์ฑ์ ์ํ์ ๋ฐ๋ผ ๋ค๋ฅธ ํ๋ฉด ๋ณด์ฌ์ฃผ๊ธฐ (App Switcher์์ ์ฑ ํ๋ฉด ๊ฐ๋ฆฌ๊ธฐ) (0) | 2024.10.20 |
[SwiftUI] String์ ํฌํจ๋ HTML ํ๊ทธ ์ญ์ (0) | 2023.11.15 |
[SwiftUI] @Environment (0) | 2023.04.23 |

RedactionReasons ์์๋ณด๊ธฐ
๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์ ํด๋น redactionReason๋ฅผ ์ฌ์ฉํ๋ฉด ์ข์ต๋๋ค!
invalidated
- ๋ฐ์ดํฐ๊ฐ ์๋ชป๋์๊ฑฐ๋ ๋ฌดํจ์ผ ๋ ์๋ก์ด ์ ๋ฐ์ดํธ๊ฐ ํ์ํจ์ ๋ํ๋ผ ๊ฒฝ์ฐ
- API ์๋ต์ด ๋ณ๊ฒฝ๋๊ฑฐ๋, ์ฝํ ์ธ ๊ฐ ์ต์ ์ํ๊ฐ ์๋์ด์ ์ ๋ฐ์ดํธ๊ฐ ํ์ํ ๊ฒฝ์ฐ
placeholder
- ๋ฐ์ดํฐ๊ฐ ๋ก๋ ์ค์ผ ๋ ๋ก๋ฉ ์ํ๋ฅผ ํ์ํ๋ ๊ฒฝ์ฐ
privacy
- ๊ฐ์ธ์ ๋ณด๋ฅผ ๋ณดํธํ๊ธฐ ์ํด ์ผ๋ถ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๋ฆด ๊ฒฝ์ฐ
- ์ฌ์ฉ์์ ๊ณ์ข ์ ๋ณด๋ ๊ฑฐ๋ ๋ด์ญ์ ๊ฐ๋ฆด ๊ฒฝ์ฐ
- ์ฑ์ ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ์ ํํ๊ฑฐ๋ ์บก์ฒ๊ฐ ๊ฐ์ง๋ ๋ ์ ๋ณด๋ฅผ ๊ฐ๋ฆด ๊ฒฝ์ฐ
๋ด์ฉ์ด ๋ง์ง ์์์, ์ฝ๋์ ์ฃผ์์ผ๋ก ๋ฐ๋ก ์์ํ๊ฒ ์ต๋๋ค !!
// MARK: - privacy redaction
VStack(alignment: .leading) {
Text("privacy")
Text("privacy")
.privacySensitive() // (1) ๋ฏผ๊ฐํ ์ ๋ณด๋ฅผ ํฌํจํ๊ณ ์์์ ์๋ฆผ
}
.redacted(reason: .privacy) // (2) privacy ์ค์ ์ผ๋ก privacySensitive ํด๋ ํ์ ๋ทฐ๊ฐ ์๋ค๋ฉด, ๋ง์คํน ์ฒ๋ฆฌ
// MARK: - placeholder redaction
VStack(alignment: .leading) {
Text("placeholder")
.unredacted() // (3) ์์ ๋ทฐ์ redaction ํจ๊ณผ๋ฅผ ๋ฌด์ํ๊ณ ํ
์คํธ๋ฅผ ํ์ํจ
Text("placeholder") // (4) 5๋ฒ์ ์ํด ๋ง์คํน ์ฒ๋ฆฌ
}
.redacted(reason: .placeholder) // (5) ํ์ ๋ทฐ๋ฅผ ๋ง์คํน ์ฒ๋ฆฌ(ํ๋ ์ด์ค ํ๋ ์ฒ๋ฆฌ)
// MARK: - invalidated redaction
VStack(alignment: .leading) {
Text("invalidated")
Text("invalidated")
.invalidatableContent() // (6) ์ปจํ
์ธ ๊ฐ ๋ฌดํจํ๋ ์ ์์์ ๋ํ๋
}
.redacted(reason: .invalidated) // (7) invalidated ์ค์ ์ผ๋ก invalidatableContent๋ฅผ ํด๋ ํ์ ๋ทฐ๊ฐ ์๋ค๋ฉด, ๊น๋นก์ ์ฒ๋ฆฌ
์ฌ์ฉ ์์
์ฑ์ ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ์ ํํ๊ฑฐ๋ ์บก์ฒ๊ฐ ๊ฐ์ง๋๋ฉด, ์ฌ์ฉ์์ ๋ฏผ๊ฐ ์ ๋ณด๋ฅผ privacy๋ฅผ ์ฌ์ฉํด ๊ฐ๋ฆด ์ ์์ต๋๋ค.
struct AccountView: View {
@State private var isPrivacyMode: Bool = true
var body: some View {
VStack(alignment: .leading) {
Text("์ด๋ฆ: ํ๊ธธ๋")
Text("๊ณ์ข ์๊ณ : 120,000์")
.privacySensitive() // ๋ฏผ๊ฐ ์ ๋ณด๋ก ํ์
}
.redacted(reason: isPrivacyMode ? .privacy : []) // Privacy ๋ชจ๋ ํ์ฑํ ์ ์ ๋ณด ๊ฐ๋ฆผ
.onAppear {
// Privacy ๋ชจ๋ ํ์ฑํ ์กฐ๊ฑด
isPrivacyMode = UIApplication.shared.applicationState != .active
}
}
}


์ต์ ์ฃผ๊ธฐ (๋ณตํฉ์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ)
์ด๋ค ๊ฒฝ์ฐ์ ์ฌ์ฉํ ์ ์์์ง ์ ๋ชจ๋ฅด๊ฒ ์ง๋ง, ์๋์ฒ๋ผ ์ต์ ์ ๋ ์กฐํฉํ ์๋ ์์ต๋๋ค.
VStack {
Text("placeholder union invalidated")
.unredacted()
Text("placeholder union invalidated")
.invalidatableContent()
Text("placeholder union invalidated")
}
.redacted(reason: .placeholder.union(.invalidated))
ํ๊ฒฝ ๋ณ์ ์ฌ์ฉํ๊ธฐ
privacySensitive์ ํ์ฉํ์ฌ ๋ง์คํน ์ฒ๋ฆฌํ๋ ๋์ ๋ค๋ฅธ ๋ทฐ๋ฅผ ๋์ฐ๋๋ก ํ ์๋ ์๋ค.
struct ContentView: View {
var body: some View {
VStack(alignment: .leading) {
SubView()
SubView()
.redacted(reason: .privacy)
}
}
}
struct SubView: View {
@Environment(\.redactionReasons) var redactionReasons // ๋ทฐ ๊ณ์ธต์ ํ์ฌ ์ ์ฉ๋ ๋ ๋ค์
์ด์ ๋ค์ ๊ฐ์ง๊ณ ์์
var body: some View {
if redactionReasons.contains(.privacy) {
Text("It's privacy, you can't see")
} else {
Text("It's not privacy")
}
}
}

'๐ Apple > SwiftUI' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[SwiftUI] Sheet ๋์ด ๊ณ ์ ์๋๋ ๋ฌธ์ ํด๊ฒฐํ๊ธฐ(presentationDetents) (0) | 2025.02.12 |
---|---|
[SwiftUI] redacted๋ฅผ ์ฌ์ฉํ ์ค์ผ๋ ํค ํ๋ฉด ๊ตฌํํ๊ธฐ (0) | 2025.01.06 |
[SwiftUI] ์ฑ์ ์ํ์ ๋ฐ๋ผ ๋ค๋ฅธ ํ๋ฉด ๋ณด์ฌ์ฃผ๊ธฐ (App Switcher์์ ์ฑ ํ๋ฉด ๊ฐ๋ฆฌ๊ธฐ) (0) | 2024.10.20 |
[SwiftUI] String์ ํฌํจ๋ HTML ํ๊ทธ ์ญ์ (0) | 2023.11.15 |
[SwiftUI] @Environment (0) | 2023.04.23 |