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