Today Extension
iOS 8から通知センターに Today Extension(ウィジェット)を設置できるようになりました。
実装は必須ではありませんが、ここでは、最新のお知らせタイトルを表示する方法についてご紹介します。
Extensionの作成
File > New > Target > iOS > Application Extension から、Today Extension を選択し、Extension を作成します。

App Groupの作成
アプリ本体と Today Extension でデータを共有するためには、App Group を作成することが必要です。
- ブラウザから iOS Dev Center にログインし、App Groups から App Group を作成します。

- App IDs から iPhone アプリを選択し、App Groups を有効化します。プロビジョニングプロファイルは再作成してください。

- iOS Dev Center において、Today ExtensionのApp ID を作成します。(Xcode によって自動的に作られている場合もあります。)
- ここからは Xcode 上の作業となります。
iPhone アプリと Today Extension の TARGETS において、それぞれ Capabilities から App Groups を有効化します。

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")
}