美文网首页iOS精品文章
iOS Extension Today Widget 开发

iOS Extension Today Widget 开发

作者: iOS104 | 来源:发表于2017-03-07 21:15 被阅读211次

    由于项目中要用到,最近研究了下Today Widget 开发

    1.什么是Extension?

    扩展 (Extension) 是 iOS 8 和 OSX 10.10 加入的一个非常大的功能点,开发者可以通过系统提供给我们的扩展接入点 (Extension point) 来为系统特定的服务提供某些附加的功能。

    • extension并不是一个独立的app,它有一个包含在app bundle中的独立bundle,extension的bundle后缀名是.appex;需要依赖于containning app。
    • 调试主App则运行主App;调试扩展则运行扩展
    • 扩展App想要使用的图片资源等,需要引入到扩展文件夹下
    • 创建一个Extension之前,需要有一个承载扩展的应用,称为containing app,然后在Containing app中通过Xcode->File->new->target->选择所需的Extension创建。
    • Extension 不能单独存在和发布,随containing app 的安装而安装,随containing app的发布而发布,一个containing app 可以添加多个Extension。
    • Extension 的运行是独立的,containing app 在没有启动的状态下,Extension仍然可以被启动和运行。

    2、Extension 生命周期详解

    Extension 不是一个app,所以生命周期和运行环境和app不同。在多数情况下,extension是由用户在某一个app的界面或者某一个活动的控制器中启动,这个启动extension的app被称为host app。Host app 提供extension运行所需的上下文并通过发送一个request的方式开启extension的生命周期,extension在完成host app请求的任务后结束运行

    Paste_Image.png

    3、UI样式

    • 背景:尽量不要使用背景,默认的毛玻璃效果很好,主要文字颜色最好是白色,次要文字的颜色最好是 lightTextColor
    • 不要在今日面板里使用可以滚动的 Scroll View,而是要完全展开
    • 缩进:尽量保持默认的缩进,即左边会空几个像素。如果想改变默认缩进,在TodayViewController里面实现以下方法

    4、与主App进行交互

    • Today跳转App(唤起App,调用App某项功能)
      [UIApplication sharedApplication]在扩展App中是无法访问的,需要通过NSExtensionContext来调用主App的openURL方法

    5、与主App共享数据

    • 利用group,将主App和扩展App做一个数据共享空间(NSUserDefault),先在主App的Targets中创建并设置,再在扩展App的Targets设置(如图)。
    • 可以和containing app 公用保持在本地登录的session和登录状态,然后去拉取最新的today需要展示的数据
    Paste_Image.png

    主App存扩展App所需要数据

    NSUserDefaults *userDefault = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.myApp"];
    [userDefault setBool:YES forKey:@"isLogin"];
    

    扩展App取所需要数据

    NSUserDefaults *myDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.myApp"];
    BOOL isLogin = [myDefaults objectForKey:@"isLogin"];
    

    6、iOS10 的适配- 展开、折叠按钮

    在NSExtensionContext中,新添了widgetLargestAvailableDisplayMode属性,来确认当前widget是展开还是折叠状态。所以,先在viewWillAppear中设置widget的mode为展开。

    -(void)widgetActiveDisplayModeDidChange:(NCWidgetDisplayMode)activeDisplayMode withMaximumSize:(CGSize)maxSize {    
      if (activeDisplayMode == NCWidgetDisplayModeCompact) {
        self.preferredContentSize = CGSizeMake([UIScreen mainScreen].bounds.size.width, 110);    
        // 处理~~    
      } else {        
        self.preferredContentSize = CGSizeMake([UIScreen mainScreen].bounds.size.width, 300);     
        // 处理~~    
      }
    }
    

    7、数据获取问题

    如果不是静态页面,就需要去服务端拉取最新的数据然后展示出来,如果像头条的today就需要每次展示的时候去服务端拉取最新的新闻信息展示出来,包括和containing app数据保持同步。感觉挺鸡肋的。

    相关文章

      网友评论

        本文标题: iOS Extension Today Widget 开发

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