又是好久没有写东西了,前几天去面试问到关于App Extension的问题,以前没做过,就和大家一起学习下吧,一般常用的是Today和Share,这里就先看看这两个吧.由于关于这方面的介绍网上已经有很多资料了,但没有demo,我自己写了个demo,通过这个demo,相信很快就能将App Extension用到自己的项目中。
Today
先看效果图(系统:iOS 10, demo主要有三个功能,分别是视图的折叠收缩、页面跳转和数据共享):
下面来说说实现过程
视图的折叠收缩
创建一个Extension我就不说了,UI我是通过storyboard来做的,所以不用做修改,若是用代码布局需要修改Info.plist文件.
需要说明的几行代码:
[self.extensionContext widgetMaximumSizeForDisplayMode:NCWidgetDisplayModeCompact];
这行代码是指当today视图折叠起来的最小Size(你所设置的尺寸要比这个大)。
self.extensionContext.widgetLargestAvailableDisplayMode = NCWidgetDisplayModeExpanded;
设置成可以折叠的模式
页面跳转
页面跳转就是用通过URL Schemes来打开App,并通过URL传过来的参数跳转到指定的页面,具体做法:
- 在项目的Info.plist文件中添加URL types字段
-
设置填写URL Schemes和URL identifier如下图:
- AppDelegate.m文件中添加
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
这个方法,并在方法内实现跳转到App后执行的代码 - 在
TodayViewController.m
文件中使用[self.extensionContext openURL:url completionHandler:nil];
方法打开App,url就是前面填写的URL Schemes
数据共享
数据共享有两种方法,这里只说demo中用到的UserDefault
-
打开主程序和Extension的App Group,并设置Group名称,如下图
- 通过
[[NSUserDefaults alloc] initWithSuiteName:@"group.steven.app"];
来创建NSUserDefaults,并通过KVC来进行数据存储和读取即可。
到这里,关于Today的demo就完成了。。。
Share
先看效果图(系统:iOS 10, demo主要有两个功能,分别是分享的字数限制、数据提取和数据共享,这里只做了Safari的分享):
字数限制(demo限制为66个字)
- (BOOL)isContentValid {
// Do validation of contentText and/or NSExtensionContext attachments here
NSInteger maxLength = 66;
NSInteger length = self.contentText.length;
self.charactersRemaining = @(maxLength - length);
if (self.charactersRemaining.integerValue > 0) {
return YES;
}else {
return NO;
}
}
数据提取
dispatch_sync(dispatch_get_global_queue(0, 0), ^{
NSUserDefaults *userDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.steven.app"];
[userDefaults setObject:self.contentText forKey:@"shareText"];
NSExtensionItem * item = self.extensionContext.inputItems.firstObject;
NSItemProvider * provider =item.attachments.firstObject;
[provider loadPreviewImageWithOptions:nil completionHandler:^(id<NSSecureCoding> _Nullable item, NSError * _Null_unspecified error) {
NSData * data = UIImagePNGRepresentation((UIImage *)item);
[userDefaults setObject:data forKey:@"shareImage"];
}];
NSString * dataType = provider.registeredTypeIdentifiers.firstObject;
[provider loadItemForTypeIdentifier:dataType options:nil completionHandler:^(id<NSSecureCoding> _Nullable item, NSError * _Null_unspecified error) {
NSString * url = [NSString stringWithFormat:@"%@",item];
[userDefaults setObject:url forKey:@"shareURL"];
}];
[userDefaults synchronize];
});
关于数据共享是和Today是一样的,这里就不再重复了,demo点击下载,欢迎大家Star.