Swift

Swift:Sandbox対応アイデアと答え

SandboxをONにしてもファイル一覧にアクセスするアイデアについての検討です。
➡️結論:NSOpenPanelを使えば問題解決が可能です。

SandboxにUser selected fileはread/writeが可能にする設定があります。これをチェックすれば何ができるのかわからないのですが、次のようなシナリオに有効性はないのでしょうか?サンプルプログラムを作成して評価することにします。

  • Pictures / Download / Music / Movieフォルダの外にあるフォルダの一覧を作成し、サムネール表示すると、おそらくこの時点でSandboxにひっかかります。
  • User selected fileをONにして、たとえばDocumentsの中のフォルダのファイル一覧を作成し、ユーザーに選択してもらいます。その上でファイルのサムネールを作成したらどうなるのでしょう?
    ➡️NG。User selected fileは、ユーザーがフォルダにあるファイルを右クリックしてアプリを起動するときに使う機能のようですね。参考:How to check if user selected file(s) my Sandboxed app has permission to write?
    ➡️簡単に道がふさがれてしまいました。アプリ申請の方は、Sandboxの指定でUser selected fileをOFFにする必要が出てきました。

解決案:Sandboxの問題を解決する方法としてNSOpenPanelを使えばいいのでは?

  • NSOpenPanelを使ってユーザーが指定したfolderpathを取る方法がわかりました。❶結果は配列/NSURLで返ってきます。❷NSURLからfull folderpathに変換するには.pathComponentsを使えばできそうです。

var NSOpen=NSOpenPanel()
NSOpen.allowsMultipleSelection = false
NSOpen.canChooseDirectories = true
NSOpen.canCreateDirectories = false
NSOpen.canChooseFiles = true
var wModal = NSOpen.runModal()
print(“\(NSOpen.URLs)”) //❶
print(“\(NSOpen.URLs[0].pathComponents)”)//❷

上記の実行結果は、次の通りです。この次の問題は、このfull folderpathでアクセス可能かどうか?このフォルダの中のファイルを探してそれにアクセス可能かどうか。

❶ [file:///Users/hk/Documents/Mesa%E3%82%A2%E3%83%95%E3%82%9A%E3%83%AA%E9%96%8B%E7%99%BA%E9%96%A2%E4%BF%82%E8%B3%87%E6%96%99/Objective-C%E5%8B%89%E5%BC%B7/]

❷ Optional([“/”, “Users”, “hk”, “Documents”, “Mesaアプリ開発関係資料”, “Objective-C勉強”])

この方式で実装していけば、Sandbox対応が可能とわかったので、安心して先へ進めます。

Categories: Swift, 技術