App Extension today widget开发总结

今天空出来了,发现iOS8推出的today widget扩展蛮有意思的,像支付宝等应用都做了这个扩展,方便用户快速使用APP中的功能。今天研究了以下,期间走了不少弯路,参考了很多博客,但多少有点走不通顺。然后看了一篇英文博客后,豁然开朗,特做此文。

关于App Extension 和today widget的基础知识,这里就不介绍了,可以参考文章后面的博客。

1.设置在today widget中展示的尺寸

在TodayViewController的viewDidLoad方法中加入:

[self setPreferredContentSize:CGSizeMake(0, 100)];

2.扩展和主程序之间传递值

打开主程序Capabilities下的App Group功能,并新建一个App Groups,然后打开扩展程序的App Group功能并勾选刚才创建的App Groups。
在代码中使用

NSUserDefaults *groupDefaults = [[NSUserDefaults alloc]initWithSuiteName:@"groupName"];

来保存和获取数据。

3.在today widget中响应用户点击事件,并打开主app

先在主程序下配置好URL Schemes 比如“widgetAction”,然后在扩展中用以下方式调用:

NSExtensionContext *myExtension = [self extensionContext];
[myExtension openURL:[NSURL URLWithString:@"widgetAction://"] completionHandler:nil];

4.在主程序中响应扩展的调用事件

在主程序的 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法中可以通过launchOptions的UIApplicationLaunchOptionsURLKey拿到扩展中调用的url。但是这里只在APP每次启动的时候执行。
每次打开APP或者APP从后台到前台都会走以下方法,所以,应该在以下方法中处理:

//8.0  
-(BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
    NSLog(@"test ios8");
    UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"iOS8" 
                                                   message:url.absoluteString 
                                                   delegate:nil 
                                      cancelButtonTitle:@"OK"
                                      otherButtonTitles:nil, nil];
    [alert show];
    
    return YES;
}

//9.0  
-(BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary *)options
{
    NSLog(@"test ios9");
    UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"iOS9" 
                                                  message:url.absoluteString 
                                                  delegate:nil 
                                     cancelButtonTitle:@"OK" 
                                     otherButtonTitles:nil, nil];
    [alert show];
    
    return YES;
}

在这里可以根据不同的url来做出不同的动作。

5.关闭today widget中APP扩展的显示

有时候在没有数据的时候需要隐藏扩展,可以使用以下方法:

NCWidgetController *widgetController = [NCWidgetController widgetController];
[widgetController setHasContent:NO forWidgetWithBundleIdentifier:@"你扩展的标示"];

参考文章

A Tutorial on iOS 8 App Extensions(就是这篇博客,写得很详细。)
苹果官方AppCommunication文档
iOS开发之构建Widget
揭秘 iOS App Extension 开发 —— Today 篇

你可能感兴趣的:(App Extension today widget开发总结)