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 ...
随机推荐
- SQL SERVER 执行远端数据库的SQL命令
--------------------------------------------------------------这段先执行exec sp_configure 'show advanced ...
- layout布局实例化
实例化xml中的Layout布局在开发中经常会用到,有几种方法可以使用 1.在Activity中使用getLayoutInflater()方法 View layout = getLayoutInfla ...
- Java基础知识强化27:Object类之toString()方法
1. Object类的toString()方法: public String toString():返回该对象的字符串表示 2. 案例演示: (1)Student类: package cn.itc ...
- 《photoshop cc 新功能 生成图像资源》智能切图逆天啦!
作为一个前端工程师切图这个步骤是必不可少的,方式多种多样,有和切图工具的,也有是把要切的图层元素或者组直接新建保存成文件的,现在photoshop cc2015,可以让你轻松切图,摆脱繁琐的切图步骤. ...
- asp.net微信开发第一篇----开发者接入
在项目的根目录或者特定的文件夹内,创建一个ashx文件(一般处理程序文件),如图 public void ProcessRequest(HttpContext context) { context.R ...
- Asp.Net WebApi 启用CORS跨域访问指定多个域名
1.后台action指定 EnableCors指定可访问的域名多个,使用逗号隔开 //支持客户端凭据提交,指定多个域名,使用逗号隔开 [EnableCors("http://localhos ...
- BestCoder Round 59 (HDOJ 5500) Reorder the Books
Problem Description dxy has a collection of a series of books called “The Stories of SDOI”,There are ...
- 系统管理中 bash shell 脚本常用方法总结
在日常系统管理工作中,需要编写脚本来完成特定的功能,编写shell脚本是一个基本功了!在编写的过程中,掌握一些常用的技巧和语法就可以完成大部分功能了,也就是2/8原则 1. 单引号和双引号的区别 单引 ...
- swing——JFrame基本操作
用JFrame(String String1)创建一个窗口 public void setBounds(int a,int b,int width,int height)设置窗口初始化的位置(a,b) ...
- 【转】setStyleSheet用法
[转自]http://blog.csdn.net/seanyxie/article/details/5925723 使用setStyleSheet来设置图形界面的外观: QT Style Sheets ...