82602


ReplayKitで録画したデータは、recorder.stopRecording(withOutput:
outURL)を使用すると指定したURLにダイレクトに保存できるようなのですが、ApplicationSurpportフォルダなどで試しても保存できず、Tempファイルにしか保存できないように見えます。

参考；[URL of screen recording from
ReplayKit](https://stackoverflow.com/questions/66966724/url-of-screen-
recording-from-replaykit)

そこで、以下のコードのように、Tempフォルダ内にあるファイルをApplicationSurpportフォルダにコピーしようとしてもエラーになってしまいました。

Tempフォルダ内のファイルというのは、外部にコピーできないものなのでしょうか？

Tempフォルダにファイルが存在すること自体は確認できるのですが、コピー結果がエラーになってしまいます。

[code]

    func copyTempVideoToApplicationFolder(srcURL:URL)
    {
        guard let applicationURL = FileManager.default.urls(for: .applicationDirectory, in: .userDomainMask).first else{ return }
        let dstURL = applicationURL.appendingPathComponent("recordedVideo.mp4")
        
        if FileManager.default.fileExists(atPath: srcURL.path)
        {
            print("tempファイルが存在するよ")
            
            if FileManager.default.fileExists(atPath: dstURL.path)
            {
                //すでにファイルがあれば削除
                do
                {
                   try FileManager.default.removeItem( atPath: dstURL.path )
                }
                catch {print("remove_error")}
            }
    
            do
            {
                try FileManager.default.copyItem(at: srcURL, to: dstURL)
            }
            catch{
                print("Unable to copy file: copyTempVideoToApplicationFolder")
            }
        }
        else
        {
            print("tempファイルが存在しないよ")
        }
    }
    func endRecordingReplayKitVideo(stopHandler: @escaping ()->Void)
    {
        // 録画中じゃないと終了しない
        guard self.recorder.isRecording else { return }
        
        if #available(iOS 14.0, *)
        {
            if let outURL = self.tempURL()
            {
                self.recorder.stopRecording(withOutput: outURL) { (error) in
                    stopHandler()
                    guard error == nil else{
                        print("Failed to save ")
                        return
                    }
                    if(FileManager.default.fileExists(atPath: outURL.path)){print("exists")}else{print("not exists")}
                    //application surpport folderへコピー
                    self.copyTempVideoToApplicationFolder(srcURL:outURL)
                }
    
            }
        }
     }
    func tempURL() -> URL? {
        let directory = NSTemporaryDirectory() as NSString
            
        if directory != "" {
            let path = directory.appendingPathComponent(NSUUID().uuidString + ".mp4")
            return URL(fileURLWithPath: path)
        } 
        return nil
    }
    
[/code]


CC BY-SA 4.0
2021-09-20T07:56:53.307
82600
2021-09-20T10:00:44.773
36446
question
swift
Tempフォルダ内にあるファイルをApplicationSurpportフォルダにコピーできない


2つ大きな問題点があります。

  1. `FileManager.default.urls(for: .applicationDirectory, in: .userDomainMask)`で返されるのはApplicationディレクトリであり、ApplicationSurpportディレクトリではありません。

  2. Sandbox保護されたアプリ用のファイル領域には、限られた少数のディレクトリ(`Documents`のみ?)しか存在せず、それ以外のディレクトリは、ディレクトリ作成の命令を実行しない限り存在しません。

今回はあまり大きな問題ではないかもしれませんが、せっかくdo-try-catchで受け取れるエラー情報を黙って無視してしまうのはやめた方が良いでしょう。

以下のようなコードを試してみてください。

[code]

        func copyTempVideoToApplicationFolder(srcURL:URL) {
            guard let applicationSupportURL = FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first else {return}
            //保存先のディレクトリが存在しなければ作成する
            if !FileManager.default.fileExists(atPath: applicationSupportURL.path) {
                //簡略化のためエラーは無視
                try? FileManager.default.createDirectory(at: applicationSupportURL, withIntermediateDirectories: true, attributes: nil)
            }
            let dstURL = applicationSupportURL.appendingPathComponent("recordedVideo.mp4")
            
            if FileManager.default.fileExists(atPath: srcURL.path) {
                print("tempファイルが存在するよ")
                
                if FileManager.default.fileExists(atPath: dstURL.path) {
                    //すでにファイルがあれば削除
                    do {
                       try FileManager.default.removeItem(atPath: dstURL.path)
                    } catch {
                        print("remove_error: \(error)")
                    }
                }
    
                do {
                    try FileManager.default.copyItem(at: srcURL, to: dstURL)
                } catch {
                    print("Unable to copy file: copyTempVideoToApplicationFolder: \(error)")
                }
            } else {
                print("tempファイルが存在しないよ")
            }
        }
    
[/code]

`recorder.stopRecording(withOutput:
outURL)`は試していませんが、保存先のディレクトリを上記のように作成しておけば、保存できるかもしれません。


CC BY-SA 4.0
2021-09-20T10:00:44.773
82602
2021-09-20T10:00:44.773
13972
82600
answer