2015-09-15 18 views
8

コンテンツブロッカー拡張子から複数のJSONファイルを返すことはできますか?私のUIユーザは、異なるフィルタを有効/無効にし、各フィルタは別々のファイルで表されます。私は現在、(のみ複数を反復処理するにもかかわらず、1をロードする)があります。iOSコンテンツブロッキング拡張機能複数のJSONファイルを読み込む

func beginRequestWithExtensionContext(context: NSExtensionContext) { 
    var items = Array <NSExtensionItem>() 

    let resources = ["a", "b", "c"] 
    for resource in resources { 
     let url = NSBundle.mainBundle().URLForResource(resource, withExtension: "json") 

     if let attachment = NSItemProvider(contentsOfURL: url) { 
      let item = NSExtensionItem() 
      item.attachments = [attachment] 
      items.append(item) 
     } 
    } 
    context.completeRequestReturningItems(items, completionHandler: nil) 
} 

私は複数のアイテムや、複数のファイルが添付された単一の項目をやってみました。別々のファイルを持つことができない場合は、複数を組み合わせる(またはプログラムで生成する)方法はありますか?

答えて

3

好奇心を抱いている人には、JSONファイルを動的に生成するコードを追加しました(ディスクに保存されています)。他の回答からは、ファイルの代わりにNSDataの表現を返すことで、節約のステップが回避できるように思えますが、その試みは失敗しました。ここに私のスニペットがあります:

import UIKit 
import MobileCoreServices 

class ActionRequestHandler: NSObject, NSExtensionRequestHandling { 

    func beginRequestWithExtensionContext(context: NSExtensionContext) { 
     let item = NSExtensionItem() 
     let items = [item] 

     let url = buildJSONFileURL() 
     if let attachment = NSItemProvider(contentsOfURL: url) { item.attachments = [attachment] } 

     context.completeRequestReturningItems(items, completionHandler: nil) 
    } 

    func buildJSONFileURL() -> NSURL { 
     let directories = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) 
     let directory = directories[0] 

     let path = directory.stringByAppendingFormat("/block.json") 

     let selector = [...] // Dynamically Generated 
     let dictionary = [[ 
      "action": [ "type": "css-display-none", "selector": selector ], 
      "trigger": [ "url-filter": ".*" ] 
      ]] 

     let data = try! NSJSONSerialization.dataWithJSONObject(dictionary, options: NSJSONWritingOptions.PrettyPrinted) 
     let text = NSString(data: data, encoding: NSASCIIStringEncoding)! 

     try! text.writeToFile(path, atomically: true, encoding: NSASCIIStringEncoding) 

     return NSURL(fileURLWithPath: path) 
    } 

} 
+0

ありがとうございます。あなたのコードを試して、動作しませんでした。私はどのように結合するか、ここにjsonファイルをフィルタに応じて分割するかわからない... –

3

複数のJSONファイルを作成し、コンテンツブロッカー拡張機能に使用することは可能です。あなたはカントがNSExtensionに複数の添付ファイルを添付

2)completeRequestReturningItemsメソッドへの複数の拡張項目を渡す場合

1)SFContentBlockerErrorDomainをスローし、ソースコードにコメントが言う、添付ファイルは、代替データの配列であることを意味しませんフォーマット/タイプではなく、ソーシャルメディアの投稿などに含めるコレクションです。これらの項目は、常にNSItemProviderと入力されます。私は添付ファイルとして複数のjsonデータを追加することはできないと思います。メッセージを作成する一連の添付ファイルではないからです。

私の解決策は、(それが動作確認済み):

NSItemProviderは、アイテム(NSDataの)とtypeIdentifierで初期化することができます。

let aData = NSData(contentsOfURL: NSBundle.mainBundle().URLForResource("a", withExtension: "json")!) 
let bData = NSData(contentsOfURL: NSBundle.mainBundle().URLForResource("b", withExtension: "json")!) 

aJSON = `convert aData to JSON` 
bJSON = `convert bData to JSON` 
combinedJSON = `aJSON + bJSON` 
combinedData = 'convert combinedJSON to NSData' 

let attachment = NSItemProvider(item: combinedData, typeIdentifier: kUTTypeJSON as String) 

これで、添付ファイルcombinedDataを自分の好みに従って作成することができました。

+0

私は初心者です。あなたはこれの客観的なバージョンを私に指摘できますか?ありがとうございました – jasono

関連する問題