美文网首页iOS
iOS Widget 的基本使用

iOS Widget 的基本使用

作者: L小杰 | 来源:发表于2016-12-12 15:04 被阅读102次

    扩展如何运作、Extension和Containing App、host app之间的关系、Containing App与扩展共享数据、开启App Groups
    Containing App 包含widget的app
    host app 宿主app,对于today widget来说,host app就是today

    1.创建Extension
     点击“File”->”New”->”Target”
    创建出的TodayViewController同样需要配置一套配置文件,和之前的操作相同

    1.png
    2.widget里唤醒主程序,通过url schemes
    NSString *urlStr = @"xjwidgetapp://red"; NSURL *url = [NSURL URLWithString:urlStr]; [self.extensionContext openURL:url completionHandler:^(BOOL success) { }];
    3.在host app 宿主和today widget中开启app groups 这样才能进行数据交互。
    //存储 NSUserDefaults *shared = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.lxjfmdb.app"]; [shared setObject:@"orange" forKey:@"key"]; [shared synchronize];
    //读取 NSUserDefaults *shared = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.lxjfmdb.app"]; NSString *str = [shared objectForKey:@"key"]; NSLog(@"%@",str);
    4.widget生命周期

    如果用户是第一次下拉查看Widget其实就是执行整个ViewController生命周期调用过程。
    系统为了保证Widget上数据是及时更新的,默认会截取上次显示成功Widget的快照.这个快照会一直保存到新的数据或UI被更新才回被替换,那这就会带来一个问题,当你拖拽通知中心(Notification Center)下拉过于频繁时,Debug跟踪代码执行路径你会发现整个Widget生命周期执行过程和第一次下拉执行的路径发生了变化.
    第一次下拉执行路径是viewDidLoad->viewWillAppear,而如果下拉过于频繁你就会发现代码执行路径直接只会执行viewWillAppear方法,这个就是系统默认保存上次快照而导致的执行路径上变化.这对我们选择NSTimer更新时机以及后面会提到的Widget横竖屏处理都会有影响.

    在viewwillappear里调用数据请求和设置界面高度
    // 设置界面的高度

    -(void)viewWillAppear:(BOOL)animated{
        [super viewWillAppear:animated];
        self.extensionContext.widgetLargestAvailableDisplayMode =  NCWidgetDisplayModeExpanded;
        
        [self getBidInfo];
    }
    

    -(void)widgetActiveDisplayModeDidChange:(NCWidgetDisplayMode)activeDisplayMode 方法里设置高度

    -(void)widgetActiveDisplayModeDidChange:(NCWidgetDisplayMode)activeDisplayMode withMaximumSize:(CGSize)maxSize{
        if (activeDisplayMode == 0) {
            self.preferredContentSize = CGSizeMake([UIScreen mainScreen].bounds.size.width, 110 );///这里的110是苹果设置死的,应该不能改吧
        } else {
            self.preferredContentSize = CGSizeMake([UIScreen mainScreen].bounds.size.width, 110 * 4);//这里的总高度可以自己设置
        }
    }
    

    TodayViewController同样支持cocoapod,一样可以进行数据请求

    platform :ios, ‘8.0’
    target ‘TodayViewController’ do
        
    pod 'AFNetworking'
    
    pod 'MJExtension'
    end
    

    基本上widget就能接入成功了

    相关文章

      网友评论

        本文标题:iOS Widget 的基本使用

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