解决iOS9通知栏消息无法清除的问题
我的手机安装了腾讯的自选股,有时候就发现消息通知栏的消息无法删除,特别是只剩下一条自选股的推送时。为此抓狂了好久。
但是你说取消消息推送又不是很合适。
今天试了一个方法,果然是管用的。设置->通知->开启按应用分组。
问题就解决了,希望接下来的iOS10系统可以解决这个问题。
我的手机安装了腾讯的自选股,有时候就发现消息通知栏的消息无法删除,特别是只剩下一条自选股的推送时。为此抓狂了好久。
但是你说取消消息推送又不是很合适。
今天试了一个方法,果然是管用的。设置->通知->开启按应用分组。
问题就解决了,希望接下来的iOS10系统可以解决这个问题。
cocoapods 是 iOS 上不错的包依赖管理软件,在前面的文章里衣服自己洗是有做简单的介绍。
苹果发布了Mac OS X 10.10 后,就安装了新系统和 XCode 6,然后顺便执行了 sudo gem update –system
然后噩梦就来了,这次要创建一个新的项目,写好 podfile 后,结果安装失败。然后网上一搜索,发现 OS X 10.10后有点问题,需要先卸载 cocoapods,然后再重新安装。各种细节和其它诸如Command Line Tools之类的就不展开说了。
安装倒是成功了,可是在执行 pod setup时,总是失败。提示 There was an error reading ‘/Users/mmcer/.cocoapods/repos/master/CocoaPods-version.yml ,然后给了一个官方的URL地址。
按照该地址访问 http://blog.cocoapods.org/Repairing-Our-Broken-Specs-Repository/,使用里面的方法删除本地文件夹
sudo rm -rf ~/.cocoapods/repo/master/
sudo setup
仍然失败,衣服自己洗以为是网络、CDN或者国家防火墙的问题,于是回家后又是各种环境,还是不行。网上是各种搜索,大家的解决方法和上面的几乎是一样的。
后来就闲逛github,在他们的 issue 里发现了居然别人也有相同的问题,并且自己摸索解决了。这里真是要汗颜下自己,没有一早想到这里不说,还懒的自己去摸索。
原因就是曾经的更新导致,具体就是 psych 这个组件,卸载然后安装一个低版本就可以了。github 里是用的2.0.0,但是我用了一个略高的版本发现也是可以的。
sudo gem uninstall psych
sudo gem install psych -v 2.0.0
帖子里还有个人是把所有的gem安装的软件都卸载了然后重装发现也可以解决问题,衣服自己洗觉得太麻烦就没有采用。
之后再重新执行 pod setup 和 pod install 都正常了。浪费了3天时间,对进度还是有很大影响的,不过这个是题外话了。
在某个周六的时候,我跑去听了一个淘宝举办的无线交流会,对于安全来说还是蛮有收获的。回来后在网上找相关资料,看到一个关于使用 keychain 来存储数据的方案,思路比较不错。
使用keychain,有2点好处。
1、数据相对使用NSUserDefaults,更安全一点。
2、可以用来进行应用间的数据共享。
下面给出通用类代码,首先是头文件
KeychainManager.h
#import <Foundation/Foundation.h>
@interface KeychainManager : NSObject
+ (void)save:(NSString *)key withValue:(id)value;
+ (id)get:(NSString *)key;
+ (void)deleteData;
@end
接下来,是具体的实现代码
KeychainManager.m
#import “KeychainManager.h”
@implementation KeychainManager
static NSString * const KEY_IN_KEYCHAIN = @”com.5danyuan.app”;
+ (void)save:(NSString *)key withValue:(id)value{
NSMutableDictionary *dic = [NSMutableDictionary dictionary];
[dic setObject:value forKey:key];
NSMutableDictionary *query = [NSMutableDictionary dictionaryWithObjectsAndKeys:
(__bridge_transfer id)kSecClassGenericPassword,
(__bridge_transfer id)kSecClass,
KEY_IN_KEYCHAIN,(__bridge_transfer id)kSecAttrService,
KEY_IN_KEYCHAIN,(__bridge_transfer id)kSecAttrAccount,
(__bridge_transfer id)kSecAttrAccessibleAfterFirstUnlock,
(__bridge_transfer id)kSecAttrAccessible,
nil];
//删除旧数据
SecItemDelete((__bridge_retained CFDictionaryRef)query);
[query setObject:[NSKeyedArchiver archivedDataWithRootObject:dic] forKey: (__bridge_transfer id)kSecValueData];
SecItemAdd((__bridge_retained CFDictionaryRef)query, NULL);
}
+ (id)get:(NSString *)key{
NSMutableDictionary *dic = nil;
NSMutableDictionary *query = [NSMutableDictionary dictionaryWithObjectsAndKeys:
(__bridge_transfer id)kSecClassGenericPassword,
(__bridge_transfer id)kSecClass,
KEY_IN_KEYCHAIN,(__bridge_transfer id)kSecAttrService,
KEY_IN_KEYCHAIN,(__bridge_transfer id)kSecAttrAccount,
(__bridge_transfer id)kSecAttrAccessibleAfterFirstUnlock,
(__bridge_transfer id)kSecAttrAccessible,
nil];
[query setObject: (id)kCFBooleanTrue forKey: (__bridge_transfer id)kSecReturnData];
[query setObject: (__bridge_transfer id)kSecMatchLimitOne forKey: (__bridge_transfer id)kSecMatchLimit];
CFDataRef keyData = NULL;
if (SecItemCopyMatching((__bridge_retained CFDictionaryRef)query, (CFTypeRef *)&keyData) == noErr) {
@try {
dic = (NSMutableDictionary *)[NSKeyedUnarchiver unarchiveObjectWithData: (__bridge_transfer NSData *)keyData];
}
@catch (NSException *exception) {
NSLog(@”Unarchive of %@ failed:%@”,KEY_IN_KEYCHAIN,exception);
}
@finally {
}
}
if(dic != nil){
return [dic objectForKey:key];
}
return nil;
}
+ (void)deleteData{
NSMutableDictionary *query = [NSMutableDictionary dictionaryWithObjectsAndKeys:
(__bridge_transfer id)kSecClassGenericPassword,
(__bridge_transfer id)kSecClass,
KEY_IN_KEYCHAIN,(__bridge_transfer id)kSecAttrService,
KEY_IN_KEYCHAIN,(__bridge_transfer id)kSecAttrAccount,
(__bridge_transfer id)kSecAttrAccessibleAfterFirstUnlock,
(__bridge_transfer id)kSecAttrAccessible,
nil];
SecItemDelete((__bridge_retained CFDictionaryRef)query);
}
@end
对于通用类而言,提供了3个方法,添加、删除、保存。其中,为了安全起见,防止被恶意分析,获取的get方法的返回值是 id 类型的。对于合法的使用者,自然是知道应该转换为什么样的数据类型的。
iOS 开发是我自学的,就那种边学边用的那种。一切都是慢慢摸索。
以前有看到推荐CocoaPods,一看介绍,确实不错,值得一用,但是直到今天才自己为此写文字。
现在来说流程:
首先在命令行里执行如下操作:
1、sudo gem update –system
这是为了让系统组件升级到最新版本。
2、sudo gem install cocoapods
开始安装cocoapods。
3、pod setup
自动配置cocoapods。接下来呢,就是要针对每个 ios 项目了。在想要配置的项目里编辑文件,文件名为 Podfile,内容格式如下:
platform :ios
pod ‘JSONKit’
pod ‘FMDB’
这里需要特别说明的是,第一行的冒号应该和 ios 放在一起,我最开始是放在前面的,导致出错。剩下的就是每一行一个第三方的库引用。如果不知道名称是什么,可以用 pod search 关键词 命令来搜索看看。其实 Podfile 文件也可以使用touch 命令来创建,但是我更喜欢用编辑器来操作。其实后面还可以跟版本号,我比较喜欢使用最新的版本,所以就去掉啦。文件创建完成后,就执行第四步。
4、pod install
这个命令是需要先在命令行里进入到项目的文件夹,然后才运行的。安装成功后,会在项目的目录中,多出3个文件和一个文件夹,分别是 ***.xcworkspace、Podfile、Podfile.lock、Pods。以后再打开项目的话,就不要用 ***.xcodeproj 了,而是改用 ***.xcworkspace 。
随着项目的进度,会在后面才加入新的第三方库,这个时候只需要在 Podfile 里添加新的行,然后命令行进入到对应的项目文件夹,执行 pod update 就可以了。其实重新执行 pod install 也没有太大影响,只是说相对会慢一点。
上面的步骤和网上其他的地方基本上是大同小异的,实际使用的过程中,我还发现了另外的一个问题,就是在打开项目的时候,XCode 会提示我要不要对文件进行解锁。解锁后,总是提示失败。正是这个原因导致我在开始的时候放弃了CocoaPods。
我不知道这个现象是不是只有我一个人才有,网上也搜索了下,似乎信息很少。有的同学会觉得奇怪,既然无法解锁,那么就不解锁呗。原因是酱紫的,因为第三方库可能存在bug,或者使用了被遗弃掉的API,或者兼容性问题,或者只需要使用其中的某一个子组件。这些情况下,就需要对第三方库进行修改和完善。如果不解锁,就无法保存修改的地方。
既然没有什么有效的方式来解锁,只好使用linux的功能,sudo chmod -R 777 目录名 。这样的话就可以解锁所有的目录了。-R 参数是遍历所有的子目录。先前我每天添加,解锁不完美,后来查询了参数就顺利解决了。
在最后还有一个很重要的步骤,就是添加引用,不然在项目的代码里是无法 #import 头文件的,打开项目的 Target ,选择Build Settings,然后在Search Paths 节点下 User Header Search Paths 添加一个配置 ${SRCROOT},同时要记得选择 recursive。如果你一时发现不了User Header Search Paths,可以善用上方的搜索条喔。
在发布了新的 ios 7 系统后,发现导航栏会占据视图的位置,如果应用是在6 和7 上都有用户的话,那么就需要做兼容适配。
网上有看到2种方法。一种是设置 UINavigationBar的translucent属性,self.navigationController.navigationBar.translucent = NO;
另外的一个方法是设置边沿延伸的属性,但是需要先获取判断系统的版本,代码如下:
if ([[[UIDevice currentDevice] systemVersion] doubleValue] >= 7.0) {
self.edgesForExtendedLayout = UIRectEdgeNone;
}
在查看文档的时候,发现有段文字提及UINavigtaionBar的高度会自动根据实际情况变化为 44 或者64,没有确定的预测方法,如果对 UINavigationBar 有设置背景图片的话,按照别人的经验,最好是用一个64高度的图片,上面的20像素设置为透明的。更具体的内容可以查看这里。
7月份都过去大半了,今天才来写这个月的博客。今天可以来说一说最近发生的一件事情。
这个月,除了玩了很多的LOL外,就是写一个小应用了。某一次在威客网站上接了一个iOS的活,人家已经有android 的版本了,想再来一个iOS的,功能都比较简单。人家问我要多少钱,我很不自信,因为才学习iOS开发没有多久,所以准备说200块。然后又一狠心,又加了50块。
接着就轮到人家不相信了,我想如果从事开发的同学就知道,这个价格是非常低的了。在人家质疑能力的时候,幸好前不久在store上架了一个html5介绍的应用,于是人家也没有多说什么,当然这么低的价格也让人家最终选择了我。
当然最后结果还是不错的,人家主动说250块太低了,然后给加到350块了,后来觉得和我合作很舒服,于是又给添加了350块。虽然钱真的不多,也就一顿饭的支出。但那种被认可的感觉,真的很爽。
因为这个事情,妹子把我说了好几顿了。正所谓万事开头难嘛~再接再励好了。
第一个iOS应用终于上架了。这是一个分享传播html5知识的简单应用。历时3个月,被拒绝了5次。通过审核时,真是感觉泪流满面啊。
由于E文水平很菜,当初想了解下苹果从开发到上架的整个流程,于是就想写一个简单的应用尝试看一看。我的很多朋友都是在做前端开发,所以就选择以 html5 作为切入点。
其实最头疼的是没有设计参与进来,所以界面简单而且丑陋。苹果的审核是很严格的,对于不会做设计的我来说,实在是有点难为我。由于程序功能简单,网上很多的界面都只有参考意义。
后来有一次看到微博上一个讲述统计的图片,有点感觉,于是使用了四叶草的变形。也恰好符合程序的几个功能菜单。在最开始的版本里,有放一个广告墙的推荐。被拒绝后在原因描述里说违反了苹果的策略。按说在应用里放广告是很正常的事情,不知道为什么会拒绝。只好给移除掉。
位置是空闲出来了,但是接下来要考虑填充的内容,恰好在看一个 cover flow的特效,那天在家在翻阅一本前端开发的书籍,当时就决定使用这个特效来推荐一些关于 html5的书籍。于是也就有了现在的样子。
应用最初出发点是想熟悉流程的,被苹果拒绝后,看着页面上显示 reject 字样,有点强迫症的我,又开始不甘心了,坚持要给做到通过。是的,最后我坚持下来了,不知道是不是因为他们的审核团队比较烦我才给通过的。
丑是丑了点,我接受各位同学的鄙视,不过你们谁有比较好的设计资源,一定要告诉我呀。
前面的文章中,我讲述了如何注册申请微软开发者帐号的大致流程。在这里,再来描述下苹果个人开发者帐号的注册申请好了。
我在申请前,都有看过网上的教程和帖子。比较坑爹的是,我看到的几乎所有的全部都是讲的企业开发者帐号的申请,看来都只有企业才有钱去搞 iOS 的开发哇。彼时我都蛋疼乳酸的不得了,所以把自己申请的过程讲一下,希望对大家有帮助。
在使用水果的设备时,需要一个帐号来进行程序的管理。这个帐号就是 Apple ID,其实微软的 Microsoft ID 就是学的水果的,还有什么 Adobe ID, Lenovo ID 啊诸如此类的。进行常规注册就可以了,这对于大家来说都是轻车熟路了。
以手机为例,进入到水果的手机开发者中心,https://developer.apple.com/devcenter/ios/index.action 登陆后申请。输入个人信息、支付信息什么的。在这里需要特别注意的是 Legal Name 这个文本框里就是将来在 store 里显示是组织名称,可惜我是随便填写的,悲催了。各位同学这里可是要慎重取个好名字哈。
填写完成后,水果会给你一个 pdf 的表格,按照要求,是需要打印然后填写,最后传真给水果。这对于个人开发者来说,还是太挑剔了点,好在我从网上找到了可以免费发传真的地方。把 pdf 用ps 打开,该勾选的勾选,签名那里用画笔工具尽量模仿自己的手写,然后通过免费传真发送过去了。本来还担心水果会不会拒绝,最后没有想到还通过了。
不过这个等待的过程就太长了些,前后差不多等待了近一个星期的样子,这对于急性子的我来说近乎是种煎熬。终于在某一天的早上,收到了含有激活码的邮件,可是验证的时候,就无法激活。显示的是一堆的英文字母,看也看不懂,只好在线给他们求助,好在当天就回复了。邮件也是英文的,看不懂,貌似大意就是说让再重新激活下。于是重新激活,就成功了。
晚上回家后,尝试进行真机调试,也无法调试。发现工程属性里的版本不对,手机是 ios 6 ,但是工程里的是 ios 5,修改后还是不行。后来无意间发现,在真机的设备页里,点击那个“作为开发使用”的按钮后,才可以真机调试了。
大家还记得我前文中,提到的那个 MMHot 应用么,我安装到真机上,感觉福利图好爽的样子喔。
这几天在调试当初的一个demo的程序的时候,一运行就报错,本来就对 xcode 不熟悉,这下更是手忙脚乱的。貌似这里面的断点调试也不怎么好用,放了几个断点,然后逐步执行。
运行到最后,出错的时候是停留在表格的显示的方法里,但是感觉不对。很是郁闷,这个和vs 比起来要弱爆了。看了下异常信息,提示的是 EXC_BAD_ACCESS 错误。在网上搜索了下,还很多人都有这个错误呢。
总计了下大家的建议,说的是 90% 的EXC_BAD_ACCESS 异常都是因为释放了已经释放的变量导致。安装网上的说法要打开 NSZombieEnabled 来显示更多的信息。
我这里说一个简单的方式:Product->Edit Scheme,然后选择 Diagnostics 选项卡,勾选 Enable Zombie Objects ,然后再重新调试,就可以显示一些更有用的信息了。再 Output 里显示了 UIAlertView 的字符串,我的项目里用到了这个,但是不太多,一搜索果然发现和定位了错误。
我在一处声明了 UIAlertView 并且使用了 autorelease 关键字,但是在后面,我又 release 了一遍,导致出错了。最开始学习的时候,我是从网上照葫芦画瓢地写的这样的代码。
修正了错误后,重新编译就没有问题了。心里的石头算是放下来了。网上的文章还有继续讲解如何来来进行定位操作的,我看了下还需要执行命令,这对我来说复杂了,问题本来也解决了,就没有继续跟了。有兴趣的同学可以搜索网上相关的文章看看。
最后需要提醒大家的,再找到了错误原因后,需要重新取消勾选 Enable Zobie Objects 复选框。
在上一个应用 MMHot 中,我们讲解了如何显示图片,后来我打算再添加一个功能,就是长按屏幕可以保存图片,保存图片后播放一个声音通知用户。声音的播放使用了 AudioServices。
AudioServices 是 Audio Toolbox 下的一个播放小于 30秒 声音的功能集合。从 ios 2.0 开始,在系统中欲定义了一些系统声音,它们从 1000 到 2000。内置的声音文件存放的地址为 /System/Library/Audio/UIsounds/ 。
Sound ID | File name (iPhone) | File name (iPod Touch) | Category | Note |
---|---|---|---|---|
1011 | – | – | SMSReceived_Vibrate | |
1102 | – | – | FailedUnlock | |
1311 | – | – | SMSReceived_Vibrate | |
1350 | – | – | RingerVibeChanged | |
1351 | – | – | SilentVibeChanged | |
4095 | – | – | Vibrate | There was no category for this sound before 2.2. In the SDK this is the constant kSystemSoundID_Vibrate. |
1005 | alarm.caf | sq_alarm.caf | CalendarAlert | |
1304 | alarm.caf | sq_alarm.caf | SystemSoundPreview | |
1020 | Anticipate.caf | Anticipate.caf | SMSReceived_Alert | Available since 4.2 |
1320 | Anticipate.caf | Anticipate.caf | SMSReceived_Selection | Available since 4.2 |
1106 | beep-beep.caf | sq_beep-beep.caf | ConnectedToPower | |
1113 | begin_record.caf | begin_record.caf | BeginRecording | Available since 3.0 |
1117 | begin_video_record.caf | begin_video_record.caf | BeginVideoRecording | Available since 3.0 |
1021 | Bloom.caf | Bloom.caf | SMSReceived_Alert | Available since 4.2 |
1321 | Bloom.caf | Bloom.caf | SMSReceived_Selection | Available since 4.2 |
1022 | Calypso.caf | Calypso.caf | SMSReceived_Alert | Available since 4.2 |
1322 | Calypso.caf | Calypso.caf | SMSReceived_Selection | Available since 4.2 |
1023 | Choo_Choo.caf | Choo_Choo.caf | SMSReceived_Alert | Available since 4.2 |
1323 | Choo_Choo.caf | Choo_Choo.caf | SMSReceived_Selection | Available since 4.2 |
1070 | ct-busy.caf | ct-busy.caf | AudioToneBusy | There was no category for this sound before 4.0. |
1074 | ct-call-waiting.caf | ct-call-waiting.caf | AudioToneCallWaiting | There was no category for this sound before 4.0. |
1153 | ct-call-waiting.caf | ct-call-waiting.caf | VCCallWaiting | Available since 4.1 |
1071 | ct-congestion.caf | ct-congestion.caf | AudioToneCongestion | There was no category for this sound before 4.0. |
1073 | ct-error.caf | ct-error.caf | AudioToneError | There was no category for this sound before 4.0. |
1075 | ct-keytone2.caf | ct-keytone2.caf | AudioToneKey2 | There was no category for this sound before 4.0. |
1072 | ct-path-ack.caf | ct-path-ack.caf | AudioTonePathAcknowledge | There was no category for this sound before 4.0. |
1024 | Descent.caf | Descent.caf | SMSReceived_Alert | Available since 4.2 |
1324 | Descent.caf | Descent.caf | SMSReceived_Selection | Available since 4.2 |
1200 | dtmf-0.caf | dtmf-0.caf | TouchTone | |
1201 | dtmf-1.caf | dtmf-1.caf | TouchTone | |
1202 | dtmf-2.caf | dtmf-2.caf | TouchTone | |
1203 | dtmf-3.caf | dtmf-3.caf | TouchTone | |
1204 | dtmf-4.caf | dtmf-4.caf | TouchTone | |
1205 | dtmf-5.caf | dtmf-5.caf | TouchTone | |
1206 | dtmf-6.caf | dtmf-6.caf | TouchTone | |
1207 | dtmf-7.caf | dtmf-7.caf | TouchTone | |
1208 | dtmf-8.caf | dtmf-8.caf | TouchTone | |
1209 | dtmf-9.caf | dtmf-9.caf | TouchTone | |
1211 | dtmf-pound.caf | dtmf-pound.caf | TouchTone | |
1210 | dtmf-star.caf | dtmf-star.caf | TouchTone | |
1114 | end_record.caf | end_record.caf | EndRecording | Available since 3.0 |
1118 | end_video_record.caf | end_video_record.caf | EndVideoRecording | Available since 3.0 |
1025 | Fanfare.caf | Fanfare.caf | SMSReceived_Alert | Available since 4.2 |
1325 | Fanfare.caf | Fanfare.caf | SMSReceived_Selection | Available since 4.2 |
1115 | jbl_ambiguous.caf | jbl_ambiguous.caf | JBL_Ambiguous | Available since 3.0 |
1110 | jbl_begin.caf | jbl_begin.caf | JBL_Begin | Available since 3.0 |
1112 | jbl_cancel.caf | jbl_cancel.caf | JBL_Cancel | Available since 3.0 |
1111 | jbl_confirm.caf | jbl_confirm.caf | JBL_Confirm | Available since 3.0 |
1116 | jbl_no_match.caf | jbl_no_match.caf | JBL_NoMatch | Available since 3.0 |
1026 | Ladder.caf | Ladder.caf | SMSReceived_Alert | Available since 4.2 |
1326 | Ladder.caf | Ladder.caf | SMSReceived_Selection | Available since 4.2 |
1100 | lock.caf | sq_lock.caf | ScreenLocked | |
1305 | lock.caf | sq_lock.caf | SystemSoundPreview | |
1254 | long_low_short_high.caf | long_low_short_high.caf | Headset_StartCall | |
1006 | low_power.caf | low_power.caf | LowPower | |
1001 | mail-sent.caf | mail-sent.caf | MailSent | |
1303 | mail-sent.caf | mail-sent.caf | SystemSoundPreview | |
1259 | middle_9_short_double_low.caf | middle_9_short_double_low.caf | Headset_TransitionEnd | |
1027 | Minuet.caf | Minuet.caf | SMSReceived_Alert | Available since 4.2 |
1327 | Minuet.caf | Minuet.caf | SMSReceived_Selection | Available since 4.2 |
1000 | new-mail.caf | new-mail.caf | MailReceived | |
1302 | new-mail.caf | new-mail.caf | SystemSoundPreview | |
1028 | News_Flash.caf | News_Flash.caf | SMSReceived_Alert | Available since 4.2 |
1328 | News_Flash.caf | News_Flash.caf | SMSReceived_Selection | Available since 4.2 |
1029 | Noir.caf | Noir.caf | SMSReceived_Alert | Available since 4.2 |
1329 | Noir.caf | Noir.caf | SMSReceived_Selection | Available since 4.2 |
1108 | photoShutter.caf | photoShutter.caf | CameraShutter | |
1003 | ReceivedMessage.caf | ReceivedMessage.caf | SMSReceived | |
1301 | ReceivedMessage.caf | ReceivedMessage.caf | SystemSoundPreview | |
1107 | RingerChanged.caf | RingerChanged.caf | RingerSwitchIndication | |
1004 | SentMessage.caf | SentMessage.caf | SMSSent | |
1109 | shake.caf | shake.caf | ShakeToShuffle | Available since 3.0 |
1030 | Sherwood_Forest.caf | Sherwood_Forest.caf | SMSReceived_Alert | Available since 4.2 |
1330 | Sherwood_Forest.caf | Sherwood_Forest.caf | SMSReceived_Selection | Available since 4.2 |
1255 | short_double_high.caf | short_double_high.caf | Headset_Redial | |
1257 | short_double_low.caf | short_double_low.caf | Headset_EndCall | |
1258 | short_double_low.caf | short_double_low.caf | Headset_CallWaitingActions | |
1256 | short_low_high.caf | short_low_high.caf | Headset_AnswerCall | |
1051 | SIMToolkitCallDropped.caf | SIMToolkitCallDropped.caf | SIMToolkitTone | |
1052 | SIMToolkitGeneralBeep.caf | SIMToolkitGeneralBeep.caf | SIMToolkitTone | |
1053 | SIMToolkitNegativeACK.caf | SIMToolkitNegativeACK.caf | SIMToolkitTone | |
1054 | SIMToolkitPositiveACK.caf | SIMToolkitPositiveACK.caf | SIMToolkitTone | |
1055 | SIMToolkitSMS.caf | SIMToolkitSMS.caf | SIMToolkitTone | |
1007 | sms-received1.caf | sms-received1.caf | SMSReceived_Alert | |
1012 | sms-received1.caf | sms-received1.caf | SMSReceived_Alert | |
1307 | sms-received1.caf | sms-received1.caf | SMSReceived_Selection | |
1312 | sms-received1.caf | sms-received1.caf | SMSReceived_Selection | |
1008 | sms-received2.caf | sms-received2.caf | SMSReceived_Alert | |
1308 | sms-received2.caf | sms-received2.caf | SMSReceived_Selection | |
1009 | sms-received3.caf | sms-received3.caf | SMSReceived_Alert | |
1309 | sms-received3.caf | sms-received3.caf | SMSReceived_Selection | |
1010 | sms-received4.caf | sms-received4.caf | SMSReceived_Alert | |
1310 | sms-received4.caf | sms-received4.caf | SMSReceived_Selection | |
1013 | sms-received5.caf | sms-received5.caf | SMSReceived_Alert | |
1313 | sms-received5.caf | sms-received5.caf | SMSReceived_Selection | |
1014 | sms-received6.caf | sms-received6.caf | SMSReceived_Alert | |
1314 | sms-received6.caf | sms-received6.caf | SMSReceived_Selection | |
1031 | Spell.caf | Spell.caf | SMSReceived_Alert | Available since 4.2 |
1331 | Spell.caf | Spell.caf | SMSReceived_Selection | Available since 4.2 |
1032 | Suspense.caf | Suspense.caf | SMSReceived_Alert | Available since 4.2 |
1332 | Suspense.caf | Suspense.caf | SMSReceived_Selection | Available since 4.2 |
1033 | Telegraph.caf | Telegraph.caf | SMSReceived_Alert | Available since 4.2 |
1333 | Telegraph.caf | Telegraph.caf | SMSReceived_Selection | Available since 4.2 |
1057 | Tink.caf | Tink.caf | PINKeyPressed | |
1103 | Tink.caf | sq_tock.caf | KeyPressed | |
1034 | Tiptoes.caf | Tiptoes.caf | SMSReceived_Alert | Available since 4.2 |
1334 | Tiptoes.caf | Tiptoes.caf | SMSReceived_Selection | Available since 4.2 |
1104 | Tock.caf | sq_tock.caf | KeyPressed | |
1105 | Tock.caf | sq_tock.caf | KeyPressed | |
1306 | Tock.caf | sq_tock.caf | KeyPressClickPreview | The category was SystemSoundPreview before 3.2. |
1016 | tweet_sent.caf | tweet_sent.caf | SMSSent | Available since 5.0 |
1035 | Typewriters.caf | Typewriters.caf | SMSReceived_Alert | Available since 4.2 |
1335 | Typewriters.caf | Typewriters.caf | SMSReceived_Selection | Available since 4.2 |
1101 | unlock.caf | sq_lock.caf | ScreenUnlocked | |
1036 | Update.caf | Update.caf | SMSReceived_Alert | Available since 4.2 |
1336 | Update.caf | Update.caf | SMSReceived_Selection | Available since 4.2 |
1050 | ussd.caf | ussd.caf | USSDAlert | |
1152 | vc~ended.caf | vc~ended.caf | VCEnded | Available since 4.0 |
1150 | vc~invitation-accepted.caf | vc~invitation-accepted.caf | VCInvitationAccepted | Available since 4.0 |
1151 | vc~ringing.caf | vc~ringing.caf | VCRinging | Available since 4.0 |
1154 | vc~ringing.caf | vc~ringing.caf | VCCallUpgrade | Available since 4.1 |
1002 | Voicemail.caf | Voicemail.caf | VoicemailReceived | |
1015 | Voicemail.caf | Voicemail.caf | – | Available since 2.1 |
1300 | Voicemail.caf | Voicemail.caf | SystemSoundPreview | |
1315 | Voicemail.caf | Voicemail.caf | SystemSoundPreview | Available since 2.1 |
使用的时候,添加引用 #import <AudioToolbox/AudioToolbox.h>
SystemSound sound=1109;
AudioServicesPlaySystemSound(sound);
播放是以当前系统的音量来进行后台播放,比较适合我在这个应用中的需要。