WidgetDemo
从iOS 8开始,引入widget特性。可以在通知中心的Today栏中添加widget。widget可以简单理解为一个小的扩展程序,可以展示相关应用的简略信息,提供快捷访问等功能。
widget的概念在Android中已经十分成熟,iOS widget与自由度相当高的Android widget有显著的区别。iOS widget的刷新时间为展示widget时,而不是像Android widget时刻保持在后台,消耗系统资源。iOS widget只是作为很小的配角存在,Apple的中心思想还是希望开发者关注App本身的设计和性能。
尽管iOS widget是一种约束状态下的自由,但已经逐渐改变用户的交互行为。
1、创建工程;
2、为工程添加新Target,并选择Today Extension模板;
3、改为纯代码创建界面,默认会创建MainInterface.storyboard设计界面。删除Info.plist文件中的字段,并添加NSExtensionPrincipalClass字段,设为对应的TodayViewController;
4、在TodayViewController中创建界面。
为widget添加跳转至主应用的快捷入口。
为widget添加一层透明UIView,并添加tap手势,当点击widget时,执行下面方法:
- (void)tapAction {
[self.extensionContext openURL:[NSURL URLWithString:@"customScheme://url"]
completionHandler:nil];
}
其中customScheme可以自定义为需要的名字,字符串整体一定要符合URL格式,否则无法跳转。
tapAction方法发出打开URL请,系统会查找注册过相同scheme的应用,并对其通知。所以主应用要注册相同的scheme,并且实现对通知的响应。
首先,在主应用的Info.plist文件中,添加URL types字段,并最终添加对应的scheme。
然后,在主应用AppDelegate.m中添加如下方法:
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication
annotation:(id)annotation {
if ([[url scheme] isEqualToString:@"customScheme"]) {
// scheme相同,打开应用
return YES;
}
// scheme不同,退出
return NO;
}
大致过程与widget跳转至主应用相同,差别在于发送跳转请求的方法不同,如下:
- (void)jumpToApp2 {
[[UIApplication sharedApplication]
openURL:[NSURL URLWithString:[NSString stringWithFormat:@"customScheme://"
@"www.ticwath."
@"com?name=%@",
self.tf.text]]
options:@{}
completionHandler:^(BOOL success) {
if (success) {
NSLog(@"success");
} else {
NSLog(@"failed");
}
}];
}
一定要保持两者约定的scheme相同。跳转时传递的信息保存在URL中,按约定解析即可。