Today widget是在通知中心下面Today標籤頁的內容,任何APP均可以建立本身的Today widget,並且能夠建立多個。用戶能夠在Today頁面進行管理,選擇那些widget是可見的,那些是不可見的。Today widget裏面能夠顯示應用相關的數據,能夠進行一些簡單的操做(官方建議不要太複雜),也能夠跳回主程序。Today widget即便在鎖屏狀態下都是可見的,因此用戶使用是很簡單的。app
用Xcode打開項目,選擇File->New->Target,選擇Today Extension;ui
輸入插件名稱,如MyWidget;url
最後在項目目錄裏面就能看到咱們新建的插件。spa
系統給咱們建立一個storyboard做爲初始界面,而且使用了AutoLayout。這種作法是比較推薦的,固然必定要用代碼寫界面也能夠,就是麻煩點。插件
1.UI樣式:
code
若是你看一下官方對於今日插件的UI指南,有兩點值得注意:
一、儘可能不要使用背景,默認的毛玻璃效果很好,也比較統一;
二、儘可能保持默認的縮進,即左邊會空幾個像素。orm
若是想改變默認縮進,有一個方法:進程
在TodayViewController裏面實現如下,縮進就沒有了。get
- (UIEdgeInsets)widgetMarginInsetsForProposedMarginInsets:(UIEdgeInsets)defaultMarginInsets { return UIEdgeInsetsZero; }
2.跳轉到主應用:string
咱們在插件的storyboard上加幾個按鈕,分別跳轉到主應用的不一樣頁面,怎麼辦呢?
經過OpenUrl方法,self.extensionContext其實就是Today這個app,而後有Today和主應用進行進程間通信,裏面很複雜,但方法封裝的很簡單,就是OpenUrl:
- (IBAction)menuPressed:(id)sender { UIButton* button = (UIButton*)sender; if (button.tag == 1) { [self.extensionContext openURL:[NSURL URLWithString:@"iOSWidgetApp://action=GotoHomePage"] completionHandler:^(BOOL success) { NSLog(@"open url result:%d",success); }]; } else if(button.tag == 2) { [self.extensionContext openURL:[NSURL URLWithString:@"iOSWidgetApp://action=GotoOrderPage"] completionHandler:^(BOOL success) { NSLog(@"open url result:%d",success); }]; } }
協議名是iOSWidgetApp,這個要在主應用的plist裏面註冊一下
而後在主應用的AppDelegate解析協議,進行不一樣的操做。
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { NSString* prefix = @"iOSWidgetApp://action="; if ([[url absoluteString] rangeOfString:prefix].location != NSNotFound) { NSString* action = [[url absoluteString] substringFromIndex:prefix.length]; if ([action isEqualToString:@"GotoHomePage"]) { } else if([action isEqualToString:@"GotoOrderPage"]) { BasicHomeViewController *vc = (BasicHomeViewController*)self.window.rootViewController; [vc.tabbar selectAtIndex:2]; } } return YES; }
3.數據共享
今日插件怎麼能獲取主應用的數據呢?要知道插件和主應用是獨立的兩個進程,之前是沒法共享數據的,如今能夠經過AppGroup來共享數據,同屬於一個group的App共同訪問並修改某個數據。
選中主應用的Target,選擇Capabilities,建立一個group,名字叫group.xxx,而後到插件的target勾選剛纔建立的group,這樣就ok了。
4.讀寫數據
經過NSUserDefaults來讀寫數據,注意NSUserDefaults是根據剛纔建立的group來建立的。咱們在主應用里加入以下代碼,這樣今日插件就有數據可讀了。
NSUserDefaults* userDefault = [[NSUserDefaults alloc] initWithSuiteName:@"group.huijia"]; [userDefault setObject:@"nmj" forKey:@"group.huijia.nickname"];
今日插件裏面的代碼,這樣就能根據主應用的狀態更新插件的狀態。
NSUserDefaults* userDefault = [[NSUserDefaults alloc] initWithSuiteName:@"group.huijia"]; NSString* nickName = [userDefault objectForKey:@"group.huijia.nickname"]; if (nickName) { NSString* message = @"今天XX又給你準備了不少驚喜哦,快去看看吧!"; self.messageLabel.text = [NSString stringWithFormat:@"%@,%@",nickName,message]; }
最終效果:根據用戶是否已經在主應用裏面登陸,顯示不一樣的message,有兩個按鈕,跳轉到主應用不一樣的頁面。