了解如何使用Swift构建iMessage应用

iMessage应用程序是Apple使用iOS设备推动更多对话的最新尝试。 仅需少量代码,您就可以创建扩展,以将自定义逻辑和交互添加到Apple的iMessage应用。 在本文中,我将向您展示如何创建一个简单的iMessage应用程序,该应用程序可让您在iMessage对话中与朋友评价图像。

消息框架

Messages Framework允许您扩展iMessages来创建两种类型的扩展名:贴纸包和iMessage应用程序。 Apple允许您将扩展程序创建为独立应用程序或现有应用程序的扩展程序。

贴纸包

贴纸包是两个扩展中较容易创建的,因为它们不需要代码。 贴纸包只是包含图像的资产目录,用户可以将其附加到消息提示框上。 您可以在此处了解有关图像要求(尺寸,格式等)的更多信息。

iMessage应用程序

iMessage应用程序使您可以与iMessage应用程序进行更深入的集成。 iMessage扩展可以创建自定义UI,以在iMessages中呈现给用户。 您还可以为用户创建动态标签,或将富媒体类型插入对话。 iMessage应用程序可以利用MSMessageMSConversation对象来创建交互式内容,甚至可以更新对话中的消息。

在创建iMessage应用程序时,Messages框架为您提供了很多控制。 本文的其余部分将重点介绍如何创建iMessage应用程序以及您需要了解的主要类。

立即评价

我们的示例iMessage应用程序称为Ratethisnow 。 我们的应用程序可让您对1到5星的图像进行评分,并与朋友分享您对图像的其他评论。 为了简化此发布的示例,我们将示例限制为只有2个用户,以便我们可以使用iPhone Simulator。

我在演示中还使用了其他一些东西来简化事情。 当它们出现时,我们将进行覆盖。

应用程式设定

启动Xcode 8并创建一个新项目,在iOS选项卡下选择iMessage Application模板。 命名您的项目ratethisnow 。 如果您只是想继续,可以从Github获得我的示例项目。

让我们快速看一下项目浏览器。 iMessage应用程序的模板包含一个入口点( MessagesViewController.swift )和一个故事板( Maininterface.storyboard ),我们可以为其添加自定义视图。 单击MessagesViewController并查看内容。 我们的swift类继承自MSMessagesAppViewController,并且覆盖了其几个类。 MSMessagesAppViewController是iMessage扩展的主要类。 您需要重写子类中的方法才能与iMessage进行交互。 您可以在此处了解有关文档中可用方法的更多信息。 您还可以在“应用程序扩展编程指南”中获得应用程序扩展的更广泛概述。

模型

我们的应用程序允许用户创建商品的评价并在对话中分享。 创建一个新的名为RTNItem的 swift类作为我们的模型对象。 我们需要存储标题,图像和用户评分。 如前所述,我们将采取一些捷径来使本文易于管理。 因此,我们将仅允许两个评估者,因为iPhone Simulator仅包含两个可用于测试的用户。 您当然可以将其更改为适合将来用途的系列。

接下来,我们需要配置两个Collection视图单元:一个用于创建按钮,另一个用于标签类型。 默认情况下,集合视图将具有一个CollectionViewItem单元格。 我们需要添加另一个对象,方法是先在RTNRatings ViewController下的场景列表中选择“ Collection”视图对象,然后切换到“属性”检查器(位于菜单选项的右上方列表中),然后将项目增加到2。每个CollectionViewItem需要按类型唯一定义,因此我们需要为每个单元格添加唯一的名称。 命名第一个addratingscell和第二个stickerCell 。 通过选择每个单元格,然后切换到“属性检查器”菜单,您将找到标识符标签。

这种观点我们差不多完成了。 我们只需要设置单元格大小并为“创建”单元格添加一个“添加”图像。 我们可以通过选择“集合视图”对象然后切换到“大小”检查器(位于菜单的右上角)来更改单元格的大小。 更改设置以匹配我的设置,如下图所示。

要添加“添加”图像,请选择“添加”集合视图单元格,然后拖出UIImageView覆盖该单元格。 从我们的资产目录中选择加法图像。

RTNCreateRatingViewController

将UIViewController拖出场景。 单击界面构建器右上方的Identity Inspector, 然后使用下拉菜单将自定义类名称更改为RTNCreateRatingViewController 。 您还需要给Storyboard ID命名为RTNCreateRatingViewController

这只是一个简单的视图。 您需要三个按钮和一个文本字段。 排列视图以匹配我的视图,如下图所示。 如果布局有问题,可以参考已完成的项目文件,可以在此处找到。

完成布局后,您可以连接代码文件中包含的插座。 此时,您可能想知道为什么评分项是按钮而不是图像。 答案是,我采用了一种简化的捷径来使文章简短,同时也要注意iMessage交互。 只需一点想象力和代码,您就可以连接此按钮动作以启动带有图像列表的视图,用户可以选择图像作为评级的基础。 另一个角度可能是该动作启动了相机,以允许用户拍摄要评价的东西的照片。 我会留给您以后再探讨。

MessagesViewController

完成我们的UI后,让我们切换到MessagesViewController并介绍控制iMessage交互的逻辑。 当需要显示我们的iMessage扩展时,我们可以告诉扩展要呈现哪个UI并处理紧凑和全屏视图。 我已经集中了向presentRatingsViewController方法呈现适当的UI和大小的工作 。 此方法检查表示样式,并为紧凑样式显示RTNRatingsViewController视图,为扩展样式显示RTNCreateRatingViewController视图。 然后,当我们的扩展名从非活动状态更改为活动状态时,将调用此方法( willBecomeActive方法),而当我们的演示样式更改时( willTransition方法)。

在本文的前面,我提到我们需要返回完成一些细节,以使我们的应用正常运行。 让我们现在开始,从我们的RTNRatingsViewController开始。 当用户按下添加评分集合视图单元格时,我们需要通知我们的MessagesViewController我们想要将表示样式从紧凑更改为展开,然后将使用委托模式来简化此操作。 将以下行添加到RTNRatingsViewController中,以创建MessagesViewController将要实现的协议。

composeMessage函数中,我设置了模板的基础图像。 在您的项目中,您可以添加标题或设置其他适合您使用的字段。

对于许多应用程序来说,了解会话中的用户是有意义的。 但是,Apple不会将您的代码直接授予用户。 相反,您可以访问对话中每个收件人的UUID。 您可以使用以下语法在MSMessageTemplateLayout的文本位置显示用户名。

不幸的是,Apple仅允许您在消息布局中显示用户名时使用此功能。 如果您想知道发件人是否是当前设备上的发件人,则可以在会话上使用属性来测试是否相等

完成MSMessage之后 ,我们将其插入到活动对话中,并将其传输到远程收件人。

包起来

让我们测试一下我们的工作,看看演示中的工作原理。 Apple为我们提供了一种使用模拟器测试iMessage应用程序的方法。 对于iMessage应用程序,我们有两个用户可以发送和接收来自另一个用户的消息。 让我们运行我们的iMessage扩展,测试我们可以创建一个评级,并与两个用户一起查看创建的消息。

我们的项目到此结束,但是不必到此结束。 我创建了一个简化的项目,向您展示如何入门。 一个不错的练习是看您是否可以扩展该项目,以使其能够被两个以上的用户使用,并找到有趣的东西让您的用户评分。 如果还没有,可以在这里找到该项目代码的链接。

结论

希望本文对您有所帮助。 我认为iMessage应用程序确实有希望,我们只是在可能的范围内涉及表面!

简要地说,我还写了一篇文章,说明为什么创建本地应用程序可能是大多数移动开发工作中最好的方法。 阅读并参与讨论!

如果您发现这篇文章有帮助,请推荐给其他人阅读。 如果您想了解有关Swift 3新增功能的更多信息,请查阅我的新书《 Swift 3新功能》。 谢谢!