iOS音效提示音(AudioServices)

最近做的項(xiàng)目里剛好用到提示音,所以就把自己寫了個(gè)簡單的 demo 跟大家分享一下:
demo GitHub地址
兩種提示方式:
1.調(diào)用系統(tǒng)的提示音:這種方式很簡單,直接指定soundID,即可
-- [系統(tǒng)提示音soundID 官方說明:點(diǎn)擊這里可以查看soundID]
(http://iphonedevwiki.net/index.php/AudioServices)
soundID范圍:1000 to 2000,比如,1007就是蘋果默認(rèn)的三全音提示,其他的大家可以自己意義試聽(哈哈,太多了)
--AudioServicesPlaySystemSound(soundID) **
2.使用自定義的提示音(時(shí)間必須小于30秒. caf 文件)
-- 這種方式需要讀取工程里的音頻文件(.caf)格式的,然后添加到系統(tǒng)提示音里面,得到 soundID ,然后調(diào)用
AudioServicesPlaySystemSound(soundID) **即可

具體實(shí)現(xiàn):本 demo 提供最常見了三中方式:
1.聲音提示(我覺得這個(gè)應(yīng)該是用的最多了吧,誰也不愿意每次收到微信消息都振動(dòng)吧,??)AudioServicesPlaySystemSound(soundID) **
2.振動(dòng)提示(靜音狀態(tài))
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate)**
3.聲音加振動(dòng)(感覺很少用到哈)** AudioServicesPlayAlertSound(soundID)**

iOS系統(tǒng)提供了AudioToolbox.framework 框架,需要導(dǎo)入<AudioToolbox/AudioToolbox.h>頭文件.

注意:

這個(gè)庫是伴隨系統(tǒng)聲音設(shè)置的(也就是說,如果系統(tǒng)為靜音或者是振動(dòng),提示也就是振動(dòng)或者沒有提示)

廢話不多說了,具體直接上代碼

調(diào)用方法:

   
        AudioOnly = 1,  // 聲音提示
        VibrateOnly,    // 振動(dòng)提示
        AudioAndVibrate // 聲音&振動(dòng)
  
   AudioServicesManager *manager = [AudioServicesManager sharedManager];
    // 設(shè)置提示類型
    manager.audioServicesType = AudioOnly;
    // 觸發(fā)提示
    [manager play];

AudioServicesManager.h文件

//
//  AudioServicesManager.h
//  音效播放
//
//  Created by lihaohao on 2017/5/12.
//  Copyright ? 2017年 lihaohao. All rights reserved.
//

#import <Foundation/Foundation.h>
typedef NS_ENUM(NSInteger){
    AudioOnly = 1,  // 聲音提示
    VibrateOnly,    // 振動(dòng)提示
    AudioAndVibrate // 聲音&振動(dòng)
}AudioServicesType;
@interface AudioServicesManager : NSObject
@property (nonatomic ,assign) AudioServicesType audioServicesType;
+ (instancetype)sharedManager;
- (void)play;
@end

AudioServicesManager.m文件

//
//  AudioServicesManager.m
//  音效播放
//
//  Created by lihaohao on 2017/5/12.
//  Copyright ? 2017年 lihaohao. All rights reserved.
//

#import "AudioServicesManager.h"
#import <AudioToolbox/AudioToolbox.h>
NSString *const kFileUrl = @"sound.caf";
@interface AudioServicesManager()
@property (nonatomic ,assign) SystemSoundID soundID;
@end
@implementation AudioServicesManager
+ (instancetype)sharedManager{
    static AudioServicesManager *manager = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        manager = [[AudioServicesManager alloc]init];
    });
    return manager;
}
- (instancetype)init{
    self = [super init];
    if (self) {
        NSString *audioFile=[[NSBundle mainBundle] pathForResource:kFileUrl ofType:nil];
        NSURL *fileUrl=[NSURL fileURLWithPath:audioFile];
        AudioServicesCreateSystemSoundID((__bridge CFURLRef)(fileUrl), &_soundID);
    }
    return self;
}
#pragma mark -
#pragma mark - play
-(void)play{
    NSLog(@"%d",_soundID);
    switch (_audioServicesType) {
        case AudioOnly:
            [self audioOnly];
            break;
        case VibrateOnly:
            [self vibrateOnly];
            break;
        case AudioAndVibrate:
            [self audioAndVibrate];
            break;
            
        default:
            break;
    }
}
- (void)audioOnly{
#if __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_9_0
    AudioServicesPlaySystemSound(_soundID);
#else
    AudioServicesPlaySystemSoundWithCompletion(_soundID, nil);
#endif
}
- (void)vibrateOnly{
#if __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_9_0
    AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
#else
    AudioServicesPlaySystemSoundWithCompletion(kSystemSoundID_Vibrate, nil);
#endif
}
- (void)audioAndVibrate{
#if __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_9_0
    AudioServicesPlayAlertSound(_soundID);
#else
    AudioServicesPlayAlertSoundWithCompletion(_soundID,nil);
#endif
}

#pragma mark -
#pragma mark - dealloc
- (void)dealloc{
    AudioServicesRemoveSystemSoundCompletion(_soundID);
    AudioServicesDisposeSystemSoundID(_soundID);
}
@end

尾巴:

測試發(fā)現(xiàn)在調(diào)用系統(tǒng)的三全音的時(shí)候,在 iOS 10.3.1下,只要設(shè)置聲音就會有振動(dòng),不管調(diào)用AudioServicesPlayAlertSound,還是AudioServicesPlaySystemSound在系統(tǒng)設(shè)置為聲音加振動(dòng)的情況下,由于我們需要單獨(dú)控制聲音和振動(dòng),用自己定義的聲音文件就可以單獨(dú)控制聲音和振動(dòng)提醒.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末淘捡,一起剝皮案震驚了整個(gè)濱河市腻豌,隨后出現(xiàn)的幾起案子荸哟,更是在濱河造成了極大的恐慌响牛,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件查蓉,死亡現(xiàn)場離奇詭異乌询,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)豌研,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進(jìn)店門妹田,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人鹃共,你說我怎么就攤上這事鬼佣。” “怎么了霜浴?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵晶衷,是天一觀的道長。 經(jīng)常有香客問我阴孟,道長晌纫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任永丝,我火速辦了婚禮锹漱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘慕嚷。我一直安慰自己哥牍,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布闯冷。 她就那樣靜靜地躺著砂心,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蛇耀。 梳的紋絲不亂的頭發(fā)上辩诞,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天,我揣著相機(jī)與錄音纺涤,去河邊找鬼译暂。 笑死,一個(gè)胖子當(dāng)著我的面吹牛撩炊,可吹牛的內(nèi)容都是我干的外永。 我是一名探鬼主播,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼拧咳,長吁一口氣:“原來是場噩夢啊……” “哼伯顶!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤祭衩,失蹤者是張志新(化名)和其女友劉穎灶体,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體掐暮,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蝎抽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了路克。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片樟结。...
    茶點(diǎn)故事閱讀 39,722評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖精算,靈堂內(nèi)的尸體忽然破棺而出瓢宦,到底是詐尸還是另有隱情,我是刑警寧澤殖妇,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布刁笙,位于F島的核電站破花,受9級特大地震影響谦趣,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜座每,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一前鹅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧峭梳,春花似錦舰绘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至孵运,卻和暖如春秦陋,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背治笨。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工驳概, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人旷赖。 一個(gè)月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓顺又,卻偏偏與公主長得像,于是被迫代替她去往敵國和親等孵。 傳聞我的和親對象是個(gè)殘疾皇子稚照,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評論 2 353

推薦閱讀更多精彩內(nèi)容