一、背景
最近工作不是特别繁琐,所以空闲时间给自己充充电,提升技术的同时对自己的写东西和表达能力也会有所加强。WWDC2016 对于我等屌丝来说也只能远观之,所以在介绍 Today Widget 之前先来简单聊聊WWDC的 xcode8 ios10。
二、xcode8 ios10
xcode
1.View Debugging 可以帮助我们查找内存问题
2.自动匹配证书描述文件这块做了很大的改进
3.兼容了swift3的改进,swift3改变很大(学习中)
...
ios10
1.SiriKit
2.User Notifications
3.iMessage Apps
...
三、Extension
2014年ios8发布以来对于扩展(Extension)一直在更新,现在到ios10也增加了很多不同扩展。苹果也是在慢慢对开发者放开权限,下面就来介绍一个Today Widget
四、Today Widget
ios10 对Today Widget做了一些功能更新,更新如下
- 锁屏下拉通知栏左滑可以看到我们的Widget,在Widget的右上角有一个“展开”、“折叠”的功能
- 在支持3D Touch的苹果手机上,长按可以弹出折叠后的Widget
废话少说下面开始我们的工作
环境: xcode8 iOS10 swift
步骤一:创建Today Widget
-
在我们已有的工程里面创建(demo:在文章的最下面有github连接 SwiftTodayWidget) File->New->Target->Today Widget
Today Widget.png
步骤二:创建支持数据共享的App Groups
- 在我们的开发者账号中找到App Groups创建id:group.com.tyjy.SwiftTodayWidget
groups.png
步骤三:创建应用
- 主应用:com.tyjy.SwiftTodayWidget
- 扩展:com.tyjy.SwiftTodayWidget.SwiftTodayWidgetExt
重要:主应用和扩展相当于两个独立的应用,发布到AppStore要用两个不同的Bundle Identifier、两个不同的描述文件

步骤四:打开App Groups
- 在主程序和扩展中都得打开App Groups,同事勾选步骤二创建的group.com.tyjy.SwiftTodayWidget

步骤五:共享数据
- 主程序写入数据
let userDef = UserDefaults.init(suiteName: "group.com.tyjy.SwiftTodayWidget");
userDef!.set(self.txtNumber.text, forKey: "numberValue");
userDef?.synchronize();
self.lbNumber.text = self.txtNumber.text!;
- 扩展显示
//获取共享值
let userDef = UserDefaults.init(suiteName: "group.com.tyjy.SwiftTodayWidget");
self.lbNumber.text = String(userDef!.value(forKey: "numberValue")!);
userDef?.synchronize();
步骤六:展开、折叠功能
@IBOutlet weak var lbNumber: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
//设置展开与收缩
self.extensionContext?.widgetLargestAvailableDisplayMode = NCWidgetDisplayMode.expanded;
self.preferredContentSize = CGSize(width: UIScreen.main.bounds.width, height: 100);
//获取共享值
let userDef = UserDefaults.init(suiteName: "group.com.tyjy.SwiftTodayWidget");
self.lbNumber.text = String(userDef!.value(forKey: "numberValue")!);
userDef?.synchronize();
}
func widgetActiveDisplayModeDidChange(_ activeDisplayMode: NCWidgetDisplayMode, withMaximumSize maxSize: CGSize) {
if activeDisplayMode == NCWidgetDisplayMode.compact {
self.preferredContentSize = CGSize(width: UIScreen.main.bounds.width, height: 100);
}else{
self.preferredContentSize = CGSize(width: UIScreen.main.bounds.width, height: 200);
}
}
步骤七:扩展唤醒主程序
扩展可以唤醒到主程序的不同页面,在唤醒过程中扩展可以传值到主程序,这里就不介绍了,主要是在主程序plist里面添加如下:

总结:
1.如果在共享数据扩展没有及时更新的时候,我们手动关掉扩展再打开就解决了
2.证书这块xcode8可以自动为我们创建很多东西,不用我们手动创建了,重复:发布到AppStore必须是不同的bundle id 和描述文件
3.demo源码:https://github.com/wudanfeng/SwiftTodayWidget.git
4.为了方便demo的图片、名字和证书都用的公司的一个项目

