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,有两个按钮,跳转到主应用不一样的页面。