金田 (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