티스토리 뷰

반응형

 

 

앱을 개발하다보면, 특정 URL로부터 Data를 얻고 그 데이터를 저장하고, 공유하는 기능을 구현해보고 싶을때가 있을거에요.
오늘은 URL, Data, FileManager등을 사용해서 그 과정을 실제로 구현해보도록 하겠습니다.

 


파일 공유에 사용되는 ActivityViewController SwiftUI로 사용할 수 있도록 구현하기

UIActivityViewController는 UIKit에서 파일 공유창으로서 사용되는 UIView인데요. 이를 UIViewControllerRepresentable을 채택해서 래핑하면, SwiftUI View에서 사용이 가능해집니다.

69 ~ 70행) activityItems에 공유하고자하는 파일의 URL을 넘겨서 공유를 할 수 있고, applicatioinActivities에는 공유 관련 Activity를 정의가능한데 이건 이번 포스팅에서는 사용하지 않습니다!

72 ~ 78행) ActivityViewController를 초기화 할때 위 2개 멤버가 초기화 되고 그에 맞게 makeUIViewController에서 공유기능 창 구현에 사용 될 UIActivityViewController가 생성됩니다. 

80행) UIViewControllerRepresentable 프로토콜 준수를 위해 의무적으로 구현해야하는 메서드로 구현을 해두었습니다.

해당 ActivityViewController는 SwiftUI View에서 파일을 공유하는 화면으로서 사용될 거에요. 이제 예제 View에 사용될 ViewModel를 확인해보겠습니다.

 


파일 저장 및 공유 기능이 있는 ViewModel 구현

ViewModel에 View가 onAppear 이벤트가 발생할때 특정 URL로부터 Video Data를 만들고, 저장하고, 공유하는 기능을 구현해보겠습니다.

12행) isActivityViewPresented는 @Published로 지정되어있기 때문에 값이 변경되면 View의 Rendering에 직결됩니다. 따라서 항상 변경 시에 메인스레드에서 동작해야해요.

13 ~ 14행) videoURLString은 저장하고자 하는 비디오 URL String, videoURL은 실제 공유할 파일의 URL이 저장될 예정입니다.

16행 ~ 25행) onAppear 이벤트가 발생할때 호출될 메서드로, 저장하려는 비디오 URL을 생성하고 데이터를 만들고, FilieManager를 통해 앱 로컬에 파일을 저장하는 작업이 수행됩니다.

비디오 URL로부터 데이터를 만들고, 저장하는 과정이 오래 소요될 수 있기 때문에 background thread에서 동작을 하고 있습니다. 그렇게 URL로부터 Data 생성이 되었다면(urlData), 저장할 로컬 URL을 만들어줍니다.(urlToSave)

urlToSave URL의 pathComponent로 파일 이름은 tempFilie.mp4로 지정을 한 뒤, 그 URL에 urlData를 저장할 준비를 합니다.

29 ~ 30행) 앞서 만들어 놓은 임시 URL(urlToSave)에 Data르 저장하고, 저장한 비디오 데이터 경로를 지정하여 공유하기 위해 isActivityViewPresented를 true로 설정합니다. 이 시점에 맞게 트리거 되어 ActivityViewController 화면이 올라올 거에요. 또한 앞서 말씀드렸듯이 @Published 멤버이기 때문에 해당 값이 변경되면 View가 업데이트 됩니다. 반드시 메인스레드에서 동작시켜줍니다.

이제 ActivityView, ViewModel을 구현했습니다. 실제 ContentView에서 이들을 사용해서 파일을 저장하고, 공유하는 기능을 동작시켜보겠습니다.

 

 


ContentView에 앞서 만든 ActivityView, ViewModel 사용하여
비디오 파일 저장, 공유기능 구현방법

ObservableObject인 viewModel은 @StateObject, @ObservedObject 등으로 정의가 되어 사용가능합니다.

그 밑에 뷰는 특정 이미지, 텍스트가 나오도록 임의로 지정했구요. onAppear 블록 내에서 viewModel의 onAppear 이벤트를 호출하고 있습니다.

뷰가 나타나면 viewModel의 onAppear가 호출되고 특정 URL로부터 파일을 저장하고, 공유하는 창이 나올겁니다.

 

 

비디오 파일 저장이 완료되고 공유기능을 동작시키려 할때, isActivityViewPresented가 true로 설정이 되었었죠? 그것에 맞게 sheet viewModifier의 기능이 트리거 될겁니다.

viewModel.isActivityViewPresented == true가 되면서, viewModel.videoURL에 저장된 Video URL path가 제대로 지정되었다면, ActivityViewController를 통해 비디오 공유 창이 표출이 될거에요.

이제 이렇게 작성을 했다면, option + commend + enter 버튼을 눌러서 live view를 보거나, 실기기로 테스트를 해보세요. 어느정도 시간이 소요되었다가, 비디오 파일이 잘 저장되면 그 저장 경로를 기준으로 공유창이 나오게 됩니다. 그 예시는 아래 live view 보시면 됩니다.

 

 

만약 URL이 제대로 설정되지 않았다면 창이 올라오지 않았거나, 빈 뷰가 올라왔을거에요. 위와 같이 비디오 데이터에 대한 공유 창이 정상적으로 올라오는 것을 확인 가능했습니다.

 


비디오 데이터에 대한 저장을 했지만 공유기능이 잘 동작하지 않을때 확인할 사항

plist 설정이 잘 안되어서 URL에 대한 접근 및 Data 변환 과정이 정상동작하지 않을 수도 있어요. 이때는 앱의 plist 설정에서 위와 같이 App Transport Security Settings가 잘 지정되어있는지를 확인해주세요.

최소한 본인이 사용한 비디오 URL에 맞는 base URL은 허용 설정을 해두어야 합니다.

 


오늘은 간단하게 View가 화면에 노출되었을때 onAppear 시점에서 특정 비디오 URL로부터 Data를 얻고, FileManager를 통해 임시 로컬 경로를 만들고, 그 경로에 Data를 저장해서 UIActivityView를 통해 공유하는 과정을 알아보았습니다.

평소 사용을 안하다가 구현하려다 보면 구글링을 하게 되는 주제인것 같아서 기록해둡니다. 댓글로 많은 피드백 주세요. 감사합니다. 🤗

 

반응형
댓글
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함