与CoreData Swift 3结合使用以接受文本和URL的共享扩展

正如我在先前有关操作扩展的博客中提到的那样,我正在创建默认Apple Notes应用程序的副本,其中还包括创建共享扩展名,该共享扩展允许我的Notes应用程序接受其他应用程序中的URL和文本。 这里的主要挑战是,我希望我的共享扩展名能够创建或添加到保存在CoreData中的现有笔记中。

整个项目可以位于此处(免责声明,我仍在对其进行调整):

almusto / CustomNotes
通过在GitHub上创建一个帐户为CustomNotes开发做出贡献。 github.com

我做了很多的在线查找工作,但从未真正找到一个很好的例子说明我正在尝试做的事情。 其中一些方法包括在CoreDataStack的init中使用NotificationCenter并使用它来传递数据的方法,但是我发现了一种更简单且似乎很好的方法!

就像所有其他扩展程序一样,Share Extensions基本上是它们自己的应用程序,但是它们需要作为项目的一部分而不是独立的项目包含在内。 要在项目中创建共享扩展名,请转到文件->新建->目标,然后选择共享扩展名。

创建后将出现一个弹出窗口,询问您是否要使其激活。 这意味着在构建应用程序时,它将构建扩展而不是应用程序。 您可以选择否或是,然后手动更改要在Xcode左上方运行的内容:

如前所述,我在Notes应用程序中进行了股票扩展。 为了使这两个应用程序彼此通信,首先要做的是将您的应用程序和扩展名连接到同一应用程序组。 为此,请转到项目功能,然后将您的应用程序和扩展程序的“应用程序组”都打开,然后将它们添加到同一组中:

在共享扩展本身中,您会注意到它带有类型为SLComposeServiceViewController的ShareViewController,其中具有三个函数:

  isContentValid()->布尔 
didSelectPost()
configurationItems()-> [任何]!

为了解释这些功能,您可以使用Safari快速运行扩展,然后单击活动按钮时,应该看到扩展已加载,如下所示:

在不编写任何代码的情况下单击它之后,您将看到此消息:

如您所见,它就像是Safari中自己的小应用程序。 回到您可能已经猜到的三个函数,当您单击发布按钮时,didSelectPost()被触发。 isContentValid()实际上是在检查我们尝试与应用程序共享的内容是否为正确的类型。 此功能确定是否启用发布按钮。 最后,configurationItems()函数使我们能够将信息发布到特定对象。 在此示例中,我希望能够通过Core Data在CustomNotes应用程序中创建或添加到现有笔记中。

在开始在扩展程序中编写代码之前,让我们回到我的customNotes应用程序以提供一些上下文,并开始与扩展程序共享coreData的过程。

Core Data上还有其他资源,因此除了与共享扩展有关的需求之外,我将不做过多介绍。 我个人喜欢创建一个可以处理我所有核心数据需求的核心数据栈。 在此示例中,我的数据模型称为“ NotesModel”,它具有“ Note”类型的实体和两个属性。 一个叫做String的“ title”,另一个叫做Date的“ date”,在CoreData中实际上是NSDate类型。 以下是我的CoreDataStack:

现在,在此示例中,我只想允许我的notes应用程序接受URL和文本。 第一步是进入扩展程序的plist文件,并将NSExtensionActivationRule更改为字典,然后将NSExtensionActivationSupportsWebPageWithMaxCount作为数字添加为1,将NSExtensionActivationSupportsText作为布尔值添加为YES。 同样,当我们在这里时,您可以将Bundle显示名称更改为所需的名称,因为此名称是设置活动控制器时实际显示的名称。

现在,在我们的ShareViewController中,我们创建一些变量来保存数据。 一方面,我希望变量保留我的网址信息,在我的示例中,我只希望该网址为字符串。 另外,如果我只是想共享文本,我希望有一个变量可以保留该文本。

一定要在底部启用这个小的选择注释选项,我们需要使用我们的configurationItem函数,但是我们想用CoreData中的注释填充它,因此让我们向ShareViewController添加一些属性。 一个用来存储我们所有的笔记,一个用来创建我们的CoreDataStack实例,另一个用来保存我们选择要发布到的笔记的值。

  var selected注意:注意! 
让存储= CoreDataStack.store
var notes = [Note]()

另外,将它们添加到viewDidLoad()中,以便我们可以填充注释:

  store.fetchNotes() 
notes = store.fetchedNotes

当我们点击上方的“新笔记”时,它将实际上打开另一个viewController,使我们可以选择要添加到的笔记。 为此,我们要创建另一个ViewController,由于它将是当前注释的列表,因此继续将其设置为TableViewController。

就像您在表视图中可能已经猜到的那样,我们可以选择要更改的注释,但是我们需要将其传递回ShareViewController,因此让我们继续创建协议并让我们的ShareViewController符合该注释。

现在,让我们进入configurationItems()函数来设置我们的小底部区域:

实际上,我们在ShareViewController中需要做的最后一件事是将我们的项目发回到核心数据中:

现在您的共享扩展名和应用程序可以通信并一起工作!!

最后一项是在您的手机后台打开已经打开的便笺应用程序时,可以对其进行任何新的便笺更改或更改。 为此,只需将以下代码添加到显示笔记的初始视图控制器中:

希望对您有所帮助。 如果您还有其他见解或问题,请随时发表评论。

我会说,在构建此扩展程序时,我遇到了一个有趣的问题:当某人试图在扩展程序中添加现有笔记时,从后台打开笔记应用程序,然后进入该现有笔记,它将不会显示添加内容。 要解决此问题而不是更改便笺,我将创建一个新便笺并删除旧的便笺。 您可以在我的didSelectPost.swift要点(发布的倒数第二个)的第12–20行上看到此内容。