使用 Swift 构建一个iOS的邮件应用 Building a Mail App with Swift

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
查看查看80 回复回复1 收藏收藏 分享淘帖 转播转播 分享分享 微信
查看: 80|回复: 1
收起左侧

使用 Swift 构建一个iOS的邮件应用 Building a Mail App with Swift

[复制链接]
baddy 发表于 2016-9-30 15:59:34 | 显示全部楼层 |阅读模式
快来登录
获取优质的苹果资讯内容
收藏热门的iOS等技术干货
拷贝下载Swift Demo源代码
订阅梳理好了的知识点专辑

在前几个月内,我一直在做InboxKit的研究,它是关于Inbox平台的IOS SDK。Inbox为和邮件数据的交互提供高层API,使得你可以忽略IMAP、Exchange、MIME的解析以及thread探测(当然还有很多其他事情...),并使你致力于完成富有创意的App的创作上。我们的目标很简单:尽可能地打造一个优雅的,跨提供商的邮件应用。毕竟,它很难。

使用 Swift 构建一个 iOS 的邮件应用 1

使用 Swift 构建一个iOS的邮件应用 Building a Mail App with Swift - 敏捷大拇指 - 使用 Swift 构建一个 iOS 的邮件应用 1


在Objective-C中,InboxKit使得创建邮件体验变得很轻松,那么,Swift又如何呢?Swift在WWDC后已正式被iOS社区所采纳,我认为以后的SDK设计肯定会包括既有Objective-C又有Swift写的样例。

我们的第一个Swift例子,我想写一个简单的App,它就像一个魔幻8球:

  • 显示Inbox中未读thread
  • 当你摇动手机,标记thread为已读并显示新的thread


使用 Swift 构建一个 iOS 的邮件应用 2

使用 Swift 构建一个iOS的邮件应用 Building a Mail App with Swift - 敏捷大拇指 - 使用 Swift 构建一个 iOS 的邮件应用 2


(注:文中的thread并不是线程的意思,在论坛中的一个帖子叫thread,回复叫post,看看敏捷大拇指就知道了。这里可理解为一封邮件)




1、在 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。




2、查看邮件

InboxKit 让我们从Inbox同步引擎获取邮件数据变得简单起来。我们实例化一个 INThreadProvider ,以此展示来自我们邮箱账号的线程,并且具象化需要的数据。供应者模型 是InboxKit的一个核心概念: 他们被用于获取线程、信息、联系人和更多东西的集合 。供应者有点类似于Core Data中的 NSManagedObjectContext 和YapDatabase的视图——他们把复杂的东西封装在内部,只是暴露出一个结果集,这个结果集是基于你提供的配置。 在InboxKit,供应者从本地SQLite store拉取缓存数据,同时,让对于Inbox API 的询问变得透明。

我们的应用将展示来自Inbox的未读线程,每次一个,所以我们这样定义线程供应者:

[Swift] 纯文本查看 复制代码
	var provider:INThreadProvider! = namespace?.newThreadProvider();
	provider.itemFilterPredicate = NSComparisonPredicate(format: "ANYtagIDs=%@", INTagIDInbox)
	provider.itemSortDescriptors=[NSSortDescriptor(key: "lastMessageDate", ascending: false)]
	provider.delegate=self
	
	self.threadProvider=provider


由于我们已经创建了一个线程供应者,我们就可以使用它的条目数组来存放我们的视图。供应者不会同步获取结果集,所以我们需要实现INModelProviderDelegate协议并监听更新。当新的线程通过以下方式被创建的时候,供应者会调用-providerDataChanged 方法,这些创建新线程的方式包括:

1、从缓存从获取;
2、通过API加载;
3、(某个时间)通过网络数据包被推送到应用。

实现协议确保了我们的应用总是显示最新的数据。

还有其他一些代理方法,比如 providerDataAltered:它让基于UICollection或者UITableView创建邮箱用户界面变得更简单,同时可以使用各种插入删除动画效果。但是目前,我们继续看一些基础的东西。

[Swift] 纯文本查看 复制代码
	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!, dataFetchFailederror: NSError!) {
		self.displayError(error);
	}





3、标记为已读

在我们的 Swift 示例程序中,我们要在用户摇动手机的时候,把当前线程标记为已读,并且显示一个新的线程。用InboxKit,标记为已读是非常简单的。

[Swift] 纯文本查看 复制代码
	overridefuncmotionEnded(motion: UIEventSubtype, withEventevent:UIEvent!) {
	if(motion == UIEventSubtype.MotionShake){
	var items = self.threadProvider!.items
	if let thread = items[0] as? INThread{
		thread.markAsRead()
	}
	}}


在后台,-markAsReadqueues这个方法使新的API动作进入队列,通过这种行为来从线程中移除未读标签。 INThread对象和本地存储的数据会被立刻更新,但是这个动作将会在手机上排队,直到可以建立连接。如果服务器拒绝这次的动作,那么本地的数据也会回滚。

我们不需要刷新我们的线程供应者——我们的工作已经完成!如果当前线程被标记为已读,那么它就不再需要满足我们线程供应者结果集的标准。供应者会自动匹配它的内容,并且调用providerDataChanged方法,我们实现的代理方法将会刷新我们显示,来展现新集合中的第一个线程。




4、接下来的步骤

好了! 只用了几十行代码,我们就创建了一个示例程序,它可以从我们的收件箱一条条的获取线程,并且让我们标记为已读。现在它仅仅需要点动画和润色。你可以从这里查看demo的源码:

SwiftEightBall Sample App

我们仅仅接触了InboxKit的一些浅显的东西。在iOS SDK的上层创建我们的Swift应用,这意味着我们需要为模型获取本地类的支持,比如线程和通讯录,以及因为支持延时线程和消息动作的SQLite而变得更强大的离线缓存。

看看iOS SDK documentation学习一下更多关于在邮件上层创建美观大方应用的知识。

都看到这里了,就把这篇资料推荐给您的好朋友吧,让他们也感受一下。

回帖是一种美德,也是对楼主发帖的尊重和支持。

*声明:敏捷大拇指是全球最大的Swift开发者社区、苹果粉丝家园、智能移动门户,所载内容仅限于传递更多最新信息,并不意味赞同其观点或证实其描述;内容仅供参考,并非绝对正确的建议。本站不对上述信息的真实性、合法性、完整性做出保证;转载请注明来源并加上本站链接,敏捷大拇指将保留所有法律权益。如有疑问或建议,邮件至marketing@swifthumb.com

*联系:微信公众平台:“swifthumb” / 腾讯微博:@swifthumb / 新浪微博:@swifthumb / 官方QQ一群:343549891(满) / 官方QQ二群:245285613 ,需要报上用户名才会被同意进群,请先注册敏捷大拇指

嗯,不错!期待更多好内容,支持一把:
支持敏捷大拇指,用支付宝支付10.24元 支持敏捷大拇指,用微信支付10.24元

评分

参与人数 1金钱 +10 收起 理由
Anewczs + 10 推送上首页了~分享到朋友圈微博QQ空间吧~.

查看全部评分

我是90后 发表于 2016-9-30 17:05:15 | 显示全部楼层
都放假了,还给我们布作业
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

做任务,领红包。
我要发帖

分享扩散

都看到这里了,就把这资料推荐给您的好朋友吧,让他们也感受一下。
您的每一位朋友访问此永久链接后,您都将获得相应的金钱积分奖励
关闭

站长推荐 上一条 /3 下一条

热门推荐

合作伙伴

Swift小苹果

  • 北京治世天下科技有限公司
  • ©2014-2016 敏捷大拇指
  • 京ICP备14029482号
  • Powered by Discuz! X3.1 Licensed
  • swifthumb Wechat Code
  •   
快速回复 返回顶部 返回列表