金田 (github示例源码)html
在以前的Blog中有介绍了关于Safari Extensibility的 Content Blocking部分,详情能够看这里 --- iOS 9之Safari广告拦截器(Content Blocker),今天咱们就来看看关于 Safari的另外一个扩展点(插件)- Shared Links。ios
好,先来看一下如何使用该功能:git
图1 书签按钮github
图2 Shared Links示例微信
图3 Subscriptions网络
4. 选择一个连接就能够直接在Safari中打开了,就是这么简单 Lapp
从以上的操做步骤和截图中能够看出,Shared Links就如它的名字同样,共享连接,像咱们在QQ,微信(崇洋媚外一点儿的Facebook,Twitter)等IM软件中,常常会有朋友,同事发过来的各类网络连接,做为IT民工也常常要看的各类最新技术网页等,过了一段时间以后,若是还想继续查阅,基本就只能去翻找历史记录 or Safari 书签(固然若是当初你有手动加入的话)。如今咱们有了 Shared Links后,就能够不用肿么费体力啦,一切就是这么自动智能~懒人老是有懒人本身的方法~ide
总结一下,Content Blocking是用来屏蔽内容的,Shared Links则是用来分享内容滴。ui
进入正题,开始动手!url
首先须要在工程(扩展不能独立存在,须要一个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