2015年11月3日火曜日

通知センターに通知を表示する

メールを受信した時や、スケジューラの予定時刻が来た時などにお知らせを出すiOSの通知センターに、アプリから通知を表示する方法。

AppDelegate.swiftにあるapplication()関数に以下のようなコードを書く。

    //AppDelegate.swiftの起動時に呼ばれる関数
    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        //現在の通知を削除
        UIApplication.sharedApplication().cancelAllLocalNotifications();
        
        //通知登録前のおまじない
        //これがないとpermissionエラーが発生する
        application.registerUserNotificationSettings(UIUserNotificationSettings(forTypes:
            [UIUserNotificationType.Sound,
            UIUserNotificationType.Alert,
            UIUserNotificationType.Badge],
            categories: nil))
        
        //通知の設定
        let notification:UILocalNotification = UILocalNotification()
        notification.fireDate = NSDate(timeIntervalSinceNow: 10)
        notification.timeZone = NSTimeZone.defaultTimeZone()
        notification.alertBody = "10秒たちました"
        notification.alertAction = "はい"
        notification.soundName = UILocalNotificationDefaultSoundName
        
        //通知登録
        UIApplication.sharedApplication().scheduleLocalNotification(notification)

        return true

    }

通知の設定以下〜return trueの前までは、べつにAppDelegate内に書かなくてもいいので、普通のViewController.swiftなどのしかるべきところに書いてもいい。
「アプリを切り替えてアクティブじゃなくなったら10秒後に通知」とかもできる。
上記のコードでは音を鳴らすようにしているが、soundNameをコメントアウトすれば鳴らない。

通知のダイアログ(iOSの個々の設定次第で出方が変わる)をタップすると、勝手に自分のアプリをアクティブにしてくれる。

通知をタップした時の処理

単にアプリをアクティブにしたのではなく、「通知をタップしてアクティブになった時」に処理をする場合は以下の関数で。
引数notification.alertActionで、上で設定したalertAction(はい)が取り出せる。
(使用不推奨のUIAlertViewを使ってるのはAppDelegate.swift内ではUIAlertControllerだとうまくいかなかったから。ま、気にすんな)

    //LocalNotificationがタップされた時に実行される
    func application(application: UIApplication, didReceiveLocalNotification notification: UILocalNotification) {
        let alert = UIAlertView();
        alert.title = "受け取りました";
        alert.message = notification.alertBody;
        alert.addButtonWithTitle(notification.alertAction!);
        alert.show();
    }

0 件のコメント:

コメントを投稿