使用 Swift 构建一个 iOS 的邮件应用 【已翻译100%】
在前几个月内,我一直在做InboxKit的研究,它是关于Inbox平台的IOS SDK。Inbox为和邮件数据的交互提供高层API,使得你可以忽略IMAP,Exchange,MIME的解析以及thread探测(当然还有很多其他事情...),并使你致力于完成富有创意的APP的创作上。我们的目标很简单:尽可能地打造一个优雅的,跨提供商的邮件应用。毕竟,它很难。
在Objective-C中,InboxKit使得创建邮件体验变得很轻松,那么,Swift又如何呢?Swift在WWDC后已正式被IOS社区所采纳,我认为以后的SDK设计肯定会包括既有Objective-C又有Swift写的样例。
我们的第一个Swift例子,我想写一个简单的app,它就像一个魔幻8球:
1.显示Inbox中未读thread
2.当你摇动手机,标记thread为已读并显示新的thread
(译者注:文中的thread并不是线程的意思,在论坛中的一个帖子叫thread,回复叫post.这里可理解为一封邮件)
**
在 Swift 中使用 Objective-C SDK**
InboxKit有6000行Objective-C代码,我们还不打算把他们都转换成Swift。为了编译我们的Swift邮件应用,我更新了open-source SDK,包含了“Xcode 6 自定义框架“。自定义框架是Xcode6的新特色-支持第三方框架的创建和分发。当DEFINES_MODULE标志设置为可用时,自定义框架会自动为Swift准备Objective-C模块的头文件。在Swift编译时,它会读取这个模块头文件,把Objective-C的类和方法映射到Swift。
Cocoa Touch框架包含这个SDK之后,在Swift中使用很简单。比如我创建了一个新的Swift应用,只需要把这个SDK拖入工程中,然后在root view controller中添加import InboxKit。
Xcode 6 自定义框架非常棒, 可是目前只有Xcode 6和iOS 8支持. 如果你正在开发一款应用程序, 你仍然可以选择pod InboxKit。
查看邮件
InboxKit 让我们从Inbox同步引擎获取邮件数据变得简单起来。我们实例化一个 INThreadProvider ,以此展示来自我们邮箱账号的线程,并且具象化需要的数据。供应者模型 是InboxKit的一个核心概念: 他们被用于获取线程,信息,联系人和更多东西的集合 。供应者有点类似于Core Data中的 NSManagedObjectContext 和 YapDatabase的视图——他们把复杂的东西封装在内部,只是暴露出一个结果集,这个结果集是基于你提供的配置。 在InboxKit,供应者从本地SQLite store拉取缓存数据,同时,让对于Inbox API 的询问变得透明。
我们的应用将展示来自Inbox的未读线程,每次一个,所以我们这样定义线程供应者:
var provider:INThreadProvider! = namespace?.newThreadProvider(); provider.itemFilterPredicate = NSComparisonPredicate(format: "ANY tagIDs = %@", INTagIDInbox) provider.itemSortDescriptors = [NSSortDescriptor(key: "lastMessageDate", ascending: false)] provider.delegate = self self.threadProvider = provider
由于我们已经创建了一个线程供应者,我们就可以使用它的条目数组来存放我们的视图. 供应者不会同步获取结果集, 所以我们需要实现INModelProviderDelegate协议并监听更新. 当新的线程通过以下方式被创建的时候,供应者会调用-providerDataChanged 方法,这些创建新线程的方式包括:1.从缓存从获取 2.通过API加载 3.(某个时间)通过网络数据包被推送到应用. 实现协议确保了我们的应用总是显示最新的数据.
还有其他一些代理方法,比如 providerDataAltered:它让基于UICollection或者
UITableView创建邮箱用户界面变得更简单,同时可以使用各种插入删除动画效果.但是目前,我们继续看一些基础的东西.
func refreshInterface() { var items = self.threadProvider!.items if items.count == 0 { // display empty state self.subjectLabel.text = "No unread threads!" self.snippetLabel.text = "" self.participantsLabel.text = "" self.dateLabel.text = "" } if let thread = items[0] as? INThread { // display the thread self.subjectLabel.text = thread.subject self.snippetLabel.text = thread.snippet self.dateLabel.text = formatter.stringFromDate(thread.lastMessageDate); .... }}func providerDataChanged(provider: INModelProvider!) { self.refreshInterface()}func provider(provider: INModelProvider!, dataFetchFailed error: NSError!) { self.displayError(error);}
标记为已读
在我们的 swift 示例程序中,我们要在用户摇动手机的时候,把当前线程标记为已读,并且显示一个新的线程。用InboxKit,标记为已读是非常简单的。
override func motionEnded(motion: UIEventSubtype, withEvent event: UIEvent!) { if (motion == UIEventSubtype.MotionShake) { var items = self.threadProvider!.items if let thread = items[0] as? INThread { thread.markAsRead() } }}
在后台,-markAsReadqueues这个方法使新的API动作进入队列,通过这种行为来从线程中移除未读标签。 INThread对象和本地存储的数据会被立刻更新,但是这个动作将会在手机上排队,直到可以建立
连接。如果服务器拒绝这次的动作,那么本地的数据也会回滚。
我们不需要刷新我们的线程供应者-我们的工作已经完成!如果当前线程被标记为已读,那么它就不再需要满足我们线程供应者结果集的标准.供应者会自动
匹配它的内容,并且调用providerDataChanged方法,我们实现的代理方法将会刷新我们显示,来展现新集合中的第一个线程。
接下来的步骤
好了! 只用了几十行代码,我们就创建了一个示例程序,它可以从我们的收件箱一条条的获取线程,并且让我们标记为已读.现在它仅仅需要点动画和润色.你可以从这里查看demo的源码:
: SwiftEightBall Sample App
我们仅仅接触了InboxKit的一些浅显的东西.在IOS SDK的上层创建我们的swift应用,这意味着我们需要为模型获取本地类的支持,比如线程和通讯录,
以及因为支持延时线程和消息动作的SQLite而变得更强大的离线缓存.
看看iOS SDK documentation 学习一下更多关于在邮件上层创建美观大方应用的知识.

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
这个不起眼的计划 可能是谷歌今年发布的最重要的
要说安卓手机最要命的一点是什么,相信不少朋友都会说“系统更新难”。比起老对手 iOS 那样的推送迅速,安卓手机这边简直是令人发指。很多时候,当谷歌发布新系统时你能在大半年内接受到官方推送,那都是非常非常幸运的了。虽说过了那么多年,安卓就连用起来慢、卡的顽疾都被解决得差不多了,唯独这件事还是没有变化。 “这一次,一切都会截然不同。”每一次安卓的新版本发布,并即将向手机和平板电脑开始推送时,谷歌都会这么说。但无论是“棉花糖”还是“牛轧糖”,过去两年发生过的一切都证明这番话并不完全是真的。至今谷歌最新的操作系统的安装率都只有 7.1%,又怎么能让人真正体验到截然不同呢? 顺带一提,根据谷歌官方自己的数据,直至今日都有 29.2% 的安卓设备在运行 4.4 版本的系统。考虑到这是个 2013 年推出的系统版本,安卓生态的碎片化确实让人咋舌。 其实这一切都是可以理解的。安卓系统并不像 iOS 那样,完全针对的苹果旗下自己推出的 iPhone 和 iPad。新的系统一旦要面向市面上那么多的手机型号和那么多的运营商,推送进程就难免被搁置,因为这牵涉到大量的兼容性测试,还有成本。当然,更多的是手机厂商...
- 下一篇
Google Pixel 2 首次现身:或首发安卓 8.0
Pixel、Pixel XL 虽然存在一系列问题,但作为安卓手机标杆仍是当之无愧的,有关 Pixel 2 的传闻也是不断。 如今在 AOSP 代码库里,我们第一次看到了 Pixel 2 的身影,虽然只是个代号 “Muskie”。它和其他一系列 Google Nexus/Pixel 设备代号并列在一起,没别的身份! 另外还能看到 “Walleye”(大眼梭鲈)、“Taimen”(哲罗鱼)两个代号,身份不详。 有外媒怀疑前者是小尺寸的 Pixel。 据此前报道,Pixel 2 仍然交给 HTC 代工,后者已经拿出原型机供 Google 参考,有望在 5 月 17 日的 I/O 2017 大会上伴随下代系统 Android O 一起发布。 Building 12 configured target(s): aosp-master/aosp_arm64-eng aosp-master/aosp_x86-eng git_master/aosp_muskie-userdebug git_master/aosp_walleye-userdebug git_master/bullhead-userde...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8编译安装MySQL8.0.19
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Hadoop3单机部署,实现最简伪集群
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS7设置SWAP分区,小内存服务器的救世主
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8安装Docker,最新的服务器搭配容器使用
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Docker使用Oracle官方镜像安装(12C,18C,19C)