non-main bundle file as alert sound

后端 未结 1 871
无人及你
无人及你 2020-12-11 10:10

I\'m hoping I\'m wrong but I don\'t think it\'s possible. In the Local and Push Notification Programming Guide, under \"Preparing Custom Alert Sounds\" it says that \"The s

相关标签:
1条回答
  • 2020-12-11 10:49

    I solved this by copying a system sound file to ~/Library/Sounds directory and name it as notification.caf. The server alert payload specify this as the name of the sound to be played. Whenever the user selects another sound, that sound will be copied to the same folder and overwrites the old sound.

    Payload:

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

    The push notification sound can be buggy though, I have to reboot my phone before the sound will play reliably for every notification.

    0 讨论(0)
提交回复
热议问题