2

私は間違っていると思っていますが、それは不可能だと思います。ローカルおよびプッシュ通知プログラミングガイドの「カスタムアラートサウンドの準備」の下に、「サウンドファイルはクライアントアプリケーションのメインバンドルに含まれている必要があります」と記載されています。

メインバンドルに書き込めない場合、ユーザーが生成した録音(たとえば、AVAudioRecorderを使用)をアラートサウンドとして再生するにはどうすればよいですか?

一方では不可能に思えますが、他方ではそれを実行するアプリがあると思います(そして私はそれらを探します)。

4

1 に答える 1

8

システム サウンド ファイルを ~/Library/Sounds ディレクトリにコピーし、notification.caf という名前を付けて、これを解決しました。サーバー アラート ペイロードは、これを再生するサウンドの名前として指定します。ユーザーが別のサウンドを選択するたびに、そのサウンドが同じフォルダーにコピーされ、古いサウンドが上書きされます。

ペイロード:

{
"aps": {
    "sound": "notification.caf"
}

}

// get the list of system sounds, there are other sounds in folders beside /New
let soundPath = "/System/Library/Audio/UISounds/New"
func getSoundList() -> [String] {
    var result:[String] = []
    let fileManager = NSFileManager.defaultManager()
    let enumerator:NSDirectoryEnumerator = fileManager.enumeratorAtPath(soundPath)!
    for url in enumerator.allObjects {
        let string = url as! String
        let newString = string.stringByReplacingOccurrencesOfString(".caf", withString: "", options: NSStringCompareOptions.LiteralSearch, range: nil)
        result.append(newString)
    }
    return result
}

// copy sound file to /Library/Sounds directory, it will be auto detect and played when a push notification arrive
class func copyFileToDirectory(fromPath:String, fileName:String) {
    let fileManager = NSFileManager.defaultManager()

    do {
        let libraryDir = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.LibraryDirectory, NSSearchPathDomainMask.UserDomainMask, true)
        let directoryPath = "\(libraryDir.first!)/Sounds"
        try fileManager.createDirectoryAtPath(directoryPath, withIntermediateDirectories: true, attributes: nil)

        let systemSoundPath = "\(fromPath)/\(fileName)"
        let notificationSoundPath = "\(directoryPath)/notification.caf"

        let fileExist = fileManager.fileExistsAtPath(notificationSoundPath)
        if (fileExist) {
            try fileManager.removeItemAtPath(notificationSoundPath)
        }
        try fileManager.copyItemAtPath(systemSoundPath, toPath: notificationSoundPath)
    }
    catch let error as NSError {
        print("Error: \(error)")
    }
}

ただし、プッシュ通知の音にはバグがある可能性があります。通知ごとに音が確実に再生されるようにするには、電話を再起動する必要があります。

于 2016-02-25T10:01:38.053 に答える