2015-10-01 33 views
4

我正在構建一個簡單的內容攔截應用程序。 它的工作原理,但我想應用UISwitches(保存到NSUserDefaults)過濾器(哪些網絡阻止和哪些不)。 因爲內容阻塞擴展使用JSON,所以我不清楚如何選擇多個JSON文件同時工作。用於Safari內容攔截的多個過濾器Swift

任何想法如何實現?多個擴展?以某種方式組合和分割json文件?

+0

嘿大衛,即使我有這個類似的要求,並尋找靈魂。你有這樣做嗎? –

回答

0

我一直處於同樣的情況。對此的回答有點棘手,請耐心等待。您不能寫入文件,即blockerList.json不可寫入。以下是你需要做什麼,

  1. TARGETS啓用應用程序組 - >YOUR MAIN APP - >Capabilities - >App Groups。併爲應用程序組添加唯一標識符。與擴展名相同。 (使用與您爲主應用程序輸入的組名相同的標識符)
  2. 在Container目錄中創建文件。
  3. 將規則(json)寫入該文件。
  4. 重新加載擴展程序,一旦你有書面規則。
  5. 從內容阻塞擴展中的容器目錄讀取規則。

從您的主應用程序創建的文件,並寫入JSON規則到該文件中:

let jsonData = try! JSONSerialization.data(withJSONObject: webFilters, options: JSONSerialization.WritingOptions.prettyPrinted) 

//Convert back to string. Usually only do this for debugging 

if let JSONString = String(data: jsonData, encoding: String.Encoding.utf8) { 

         let file = "conbo.json" 


         if let dir = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "YOUR_GROUP_IDENTIFIER") { 

          let path  = dir.appendingPathComponent(file) 

          do { 

           try JSONString.write(to: path, atomically: false, encoding: String.Encoding.utf8) 

           let id = "YOUR_CONTENT_BLOCKER_BUNDLE_IDENTIFIER" 
           SFContentBlockerManager.reloadContentBlocker(withIdentifier: id) {error in 



            guard error == nil else { 
             print(error ?? "Error") 
             return 
            } 

            print("Reloaded") 
           } 

          } 
          catch { 
          } 
         } 


        } 

現在延長從容器中讀取文件:

class ContentBlockerRequestHandler: NSObject, NSExtensionRequestHandling { 

func beginRequest(with context: NSExtensionContext) { 

    let file = "conbo.json" 


    if let dir = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "YOUR_APP_GROUP_IDENTIFIER") { 

     let path  = dir.appendingPathComponent(file) 

     do { 



      do { 
       let attachment = NSItemProvider(contentsOf: path)! 

       let item = NSExtensionItem() 
       item.attachments = [attachment] 

       context.completeRequest(returningItems: [item], completionHandler: nil) 


      } 



     } 

    } 



} 



}