UILocalNotification
はiOS10で非推奨になっているため、UNUserNotificationフレームワークを使用してローカル通知フローを更新しました。
アプリがフォアグラウンドにある場合、アプリはAVPlayerを使用したカスタムサウンドを再生し、正常に動作します。ただし、ローカル通知がトリガーされたときのbackgroundモードでは、カスタムサウンドの代わりに、デフォルトの通知サウンドが再生されます。
ただし、iOS9では問題なく動作していました。「didReceiveLocalNotification」メソッドアプリを使用すると、バックグラウンドモードでもカスタムサウンドを再生できます。
更新1:
ローカル通知を次のように設定しています。
let content = UNMutableNotificationContent()
content.title = NSString.localizedUserNotificationStringForKey("reminder!", arguments: nil)
content.body = NSString.localizedUserNotificationStringForKey("Reminder body.", arguments: nil)
if let audioUrl == nil {
content.sound = UNNotificationSound.defaultSound()
} else {
let alertSound = NSURL(fileURLWithPath: self.selectedAudioFilePath)
content.sound = UNNotificationSound(named: alertSound.lastPathComponent!)
}
content.userInfo = infoDic as [NSObject : AnyObject]
content.badge = 1
let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 60, repeats: false)
let identifier = "Reminder-\(date)"
let request = UNNotificationRequest(identifier: identifier, content: content, trigger: trigger)
let center = UNUserNotificationCenter.currentNotificationCenter()
center.addNotificationRequest(request, withCompletionHandler: { (error) in
if error != nil {
print("local notification created successfully.")
}
})
私はすでに多くのSO質問を通過しましたが、解決策が得られませんでした。
どんな助けでも大歓迎です!
alertSound
に正しいファイルパスがないため、content.sound
何も設定しません。記録したファイルをドキュメントディレクトリに保存していましたが、実際のデバイスのファイルパスの取得がシミュレータとは異なります。
プロジェクトバンドルに配置されたサウンドファイルを設定することはトリックをしました
content.sound = UNNotificationSound(named: "out.caf")
Swift 4.2およびXcode10.1
ローカル通知でサウンドを再生する場合
let content = UNMutableNotificationContent()
content.title = "Notification Tutorial"
content.subtitle = "from ioscreator.com"
content.body = " Notification triggered"
//Default sound
content.sound = UNNotificationSound.default
//Play custom sound
content.sound = UNNotificationSound.init(named:UNNotificationSoundName(rawValue: "123.mp3"))
カスタムサウンドでUserNotifications
フレームワークを使用して通知を作成する方法は次のとおりです。
notification
がUNNotificationContent
であり、バンドルに含まれるカスタムメディアファイルの名前がa.mp4の場合は、次のコードを使用してください。
notification.sound = UNNotificationSound(named: "a.mp4")
したがって、didRecieveLocalNotification
を使用する必要はありません。
という事は承知しています
let notificationContent = UNMutableNotificationContent()
...
notificationContent.sound = UNNotificationSound(named: "out.mp3")
正常に動作していますが、:
1)サウンドファイルは30秒を超えてはなりません(これは問題ないと思います)
2)サウンドファイルはBundle.mailファイルの一部である必要があります。それが他の場所に保存されている場合、バックグラウンドで通知にアクセスすることはできません。フォアグラウンドで正常に動作します。 Appleは、私が知る限り、他のフォルダにアクセスするためのアクセス許可を提供しません。
3)サウンドフォーマットに制限があります。 Appleガイドを参照してください
4)Bundle.mainのサウンドファイルをプログラムで変更できるかどうかわかりません。例:Apple musicに保存され、ユーザーが選択した曲の30秒を抽出するルーチンを作成しました...情報が別のディレクトリに保存されている場合はすべて正常に機能しますが、フォアグラウンドでのみ...ロックまたはバックグラウンドでアクセスすることはできません。Bundle.main内のファイルを変更/上書きすることはできません。それが可能であれば、問題は解決されると思います...しかし、私は思いますこれはセキュリティの問題になります。上記が満たされている限り、アラートサウンドと音楽は正常に機能していると結論付けます。
let notificationContent1 = UNMutableNotificationContent()
notificationContent1.title = "Good morning! Would you like to listen to a morning meditation to start the day fresh ? Or maybe a cool relaxing soundscape? Open the app and browse our collection which is updated daily."
notificationContent1.subtitle = ""
notificationContent1.body = ""
notificationContent1.sound = UNNotificationSound(named: UNNotificationSoundName(rawValue: "AlarmSound.wav"))
var dateComponents1 = DateComponents()
dateComponents1.hour = 08
dateComponents1.minute = 00
let trigger1 = UNCalendarNotificationTrigger(dateMatching: dateComponents1, repeats: true)
let request1 = UNNotificationRequest(
identifier: UUID().uuidString,
content: notificationContent1,
trigger: trigger1
)
let notificationContent2 = UNMutableNotificationContent()
notificationContent2.title = "Good evening! Hope you had a great day. Would you like to meditate on a particular topic ? Or just some relaxing sleep sounds ? Open the app and pick what you want so you can go to sleep relaxed."
notificationContent2.subtitle = ""
notificationContent2.body = ""
notificationContent2.sound = UNNotificationSound(named: UNNotificationSoundName(rawValue: "AlarmSound.wav"))
var dateComponents2 = DateComponents()
dateComponents2.hour = 20
dateComponents2.minute = 00
let trigger2 = UNCalendarNotificationTrigger(dateMatching: dateComponents2, repeats: true)
let request2 = UNNotificationRequest(
identifier: UUID().uuidString,
content: notificationContent2,
trigger: trigger2
)
UNUserNotificationCenter.current().delegate = self
UNUserNotificationCenter.current().add(request1, withCompletionHandler: nil)
UNUserNotificationCenter.current().add(request2, withCompletionHandler: nil)
プッシュ通知パッケージには、バックグラウンドで再生するカスタムサウンドを含める必要があります。このサウンドもアプリケーションに含める必要があります。
たとえば、iOS用のPHPでカスタム通知パッケージを作成する方法は次のとおりです。通知オブジェクトにサウンドオブジェクトがあることに注意してください。
array("to" => $sDeviceID,
"data" => array($sMessageType => $sMessage,
"customtitle" => $sMessageTitle,
"custombody" => $sMessage,
"customimage" => "$mIcon") ,
"notification" => array("title" => "sMessageTitle",
"text" => $sMessage,
"icon" => "$mIcon",
"sound" => "mySound.mp3"));