コンテンツにスキップ

Today Extension

iOS 8から通知センターに Today Extension(ウィジェット)を設置できるようになりました。

実装は必須ではありませんが、ここでは、最新のお知らせタイトルを表示する方法についてご紹介します。


Extensionの作成

File > New > Target > iOS > Application Extension から、Today Extension を選択し、Extension を作成します。

Extension


App Groupの作成

アプリ本体と Today Extension でデータを共有するためには、App Group を作成することが必要です。

  1. ブラウザから iOS Dev Center にログインし、App Groups から App Group を作成します。
    App Groups1
  2. App IDs から iPhone アプリを選択し、App Groups を有効化します。プロビジョニングプロファイルは再作成してください。
    App Groups2
  3. iOS Dev Center において、Today ExtensionのApp ID を作成します。(Xcode によって自動的に作られている場合もあります。)
  4. ここからは Xcode 上の作業となります。
    iPhone アプリと Today Extension の TARGETS において、それぞれ Capabilities から App Groups を有効化します。
    App Groups3

Today Extensionのコーディング

Extension を作成した際、Xcode のアプリプロジェクト上で、TodayViewController.h、TodayViewController.m、MainInterface.storyboard などが自動で生成されます。

MainInterface.storyboard において、最新のお知らせのタイトルと日付を表示するための UILabel を作成してください。

そして、TodayViewController.m の viewDidLoad 内に、以下を記述してください。

// 高さ変更
self.preferredContentSize = CGSize(width: 0, height: 100)

// 年月日ラベル用フォーマッタ
let formatter = DateFormatter()
let calendar = Calendar(identifier: .gregorian)
formatter.calendar = calendar
formatter.locale = NSLocale.system
formatter.timeZone = NSTimeZone.system
formatter.dateFormat = "yyyy/MM/dd"

// ラベルの更新
let ud = UserDefaults(suiteName: "App Group 名")
if ud != nil && ud?.object(forKey: "messageTitle") != nil {
    self.titleLabel.text = ud!.object(forKey: "messageTitle")
    self.timeLabel.text = formatter.string(from: ud!.object(forKey: "messageTime") as! Date)
} else {
    self.titleLabel.text = "お知らせはありません"
    self.timeLabel.text = ""
}

アプリ側のコーディング

AppDelegate.m において、お知らせを FANSHIP サーバーから取得した際にコールされる PopinfoReceiver デリゲートメソッドを実装します。

そのタイミングで、Today Extension とデータを共有できる領域に最新のお知らせを保存します。

func popinfoReceiver(_ popinfoReceiver: PopinfoReceiver, updateMessagesResult result: Bool) {
    // 通信に失敗した場合は return
    guard result else { return }

    // 最新のお知らせを取得する
    let myListVC = PopinfoListViewController(nibName: "PopinfoListViewController", bundle: Bundle.main)
    let messages = myListVC.retrieveAllPopinfoMessages()
    guard messages.count > 0 else { return }
    let latestMessage = messages[0]

    // Today Extension と連携するため、共有領域に最新のお知らせのタイトルと日時を保存する
    guard let ud = UserDefaults(suiteName: "App Group 名") else { return }
    ud.set(latestMessage.piTitle, forKey: "messageTitle")
    ud.set(latestMessage.piTime, forKey: "messageTime")
}