无法使用“今日扩展的共享应用程序组”共享数据

时间:2016-03-15 17:44:51

标签: ios swift core-data nsfilemanager ios8-today-widget

我正在尝试创建一个今天的扩展,通过使用共享应用程序组容器显示父应用程序中的数据,然后将持久存储添加到上下文中。

  • 添加今日扩展目标
  • 启用父应用和扩展程序的应用程序组,然后选择相同的组
  • 将今天的扩展名添加为数据模型和实体的目标成员资格
  • 将持久存储添加到上下文
  • 获取对象

我没有错误,但扩展似乎没有取得任何结果。有没有人对我可能出错的地方有任何建议?

以下是我在分机TodayViewController

中所做的事情
class TodayViewController: UIViewController, NCWidgetProviding {

var context: NSManagedObjectContext!

@IBOutlet weak var table: UITableView!
var objectsArray = [Objects]()

override func viewDidLoad() {
    super.viewDidLoad()

    let fileManager = NSFileManager.defaultManager()
    var containerPath = fileManager.containerURLForSecurityApplicationGroupIdentifier("group.com.Company.AppName")

    containerPath = containerPath?.URLByAppendingPathComponent("SingleViewCoreData.sqlite")
    let modelURL = NSBundle.mainBundle().URLForResource("AppName", withExtension: "momd")
    let model = NSManagedObjectModel(contentsOfURL: modelURL!)
    let coordinator = NSPersistentStoreCoordinator(managedObjectModel: model!)
    do {
        try coordinator.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: containerPath, options: nil)
    } catch {
     print("yellow")
    }

    context = NSManagedObjectContext(concurrencyType: .MainQueueConcurrencyType)
    context.persistentStoreCoordinator = coordinator


    let moc = context
    let request = NSFetchRequest(entityName: "Objects")
    request.sortDescriptors = [NSSortDescriptor(key: "date", ascending: true)]


    do {
        try
            self.objectsArray = moc.executeFetchRequest(request) as! [Objects]
            print ("objects count \(objectsArray.count)")
    } catch {
        // failure
        print("Fetch failed")
    }

    self.table.reloadData()
}

// MARK: - Table view data source

func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    // #warning Potentially incomplete method implementation.
    // Return the number of sections.
    //return sectionsArray.count

    return 1
}


func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    return self.objectsArray.count
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
   let cell = table.dequeueReusableCellWithIdentifier("Cell") as UITableViewCell!

   cell.textLabel!.textColor = UIColor.whiteColor()
   cell.textLabel!.text = self.objectsArray[indexPath.row].title

   return cell

}

func widgetPerformUpdateWithCompletionHandler(completionHandler: ((NCUpdateResult) -> Void)) {
    // Perform any setup necessary in order to update the view.

    // If an error is encountered, use NCUpdateResult.Failed
    // If there's no update required, use NCUpdateResult.NoData
    // If there's an update, use NCUpdateResult.NewData

    completionHandler(NCUpdateResult.NewData)
}

}

1 个答案:

答案 0 :(得分:2)

在Apple的应用扩展程序设计指南 - 与您的应用程序共享数据

  

即使应用扩展程序包嵌套在其包含的应用程序包中,正在运行的应用程序扩展程序和包含应用程序也无法直接访问彼此的容器

即使您

,他们也无法直接共享数据
  

将今日扩展添加为数据模型和实体的目标成员资格

相反,他们间接通过共享容器(应用程序组)相互通信,您已在步骤2中设置了这些容器。

enter image description here

所以解决方案是:

  1. 在您的Contraning App中,在共享容器中创建sql数据模型,在此数据库中插入数据。在todayExtension中调整您的代码,然后获取数据。
  2. 或使用 NSUserDefaults 来代替共享数据。
  3. 像这样:

    // Create and share access to an NSUserDefaults object
    NSUserDefaults *mySharedDefaults = [[NSUserDefaults alloc] initWithSuiteName: @"com.example.domain.MyShareExtension"];
    
    // Use the shared user defaults object to update the user's account
    [mySharedDefaults setObject:theAccountName forKey:@"lastAccountName"];