iOS 10和消息框架

当苹果公司最近在WWDC向开发社区开放Messages时,我们的最初反应是HURRAY ! 像许多热情的开发人员一样,我们一直在等待这一刻,以便将有趣的内容集成到Messages中。 实际上,每个iPhone所有者都使用“电话”,“设置”和“消息”应用程序-这3个应用程序基本上是必不可少的。 直到iOS 10为止,Messages都是与我们的开发人员隔离的一个应用程序。 因此可以肯定地说我们很兴奋。

第一印象

在玩Ice Cream Builder示例时,您会发现Apple不仅在框架中进行了一半。 他们正在寻求创建一种新的应用程序范例,以量身定制以改善消息传递体验。 当苹果公司允许在iOS 8中使用第三方键盘时,我们开始看到这种希望的一瞥。该键盘允许以以前无法实现的方式共享GIF,贴纸和图像等丰富的内容。 有了iOS 10,大门就敞开了。

具有协调参与的交互式消息为开发人员带来了许多新的可能性。 回合制游戏(象棋,西洋跳棋和ooh战舰😀)立刻浮现在脑海,但更令人兴奋的是更实际的用例,例如在小组对话中直接与几个朋友分割支票。 每个人都点击Square Cash或Venmo片段并支付其份额。 此外,有了Messages片段中的归因支持,群聊中的每个人都有机会安装贡献者应用程序。 对于开发人员来说,这是一个梦想成真。

如果深入研究Messages Framework文档,您会发现有两种不同类型的集成:

贴纸包

有人说贴纸吗? 是! 在imoji,我们为贴纸而活! 实际上,我们之所以制作了表情符号,是因为我们了解了全球消息传递趋势,并且知道贴纸注定将成为iMessage及更高版本中可视通信的关键部分。 iOS 10不仅通过增加轻松向用户发送视觉效果的功能,而且还允许用户在聊天对话中的任意位置剥离和放置贴纸,从而使贴纸成为消息传递的重要组成部分。 消息传递曾经只是来回传递,但现在会变得更加有趣!

苹果公司一直重视视觉交流,并且作为该策略的一部分,为开发人员创建了一个简单而优雅的解决方案来创建贴纸包。 以下是开发人员如何发布基本贴纸包(功能受限)的示例。

首先创建一个新的Sticker Pack项目:

接下来,将您的图像拖到贴纸包资产目录中。 对于此示例,我们决定创建一个动画猫贴纸包(由Iconka提供)。 因为谁不喜欢可爱的动画猫咪贴纸?

差不多了! 这是我们手机中“消息”中的外观:

很容易吧? 借助如此简单的工具,我们可以确定,一旦iOS 10推出,数千个贴纸包应用程序将立即在App Store中弹出。

消息扩展

尽管贴纸包既有趣又可爱,但它们并非功能强大。 用户可以将贴纸发送给他们的朋友或将其拖动到照片上,但是要增加体验的复杂程度(例如搜索贴纸的能力),我们需要做更多的工作。 这是Messages扩展的来源。

消息扩展功能一目了然。 与具有较少内存的键盘不同,Messages扩展更为宽松。 更好的是,用户不再需要采取其他步骤来在“设置”中启用完全访问权限。 只是……有效。

简而言之,Messages扩展与任何其他扩展一样工作。 iOS将调用您的主视图控制器,该控制器必须扩展MSMessagesAppViewController。 在视图控制器中,您可以访问所有UIKit元素(显然),但是在处理贴纸时,您需要特别注意MSStickerView,MSStickerBrowserView和MSStickerBrowserViewController。

要重构上面的无代码贴纸包应用示例,我们可以子类化MSStickerBrowserViewController并加载贴纸,也可以使用MSStickerBrowserView创建视图层次结构。 创建MSStickerBrowserViewController子类是最简单的方法-它已经符合MSStickerBrowserViewDataSource,因此,您真正需要做的就是告诉父级正在加载的贴纸数量,并为请求的索引返回MSSticker对象。 这类似于构建UICollectionView或UITableView,但更加简化。

说到UICollectionView,您始终可以使用它来显示贴纸内容-这是贴纸最灵活的选项。 如果您熟悉集合视图,那么您已经知道如何创建自定义标题,布局,动画等。例如,MSStickerBrowserView仅具有reloadData方法来重新显示内容,UICollectionView可以逐步添加内容,重新加载特定部分等。

在imoji上,我们构建了UI元素,可以轻松将标签对象加载到开发人员应用程序中。 由于我们已经在使用UICollectionView实现,因此将MSStickerView合并到我们的视图单元中是有意义的。

MSSticker对象

一个MSSticker对象是传递给MSStickerView或MSStickerBrowserView所需要的。 现在,MSSticker对象有些棘手。 他们采用文件URL进行构造。 在我们的测试中,我们发现文件扩展名对于确定内容类型至关重要,这意味着您需要将.png,.gif或.apng显式传递给URL,否则将无法正确加载。

您会注意到该模板创建了2个项目。 一个用于主容器应用程序,另一个用于“消息”扩展程序。 这是扩展应用程序的标准行为。 它们都需要一个主应用才能运行。 但是,在iOS 10上,Apple创建了似乎是隐藏的容器应用程序,用户在其主屏幕上看不到这些应用程序。 这是个好消息,因为用户将获得扩展的全部好处,而不会因不提供任何实际功能的应用而乱丢主屏幕。

现在关闭我们的Xcode项目,并允许CocoaPods接手。 对于那些不熟悉CocoaPods的人来说,它是一个很棒的依赖项管理工具,例如Java的Maven或Node的NPM,它可以解决添加库所带来的所有麻烦。

现在,我们需要创建将整合imoji SDK的CocoaPods文件。 与往常一样,该文件简称为Podfile

  vi Podfile 

当我们将ImojiSDKUI添加到MessagesExtension目标时,我们得到:

 来源'https://github.com/CocoaPods/Specs.git' 
平台:ios,“ 10.0”
 目标“ TrendingStickers” 
结束
 目标“ MessagesExtension” 
吊舱“ ImojiSDKUI”
结束

最后,我们安装pod文件并打开工作区文件:

 吊舱安装 
打开TrendingStickers.xcworkspace

好! 现在我们已经完成了设置工作,让我们深入研究MessagesViewController并了解我们所拥有的。

像其他任何UIViewController扩展实现一样,我们可以在viewDidLoad中设置组件。 在这里,我们将初始化API令牌等

轻按标签应将我们带入类别。 但是,点击单个贴纸尚无任何作用。 因此,我们只需要关闭循环并创建一个MSSticker对象即可发送到对话。

为此,我们将实现一个由IMCollectionViewControllerDelegate调用的委托方法。 让我们让我们的私有类别实现IMCollectionViewControllerDelegate

这很酷,但是在示例中我们还错过了一件有趣的事情。 如果您注意到了,我们还不能直接从imoji扩展名中将标签剥离到对话中。 这是因为默认情况下,IMCollectionViewController使用UIImageView来显示内容。 因此,我们需要使用MSStickerView来执行此魔术。

为了指示IMCollectionViewController使用MSStickerView,请从collectionView实例将loadUsingStickerViews设置为YES:

  stickerController.collectionView.loadUsingStickerViews =是; 

现在,我们可以将好朋友诺瓦克的脸拖到平静的草床上:

剥离功能增加了在消息传递中从未见过的交互性。 我们对这种可能性感到非常兴奋。 考虑一下-下次您的朋友向您发送您不喜欢的人的照片时,您可以通过剥去Leonardo Dicaprio贴纸并将其贴在他们的头上来找回他们(假设您当然是Leo的粉丝)。

如您所见,第三方应用程序与消息之间的交互性比以往任何时候都更好! 向朋友发送文本可以理解这一点,但是发送gif或贴纸可以增加纯文本无法传达的情感水平。 贴纸,GIF,视频和其他媒体内容的用例将使应用程序达到一个全新的水平,并为新的创新铺平道路。 像许多其他开发人员一样,我们很高兴继续梦想新的方法,以使日常消息变得更加有趣和个性化。

如果您想了解更多信息,请查看Github上的完整项目。

摘要

借助iOS 10,Apple的Messages框架通过允许第三方应用程序以前所未有的方式与消息进行交互,向着未来迈出了大胆的一步。 虽然许多其他消息传递公司都在尝试使用机器人,但苹果公司正在让应用程序改善体验。 我们希望这些变化将引发新的创造力浪潮,这在应用程序社区中是前所未有的。 其他消息传递应用程序已尝试实现此目的。 但是他们都没有像苹果公司那样拥有本地iOS访问权限。