ラベル 通知センター の投稿を表示しています。 すべての投稿を表示
ラベル 通知センター の投稿を表示しています。 すべての投稿を表示

2017年1月28日土曜日

別のクラスのイベントの通知を受ける

iOSは内部でいろんなイベントが起こってるわけだが、別のクラスで起こったイベントの通知を受けることができる。
それがNSNotificationCenter。


  • アプリが起動したら
  • アプリがバックグラウンドからアクティブになったら
  • 別のクラスでhogeというメソッドが実行されたら

などなど。

書き方は以下のように。

NotificationCenter.default.addObserver(
     self,
   selector:#selector(textChanged),
     name: NSNotification.Name.UITextViewTextDidChange,

     object: self)

上記はUITextViewクラスのTextDidChangeメソッド(delegateメソッドだな)が発生したら、textChangeメソッドを実行しろと設定している。


NotificationCenter.default.addObserver(self,
      selector: #selector(ViewController.forActive),
      name: NSNotification.Name.UIApplicationDidBecomeActive,
      object: nil)

上記はアプリがバックグラウンドからアクティブになり、UIApplicationクラスのDidBecomeActiveが発生したらforActiveメソッドを実行しろと設定している。

object:がselfだったりnilだったりするって?
よくわかんねぇんだよ、ここw
たぶん呼ばれるメソッドや関数に渡すための引数じゃないかと思う。自分で調べてー。


なお同じNotificationでも、一定時間後とかに通知センターにiPhoneやiPadにメッセージを表示させるのはUILocalNotification。

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();
    }