金田 (github示例源码)

在之前的Blog中有介绍了关于Safari Extensibility的 Content Blocking部分,详情可以看这里 --- iOS 9之Safari广告拦截器(Content Blocker),今天我们就来看看关于 Safari的另一个扩展点(插件)- Shared Links。

好,先来看一下如何使用该功能:

  1. 打开Safari,点击书签按钮 (像一本打开的书一样的按钮)

图1 书签按钮

  1. 选择 “@”共享分栏,就可以看到当前设备中的所有Shared Links 啦

图2 Shared Links示例

  1. 如果没有看到自己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

https://developer.apple.com/library/prerelease/ios/releasenotes/General/WhatsNewInSafari/Articles/Safari_9.html

版权所有,转截须注明作者(金田)及原文出处(原文

iOS 9之Shared Links Extension(Safari Extensibility)的更多相关文章

  1. iOS桌面小插件 Widget Extension

    iOS桌面小插件 Widget Extension 这个插件时iOS14以后才出现的,基于SwiftUI 旧项目新建时可能一堆错误,其中一个时要把插件target 开发sdk版本设置为14.0以上 新 ...

  2. iOS 8 Share Extension Safari URL Example(在iOS中分享url的样例)

    ios8 的Extension给我们提供了非常多奇妙的功能.以后分享内容再也不用进入app了,让我们的手机更安全,以下我们以在safari 浏览器中分享一个web url 来讲述Share Exten ...

  3. ios中的category与extension

    http://blog.csdn.net/haishu_zheng/article/details/12873151   category和extension用来做类扩展的,可以对现有类扩展功能或者修 ...

  4. iOS类别(Category)与扩展(Extension)-b

    苹果的官方文档 Category在iOS开发中使用非常频繁.尤其是在为系统类进行拓展的时候,我们可以不用继承系统类,直接给系统类添加方法,最大程度的体现了Objective-C的动态语言特性. #im ...

  5. iOS 9的 Universal Links 通用链接使用

    前段时间和朋友(@品味生活)一起搞 iOS9的通用链接,我主要做了前面官方文档翻译工作,后面的一些东西都是他在搞,整理也是他整理的. 他的博客原文地址:http://pinwei.blog.51cto ...

  6. iOS类别(Category)和扩展(Extension,匿名类)

    Category在iOS在开发常用. 特别是对于系统扩展上课时间.我们不能继承系统类.直接添加到系统类方法,最大程度上体现Objective-C动态语言特征. #import @interface N ...

  7. iOS 从app跳转到Safari、从app打开电话呼叫

    1.从app跳转到Safari NSString* strIdentifier = @"http://www.ybyb.com"; BOOL isExsit = [[UIAppli ...

  8. iOS分类(category),类扩展(extension)—史上最全攻略

    背景: 在大型项目,企业级开发中多人同时维护同一个类,此时程序员A因为某项需求只想给当前类currentClass添加一个方法newMethod,那该怎么办呢? 最简单粗暴的方式是把newMethod ...

  9. iOS - App Extension 整体总结

    一.App Extension的介绍 App Extension可以让你扩展你APP的自定义功能和内容,使用户可以在与其他应用或者系统进行互动的时候去使用它.app extension即为本文所说的e ...

随机推荐

  1. win7 无线网络无法启动

    开始菜单-运行输入services.msc然后确定!找到WLAN Autoconfig这一项,启动此项服务,一切就OK了

  2. Android 使用 RemoteViews 发送自定义通知 ,遇到 Couldn't expand RemoteViews问题总结

    在RemoteViews这种调用方式中,你只能使用以下几种界面组件: Layout:     FrameLayout, LinearLayout, RelativeLayout Component: ...

  3. 理解 B*tree index内部结构

    转载请注明出处:http://write.blog.csdn.net/postedit/40589651 Oracle数据库里的B树索引就好象一棵倒长的树.它包括两种类型的数据块:一种是索引分支块,还 ...

  4. struts2,hibernate,spring整合笔记(1)

    今天终于配置好了ssh框架的整合,记录下过程供参考 环境:window8.1,jdk1.7 ,带有javaee的eclipse,也就是说要能发布web项目,TOMCAT服务器,tomcat配置涉及到环 ...

  5. git clone之后自动checkout文件处理

    这个问题发生是因为不同操作系统的行结束符不一致导致的,可在clone之后在仓库根目录修改.gitattributes文件 简单处理的话,注释* text=auto这行即可.也可根据不同系统,做相应设定 ...

  6. D3画图学习一

    一.D3画图简介 D3 是最流行的可视化库之一,它被很多其他的表格插件所使用.它允许绑定任意数据到DOM,然后将数据驱动转换应用到Document中.你可以使用它用一个数组创建基本的HTML表格,或是 ...

  7. 本篇文章主要是对jquery+ajax+C#实现无刷新操作数据库数据的简单实例进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助

    我们知道同步执行和异步执行的区别,为了更好的提高用户的体验,我们都会采用异步方式去处理一些问题,毕竟单线程的同步可能回造成卡死等现象,很不友好,所以可以使用ajax来完成用户的体验,现在我们就来说说如 ...

  8. elasticsearch中的概念简述

    Near Realtime(NRT) Elasticsearch接近实时.从为一个文档建立索引到可被搜索,正常情况下有1秒延迟. Cluster 一个集群有一个唯一的名字,默认是"elast ...

  9. PHP Libxml

    PHP Libxml 函数 PHP:指示支持该函数的最早的 PHP 版本. 函数 描述 PHP libxml_clear_errors() 清空 Libxml 错误缓冲. 5 libxml_get_e ...

  10. WPF自定义Main函数

    第一步:在app.xaml.cs里加入以下代码: [STAThread] public static void Main(string[] args) { App app = new App(); a ...