在 iphone 上我们会看到一些小工具,类似插件的存在
这些就是 widget 其实就是项目中的一个 target
新创建的 today
如果想要纯代码 编写UI
在 infoPlist中修改 NSExtension 字段
具体UI编写和之前一样这里就是说了..
主要说几个地方:
一.展开与折叠状态
//当点击右上角的按钮时 切换显示模式自动调用
-(void)widgetActiveDisplayModeDidChange:(NCWidgetDisplayMode)activeDisplayMode withMaximumSize:(CGSize)maxSize{
if (activeDisplayMode == NCWidgetDisplayModeCompact) {
self.preferredContentSize = CGSizeMake([UIScreen mainScreen].bounds.size.width, 110);
} else {
self.preferredContentSize = CGSizeMake([UIScreen mainScreen].bounds.size.width, 300);
}
}
如果没有展开效果 查看在切换状态的时候有没有更改对应的高度
二.调起 App
1.添加Containing App (原本的项目)的 URL Schems
2.在Extension App 对应的位置添加如下代码完成跳转
//在"widget://"后面添加对应参数
NSString *urlStr = [NSString stringWithFormat:@"widget://%@",@"i am comming"];
NSURL *url = [NSURL URLWithString:urlStr];
[self.extensionContext openURL:url completionHandler:^(BOOL success) {
}];
3.在 Containing App 中拦截 url 分析后执行相应的方法
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options{
NSLog(@"%@",url);
[[NSNotificationCenter defaultCenter]postNotificationName:@"fromWidget" object:[NSString stringWithFormat:@"%@",url]];
return YES;
}
三.数据共享
1.通过 NSUserDefaults
共享数据
1.1设置 Containing App 与 Extension App 的 App Groups
两个选一样的 App Groups
1.2存
NSUserDefaults *shared = [[NSUserDefaults alloc] initWithSuiteName:@"group.111"];
[shared setObject:@"11111" forKey:@"widget"];
[shared synchronize];
1.3取
NSUserDefaults *shared = [[NSUserDefaults alloc] initWithSuiteName:@"group.111"];
NSString *value = [shared valueForKey:@"widget"];
NSLog(@"%@",value);
注意:
这里的NSUserDefaults 实例化方法和常用的不同
两者的initWithSuiteName 需要与设置的 App Groups 一致 (为啥?)
2.通过NSFileManager
共享数据
保存数据
- (BOOL)saveDataByNSFileManager{
NSError *err = nil;
NSURL *containerURL = [[NSFileManager defaultManager] containerURLForSecuri
tyApplicationGroupIdentifier:@"group.com.xxx"];
containerURL = [containerURL URLByAppendingPathComponent:@"Library/Caches/
widget"];
NSString *value = @"asdfasdfasf";
BOOL result = [value writeToURL:containerURL atomically:YES encoding:NSUTF8StringEncoding error:&err];
if (!result) {
NSLog(@"%@",err);
} else {
NSLog(@"save value:%@ success.",value);
}
return result;
}
读取数据
- (NSString *)readDataByNSFileManager{
NSError *err = nil;
NSURL *containerURL = [[NSFileManager defaultManager] containerURLForSecuri
tyApplicationGroupIdentifier:@"group.com.xxx"];
containerURL = [containerURL URLByAppendingPathComponent:@"Library/Caches/
widget"];
NSString *value = [NSString stringWithContentsOfURL:containerURL encoding:
NSUTF8StringEncoding error:&err];
return value;
}
最后注意:
1.UI 操作应在主线程执行
dispatch_async(dispatch_get_main_queue(), ^{
});
2.可以添加 tableView 但是无法滚动