2017-12-20 7 views
1

私はあなたのためにファイルを作成する機能を持つMAC OSアプリを開発しています。最初のユーザーがファイルを保存するフォルダを選択(アプリケーションの起動時に1回)し、選択したフォルダ(アプリケーションの開始時に選択したフォルダ)に作成するファイルのタイプと名前をリンゴスクリプトを使用して選択できます。資格ファイルにtemporary-exception以下のファイルを追加するとファイルを作成できますが、Appleの審査チームにはできませんが、サンドボックスでは動作します。Mac OSアプリでユーザーが選択したフォルダに対する読み書き権限はありますか?

ガイドライン2.4.5(I) - パフォーマンス 私たちは、このアプリのために要求された一つ以上の一時的な資格例外が適切でないと許可されないことを決定しました:

com.apple.security.temporary-exception.files.home-relative-path.read-write 
/FolderName/ 

私は見つかりました:

Enabling App Sandbox - 実行可能ファイルを書き込むことをアプリに許可します。

そして

Enabling User-Selected File Access - Xcodeは、ユーザーが明示的に選択した読み取り専用または/ファイルおよびフォルダへの書き込みアクセスを読んで可能にするための選択肢で、ターゲットエディタの[概要]タブでは、ポップアップメニューを提供します。ユーザーが選択したファイルアクセスを有効にすると、ユーザーがNSOpenPanelオブジェクトを使用して開くファイルとフォルダにプログラムでアクセスし、NSSavePanelオブジェクトを使用してユーザーが保存するファイルにアクセスできます。ファイル作成のためのコードの下に使用

let str = "Super long string here" 
let filename = getDocumentsDirectory().appendingPathComponent("/xyz/output.txt") 

do { 
    try str.write(to: filename, atomically: true, encoding: String.Encoding.utf8) 
} catch { 
    // failed to write file – bad permissions, bad filename, missing permissions, or more likely it can't be converted to the encoding 
} 

もNSOpenPanelオブジェクトのエンタイトルメントファイルにcom.apple.security.files.user-selected.read-writeを追加してみました:

<key>com.apple.security.files.user-selected.read-write</key> 
<true/> 

は、Macを承認するパスリンゴのレビューチームを取得する方法はありますユーザーが選択したフォルダに対する読み取りと書き込みの権限を持つアプリですか?ユーザは、あなたがにアクセスできるようにフォルダを選択することができNSOpenPanelを使用して

<key>com.apple.security.files.user-selected.read-write</key> 
<true/> 
<key>com.apple.security.files.bookmarks.app-scope</key> 
<true/> 

そして、開いているフォルダの選択:

+1

ユーザーが常にターゲットフォルダを選択した場合(つまり、ユーザーの操作なしで書き込みを試行しない場合)、com.apple.security.files.user-selected.read-writeのみ必要です。 – Moritz

+1

セキュリティスコープのブックマークを使用します。 –

+0

@モーリッツええ、私は一度のフォルダの選択をしたい、すべてのファイルは同じ場所に格納されます。 –

答えて

1

は、エンタイトルメントファイルにuser-selectedbookmarks.app権限を追加します。 NSOpenPanelは、ブックマークとして保存してディスクに保存する必要があります。その後、ユーザーがフォルダを選択したときと同じアクセスレベルになります。

+0

これはあなたのために動作しますしてください。 –

+0

応答をありがとう、私はこれを試してみます。 –

1

ここは私の回答です Mac OSアプリケーションでは、ユーザーが選択したフォルダの読み書き権限を実装して保持する方法はありますか?

GitHub Example Project link

まず:

エンタイトルメントファイルにuser-selectedbookmarks.app権限を追加します。

<key>com.apple.security.files.user-selected.read-write</key> 
<true/> 
<key>com.apple.security.files.bookmarks.app-scope</key> 
<true/> 

それから私はstoreing、読み込みのために必要なすべてのブックマーク関連の機能のためのクラスを作成した...などのブックマークアプリ。NSOpenPanelを使用して

import Foundation 
import Cocoa 

var bookmarks = [URL: Data]() 

func openFolderSelection() -> URL? 
{ 
    let openPanel = NSOpenPanel() 
    openPanel.allowsMultipleSelection = false 
    openPanel.canChooseDirectories = true 
    openPanel.canCreateDirectories = true 
    openPanel.canChooseFiles = false 
    openPanel.begin 
     { (result) -> Void in 
      if result.rawValue == NSApplication.ModalResponse.OK.rawValue 
      { 
       let url = openPanel.url 
       storeFolderInBookmark(url: url!) 
      } 
    } 
    return openPanel.url 
} 

func saveBookmarksData() 
{ 
    let path = getBookmarkPath() 
    NSKeyedArchiver.archiveRootObject(bookmarks, toFile: path) 
} 

func storeFolderInBookmark(url: URL) 
{ 
    do 
    { 
     let data = try url.bookmarkData(options: NSURL.BookmarkCreationOptions.withSecurityScope, includingResourceValuesForKeys: nil, relativeTo: nil) 
     bookmarks[url] = data 
    } 
    catch 
    { 
     Swift.print ("Error storing bookmarks") 
    } 

} 

func getBookmarkPath() -> String 
{ 
    var url = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] as URL 
    url = url.appendingPathComponent("Bookmarks.dict") 
    return url.path 
} 

func loadBookmarks() 
{ 
    let path = getBookmarkPath() 
    bookmarks = NSKeyedUnarchiver.unarchiveObject(withFile: path) as! [URL: Data] 
    for bookmark in bookmarks 
    { 
     restoreBookmark(bookmark) 
    } 
} 



func restoreBookmark(_ bookmark: (key: URL, value: Data)) 
{ 
    let restoredUrl: URL? 
    var isStale = false 

    Swift.print ("Restoring \(bookmark.key)") 
    do 
    { 
     restoredUrl = try URL.init(resolvingBookmarkData: bookmark.value, options: NSURL.BookmarkResolutionOptions.withSecurityScope, relativeTo: nil, bookmarkDataIsStale: &isStale) 
    } 
    catch 
    { 
     Swift.print ("Error restoring bookmarks") 
     restoredUrl = nil 
    } 

    if let url = restoredUrl 
    { 
     if isStale 
     { 
      Swift.print ("URL is stale") 
     } 
     else 
     { 
      if !url.startAccessingSecurityScopedResource() 
      { 
       Swift.print ("Couldn't access: \(url.path)") 
      } 
     } 
    } 

} 

そして、開いているフォルダの選択ので、ユーザは、あなたがにアクセスできるようするフォルダを選択することができます。 NSOpenPanelは、ブックマークとして保存してディスクに保存する必要があります。その後、ユーザーがフォルダを選択したときと同じアクセスレベルになります。

let selectedURL = openFolderSelection() 
saveBookmarksData() 

とアプリの終了後に、既存のブックマークをロードするために:これだけ

loadBookmarks() 

NSOpenPanelを開くには

。 私はそれが誰かを助けてくれることを願っています。

関連する問題