iOS 10的应用程序组和iMessage扩展– Tack Mobile –中

Messages应用程序的可能性几乎是无穷无尽的,我很高兴看到iOS 10的发布在接下来的几个月中提出了其他独立或捆绑的创造性应用程序。对于我一直在从事的项目在过去的6-7个月中,我们希望通过Messages扩展程序使事情变得简单。 没有新功能,只有现有应用程序的简单功能扩展到了Messages,可以与当前没有该应用程序的人共享。 对于没有订阅功能的付费应用程序,新用户的招聘对于赚钱至关重要,这是创建Messages扩展的主要目标。 本质上,我们希望为用户提供一种更轻松的共享方式,从而通过消息向非用户推广。

第一步是创建一种在现有包含应用程序和Messages应用程序之间共享数据的方法。 本文底部已链接了有关创建App组以通过NSUserDefaults和Core Data共享数据的出色教程,我在创建Messages应用程序时引用了这些教程。 这篇文章是关于使用应用程序组通过NSFileManager共享iMessage扩展的数据。 我们已经在使用NSFileManager将要共享的数据写入磁盘。 本质上,我们遵循将数据托管在服务器上的通用模式,该服务器可根据需要提取并在本地写入/删除/读取。 由于我们已经使用NSFileManager写入文档目录,因此我使用NSFileManager与我们的消息应用程序共享数据。 就我的目的而言,Core Data可能会过大。

第一步是创建iMessage扩展。 从现有容器应用程序中,选择文件->新建->目标。 这将弹出此窗口:

选择“ iMessage扩展”,然后选择一个名称。 您可以稍后更改显示名称,并且显示名称可以与您的容器应用程序相同,这是我们选择执行的操作,因为扩展名旨在驱动用户购买容器应用程序。

要开始共享数据,您需要在“目标”功能中打开应用程序组。 这应将com.apple.security.application-groups添加到YourProject.entitlements文件,并在project.pbxproj文件中启用com.apple.ApplicationGroups.iOS。 需要明确的是,您并没有更改这些文件,当您在“目标”->“功能”中打开“应用程序组”时,它应该只显示在源代码控件中。 在新启用的“应用程序组”部分中,单击加号图标,Xcode将弹出一个视图,显示“添加新容器”。

这必须是唯一的,因此我遵循推荐的group.com.YourCompanyName.YourProjectName.container命名约定。 除不创建新容器外,还请按照消息目标中的这些相同步骤进行操作,只需选择刚刚创建的容器即可。 它是两个应用程序之间的共享容器。 确保两个目标都选中了您创建的容器,并且选中了“步骤:”下面的三个标记。 现在,您已经在两个目标中都启用了应用组,就可以开始编码了。

我做的第一件事是创建用于访问共享容器的辅助方法,因为它是我用于创建共享目录,写入数据和删除数据的路径。 您将要使用您在“项目设置”中“应用程序组”下创建的确切字符串。 我将其设置为常量,并使用NSFileManager方法containerURLForSecurityApplicationGroupIdentifier:创建了一个返回容器路径的方法,并传入了App Group常量。

在消息扩展之前,我们使用NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)将数据写入NSDocumentDirectory; 然后选择返回的第一个路径。 我更新了所有我们使用共享应用程序组容器的地方。 基本上,在使用此标准NSDocumentDirectory的任何地方,都需要对其进行更新以使用容器路径。 主要是在这里NSFileManager写入数据,获取数据和删除数据。 我们还有一个可用的磁盘空间检查,在这里我们检查attributeOfFileSystemForPath:并检查NSFileSystemFreeSize对象以查看剩余的磁盘空间,并且我还更新了此路径以检查容器路径而不是NSDocumentDirectory路径。 仔细检查文件管理器的工作并确保全面更新非常重要,因为您可以想象如果更新以将数据写入新容器但仍从NSDocumentDirectory等删除数据时可能会遇到的错误。 ,在初始化下载管理器时,我检查了共享路径中的目录是否存在,如果不存在,则使用createDirectoryAtPath:withIntermediateDirectories:attributes:error创建了该目录,然后再次传递了共享容器路径。 您需要执行此步骤,因为NSDocumentDirectory已经存在,但是需要创建容器目录。

既然您已使容器应用程序从共享应用程序组中写入,读取和删除数据,那么您也应该可以在iMessage扩展中自由使用它了! 当然,您的扩展程序需要数据的用途可能千差万别,但对我来说,仅对viewWillAppear进行一次检查/更新以查看文件管理器中的数据就足够了。 自从我在Swift中编写扩展名以来,我就使用了FileManager.default,并且再次使用了相同的containerURLForSecurityApplicationGroupIdentifier方法,该方法在Swift中被命名为forSecurityApplicationGroupIdentifier。 同样,您需要在“应用程序组”部分中传递确切的字符串。 然后,我过滤了结果以仅查找带有m4a文件扩展名的项目,并将这些文件保存在用于填充CollectionView的array属性中。 根据您要写入文件管理器的数据类型,这可能会变得很复杂。 但是对于我的使用,仅从写入共享应用程序组的文件和文件名中,我就能获得编写简单但有意义的扩展名所需的信息。

要考虑的一个潜在问题是您的用户在现有版本上更新到新的应用程序版本。 该应用程序的较旧版本将把数据写入NSDocumentDirectory,并且在尝试在新的应用程序组容器中查找数据时将失败。 为了获得无缝的体验,并且不让用户再次下载他们已经拥有的项目,您需要将数据从NSDocumentDirectory迁移到新的应用程序组容器。 在初始化下载管理器时,我在m4a文件格式的documents目录中添加了对项目的检查,并将其复制到共享应用程序组中,然后从NSDocumentDirectory中删除。

链接到有关使用应用程序组将NSUserDefaults共享到扩展的教程,该扩展对我有所帮助:http://www.atomicbird.com/blog/sharing-with-app-extensions