ios 应用扩展—— Today Extension

1 分钟阅读

截图1

转载请注明出处:http://mkapple.cn/2016/06/20/TodayExtension

今日面板

      今日面板属于一个应用的扩展,但是该扩展跟该应用是两个独立的程序。OK,来做一个任务列表(ToDoList)来熟悉 Today Extension 的开发吧。

1. 创建一个任务列表:

截图2
一个基本的 tableView ,具有点击右上角添加新元素、左滑 tableViewCell 删除元素的,so easy。

2. 创建 Today Extension 扩展

截图3

截图4
下一步,命名,完成。

会弹出这样一个框:
截图5
选择激活(Activate)

修改运行时执行的主应用
截图6

在 Run 一项里选择运行时执行的主应用:
截图7
勾上 Debug executable
截图8

修改在今日面板显示的标题:
截图9

运行扩展看看:
截图10

3. 在扩展中创建 tableView

截图11
如同平常一样,塞一个 tableView 到 sb 里面,接着注意了,在扩展想要修改显示的视图大小需要在 viewControll 里设置 preferredContentSize 属性:

self.preferredContentSize = CGSizeMake(0, todoList.count * 44-1);

4. 扩展使用主应用的共享数据

由于扩展和主应用是相互独立的程序,所以需要主应用共享出数据给扩展使用,使用App Group来解决问题。
TARGETS ——> 主应用 ——> Capabilities ——> App Group
点击开启
截图12
输入:group.BundleID

主应用同步数据到 group

- (void)updateTodoSnapshot
{
    NSUserDefaults *infoDic = [[NSUserDefaults alloc] initWithSuiteName: GROUP_ID];
    [infoDic setObject:todoList forKey:TODO_LIST_ID];
    [infoDic synchronize];
    
    //更新今日面板信息,NotificationCenter framework
    [[NCWidgetController widgetController] setHasContent:YES forWidgetWithBundleIdentifier:@"com.donlinks.MKTodyExtension.MKTodayTarget"];
}

当 group 数据更新了,扩展会调用 NCWidgetProviding 协议,实现该协议的两个方法

- (void)widgetPerformUpdateWithCompletionHandler:(void (^)(NCUpdateResult))completionHandler {
    [self loadContents];
    completionHandler(NCUpdateResultNewData);
}

- (UIEdgeInsets)widgetMarginInsetsForProposedMarginInsets:(UIEdgeInsets)defaultMarginInsets{
    return UIEdgeInsetsMake(0, 27, 0, 0);
}

第一个方法是系统通知扩展要更新时,扩展调用的方法;第二个方法返回一个内补大小,如果不实现,默认情况视图左侧会有一定的缩进。

扩展获取同步数据

NSUserDefaults *infoDic = [[NSUserDefaults alloc] initWithSuiteName: GROUP_ID];
todoList = [infoDic objectForKey: TODO_LIST_ID];

OK, 演示一遍:
截图13

5. 扩展调起主应用

首先,给主应用注册一个 URL Scheme 截图14

点击今日面板时打开主应用

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    
    NSString *text = todoList[indexPath.row];
    if([text isEqualToString:@"添加ToDo"]){
        text = @"new_item";
    }else{
        NSUserDefaults *infoDic = [[NSUserDefaults alloc] initWithSuiteName: GROUP_ID];
        NSArray *array = [infoDic objectForKey: TODO_LIST_ID];
        
        text = [NSString stringWithFormat:@"%@", @([array indexOfObject:text])];
    }
    
    NSString *urlStr = [@"MKToday://" stringByAppendingString: text];
    
    //打开主应用
    [self.extensionContext openURL:[NSURL URLWithString:urlStr] completionHandler:nil];
}

演示:
截图15

OK, 打完收工,Demo在此:MKTodyExtension

参考链接:
苹果官方文档
App Extension编程指南

P.S. 喜欢就分享或者点个赞呗

更新: