일모도원(日暮途遠) 개발자
[MacCatalyst] 이미지 파일 저장하기 본문
Mac에서 파일을 저장하기 위해서는 먼저 권한을 줘야 한다.
정확히는 모르겠는데 이렇게 App Sandbox를 열고 권한을 줘도 된다.
먼저 선택한 파일에 읽기 쓰기원한을 줘야 한다. 그럴려면
- 타겟에 원하는 앱을 선택한후에
- "Signing & Capabilities" 탭을 선택하고
- "App Sandbox"를 찾는다. (만약 없으면 Capbility옆의 +버튼을 눌러서 App Sandbox를 추가하면 된다)
- "File Access"에서 "User Selected File"의 "Permission & Access"을 None에서 Read/Write로 변경해준다.
난 AraMultiPlayerPro.entitlements 파일에서 아래처럼 권한을 줬다.
(App Sandbox는 개발할때는 NO로 두고, 배포할때는 YES를 줘야한다.)
com.apple.security.files.user-selected.read-write을 1(true)로 주면 된다.
나의 경우에는 위화면은 따로 없다. entitlements 파일 만으로도 되는거 같다.
참조한 싸이트의 코드는 다음과 같다.
바로 원하는 폴더에 저장을 하는것이 아니라, 일단 sandbox안에 먼저 저장한뒤(4번) 그다음에 UIDocumentPickerViewController를 열어서 원하는 위치를 수동으로 선택해서 저장한다.
임시저장된 파일은 나중에 자동으로 삭제된다.
func export(image: UIImage) {
guard let imageData = image.pngData() else { // 1
return
}
let fileManager = FileManager.default // 2
do {
let fileURL = fileManager.temporaryDirectory.appendingPathComponent("temp.png") // 3
try imageData.write(to: fileURL) // 4
if #available(iOS 14, *) {
let controller = UIDocumentPickerViewController(forExporting: [fileURL]) // 5
present(controller, animated: true)
} else {
let controller = UIDocumentPickerViewController(url: fileURL, in: .exportToService) // 6
present(controller, animated: true)
}
} catch {
print("Error creating file")
}
}
나의 경우는 TopView를 찾아와서 UIDocumentPickerViewController를 열게 만들었다.
func export(image: UIImage) {
guard let imageData = image.pngData() else {
return
}
let fileManager = FileManager.default
do {
let fileURL = fileManager.path(for: .picturesDirectory).appendingPathComponent("temp.png")
try imageData.write(to: fileURL)
let topVc = getTopViewController() // 1
if #available(iOS 14, *) {
let controller = UIDocumentPickerViewController(forExporting: [fileURL])
topVc?.present(controller, animated: true) // 6
} else {
let controller = UIDocumentPickerViewController(url: fileURL, in: .exportToService)
topVc?.present(controller, animated: true)
}
} catch {
logFor.ELog(message: "Error creating file:\(error.localizedDescription)")
}
}
func getTopViewController() -> UIViewController? {
let keyWindow = UIApplication.shared.windows.filter {$0.isKeyWindow}.first
var topVC: UIViewController?
if let topController = keyWindow?.rootViewController {
topVC = getTopViewController(topController)
}
return topVC
}
참조한 싸이트는 아래와 같다.
https://sarunw.com/posts/how-to-save-export-image-in-mac-catalyst/
'iOS개발 > MacCatalyst' 카테고리의 다른 글
[MacCatalyst] 마우스 커서 숨기기 (0) | 2022.10.05 |
---|---|
[MacCatalyst] 웹뷰에서 키보드 타이핑이 안될때 (0) | 2022.08.24 |
[MacCatalyst] MacBundle.bundle을 맥에만 추가하기 (0) | 2022.08.23 |
[MacCatalyst] 맥용 테스트 플라이트 설치하기 (0) | 2022.07.20 |
[MacCatalyst] 스크린 세이버 동작안하게 하기 (0) | 2022.07.20 |