【iOS12】WCErrorCodeFileAccessDeniedと出た時の対処法

2020年8月26日

watchOSからiOSへWatchConnectivityを使ってファイルを送信しようとした時に以下のようなエラーがでました。

[WC] -[WCSession notifyOfFileError:withFileTransfer:] ~~~~~ with WCErrorCodeFileAccessDenied

iPhone側からwatchのファイルにアクセスができないというエラーのようです。
今回はこちらのエラーの対処法を紹介します。

WCErrorCodeFileAccessDeniedと出た時の対処法

1. App Groupsを使えるように設定する

WatchConnectivityを使ってiPhone側からwatch側にあるファイルにアクセスするには、ファイルをwatchのAppGroupディレクトリ以下に配置する必要があります。

まずはAppIDにAppGroupsを追加しましょう。

AppGroups名は

group.バンドルID

となるが一般てきです。

バンドルIDがcom.example.AppNameの場合

group.com.example.AppName

となります。

最後にAppIDにAppGroupsの設定を追加したらプロビジョニングの更新も忘れずにしましょう。

AppIDとプロビジョニングを更新できたら、TAGETもAppGroupsに対応させます。

TARGETS > Capabilites > App Groups > ON

に変更します。

次に先ほど作成した group.com.example.AppName というAppGroups名があるのでチェックを入れます。

以上でAppGroupsを使えるようにする設定は終わりです。

2. AppGroupsのディレクトリ以下にファイルを設置する

Swift5

let data =  "a,b,c,d".data(using: .utf8)
        
// AppGroupsのURL(path)を取得する
var fileURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.com.exmple.AppName")
fileURL = fileURL!.appendingPathComponent("files/csv")

do {
    // AppGroups以下に「files/csv」という階層でディレクトリを作成する
    try FileManager.default.createDirectory(at: fileURL!, withIntermediateDirectories: true, attributes: nil)
    
    // ファイル名までのURLにする
    fileURL = fileURL!.appendingPathComponent("test.csv")
    
    do {
        // データを書き出す
        data?.write(to: fileURL)
    }
    catch {
        // エラー処理
    }
}
catch {
    // エラー処理
}

Objective-C

NSData *data = [@"a,b,c,d" dataUsingEncoding:NSUTF8StringEncoding];
    
// AppGroupsのURL(path)を取得する
NSURL *fileURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.com.exmple.AppName"];
fileURL = [fileURL URLByAppendingPathComponent:@"files/csv"];
// AppGroups以下に「files/csv」という階層でディレクトリを作成する
[[NSFileManager defaultManager] createDirectoryAtURL:fileURL withIntermediateDirectories:YES attributes:nil error:nil];
// ファイル名までのURLにする
fileURL = [fileURL URLByAppendingPathComponent:@"test.csv"];
// データを書き出す
[data writeToURL:fileURL options:0 error:nil];