iOS8 Extension 之今日插件(Today widget)插件

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裏面註冊一下today_widget_6.png

而後在主應用的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了。today_widget_7.png

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,有兩個按鈕,跳轉到主應用不一樣的頁面。

today_widget_8.PNG

相關文章
相關標籤/搜索