Xcode エラー "couldn’t be opened because you don’t have permission to view it." について.

Mac mini 2018, macOS Mojave 10.14.6, Xcode Version 11.3.1 (11C504)


テキストファイルの読み込み時にタイトルにあるようなエラーが発生します.コードは以下のようなものです.ちなみに、新しいプロジェクトを作成したあと main.m の内容に変更を加えているだけです.

main.m

#import <Cocoa/Cocoa.h>
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSString *nStringSourceCode;
        NSURL *nURL;
        NSError *nError;
        nURL = [NSURL fileURLWithPath:@"パス/document.txt"];
        nStringSourceCode = [NSString
                       stringWithContentsOfURL:nURL
                       encoding:NSUTF8StringEncoding
                       error:&nError];
        NSLog(@"%@", [nError description]);
    }
    return NSApplicationMain(argc, argv);
}

ログ.

Error Domain=NSCocoaErrorDomain Code=257 "The file “document.txt” couldn’t be opened because you don’t have permission to view it." UserInfo={NSFilePath=パス/document.txt, NSUnderlyingError=0x600000c11320 {Error Domain=NSPOSIXErrorDomain Code=1 "Operation not permitted"}}

ビルドは通るので文法的な誤りはないと思うのですが、そもそも Xcode および Objective-C はほとんど触ったことがないのでそういった意味で誤りに気づけていない可能性はあります.

パーミッション云々と書いてあるのはおおよそわかるのですが、Finderでフツーに開くことはできますし、テキストエディタでも開くこともできています.セキュリティ関連が怪しいと思いシステム環境設定にてアクセシビリティとフルディスクアクセスにも登録しています.

他、Xcodeの設定は触っていません.

さて、何がいけないのでしょうか?


Mac mini, macOS 10.14

投稿日 2022/04/04 13:21

返信
スレッドに付いたマーク ランキングトップの返信

投稿日 2022/04/04 16:06

アプリケーションプロジェクトのデフォルトでは、App Sadboxというのが有効になっていて

お書きのようにソースコード内でパスを指定してファイルを読み込むことはできないように

なっています。基本はファイルを開くパネル(NSOpenPanel)を使用して、ユーザにファイル

を選択させないと読み込むことができません。

書かれたコードで実行したい場合はSandboxをオフにする必要があります。

下の図で App Sandbox の右側の X印をクリックすればオフにできます。

この場合実行すると、システムが「(このプログラムが)ファイルにアクセスしようとしているが許可するか」

と聞いてきます。これで許可して初めて読み込むことができます。

返信: 8
スレッドに付いたマーク ランキングトップの返信

2022/04/04 16:06 light289 への返信

アプリケーションプロジェクトのデフォルトでは、App Sadboxというのが有効になっていて

お書きのようにソースコード内でパスを指定してファイルを読み込むことはできないように

なっています。基本はファイルを開くパネル(NSOpenPanel)を使用して、ユーザにファイル

を選択させないと読み込むことができません。

書かれたコードで実行したい場合はSandboxをオフにする必要があります。

下の図で App Sandbox の右側の X印をクリックすればオフにできます。

この場合実行すると、システムが「(このプログラムが)ファイルにアクセスしようとしているが許可するか」

と聞いてきます。これで許可して初めて読み込むことができます。

2022/04/05 16:43 light289 への返信

> Sandboxをオフにする必要があります


テストならオフにしてもいいとは思いますが...


Sandboxの"TestOBC.entitlements"ファイルに、"com.apple.security.temporary-exception.files.xxx"キーの値として、アクセスしようとしているパスを書くのが正しい方法です。


App Sandbox Temporary Exception Entitlements


2022/04/04 13:44 light289 への返信

そもそも、そのソースはどこから持ってきたものですか?

自分で、エディターなどを利用して作ったものなら、そんなこと言われないと思うのですが。


> document.txt” couldn’t be opened because you don’t have permission to view it.


と言われるなら、コピーを作ってそちらで作業するのはどうですか?

コピーの作り方も、ファインダーでコピー、ターミナルのcpコマンドとか色々変えてみては?

2022/04/04 23:25 はに への返信

>自分で、エディターなどを利用して作ったものなら、そんなこと言われないと思うのですが。

けれどこうして言われてしまったので、こちらも困惑した次第です.

まあ、結果からいえば Sandbox による制限が原因なのでファイル自体に問題はないようですが.

2022/04/05 17:40 hohokihai への返信

AppStoreで公開するにはSandboxが必須ですから、最終的には

そういうことになりますが、パスを決め打ちで読むようなアプリってあまり無いでしょ?

それに最初の投稿を見れば、まだXcodeってどんなものだろう、ObjectiveーC

ってどんなものだろう? と試している段階でしょ。

2022/04/05 18:24 品川地蔵 への返信

> それに最初の投稿を見れば、まだXcodeってどんなものだろう、Objective-Cってどんなものだろう?と試している段階でしょ


その通りですね。ただ、気になったものでして...


> パスを決め打ちで読むようなアプリってあまり無いでしょ?


NSUserDefaults以外にファイルを格納する場合、歴史的に"~/Library/Application Support"を使うことになると思うのですが、キーが用意されていないので、パスを書くことになると思うのですが(最近は違うのかな?


追記)

~/Libraryではなくて、~/Library/Containers... 以下でしたね。

そういえば、Documentsのキーなくなっていますが、Application SupportやDocumentsにアクセスするときに、entitlementsファイルに記載する必要ないのでしょうか?後でやってみます。

このスレッドはシステム、またはAppleコミュニティチームによってロックされました。 問題解決の参考になる情報であれば、どの投稿にでも投票いただけます。またコミュニティで他の回答を検索することもできます。

Xcode エラー "couldn’t be opened because you don’t have permission to view it." について.

Apple サポートコミュニティへようこそ
Apple ユーザ同士でお使いの製品について助け合うフォーラムです。Apple Account を使ってご参加ください。