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 ...
随机推荐
- Windows消息传递机制具体解释
林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka Windows是一个消息(Message)驱动系统.Windows的消息提供了应用程序之间.应 ...
- @余凯_西二旗民工 【SVM之菜鸟实现】—5步SVM
#翻译#了下 余凯老师的 心法 以前的一篇博文:二分类SVM方法Matlab实现 前几日实现了下,虽然说是Linear-SVM,但是只要可以有映射函数也可以做kernel-svm function [ ...
- crtmpserver 基本流程分析
近期在研究crtmpserver,这里记录下学习过程,首先我们先分析下基本流程. 1.初始化流程 InitNetworking---初始化网络 Initialize Logger::Init()--- ...
- uploadify上传大文件时出现404错误
出现这个错误的话一般是IIs限制了文件大小.IIS7下的默认设置限制了上传大小.这个时候Web.Config中的大小设置也就失效了.具体步骤:1.打开IIS管理器,找到Default Web Site ...
- Java基础知识强化97:final、finally、finally区别
1. final修饰符(关键字) 如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承.因此,一个类不能既被声明为abstract,又被声明为final. 将 ...
- Python字典--笔记
<Python3程序开发指南> 映射:键-值数据项的组合 Python3支持两种无序的映射类型:内置的dict类型.标准库中的collections.defaultdict类型. Pyth ...
- java03变量和基本数据类型
/** * * 失去一日甚易,欲得回已无途! * * 关键字:java中的关键字 就是指 已经被定义了的单词! * 我们就不能再拿关键字 作为我们的变量名! * 常用的关键字: * 基本数据类型: * ...
- PHP编写的SVN类
<?php /** * SVN 外部命令 类 * * @author rubekid * * @todo comment need addslashes for svn commit * */ ...
- python面对对象编程------4:类基本的特殊方法__str__,__repr__,__hash__,__new__,__bool__,6大比较方法
一:string相关:__str__(),__repr__(),__format__() str方法更面向人类阅读,print()使用的就是str repr方法更面对python,目标是希望生成一个放 ...
- div中英文无法自动换行的解决办法
在一个设定好宽度的div中,当我们输入的中文文字长度超过了设定宽度时,会自动换到下一行. 但是,如果输入的是英文字母,那么,无论你div设定宽度为多少,英文字母都是不换行直接在同一行输出,导致di ...