2015-10-01 4 views
4

Я создаю простое приложение для контент-блока. Он работает, но я хочу применить фильтры (какие сети блокировать, а какие нет) с UISwitches (сохранен в NSUserDefaults). Поскольку расширение блокировки контента использует json, мне непонятно, как я могу выбрать несколько json-файлов для работы одновременно.Несколько фильтров для блокировки содержимого Safari Swift

Любые идеи, как это можно достичь? Несколько расширений? Сочетание и разбиение json-файлов каким-то образом?

+0

эй Дэвид, даже у меня есть это аналогичное требование и искал душу. Вам удалось это сделать? –

ответ

0

У меня была такая же ситуация. Ответ на это немного сложно, так что несите меня. Вы не можете записать файл в пакет i.e blockerList.json не подлежит записи. Вот то, что вам нужно сделать,

  1. Включить App группы из TARGETS ->YOUR MAIN APP ->Capabilities ->App Groups. И добавьте уникальный идентификатор для групп приложений. Сделайте то же самое с расширением. (Используйте тот же идентификатор, что и имя группы, которое вы ввели для основного приложения)
  2. Создайте файл в Контейнерной директории.
  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) 


      } 



     } 

    } 



} 



} 
Смежные вопросы