从 NSData 为 localNotification 设置自定义声音

Posted

技术标签:

【中文标题】从 NSData 为 localNotification 设置自定义声音【英文标题】:Set a custom sound for localNotification from NSData 【发布时间】:2014-09-04 07:43:19 【问题描述】:

我需要将声音传递给 localNotification。我知道它的局限性和所需的格式。 但是添加它的方法只是从文件名中获取它。 UILocalNotification 只有一个属性 soundName,它只通过 name 上的 应用程序包

当我以 blob 格式保存声音并将其返回到 NSData 时,我设置了一个 SQLite 数据库。我需要设置我拥有的这个声音,并将其作为 NSData 格式的 localNotification 的参数。

这是我设置 localNotification 的方式

UILocalNotification *localNotification = [[UILocalNotification alloc] init];

NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.dateFormat = @"HH-mm";
NSDate* date = [dateFormatter dateFromString:[dateFormatter stringFromDate:timeToSetOff.date]];

localNotification.soundName = @"";  //Here is the line where I am having issues

[localNotification setFireDate:date];
[[UIApplication sharedApplication] scheduleLocalNotification:localNotification];

以前有没有人处理过这个问题,或者实现过这个算法?

【问题讨论】:

这是不可能的,只能播放 App Bundle 中的声音。如果声音不在 App Bundle 中,则无法播放声音。 @rckoenes(我将它用于警报应用程序)在前台我可以使用 AVAudioPlayer initWithContents 来完成,但是当我设置 localNotification 声音时出现问题,我需要名称。 @EridBardhaj 你只想播放声音? soundName 属性只接受应用程序包中声音的文件名。因此,当您的应用程序在前台运行时,您将能够使用AVplayer 或其他方式播放声音。您不能使用soundName 来存储名称。将声音另存为 blob 会更难,只需将文件保存在文档目录中,并在 SQLite 数据库中保存该文件的路径即可。然后je在通知的userInfo中传递声音文件的路径。 @rckoenes 感谢您的解释,真是个好主意。如果您将此作为答案发布,那么这绝对应该是公认的答案。 【参考方案1】:

收到通知时触发此方法

-(void) playSound 
NSString *soundPath = [[NSBundle mainBundle] pathForResource:@"soundfile" ofType:@"caf"];
SystemSoundID soundID;
AudioservicesCreateSystemSoundID((__bridge CFURLRef)[NSURL fileURLWithPath: soundPath], &soundID);
AudioServicesPlaySystemSound (soundID);   

【讨论】:

我知道如何在前台播放声音,但我需要 UILocalNotification 的声音,以便在我们进入后台或非活动状态时也可以播放【参考方案2】:

soundName 属性仅接受应用程序包中声音的文件名。因此,当您的应用程序在前台运行时,您将能够使用 AVplayer 或其他东西播放声音。您不能使用 soundName 来存储名称。将声音另存为 blob 会更难,只需将文件保存在文档目录中,并在 SQLite 数据库中保存该文件的路径即可。

然后你将路径传递到UILocalNotificationuserInfo 中的声音文件。

【讨论】:

以上是关于从 NSData 为 localNotification 设置自定义声音的主要内容,如果未能解决你的问题,请参考以下文章

从 NSData 的 NSMutableArray 转换为 NSString 的 NSMutableArray?

从 Parse 将 PFFile 转换为 NSData

直接从 AFNetworking 获取 NSData,而不是让它转换为 UIImage

从 NSData 为 localNotification 设置自定义声音

将 NSData 从 NSURLSession 转换为 JSON

iOS 5 - ALAssets 库 - 将视频的 URL 从资产转换为 NSDATA 文件