widget 之 Today Extension

在 iphone 上我们会看到一些小工具,类似插件的存在

widget 之 Today Extension_第1张图片
widget.png

这些就是 widget 其实就是项目中的一个 target

widget 之 Today Extension_第2张图片
Paste_Image.png

新创建的 today

widget 之 Today Extension_第3张图片
Paste_Image.png

如果想要纯代码 编写UI
在 infoPlist中修改 NSExtension 字段


使用 Storyboard
使用纯代码

具体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

widget 之 Today Extension_第4张图片
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 *)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


widget 之 Today Extension_第5张图片
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 但是无法滚动

参考与拷贝:
http://www.jianshu.com/p/9b3d06236d19

你可能感兴趣的:(widget 之 Today Extension)