美文网首页XcodeiOS学习IOS
iOS之Application Extension(Widget

iOS之Application Extension(Widget

作者: CrazySteven | 来源:发表于2016-10-24 02:35 被阅读502次

    又是好久没有写东西了,前几天去面试问到关于App Extension的问题,以前没做过,就和大家一起学习下吧,一般常用的是Today和Share,这里就先看看这两个吧.由于关于这方面的介绍网上已经有很多资料了,但没有demo,我自己写了个demo,通过这个demo,相信很快就能将App Extension用到自己的项目中。

    Today

    先看效果图(系统:iOS 10, demo主要有三个功能,分别是视图的折叠收缩、页面跳转和数据共享):


    today_test.gif

    下面来说说实现过程

    视图的折叠收缩

    创建一个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如下图:


      URL Schemes.png
    • 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名称,如下图


      App Group.png
    • 通过[[NSUserDefaults alloc] initWithSuiteName:@"group.steven.app"];来创建NSUserDefaults,并通过KVC来进行数据存储和读取即可。
      到这里,关于Today的demo就完成了。。。

    Share

    先看效果图(系统:iOS 10, demo主要有两个功能,分别是分享的字数限制、数据提取和数据共享,这里只做了Safari的分享):


    share_test.gif
    字数限制(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.

    版权声明:本文为 Crazy Steven 原创出品,欢迎转载,转载时请注明出处!

    相关文章

      网友评论

        本文标题:iOS之Application Extension(Widget

        本文链接:https://www.haomeiwen.com/subject/lcakuttx.html