Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ラズパイ×iOSウィジェットでCO2濃度を可視化する👀

 ラズパイ×iOSウィジェットでCO2濃度を可視化する👀

第0回 個人開発者のオンラインLT会(https://k-dev.connpass.com/event/175072/
で話した資料です

Qiitaで書いた記事のToday Extension部分をちょっと詳しく書きました。
https://qiita.com/akeome/items/997d2f2bd9aea538857e

Avatar for Yuki Yamashita

Yuki Yamashita

May 16, 2020

Other Decks in Programming

Transcript

  1. 今日お話すること iOSウィジェットにCO2濃度を表示する 【Raspberry Pi × CO2-mini × co2meter】 - Qiita

    (https://qiita.com/akeome/items/997d2f2bd9aea538857e) ・Raspberry Pi のセットアップ ・Raspberry Pi をWebサーバーとして動かす ・iOSウィジェットに表示する
  2. 今日お話すること iOSウィジェットにCO2濃度を表示する 【Raspberry Pi × CO2-mini × co2meter】 - Qiita

    (https://qiita.com/akeome/items/997d2f2bd9aea538857e) ・Raspberry Pi のセットアップ ・Raspberry Pi をWebサーバーとして動かす ・iOSウィジェットに表示する この部分!
  3. ウィジェットと本体アプリの違いは… class TodayViewController: UIViewController, NCWidgetProviding { override func viewDidLoad() {

    super.viewDidLoad() } func widgetPerformUpdate(completionHandler: (@escaping (NCUpdateResult) -> Void)) { completionHandler(NCUpdateResult.newData) } }
  4. ウィジェットと本体アプリの違いは… class TodayViewController: UIViewController, NCWidgetProviding { override func viewDidLoad() {

    super.viewDidLoad() } func widgetPerformUpdate(completionHandler: (@escaping (NCUpdateResult) -> Void)) { completionHandler(NCUpdateResult.newData) } } なんやこれ なんやこれ
  5. NCWidget Providing // ウィジェットのサイズが変わったときに呼び出される func widgetActiveDisplayModeDidChange( NCWidgetDisplayMode, withMaximumSize: CGSize) //

    ウィジェットが表示される度に呼び出される func widgetPerformUpdate(completionHandler: (NCUpdateResult) -> Void) The interface for customizing the appearance and behavior of a Today widget. ウィジェット表示用のprotocol iOSで使えるメソッドは2つだけ
  6. func widgetPerform Update // 新規データあり -> 更新される completionHandler(NCUpdateResult.newData) // 新規データなし

    -> 更新されない completionHandler(NCUpdateResult.noData) // 失敗 -> 更新されない completionHandler(NCUpdateResult.failed) Called to give a widget an opportunity to update its contents. 表示の度に呼ばれるメソッド 更新するかどうかのenumを引数に渡して クロージャを実行する
  7. ウィジェットと本体アプリの違いは… class TodayViewController: UIViewController, NCWidgetProviding { override func viewDidLoad() {

    super.viewDidLoad() } func widgetPerformUpdate(completionHandler: (@escaping (NCUpdateResult) -> Void)) { completionHandler(NCUpdateResult.newData) } } なんやこれ なんやこれ
  8. ウィジェットと本体アプリの違いは… class TodayViewController: UIViewController, NCWidgetProviding { override func viewDidLoad() {

    super.viewDidLoad() } func widgetPerformUpdate(completionHandler: (@escaping (NCUpdateResult) -> Void)) { completionHandler(NCUpdateResult.newData) } } ウィジェットを表示したり更新したりするた めのprotocolです 表示の度に呼び出されるメソッドです 更新するかどうかのクロージャを実行します
  9. ウィジェット更新がわかったので // ウィジェットが表示される度に呼び出される func widgetPerformUpdate(completionHandler: (@escaping (NCUpdateResult) -> Void)) {

    // 通信処理 API.request(completion: { roomCondition in      // UI更新なのでメインスレッド DispatchQueue.main.async { self.temperatureLabel.text = roomCondition.temp self.co2Label.text = roomCondition.co2 // 新規データあり -> 更新される completionHandler(NCUpdateResult.newData) } }) }
  10. ウィジェット更新がわかったので // ウィジェットが表示される度に呼び出される func widgetPerformUpdate(completionHandler: (@escaping (NCUpdateResult) -> Void)) {

    // 通信処理 API.request(completion: { roomCondition in      // UI更新なのでメインスレッド DispatchQueue.main.async { self.temperatureLabel.text = roomCondition.temp self.co2Label.text = roomCondition.co2 // 新規データあり -> 更新される completionHandler(NCUpdateResult.newData) } }) } 1. ウィジェットが表示される度に呼び 出される処理の中で
  11. ウィジェット更新がわかったので // ウィジェットが表示される度に呼び出される func widgetPerformUpdate(completionHandler: (@escaping (NCUpdateResult) -> Void)) {

    // 通信処理 API.request(completion: { roomCondition in      // UI更新なのでメインスレッド DispatchQueue.main.async { self.temperatureLabel.text = roomCondition.temp self.co2Label.text = roomCondition.co2 // 新規データあり -> 更新される completionHandler(NCUpdateResult.newData) } }) } 2. 通信処理を行って
  12. ウィジェット更新がわかったので // ウィジェットが表示される度に呼び出される func widgetPerformUpdate(completionHandler: (@escaping (NCUpdateResult) -> Void)) {

    // 通信処理 API.request(completion: { roomCondition in      // UI更新なのでメインスレッド DispatchQueue.main.async { self.temperatureLabel.text = roomCondition.temp self.co2Label.text = roomCondition.co2 // 新規データあり -> 更新される completionHandler(NCUpdateResult.newData) } }) } 3. UIを更新して
  13. ウィジェット更新がわかったので // ウィジェットが表示される度に呼び出される func widgetPerformUpdate(completionHandler: (@escaping (NCUpdateResult) -> Void)) {

    // 通信処理 API.request(completion: { roomCondition in      // UI更新なのでメインスレッド DispatchQueue.main.async { self.temperatureLabel.text = roomCondition.temp self.co2Label.text = roomCondition.co2 // 新規データあり -> 更新される completionHandler(NCUpdateResult.newData) } }) } 4. completionHandler(NCUpda teResult.newData) を呼び出せばOK
  14. 本体アプリとデータを共有するには? // 値を設定する側 let userDefaults = UserDefaults(suiteName: "group.グループ名") userDefaults?.set(123, forKey:

    "test") // 値を取得する側 let userDefaults = UserDefaults(suiteName: "group.グループ名") print(userDefaults?.integer(forKey: "test")) // 123 UserDefaultsを使った例