ios开发小技巧之提示音播放与震动
在ios开发中,有时候我们需要频繁播放某种提示声音,比如微博刷新提示音、QQ消息提示音等,对于这些短小且需要频繁播放的音频,最好将其加入到系统声音(system sound)里。
注意:
- 需要播放的音频文件不能超过30秒
- 必须是IMA/ADPCM格式[in linear PCM or IMA4(IMA/ADPCM) format]
- 必须是.caf .aif .wav文件
1、自定义系统声音
// 要播放的音频文件地址
NSString *urlPath = [[NSBundle mainBundle] pathForResource:@"end_refreshing" ofType:@"wav"]; NSURL *url = [NSURL fileURLWithPath:urlPath]; // 声明需要播放的音频文件ID[unsigned long]
SystemSoundID ID; // 创建系统声音,同时返回一个ID
AudioServicesCreateSystemSoundID((__bridge CFURLRef)(url), &ID);
2、根据自定义系统声音时传入的ID,播放自定义系统声音
// 根据ID播放自定义系统声音
AudioServicesPlaySystemSound(ID);
3、有时候我们需要在完成播放的时候做一些事情,比如继续播放下一个音频或者提示用户,或者决定以后都不再使用该音频ID了,可以在下面的函数中移除该音频ID
// 播放完成后执行的操作
/*
*参数说明:
* 1、刚刚播放完成自定义系统声音的ID
* 2、回调函数(playFinished)执行的run Loop,NULL表示main run loop
* 3、回调函数执行所在run loop的模式,NULL表示默认的run loop mode
* 4、需要回调的函数
* 5、传入的参数, 此参数会被传入回调函数里
*/
AudioServicesAddSystemSoundCompletion(ID, NULL, NULL, &playFinished, (__bridge void *)(self));
}
@implementation与@interface外部自定义一个函数,然后传入这个函数名的地址
void playFinished(SystemSoundID ssID, void* clientData)
{
unsigned long ID = ssID; // ssID 不能直接作为参数打印出来,需要中转一次 NSLog(@"播放完成-传入ID为-%lu,传入的参数为%@", ID, clientData); // 移除完成后执行的函数
AudioServicesRemoveSystemSoundCompletion(ID); // 根据ID释放自定义系统声音
AudioServicesDisposeSystemSoundID(ID);
}
这样就可以实现播放完成后调用预先定义好的函数playfinished(),继续做一些你希望的事情,但是别忘了,ARC中C语言函数需要自己管理内存,所以这里,我们需要回调完成后移除刚刚添加的操作 ,并且确认当你以后不再需要播放该ID的音频时,清理该ID音频对应的所有资源
4、完成以上步骤就可以进行简单的通过自定义系统声音来播放简单且频繁的音频文件了。
注意:
1 > 必须等到播放完成才能清理该ID对应的所有资源,也就是说,如果我们打算不再使用该音频,可以在完成后调用的函数(playFinished)里清理资源,如上例所示。 不过一般情况下,既然加到系统声音里的多是频繁使用的,可以在程序结束或者某个控制器销毁的时候再清理。
2 > 如果在AudioServicesPlaySystemSound(ID)之后马上调用AudioServicesDisposeSystemSoundID(ID),你将听不到任何声音,并且也不会调用播放完成后的函数, 这是因为,系统音频播放的所有操作都是放到主线程之外执行的,当主线程执行到清理的时候,该音频如果试图播放ID对应的音频,将无法找到。
5、哦,还有震动~ 一句话
// 播放系统预定义的音效,kSystemSoundID_Vibrate代表震动,如果有其它需求可以点进头文件里去找相应的提示音类型
AudioServicesPlayAlertSound(kSystemSoundID_Vibrate);
以上内容纯属个人理解,如有不当之处欢迎留言。
ios开发小技巧之提示音播放与震动的更多相关文章
- iOS开发小技巧 - UILabel添加中划线
iOS开发小技巧 遇到的问题: 给Label添加中划线,然后并没有效果 NSString *str = [NSString stringWithFormat:@"合计金额 ¥%.2f&quo ...
- iOS开发小技巧 - runtime适配字体
iOS开发小技巧 - runtime适配字体 版权声明:本文为博主原创文章,未经博主允许不得转载,有问题可联系博主Email: liuyongjiesail@icloud.com 一个iOS开发项目无 ...
- 【转】IOS开发小技巧
1,Search Bar 怎样去掉背景的颜色(storyboard里只能设置background颜色,可是发现clear Color无法使用). 其实在代码里还是可以设置的,那就是删除背景view [ ...
- iOS开发小技巧 -- tableView-section圆角边框解决方案
[iOS开发]tableView-section圆角边框解决方案 tableView圆角边框解决方案 iOS 7之前,图下圆角边框很容易设置 iOS 7之后,tableviewcell的风格不再是圆角 ...
- iOS开发小技巧--即时通讯项目:消息发送框(UITextView)高度的变化; 以及UITextView光标复位的小技巧
1.即时通讯项目中输入框(UITextView)跟随输入文字的增多,高度变化的实现 最主要的方法就是监听UITextView的文字变化的方法- (void)textViewDidChange:(UIT ...
- iOS开发小技巧--利用苹果官方API播放视频(方法已经过时,了解一下)
- iOS开发小技巧--iOS程序进入后台运行的实现
iOS程序进入后台运行的实现 视频中看到老师用的iOS7,代码中有开启timer,无限请求数据的功能,但是切换到后台,代码就不打印了 自己用的iOS9,进入后台还是可以打印的,再次进入前台也可以正常运 ...
- iOS开发小技巧
1. 解析详情页(是webView)遇到的3个问题: 1.图片太大,超出屏幕范围 2.怎么在webView上面添加一行文字 3.文字太小 1.解决方法 webView.scalesPageToFit ...
- iOS开发小技巧--字典和数组的中文输出
一.在解析json数据的时候,得到的集合对象或者数组对象在用%@打印的时候回出现类似乱码的情况.如图: 在iOS中打印字典或者数组对象,系统会默认调用字典对象和数组对象的descriptionWith ...
随机推荐
- 网络HTTP、JSON、XML解析等 复习
一.一个HTTP请求的基本要素1.请求URL:客户端通过哪个路径找到服务器 2.请求参数:客户端发送给服务器的数据* 比如登录时需要发送的用户名和密码 3.返回结果:服务器返回给客户端的数据* 一般是 ...
- cicm0804吊起
CICS调用方法:cicslterm -r RGCIPS /////////////// CECI LINK P(CICM0804) COMM(F0000000000000000000006) --- ...
- SQL2008、SQL2013 执行Transact-SQL 语句或者批处理时发生了异常。错误5120
附加数据库的时候遇到问题,问题描述如下: 附加数据库 对于 服务器"服务器名"失败.(Microsoft.SqlServer.Smo) 执行Transact-SQL 语句或者批处理 ...
- activiti系列导读
此用于管理activiti系列标签文章,activiti的分析是建立在目前最新的版本5.21之上. 官方指导手册链接:http://www.activiti.org/userguide/index.h ...
- exynos 4412 电源管理芯片PMIC 的配置及使用方法
/** ****************************************************************************** * @author Maox ...
- Android 技术用于汇总
id 名词 含义 详细 1 Android CTS CTS 全称 Compatibility Test Suite 兼容性测试工具 当产品开发出来以后,并定制了自己的 Android 系统后 ...
- 使用mysql关键字做类字段名报的错,花了我一个钟,坑啊
com.modelsystem.po.ProjectPlan@701faaedHibernate: insert into ld.project_plan (addTime, describe, ex ...
- How to changes to Table & EDT Relations[AX2012]
Well I hope everyone is having a fine week so far. Oh Wednesdays, the furthermost point between two ...
- python初试牛刀
需求:在L7的一台机器上做nginx配置,然后代码分发到别的所有的机器上.由于目录中有很多配置文件,而且防止误操作,需要修改配置之前先备份原配置.然后需要在运行修改配置的脚本之前,先弹出界面,告知操作 ...
- Error LNK2005 从敌人到朋友
本人在写学生信息管理系统时遇到一个很头疼的错误——error LNK2005重复定义错误,苦思冥想百度谷歌bing之后都没能解决问题,于一清早刹那间觉得知道问题出在哪儿了,于是乎起床.开机.修改代码一 ...