iOS 9之Shared Links Extension(Safari Extensibility)
金田 (github示例源码)
在之前的Blog中有介绍了关于Safari Extensibility的 Content Blocking部分,详情可以看这里 --- iOS 9之Safari广告拦截器(Content Blocker),今天我们就来看看关于 Safari的另一个扩展点(插件)- Shared Links。
好,先来看一下如何使用该功能:
- 打开Safari,点击书签按钮 (像一本打开的书一样的按钮)

图1 书签按钮
- 选择 “@”共享分栏,就可以看到当前设备中的所有Shared Links 啦

图2 Shared Links示例
- 如果没有看到自己App的共享链接,可以点击右下角的 Subscriptions 按钮,去里面激活自己的App就可以了。

图3 Subscriptions
4. 选择一个链接就可以直接在Safari中打开了,就是这么简单 L
从以上的操作步骤和截图中可以看出,Shared Links就如它的名字一样,共享链接,像我们在QQ,微信(崇洋媚外一点儿的Facebook,Twitter)等IM软件中,经常会有朋友,同事发过来的各种网络链接,作为IT民工也经常要看的各种最新技术网页等,过了一段时间之后,如果还想继续查阅,基本就只能去翻找历史记录 or Safari 书签(当然如果当初你有手动加入的话)。现在我们有了 Shared Links后,就可以不用肿么费体力啦,一切就是这么自动智能~懒人总是有懒人自己的方法~
总结一下,Content Blocking是用来屏蔽内容的,Shared Links则是用来分享内容滴。
进入正题,开始动手!
首先需要在工程(扩展不能独立存在,需要一个Containing App,哪怕是空的也可以,只要你不嫌丑)中创建一个扩展,如下图选择Shared Links Extension。

图4 Extension模板
系统将默认生成RequestHandler类文件, 在RequestHandler中添加方法- (void)beginRequestWithExtensionContext:(NSExtensionContext *)context,当在Safari中 打开“@”共享分栏时,iOS 系统就会自动调用此方法来将你需要分享的链接添加进去。
例子如下:
- (void)beginRequestWithExtensionContext:(NSExtensionContext *)context {
NSExtensionItem *extensionItem = [[NSExtensionItem alloc] init];
extensionItem.userInfo = @{ @"uniqueIdentifier": @"uniqueIdentifierForSampleItem", @"urlString": @"http://www.kdanmobile.com", @"date": [NSDate date] };
extensionItem.attributedTitle = [[NSAttributedString alloc] initWithString:@"KdanMobile title"];
extensionItem.attributedContentText = [[NSAttributedString alloc] initWithString:@"KdanMobile description text"];
[context completeRequestReturningItems:@[ extensionItem ] completionHandler:nil];
}
由上可以看出,我们分享的每个链接(Link)都对应着一个NSExtensionItem对象,其中 attributedTitle 为Link显示在 Shared Links 列表中的标题,attributedContentText为Link描述内容,userInfo 为需要分享的链接Link,所以如果需要共享多个Link,我们只需要创建对应的多个NSExtensionItem对象就可以了。
先上一个Demo运行截图:

图5 例子截图
小细节
1. 如果需要修改App扩展名,只需要在Info.plist中修改Bundle display name对应的值,如下图所示:
<key>CFBundleDisplayName</key>
<string>Shared Links</string>
2. 如果想把SharedLinks列表左边的空白图标换一种样式,例如公司Logo 之类,只需要添加如下代码:
extensionItem. = @[ [[NSItemProvider alloc] initWithContentsOfURL:[[NSBundle mainBundle] URLForResource:@"custormlogo" withExtension:@"png"]] ];
3. 扩展和Containing App各自拥有自己的数据容器,虽然扩展内嵌在Containing App的内部,但在默认情况下,他们彼此之间并不能互访数据。为了实现Containing App与扩展的数据共享,我们需要用到App Group。当开启App Group后,就可以使用NSUserDefaults方法访问共享区域,如下述代码,注意不是 [NSUserDefaults standardUserDefaults]:
NSUserDefaults *sharedUserDefault = [[NSUserDefaults alloc]
initWithSuiteName:@"group.com.kdanmobile.ExtensionDemo"];
也可以使用NSFileManager的containerURLForSecurityApplicationGroupIdentifier 方法访问共享数据区:
NSURL *containerURL = [[NSFileManager defaultManager]
containerURLForSecurityApplicationGroupIdentifier:@"group.com.kdanmobile.ExtensionDemo"];
参考链接
https://developer.apple.com/videos/wwdc/2015/?id=511
iOS 9之Shared Links Extension(Safari Extensibility)的更多相关文章
- iOS桌面小插件 Widget Extension
iOS桌面小插件 Widget Extension 这个插件时iOS14以后才出现的,基于SwiftUI 旧项目新建时可能一堆错误,其中一个时要把插件target 开发sdk版本设置为14.0以上 新 ...
- iOS 8 Share Extension Safari URL Example(在iOS中分享url的样例)
ios8 的Extension给我们提供了非常多奇妙的功能.以后分享内容再也不用进入app了,让我们的手机更安全,以下我们以在safari 浏览器中分享一个web url 来讲述Share Exten ...
- ios中的category与extension
http://blog.csdn.net/haishu_zheng/article/details/12873151 category和extension用来做类扩展的,可以对现有类扩展功能或者修 ...
- iOS类别(Category)与扩展(Extension)-b
苹果的官方文档 Category在iOS开发中使用非常频繁.尤其是在为系统类进行拓展的时候,我们可以不用继承系统类,直接给系统类添加方法,最大程度的体现了Objective-C的动态语言特性. #im ...
- iOS 9的 Universal Links 通用链接使用
前段时间和朋友(@品味生活)一起搞 iOS9的通用链接,我主要做了前面官方文档翻译工作,后面的一些东西都是他在搞,整理也是他整理的. 他的博客原文地址:http://pinwei.blog.51cto ...
- iOS类别(Category)和扩展(Extension,匿名类)
Category在iOS在开发常用. 特别是对于系统扩展上课时间.我们不能继承系统类.直接添加到系统类方法,最大程度上体现Objective-C动态语言特征. #import @interface N ...
- iOS 从app跳转到Safari、从app打开电话呼叫
1.从app跳转到Safari NSString* strIdentifier = @"http://www.ybyb.com"; BOOL isExsit = [[UIAppli ...
- iOS分类(category),类扩展(extension)—史上最全攻略
背景: 在大型项目,企业级开发中多人同时维护同一个类,此时程序员A因为某项需求只想给当前类currentClass添加一个方法newMethod,那该怎么办呢? 最简单粗暴的方式是把newMethod ...
- iOS - App Extension 整体总结
一.App Extension的介绍 App Extension可以让你扩展你APP的自定义功能和内容,使用户可以在与其他应用或者系统进行互动的时候去使用它.app extension即为本文所说的e ...
随机推荐
- Object -C self -- 笔记
- 是实例方法,是用实例对象进行调用的:+ 是类方法,又称静态方法,是用类来调用的: @interface Person: NSObject { int _age; } - (void) setAge ...
- intent的startActivityForResult()方法
/******************************************************************************************** * au ...
- 032数值的整数次方(keep it up)
剑指offer中题目:http://ac.jobdu.com/problem.php? pid=1514 题目描写叙述: 给定一个double类型的浮点数base和int类型的整数exponent. ...
- XML自己定义检查器语法+约束(1)
每次使用它检查xml文件时,仅仅需改动xmldoc.load("xml文件名称");中的文件名称,然后将该文件放在浏览器中执行就可以. 依据浏览器弹出的对话框进行推断自己写的xml ...
- Linux磁盘设备文件(sda,sdb,sdc…)变化问题
在Linux下往往会碰到这样的问题,磁盘的设备文件,比如/dev/sda, sdb, sdc等等在某些情况下会混乱掉,比如sda变成了sdb或者sdc变成了sdb等等,这样无形中会导致磁盘设备管理的混 ...
- printf用法之打印2进制,八进制,十进制,十六进制
printf是格式化输出函数,它可以直接打印十进制,八进制,十六进制,输出控制符分别为%d, %o, %x, 但是它不存在二进制,如果输出二进制,可以手写,但是也可以调用stdlib.h里面的itoa ...
- adb服务启动失败处理命令
执行以下命令: D:\android-sdks\platform-tools>adb kill-server --停止adb服务 D:\android-sdks\platform-tools&g ...
- https加密
对称加密 客户端和服务器使用同一把钥匙,加密算法公开 非对称加密 不同钥匙,公钥加密的私钥可以打开 私钥加密的公钥可以打开 HTTPS关键: 1. 要传输的业务数据,使用对称加密. 客户端生成私钥 ...
- 神器-Sublime Text 3 代码编辑器安装与使用
一.软件获取 1.软件下载地址:http://www.sublimetext.com/3. 2.注册机和汉化下载:http://files.cnblogs.com/files/1312mn/subli ...
- swift 重载 泛式 inout的使用
swift 重载 泛式 inout的使用 函数 func 关键字 -> 表示返回值信息等等 那我们接下来利用函数做几件事情 -a 比较两个数字的大小 -b 比较两个字符串 -c 既能比较字符串, ...