Swift,Objective-Cプログラミング ~ iOS ~

Objective-C,Swift,Apple Watchなどのプログラミング

【iOS Swift入門 #295】アプリ起動中(フォアグラウンド)でも通知(ローカル・リモート)を表示する

この記事を読んでわかること

  • アプリ起動中に通知(ローカル・リモート)を表示する方法

はじめに

  • iOS10以前はアプリがフォアグラウンドの時に通知を受信しても、通知は表示されない
  • iOS10からフォアグラウンドでも通知が表示できるようになった
  • ただし、通知に関するソースを変更する必要がある

方法

iOS10からUserNotificationsフレームワークが追加されました。
このフレームワークのUNUserNotificationCenterDelegateの実装が必要です。

具体的には
userNotificationCenter(_:willPresent:withCompletionHandler:)
実行時にcompletionHandlerを実行する際に、引数を指定します。

func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
    // アプリ起動中でもアラート&音で通知
    completionHandler([.alert, .sound])
}

サンプル

ボタンが一つだけある画面です。
ボタンをタップすると5秒後に通知を受信します。 f:id:fjswkun:20170311121023p:plain

ボタンタップ後、アプリをフォアグラウンドにしたまま待ちます。
通知が表示されます。
f:id:fjswkun:20170311121140p:plain

サンプルのソースは下記URLから取得できます。
SamplePushInForeground.zip - Google ドライブ

AppDelegate

import UIKit
import UserNotifications

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        
        // 通知許可の取得
        UNUserNotificationCenter.current().requestAuthorization(
        options: [.alert, .sound, .badge]){
            (granted, _) in
            if granted{
                UNUserNotificationCenter.current().delegate = self
            }
        }
        
        return true
    }
}

extension AppDelegate:UNUserNotificationCenterDelegate{
    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        // アプリ起動中でもアラート&音で通知
        completionHandler([.alert, .sound])
    }
    
    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
        completionHandler()
    }
}

ViewController

import UIKit
import UserNotifications

class ViewController: UIViewController {
    
    @IBAction func tapButton(_ sender: UIButton) {
        let contents = UNMutableNotificationContent()
        contents.title = "Hello!!!"
        contents.subtitle = "Bye!!!"
        contents.body = "Good night!!! \(Date().description(with: NSLocale.system))"
        
        let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 5, repeats: false)
        let identifier = NSUUID().uuidString
        let request = UNNotificationRequest(identifier: identifier, content: contents, trigger: trigger)
        UNUserNotificationCenter.current().add(request){
            error in
            print(error?.localizedDescription)
        }
    }
}

Swift

入門書籍

絶対に挫折しない iPhoneアプリ開発「超」入門 増補改訂第5版
プログラミングが初めて!という人が小さなアプリを作ることで、アプリ開発を学ぶことができます。
「Swiftだけでなく、プログラミング自体が初めてなんだけど、どの本が良い?」と聞かれたときには、
この書籍をおすすめしています。

本気ではじめるiPhoneアプリ作り Xcode 8.x+Swift 3.x対応 (ヤフー黒帯シリーズ)
アプリ開発からApp Storeへの公開までの一通りを学ぶことができます。
入門書を2冊、3冊を読んだあとでこの書籍を読むとかなりの実力アップを感じることができます。

ただし、一通り学ぶことができますが、プログラミング初めてでこの書籍を選ぶことはオススメできません。
最初の方の内容はプログラミング初心者には理解が難しく、そこで勉強をやめてしまう可能性がありそうだと感じます。

Swiftポケットリファレンス
辞書として1冊は持ってても良い。

仕事でやれるレベルになるために

初心者から仕事でやれるレベルになるためにオススメできる日本語書籍がみつかりませんでした。
英語は苦手でも、書籍に書かれているソースはやさしく、読み進めることができます。

The iOS Apprentice (英語サイト・英語書籍)
Swift Apprentice (英語サイト・英語書籍)

平均的プログラマーを超えるために

詳解Swift 第3版
Swift3の書籍。第1版、第2版にもお世話になっています。
Swiftの文法についてとても詳しく書いてあります。

Ray Wenderlich | Tutorials for iPhone / iOS Developers and Gamers
QiitaのSwiftに関する記事