2015-10-24

iOS の UILocalNotification でユーザーに指示を出す

iOS 9.1/Swift で定期的に音とバイブを鳴らすコードを書いた移動中の人間にスマートフォンから音声とバイブで〇〇せよという指示を与えられるかを確認することが目的だ

NSTimer を使って、定期的に関数を呼び出し、その関数の中で AVAudioPlayer オブジェクトの play() メソッドと、AudioServicesPlayAlertSound(SystemSoundID(kSystemSoundID_Vibrate)) を呼び出すコードを書いた。アプリがフォアグラウンドにあるときは、定期的に音もバイブも鳴るのだけれど、バックグラウンドに入ると音もバイブも鳴らない。

iOS アプリの開発経験のある斧さん仮名によると用途次第だが音はともかくバイブを制御できることを期待するなタイマーもだるいから諦めろ」ということだった

今回はあくまで実験なので、UILocalNotification をいくつも作って、スケジューリングすることにする。

さて、ポケットにスマートフォンを入れて、移動してみたところ、バイブが鳴ってることは分かるが、仮に振動パターンを作ったとしても、判別できなさそうだ。

一方、ボリュームを大きくしていると、胸ポケットに入れてても、尻ポケットに入れてても、音声による指示は聞こえる。

// Permission
UIApplication.sharedApplication().registerUserNotificationSettings(UIUserNotificationSettings(forTypes: [.Sound, .Alert], categories: nil))

// Setup local notifications
let COUNT = 5
Let INTERVAL = 60

for i in 0 ..< COUNT {
    let notification = UILocalNotification()
    notification.alertBody = alert
    notification.timeZone = NSTimeZone.defaultTimeZone()
    notification.fireDate = NSDate(timeIntervalSinceNow: Double(i+1) * INTERVAL)
    notification.soundName = "foo.m4a"
    UIApplication.sharedApplication().scheduleLocalNotification(notification)