zoukankan      html  css  js  c++  java
  • iOS扩展Extension之Today

    1、简介

      扩展(Extension)是iOS 8中引入的一个新特性。扩展让app之间的数据交互成为可能。在iOS 8系统之前,每一个app在物理上都是彼此独立的,app之间不能互访彼此的私有数据。而在引入扩展之后,其他app可以与扩展进行数据交换。iOS 8系统有6个支持扩展的系统区域,分别是Today、Share、Action、Photo Editing、Storage Provider、Custom keyboard。支持扩展的系统区域也被称为扩展点。本文只简单记录Today的使用!

    2、Today扩展的创建

      方法一:通过路径File -->New -->Target创建!

      方法二:直接点击项目-->点击 + 即可!

    2、Today简介和方法说明

      Today扩展的一种,虽然依附在App中,但是它是单独的个体,所使用的文件、资源、第三方等,都需要单独设置!

      Today创建之后,其实就是一个ViewController!最小高度为110pt。有三方协议方法:

    // iOS10 新增的方法
    // 用来设置Widget是展开还是折叠状态的方法,可以设置相关的preferredContentSizes属性修改大小
    - (void)widgetActiveDisplayModeDidChange:(NCWidgetDisplayMode)activeDisplayMode withMaximumSize:(CGSize)maxSize{
        if (activeDisplayMode == NCWidgetDisplayModeCompact) {
            NSLog(@"叠起状态下的默认size:%@", NSStringFromCGSize(maxSize));
        } else {
            NSLog(@"展开状态下的默认size:%@", NSStringFromCGSize(maxSize));
        }    
    }
    
    // 该方法是用来告知Widget控制器是否需要更新的一个协议方法 
    - (void)widgetPerformUpdateWithCompletionHandler:(void (^)(NCUpdateResult))completionHandler {
        // Perform any setup necessary in order to update the view.
        
        // If an error is encountered, use NCUpdateResultFailed
        // If there's no update required, use NCUpdateResultNoData
        // If there's an update, use NCUpdateResultNewData
    
        completionHandler(NCUpdateResultNewData);
    //    typedef NS_ENUM(NSUInteger, NCUpdateResult) {
    //        NCUpdateResultNewData,
    //        NCUpdateResultNoData,
    //        NCUpdateResultFailed
    //    } NS_ENUM_AVAILABLE_IOS(8_0);
    }
    
    // iOS10 版本之后将不会再被唤起
    // 用来设置Widget控制器边框间距的方法,如果出现偏差,可以调整此方法的返回值进行操作
    - (UIEdgeInsets)widgetMarginInsetsForProposedMarginInsets:(UIEdgeInsets)defaultMarginInsets NS_DEPRECATED_IOS(8_0, 10_0, "This method will not be called on widgets linked against iOS versions 10.0 and later.");

      2.1 通过Storyboard加载和编码加载两种选择:

        通过修改plist文件storyboard

        编码加载设置:

      2.2 Today的展开和折叠:

        第一步:设置 widgetLargestAvailableDisplayMode属性;

        self.extensionContext.widgetLargestAvailableDisplayMode = NCWidgetDisplayModeExpanded;

        第二步:实现协议方法;

    // iOS10 新增的方法
    // 用来设置Widget是展开还是折叠状态的方法,可以设置相关的preferredContentSizes属性修改大小
    - (void)widgetActiveDisplayModeDidChange:(NCWidgetDisplayMode)activeDisplayMode withMaximumSize:(CGSize)maxSize{
        if (activeDisplayMode == NCWidgetDisplayModeCompact) {
            NSLog(@"叠起状态下的默认size:%@", NSStringFromCGSize(maxSize));
        } else {
            NSLog(@"展开状态下的默认size:%@", NSStringFromCGSize(maxSize));
        }    
    }

      

    3、共享数据

      通过扩展点进行数据的共享,真机测试需要在开发者网站注册一个App Groups。模拟器亲测可以免费使用(App Groups的测试group.com.xxx.TextToday),后面是Bundle Identifier。

      3.1 开发者网站注册一个App Groups

      3.2 证书使用自动签名部署,设置项目和Today的target中添加APPGroups选项

      3.3 项目中储存数据,在Today中获取数据

        通过[[NSUserDefaults alloc] initWithSuiteName:@"groupName"]这个格式去创建NSUserDefaults对象,groupName填写当前设置AppGroups勾选的名字。

    - (void)savaDataWithArray:(NSArray *)dataArray {
        NSData  *data = [NSKeyedArchiver archivedDataWithRootObject:dataArray];
        NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.ForeverGuard.TextToday"];
        [defaults setObject:data forKey:@"todayModel"];
        [defaults synchronize];
    }

        获取数据:注意数据存储需要符合格则NSCoding协议、可储存的类型、自定义转Data存储等。

    - (void)readData {
        NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.ForeverGuard.TextToday"];
        NSData *dataArray = [defaults objectForKey:@"todayModel"];
        self.dataArr = [NSKeyedUnarchiver unarchiveObjectWithData:dataArray];    
    }

      通过在Today界面加载一个TableView,效果如图:

      注意Today和项目共同使用的Model和资源需要设置Target选项:

    4、点击Today跳转到APP

      4.1 设置APP的URL Schemes

      4.2 在Today中的跳转代码:

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
        [tableView deselectRowAtIndexPath:indexPath animated:YES];
        [self.extensionContext openURL:[NSURL URLWithString:[NSString stringWithFormat:@"TextToday://todayModel=%@",@"123"]] completionHandler:nil];
    }

      效果图:

      

  • 相关阅读:
    Java可变参数
    为什么static方法中不可以调用非static方法
    用注解@DelcareParents实现引用增强
    在SpringBoot中用SpringAOP实现日志记录功能
    梳理一下我理解的aop
    包裹iframe的div与iframe存在高度差的问题解决方案
    非跨域情况下iframe 高度自适应的问题解决(一)
    flex布局较之float布局的优点新发现
    webpack4 动态导入文件 dynamic-import 报错的解决方法
    vue chrome 浏览器调试工具devtools插件安装
  • 原文地址:https://www.cnblogs.com/xianfeng-zhang/p/8269226.html
Copyright © 2011-2022 走看看