iOS Today Extension/widget编程小记

从iOS8开始,下拉的”今天”里,应用可以添加自己的小widget,就是下图这样的东西:
iOS Today Extension/widget编程小记_第1张图片

这个东西在Android里叫widget,不过在iOS中我们叫它Today Extension,因为它是iOS中众多种类的extensions中的一种。

Extensions有很多种,Today Extension之外,还有包括Share、Action、Photo Editing、Document Provider、Custom Keyboard、Watch App这些;其中一些很熟悉,像Watch App,另外一些可能不太熟悉;今天主要来研究Today Extension。

首先,如何创建一个Today Extension呢?很简单,在已有的项目里,在Xcode里,选择File-New-Target-Application Extension-Today Extension,新建一个target,如下图所示。

这样,一个Today Extension就建好啦。Run一下(就是那个new name,一个空的Today Extension):

是的,创建一个Today Extension就是这么简单。对于开发者来说,一个Today Extension其实就是一个有点儿特殊的UIViewController;我们可以向这个View Controller中添加subviews,执行任务,等等。不过在开发的过程中,还有一些常见的问题:

  • 怎么跳转到主App?

对于Today Extension来讲,主App的官方名称叫Containing App;widget并没有什么特殊的方式跟Containing App交互,只能跟其它App一样,调用URL Scheme来跳转到Containing App中,执行一些特定操作:

[self.extensionContext openURL:[NSURL URLWithString:@"test://yes"] completionHandler:^(BOOL success) {
        NSLog(@"open succeed");
    }];
  • 如何确定Today Extension的高度和宽度?

对于Today Extension来说,它的宽度是不能变的,就是屏幕的宽度;而它的高度可以根据内容动态变化。苹果推荐我们使用auto layout,这样Today Extension的高度就可以自适应变化;如果不用auto layout的话,还可以调用

self.preferredContentSize = CGSizeMake(0,100);

来将其高度定为100;

  • 如何定时/下拉时刷新?

定时刷新很简单,用NSTimer就可以,只是要注意dealloc的时候,将NSTimer销毁;

对于下拉刷新,我们就要先搞清楚,下拉的时候,都调用了哪些方法。刚才讲了,Today Extension其实就是一个View Controller,因此它的生命周期,也是viewDidLoad-viewWillAppear-viewDidAppear-viewWillDisappear-viewDidDisappear-dealloc这个路子。也就是说,每次下拉展示Today Extension的时候,都会将这个流程走一遍,所以我们只要在viewDidLoad里调用最新结果就可以了。

  • 如何修改Icon旁边的名字?
    默认的名字都是Containing App的Bundle Name,不过我们可以修改这个名字,方法:在Info.plist里,修改Bundle display name。

苹果对Today Extension的建议:苹果认为,Today Extension就是一个执行简单操作、界面也简单的地方,不应当有复杂的界面、复杂的操作。因此最好不要在这里搞的很复杂,否则可能会在提交审核的时候被拒掉。

一些需要注意的地方:

  • Today Widget是不支持键盘输入的,所以诸如UITextField、UITextView之类的控件不应当放进来。

  • 一般情况下,要避免使用UIScrollView,因为Today View本身就是一个scroll view,这样的话会让用户困惑,在操作的时候容易误操作。

Today Extension不是正常的App,因此有一些限制:

  • 不能使用UIApplication这个类;

  • 不能使用某些标记了NS_EXTENSION_UNAVAILABLE的API,以及一些诸如Health Kit、Event Kit的framework;

  • 不能获取相机、麦克风;

  • 不能长时间运行background tasks;

  • 不能通过AirDrop得到数据,但可以向AirDrop发送数据;

以上就是关于Today Extension的普通问题,还有一些高端的情况,比如增加view时刷新高度、确定extension在特定情况下出现/特定情况下消失,等等情况,还有待进一步研究。

你可能感兴趣的:(ios,extension,widget)