Project3:用UIActivityViewController做社交媒体

概述

摘要:修改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在有疯传的可能。我也希望这个项目能让你知道改进一下原先的项目其实只需要花很小的一点额外努力。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容