金田 (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. SQL SERVER 执行远端数据库的SQL命令

    --------------------------------------------------------------这段先执行exec sp_configure 'show advanced ...

  2. layout布局实例化

    实例化xml中的Layout布局在开发中经常会用到,有几种方法可以使用 1.在Activity中使用getLayoutInflater()方法 View layout = getLayoutInfla ...

  3. Java基础知识强化27:Object类之toString()方法

    1. Object类的toString()方法: public  String  toString():返回该对象的字符串表示 2. 案例演示: (1)Student类: package cn.itc ...

  4. 《photoshop cc 新功能 生成图像资源》智能切图逆天啦!

    作为一个前端工程师切图这个步骤是必不可少的,方式多种多样,有和切图工具的,也有是把要切的图层元素或者组直接新建保存成文件的,现在photoshop cc2015,可以让你轻松切图,摆脱繁琐的切图步骤. ...

  5. asp.net微信开发第一篇----开发者接入

    在项目的根目录或者特定的文件夹内,创建一个ashx文件(一般处理程序文件),如图 public void ProcessRequest(HttpContext context) { context.R ...

  6. Asp.Net WebApi 启用CORS跨域访问指定多个域名

    1.后台action指定 EnableCors指定可访问的域名多个,使用逗号隔开 //支持客户端凭据提交,指定多个域名,使用逗号隔开 [EnableCors("http://localhos ...

  7. 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 ...

  8. 系统管理中 bash shell 脚本常用方法总结

    在日常系统管理工作中,需要编写脚本来完成特定的功能,编写shell脚本是一个基本功了!在编写的过程中,掌握一些常用的技巧和语法就可以完成大部分功能了,也就是2/8原则 1. 单引号和双引号的区别 单引 ...

  9. swing——JFrame基本操作

    用JFrame(String String1)创建一个窗口 public void setBounds(int a,int b,int width,int height)设置窗口初始化的位置(a,b) ...

  10. 【转】setStyleSheet用法

    [转自]http://blog.csdn.net/seanyxie/article/details/5925723 使用setStyleSheet来设置图形界面的外观: QT Style Sheets ...