前言

    iOS extension的出现,方便了用户查看应用的服务,比如用户可以在Today的widgets中查看应用的简略信息,然后点击进入相关的应用界面。
暂且不表网络上现有的widget文章,本篇文章主要说明本人具体实现widget的步骤,希望能够帮助到需要实现widget的同行朋友。

图1 Today的widget展示----以支付宝为例说明

文章将依次从以下几个问题着手,进行详细说明:
1、如何为现有的工程添加widget;
2、如何绘制UI;
3、如何调起app;
4、如何与host app共享数据。

添加Today Extension

图2 添加today的target

   如图,为现有的工程添加Today Extension,命名这里不赘述了,大家都懂的。

图3 添加today之后的工程目录

    这是添加Today Extension之后的工程目录。
    到这里,为现有的工程添加Today Extension算是完成了,运行程序就可以看到类似图1的简单的效果了,很简单哈。

绘制UI

    与网上发表文章的童鞋们一样,我也是个代码控(装B一下),习惯用纯代码来绘制Today的UI。

图4 删除默认创建的MainInterface并修改Info.plist

    这里,删除默认创建的MainInterface.storyboard,并按图4所示修改Info.plist文件。(当然,习惯使用storyboard的童鞋可以略过,直接操作storyboard即可)

图5 设置widget展示视图的大小

    首先,设置widget展示视图的大小。关于widget的背景色,以及具体展示的内容大家按需绘制,这里暂且不表。

图6 设置widget视图距离左侧边界距离为0

    运行程序后,会发现一个问题:绘制的内容与左侧边界有一定距离(约30px)。如何解决这个问题呢,如图6所示,TodayViewController遵守的NCWidgetProviding协议给出了解决方案。

调起app

    因为extension和containing app是两个完全独立的进程,所以它们之间不能直接通信(不能像应用内部点击按钮,跳转到指定页面)。为了实现widget调起app,这里通过openURL的方式来启动containing app。

- (void)openURLContainingAPP{
//通过extensionContext借助host app调起app
[self.extensionContext openURL:[NSURL URLWithString:@"appextension://xxx"] completionHandler:^(BOOL success) { NSLog(@"open url result:%d",success); }];
}

数据共享

图7 添加App Groups

    通过App Groups提供的同一group内app共同读写区域,可以用NSUserDefaults和NSFileManager两种方式实现extension和containing app之间的数据共享。

1 通过NSUserDefaults共享数据
保存数据
- (void)saveDataByNSUserDefaults{ NSUserDefaults *shared = [[NSUserDefaults alloc] initWithSuiteName:@"group.c om.xxx"]; [shared setObject:@"asdfasdf" forKey:@"widget"]; [shared synchronize];
}
读取数据
- (NSString *)readDataFromNSUserDefaults{ NSUserDefaults *shared = [[NSUserDefaults alloc] initWithSuiteName:@"group.c om.xxx"]; NSString *value = [shared valueForKey:@"widget"]; return value;
}
2 通过NSFileManager共享数据
保存数据
- (BOOL)saveDataByNSFileManager{ NSError *err = nil; NSURL *containerURL = [[NSFileManager defaultManager] containerURLForSecuri tyApplicationGroupIdentifier:@"group.com.xxx"]; containerURL = [containerURL URLByAppendingPathComponent:@"Library/Caches/ widget"]; NSString *value = @"asdfasdfasf"; BOOL result = [value writeToURL:containerURL atomically:YES encoding:NSUTF8StringEncoding error:&err]; if (!result) { NSLog(@"%@",err); } else { NSLog(@"save value:%@ success.",value); } return result;
}
读取数据
- (NSString *)readDataByNSFileManager{ NSError *err = nil; NSURL *containerURL = [[NSFileManager defaultManager] containerURLForSecuri tyApplicationGroupIdentifier:@"group.com.xxx"]; containerURL = [containerURL URLByAppendingPathComponent:@"Library/Caches/ widget"]; NSString *value = [NSString stringWithContentsOfURL:containerURL encoding: NSUTF8StringEncoding error:&err]; return value;
}

    到这里,在Today中添加应用的widget就完成了。

最新文章

  1. Dump中查看DataTime时间方法
  2. 无法删除对象 '产品',因为该对象正由一个 FOREIGN KEY 约束引用。
  3. 【C#】Json数据 排版算法
  4. json 特殊字符 javascript 特殊字符处理(转载)
  5. 【架构】docker环境搭建mysql主从
  6. 【转载自W3CPLUS】如何将页脚固定在页面底部
  7. 怎样减少FLASH影片文件过大——绝对好用
  8. window下安装composer和laravel
  9. 今天刚申请成为Uber司机 已经接了5单了....大家有什么想问的吗?
  10. Codeforces 484B Maximum Value(高效+二分)
  11. 敏捷开发(六)- SCRUM全员会议
  12. LeetCode 965. Univalued Binary Tree
  13. logistics回归简单应用(二)
  14. Codeforces Round #200 (Div. 1) D. Water Tree 树链剖分+线段树
  15. python-循环与判断练习题
  16. 编写Spark的WordCount程序并提交到集群运行[含scala和java两个版本]
  17. hibernate在Oracle中插入数据,默认字段被设置为null的问题解决
  18. Python3 列表List(十一)
  19. [ThinkPHP] 比较标签 neq&nheq 与 PHP 中的 != 与 !== 出现的问题
  20. ballerina 学习十四 values && types

热门文章

  1. 监控节点 xml写入数据库 存储过程
  2. 2017年10月30日 vs初级教学
  3. 多线程TCP的socket通信
  4. Cocos2d-js 开发记录:声音播放
  5. Maven学习篇一:依赖了解
  6. javascript对HTML字符转义与反转义
  7. python memory-management
  8. python 多线程效果演示
  9. matlab练习程序(Arnold图像置乱)
  10. 新发布 | Azure镜像市场正式上线