概述
摘要:修改project1,让用户可以分享到Facebook和Twitter。
概念:UIBarButtonItem,UIActivityViewController,社交网络框架,NSURL
1.关于技术项目
2.UIActivityViewController介绍
3.Twitter和Facebook:SLComposeViewController
4.总结
关于技术项目
如你所知,这个系列的文章顺序是app,game,技术(techique)。Project1是看图软件,project2是猜国旗游戏,所以该轮到技术项目了。
技术项目的目标是选取iOS技术中的一项进行深入。有些可能很简单,但有的会很复杂,我保证会让它们尽可能缩短因为我知道你想把更多的时间放在做实事上。
第一个技术项目真的很简单,因为我们要给project1添加一个功能:分享。
UIActivityViewController介绍
分享在iOS中是有一个标准的功能强大的组件可供其它app接入的。所以当你要给一个app增加分享功能时,第一件事就是引入这个组件。它叫做UIActivityViewController:你要跟它解释要被分享的数据是什么类型的,而它会告诉你最好的分享办法是什么。
我们的数据类型是图像,所以UIActivityViewController会自动给我们通过iMessage,邮件还有Twitter和Facebook来分享的功能,同时还有本地保存,分配给某个联系人,通过AirPrint打印等等。它甚至还跟AirDrop和iOS8扩展系统有挂钩所以其他app也可以直接从我们这里读取图像。
最棒的是,几行代码就可以完成这个任务。在我们接触UIActivityViewController之前,我们得先让用户可以触发分享,方法是添加一个按钮组件。
项目1中使用了UINavigationController来让用户在两个屏幕中跳转。UINavigationController的顶部默认有个横条,叫UINavigationBar,我们作为开发者可以向其中添加可以调用我们的方法的按钮。
现在来创建其中的一个按钮。首先复制一个项目1,重命名为项目3。然后在Xcode中打开它,点开DetailViewController.swift,找到viewDidLoad()。它几乎是空白的——除了super.viewDidLoad()和configureView()。在configureView()下面添加以下代码:
navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .Action, target: self, action: "shareTapped")
代码有两部分:左边的是视图控制器的navigationItem的rightBarButtonItem,这是被导航栏使用的导航项所以可以使用相关信息。这里我们设置的是导航右侧按钮,也就是出现在导航条右边的按钮。
在赋值号的右边,我们创建了一个UIBarButtonItem类型的新实例,带有三个参数:系统项,目标,动作。这里的系统项我们指定为.Action,代表UIBarButtonSystem.Action,是一个箭头冲出方框的图标,暗示用户点击它可以做点什么。
target和action放在一起是为了告诉UIBarButtonItem什么方法应该被调用。参数action代表:“当你被触碰时,调用方法shareTapped()”,而target告诉按钮这个方法属于当前的视图控制器——self。
如果系统提供的按钮你都不喜欢,你可以用自己的图像创建一个自己的。然而,最好是用系统自带的,因为用户都已经十分习惯了。
按钮创建好了之后,就按创建shareTapped()方法了。接下来要写一堆复杂的代码,准备好了嘛?好了咱们就开始!把下面的代码放到方法viewWillDisappear()后面:
func shareTapped() {
let vc = UIActivityViewController(activityItems: [detailImageView.image!], applicationActivities: [])
presentViewController(vc, animated: true, completion: nil)
}
有了上面这两行代码,shareTapped()就可以通过AirDrop发送照片,发到Twitter上了。你必须承认,iOS有时候真的很令人惊艳!
第二行是学过的内容:我们已经在project2中学过presentViewController()。但第一行是新的,因为它引入了一个UIActivityViewController组件。它需要两个参数:你想要分享的一组内容和一系列你想要在自己的app中能够分享到的地方。
第二个参数我们传递的是一个空数组,因为我们的app并没有提供其他服务。但如果你想要给它增加类似于“其他相似的照片”这样的功能,你可以在这个空数组的位置添加。
所以重点是第一个参数:我们传入的[detailImageView.image!]。如果你想起来了,这幅图像被放在一个叫detailImageView的UIImageView类型中,而UIImageView有个可选属性叫image,它可以存放UIImage。但因为是可选的,所以也可能没有。UIActivityViewController不想要不确定,它要的是实际存在。
好在我们给image view设置了一幅图像,实际上这才是视图控制器的重点。所以我们给detailImageView.image!加了个感叹号解包了可选项。然后图像就被放到一个数组中,并发送给了UIActivityViewController。
完成了!
Twitter和Facebook:SLComposeViewController
OK,如果我不再花点时间告诉你其他实现分享的方法我会有点罪恶感,特别是系统内建的对Facebook和Twitter分享的支持,它们还特简单。
iOS有个叫“社交”的架构,就是为发布到社交网络而设计的。这些都可以被用来让用户去分享图像,而且用户可以直接分享到他们的Twitter和Facebook而不会先问他们想怎么分享。
使用社交架构让分享直截了当,而且简单的方法具有自解释性。接下来让我们看看代码:
let vc = SLComposeViewController(forServiceType: SLServiceTypeFacebook)
vc.setInitialText("Look at this great picture!")
vc.addImage(detailImageView.image!)
vc.addURL(NSURL(string: "http://www.photolib.noaa.gov/nssl"))
presentViewController(vc, animated: true, completion: nil)
除了设置成Facebook类型的SLComposeViewController组件之外,就只有NSURL是新的了。这是个新类型,一开始看上去感觉有点多余:它用来存储和处理像www.baidu.com这样的URL。
URL就是个文本字符串,所以有个专用的类会让人觉得奇怪,不是只用string就可以了嘛。然而,iOS的URL不只是用于网站。比如你可以通过URL找到本地文件,也可以找到云端文件。即便只是网站的URL,还有“这是个HTTP还是HTTPS?”和“URL上有用户名和密码吗?”这样的问题。
下个项目我们还会用到NSURL,但这里的用法十分简单:我们把链接指向美国严重风暴实验室以便于人们可以从那里获得更多图片。NSURL(string:) 方法把字符串 “http:www.photolib.noaa.gov/nssl”转换成NSURL实例,然后就可以被传入到addURL()中了。
现在代码完成了,但你发现它无法编译。这是因为还没有引入社交架构。你可以通过在顶部的import UIKit下面加上一行 import Social,这样就可以编译了。
最后,如果你想分享到Twitter而不是Fb,只要把forServiceType中的SLServiceTypeFacebook改成SLServiceTypeTwitter就可以了。
总结
第一个技术项目特意选了这个简单但可以让app更好的技术。希望你不会感到无聊,而且还能把新的UIBarButtonItem,UIActivityViewController,社交架构和NSURL学到手。
我想让你看到在app中加入社交内容有多简单,而且它可以让你的app在有疯传的可能。我也希望这个项目能让你知道改进一下原先的项目其实只需要花很小的一点额外努力。