Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
iOSDC.pdf
Search
ビスター
September 20, 2025
Programming
0
190
iOSDC.pdf
ビスター
September 20, 2025
Tweet
Share
Other Decks in Programming
See All in Programming
Updates on MLS on Ruby (and maybe more)
sylph01
1
190
2025年版 サーバーレス Web アプリケーションの作り方
hayatow
8
1.8k
「手軽で便利」に潜む罠。 Popover API を WCAG 2.2の視点で安全に使うには
taitotnk
0
880
Introducing ReActionView: A new ActionView-compatible ERB Engine @ Rails World 2025, Amsterdam
marcoroth
0
730
時間軸から考えるTerraformを使う理由と留意点
fufuhu
16
4.8k
Navigation 2 を 3 に移行する(予定)ためにやったこと
yokomii
0
370
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
450
GitHubとGitLabとAWS CodePipelineでCI/CDを組み比べてみた
satoshi256kbyte
4
250
Ruby Parser progress report 2025
yui_knk
1
470
ファインディ株式会社におけるMCP活用とサービス開発
starfish719
0
2.2k
Ruby×iOSアプリ開発 ~共に歩んだエコシステムの物語~
temoki
0
540
今だからこそ入門する Server-Sent Events (SSE)
nearme_tech
PRO
3
270
Featured
See All Featured
Become a Pro
speakerdeck
PRO
29
5.5k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
For a Future-Friendly Web
brad_frost
180
9.9k
Gamification - CAS2011
davidbonilla
81
5.4k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
BBQ
matthewcrist
89
9.8k
Documentation Writing (for coders)
carmenintech
74
5k
We Have a Design System, Now What?
morganepeng
53
7.8k
Code Review Best Practice
trishagee
71
19k
Building Flexible Design Systems
yeseniaperezcruz
329
39k
GraphQLの誤解/rethinking-graphql
sonatard
72
11k
Build your cross-platform service in a week with App Engine
jlugia
231
18k
Transcript
4XJGU6*࣌ͷεΫγϣอޢ ʙηΩϡΞͳ7JFXͷ࡞Γํʙ #ZϏελʔ!-NTTZOD J04%$+BQBO݄ʢʣʙ 5SBDL %
"CPVU.F Ϗελʔ 7JTUBS • ݸਓ։ൃ • 41.ύοέʔδ։ൃ • 1SJWBUF"1*ݚڀ
ࠓεΫγϣอޢ͕͔ͬͨ • .JDSPTPGU 5FBNT ʮ1SFWFOU4DSFFO$BQUVSFʯػೳൃද • 9$IBU ʮ#MPDL TDSFFOTIPUTʯػೳެ։ •
J1IPOFͷϚΠφϯόʔΧʔυʢຊʣ ΥϨοτΞϓϦͰඪ४࣮ࡁΈ
͑Δ"1*ʁ
ը໘ऩؔ࿈ͷ"1* • @Environment(¥.isSceneCaptured) • UITraitCollection.sceneCaptureState • UIScreen.isCaptured Deprecated
εΫϦʔϯγϣοτؔ࿈ͷ"1* •UIApplication.userDidTakeScreenshotNot ification •UIApplication.UserDidTakeScreenshotMes sage ֤OS 26+ ͍ͣΕDidͳͷͰࣄલݕ͕ग़དྷͳ͍
εΫϦʔϯγϣοτؔ࿈ͷ"1* •func privacySensitive() -> some View •func contentCaptureProtected() -> some
CompositorContent macOS 26 & visionOS 26 Only
εΫϦʔϯγϣοτؔ࿈ͷ"1* •func contentCaptureProtected( _ isActive: Bool = true ) ->
some View visionOS 26.0+ only iOSʹల։͞Ε͍ͯͳ͍...
J04ͷతͳ"1*ͰεΫγϣ͔Β ҙͷ7JFXΛอޢ͢Δ͜ͱͰ͖ͳ͍
6*,JUͰͲ͏͢Δʁ
6*,JUͰͲ͏͢Δʁ •UITextFieldͷisSecureTextEntryΛར༻͢Δ •UITextFieldͷSubview • _UITouchPassthroughView • _UITextLayoutCanvasView อޢ͍ͨ͠7JFXΛαϒϏϡʔʹ͢Δ
4XJGU6*ͰͷϫʔΫΞϥϯυ CaptureProtectedViewController<Content: View> - containerView: UIView? _UITextLayoutCanvasViewΛऔΓग़͢ - isActive: Bool
- content: () -> Content + init(_: Bool, @ViewBuilder content: @escaping () -> Content) + viewDidLoad() UIHostingControllerΛར༻ͯ͠4XJGU6*ͷ7JFXΛ _UITextLayoutCanvasViewͷαϒϏϡʔʹ͢Δ
4XJGU6*ͰͷϫʔΫΞϥϯυ UIHostingController 4XJGU6*$POUFOU UIViewController Representable CaptureProtected ViewController 4XJGU6*ͷ7JFX
4XJGU6*ͰͷϫʔΫΞϥϯυ • .environment()ͷө ࢀߟ 88%$6*,*UτϨΠτγεςϜͷ׆༻ • ϨΠΞτͷ่Ε • *NBHF3FOEFSFS"1*ͷ੍ݶ
4XJGU6*ͰͷϫʔΫΞϥϯυ •UITextFieldͷisSecureTextEntryΛར༻͢Δ •UITextFieldͷSubview • _UITouchPassthroughView • _UITextLayoutCanvasView อޢ͍ͨ͠7JFXΛαϒϏϡʔʹ͢Δ
ͳͥ_UITextLayoutCanvasView εΫϦʔϯγϣοτʹөΒͳ͍ʁ
ΈΛௐΔ •-[UITextField setSecureTextEntry:]Λ 4ZNCPMJD#SFBLQPJOUͱͯ͠ηοτ ˠελοΫτϨʔεΛௐΔ
ΈΛௐΔ $"-BZFSΦϒδΣΫτʹରͯ͠ηϨΫλ TFU%JTBCMF6QEBUF.BTLͷϝιουΛݺͼग़͍ͯ͠Δ Y$"-BZFS YTFU%JTBCMF6QEBUF.BTL YYPSY 9DPEFͰͷελοΫτϨʔεͷදࣔ
࣮ݧ "QQ3FWJFX(VJEFMJOFT⚠ 4PGUXBSF3FRVJSFNFOUT"QQTNBZPOMZVTFQVCMJD"1*T IUUQTEFWFMPQFSBQQMFDPNBQQTUPSFSFWJFXHVJEFMJOFTTPGUXBSFSFRVJSFNFOUT
࣮ݧ 9DPEF--%#ίϚϯυʹΑΔ$"-BZFSͷશϝιουදࣔ
ΈΛௐΔ •0CKFDUJWF$༝དྷͷ,FZ7BMVF$PEJOHΛར༻ ࣮ݧ༻ͷ؆қίʔυ
࣮ݧ •EJTBCMF6QEBUF.BTL ʹΑ੍ͬͯޚ͞Ε͍ͯΔ →4QSJOH#PBSEʹΑΔࡱӨʹ ֘ϨΠϠʔؚ͕·Εͳ͍
4XJGU6*Ͱͷར༻ํ๏ͷఏҊ
4XJGU6*Ͱͷར༻ํ๏ •ϨΠϠʔͱؚͯ͠·Εແ͍͜ͱΛར༻͢Δ .mask(_:)
UIViewRepresentable _UITextLayoutCanvasView ͳͲ EJTBCMF6QEBUF.BTL͕ઃఆ͞Εͨ-BZFSΛ࣋ͭ6*7JFX backgroundColor = .black .mask { }
εΫγϣͷॠ͚ؒͩөΔ7JFXम০ࢠ
•func luminanceToAlpha() -> some View "EETBMVNJOBODFUPBMQIBF⒎FDUUPUIJTWJFX J04 J1BE04
.BD$BUBMZTU NBD04 UW04 WJTJPO04 XBUDI04 ࢀߟ EFWFMPQFSBQQMFDPN
.mask { } .background(.white) .compotisionGroup() .luminanceToAlpha()
ࢀߟ •AVSampleBufferDisplayLayer() .preventsCapture *OEJDBUFTUIBUJNBHFEBUBTIPVMECFQSPUFDUFE GSPNDBQUVSFࢀߟ EFWFMPQFSBQQMFDPN อޢର*04VSGBDFTͰͳ͍
ࢀߟ •'BJS1MBZ4USFBNJOH ಈըίϯςϯπ৴ͷ߹ʹར༻Մೳ ࢀߟ EFWFMPQFSBQQMFDPN
ҙ •ίϯςϯπͷෳࢭใ࿙Ӯࢭ •εΫγϣอޢ͞Ε͍ͯΔ͔ςετ •ར༻ऀʹεΫγϣอޢΛΒͤΔ ˠอޢΛ"MFSUͰ௨ɺεΫγϣʹอޢ͍ͯ͠ΔࢫΛهࡌ
None
࠷ޙʹ ίʔυྫ αϯϓϧύοέʔδ