ios10 Extension Today Widget

一、背景

最近工作不是特别繁琐,所以空闲时间给自己充充电,提升技术的同时对自己的写东西和表达能力也会有所加强。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、两个不同的描述文件

创建两个应用.png
步骤四:打开App Groups
  • 在主程序和扩展中都得打开App Groups,同事勾选步骤二创建的group.com.tyjy.SwiftTodayWidget
打开groups.png
步骤五:共享数据
  • 主程序写入数据
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里面添加如下:


跳转.png

总结:

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

你可能感兴趣的:(ios10 Extension Today Widget)