最近工作中有遇到这样的一个需求,就是在metro应用中,想调用指定的windows桌面程序来做一些事情。于是就琢磨了下,使用自定义协议来实现的。
其实我们接触自定义协议,用的最多的就是腾讯的 tencent:// 了,可以实现在网页中调用QQ的添加好友界面了。我们常见的协议有 http ftp svn 等。当由于实际业务中这样或者那样的实际需要时,我们可以使用自定义协议来满足我们的要求。
为系统添加自定义协议很简单,最简洁的是2步。首先,我们在注册表 HKEY_Classes_Root 下添加协议的名称做为项,例如 zyx,为该项添加一个字符串“URL Protocol”,值为空字符串。接下来,我们再为该协议设置关联程序,在 HKEY_Classes_Root\zyx 下创建项 shell ,在 shell 下创建项 open ,在open 下创建项 command ,为该项设置默认值为应用程序的绝对路径,如果再路径的后面再添加 “%1” 的话,就表示可以接受额外的参数。
这里我给出 .reg 文件好了,很方便开发时使用。
Windows Registry Editor Version 5.00
;添加自定义协议
[HKEY_CLASSES_ROOT\zyx]
“URL Protocol”=””
;设置关联程序
[HKEY_CLASSES_ROOT\zyx\shell\open\command]
@=”c:\\launch.exe %1″
把上面的代码直接保存为reg文件,双击导入到注册表即可。这里有几个小知识点可以说下,reg文件里的注释是以;开头的,如果是多行注释,那么每一行都需要添加分号。如果路径不存在,那么系统会自动创建路径。设置关联程序时,默认值的内容文本里如果包含斜杠的话,那么应该使用双斜杠,和注册表路径区分出来。如果是反注册的话,只用在 HKEY 字符的前面添加一个-,同时去掉设置即可。
在一开始的时候,为注册表添加协议关联,我还犹豫是选择 bat 格式呢还是选择 inf 格式,后来还是决定用 reg 格式了。容易理解,很方便。
我们的项目中,想在metro下启动windows应用程序,下面来讲述如何使用。
比如说代码中直接这样执行,bool flag=await Windows.System.Launcer.LaunchUriAsync(new Uri(“zyx://ooxx-with-you”)); 在运行的时候,就会运行我们在注册表里设置的关联程序 launch.exe ,同时把 zyx://ooxx-with-you 作为参数传递过去。
有了参数传入,那么程序就可以做各种逻辑操作了。对于参数,我衣服自己洗这里就多啰嗦2句,虽然对于协议来说,zyx 是协议的名称,但是为了和其它协议作为格式上的一致,我们还是要添加上 :// 标志,作为区分也是好的嘛。另外,在参数中需要考虑2个问题,第一个是符号的问题,如果是特殊符号例如空格什么的,需要考虑编码问题。如果是网页中的地址,IE 会自动帮我们转码,但是其它的部分程序又不会例如资源管理器。所以为了避免编码问题带来的潜在风险,就不要使用特殊符号了。第二个问题是,自定义协议是在注册表里设置的,谁都可以调用,为了安全考虑,关联程序需要对接收到的参数进行检查。当然咯,检查的方法是需要自己来实现的。
有的同学还不是很了解应用场景,这里说一个。metro 应用程序是运行在沙盒中的,metro IE 同样也是的,在有网银、ActiveX的页面中,可能会有些问题,虽然未来可能会有解决方案,但是目前的一个思路就是,系统跳回桌面,使用 desktop 下的 IE 来打开,这么一来,使用自定义协议不就可以解决我们的问题了么。
其实,还有扩展名的解决方案,在我的demo中也实现了,和自定义协议大同小异,就留给大家去思考啦。
前几天需要用到字符串拼接的地方,突然短路了,不知道怎么写了。
在 java 和 c# 中,字符串的拼接是直接用 + 来操作的。在 OC 中,说是有下面3种方法,
- NSString *str=[NSString initWithFormat:@”%@,%@” , a , b];
- NSString *str=[a stringByAppendingString: b];
- NSString *str=[string stringByAppendingFormat:@”%@,%@”, a , b];
网上的说法是第二种方法效率更好一点,不过我就感觉不出来什么,具体情况具体对待好了。
上一篇日志我不是说票不好买的嘛,然后某一天又看到了了一个3号晚上的票,所以就提前走了。
虽然回家了,但是仍在处理一个事情,笑死我了。
3年前,某单位试水互联网,推出了一款基于互联网内容的软件。刚开始的时候,很受欢迎,加上自身的优势,用户增长的是越来越快了。在节前的时候,老板做了一个决定,也就是我们现在要处理的事情,就是把这个软件从用户电脑上给主动卸载掉。
这是我工作以来,遇到的最搞笑的事情,而且这样的事情居然发生在这样的一个单位。无论是做软件也好,还是做互联网应用也好,都是想着尽量地吸引用户,占领用户的电脑。老板决定通过各种技术的或者非技术的手段,想法设法地把已经出货的电脑上的软件给卸载掉,于是我在回家后仍然不得不测试如何完全卸载掉。
软件前后几个版本,功能也都有很多变更,对于一个软件来说,在已经出货到用户手里,要满足老板提出来的“只要用户联网了,就给干掉”要求,确属不容易。
我们将推出的更新包就一个功能,更新的时候卸载自身的主程序。对于曾经花了时间和精力在上面的我来说,很是心痛。然后让老板这么做的原因就在于一个潜在的可能的法律风险。不通过商务或者法务层面去解决,而直接的干掉,对于一个总监来说,感觉武断了些。总结经验教训,可能有以下几点:
1、不是亲生儿子不受重视。曾经的部门调整,让这个项目有点不受重视,虽然亲生儿子也凡善可陈。
2、老板没有互联网意识,还只是停留在软件层面。对于互联网的东西,不懂也不想学习。
3、不愿意承担任何风险。部门间的相互扯皮。
4、后期运营跟不上。用户上来了,但是高层不愿意投入资源来负责运营,做技术的干着急。每年的预算要的多,后来用都用不完,宁愿挥霍也不愿意投入。
事已至此,某单位第一次试水互联网应该以失败画上句号。
今年一来是由于某些无下限浏览器的干扰把相对公平变得更不公平。另外由于某2货部门推广高铁,减少了直达的车次。
所以我就木有票拉。
本来夕发朝至的车,换成高铁后,价格多了200多,另外在转车的时间安排上变的不太合理了。我一直在犹豫要不要多出那200多块钱。口袋里的钱增长速度都跟不上物价的速度,连火车的更新换代速度都跟不上,真TM的惭愧。
上一个星期,都在解决一个问题,c# 调用 c++ 的 dll 。
问题出现在字符串上,在 win8 64位+vs2012 环境下,64位的c#去调用64位的 c++ dll。在调试的时候,总是自动退出调试,没有进入异常,也没有什么输出。dll 方法是接收2个参数,并返回一个字符串。c# 通过调用获得返回的字符串。
一开始的时候,我以为是由于 c# 和 c++ 之间不同的类型转换时,我给设置错了类型导致,然后又仔细拿网上的好几篇文章做对比,发现这块没有问题。dll 文件并不是我们这边提供的,没有源码所以也不好联调。我就给 dll 那边发邮件,描述情况,并期待他们的反馈。
对方那边就只会c++,我提供的c#代码他们看不太懂,再加上对方没有64位环境,同时也不愿意提供dll的源码给我这边调试,进度比较慢。白天就是邮件来邮件去,晚上的时候我就各种安装系统,发现这问题只在64 位系统上出现,在 32 位系统上是可以正确调用的。
后来突然想到,如果我这边新建一个 c++ 项目的话,能不能够复现呢?果然,问题复现了,现在抛开对方的 dll 文件,也可以进行调试了。经过跟踪,发现 c++ 代码完全成功执行了,但是在 c# 调用这边就崩溃了。这么看起来,似乎和 c++ 代码方面的关系不大。于是又仔细检查了 c++ 的导出函数设置,没有问题。我以为是我c#项目的问题,删掉重建了个简单的,还是不行。
接下来,我又怀疑是不是 vs 本身的问题,因为是用的 2012 的版本,恰好这个时候,vs2012 sp1补丁包出来了,果断地升级。升级后发现还是崩溃了。
到这里似乎没有进展了,最后我请教了 c++ 方面的救兵。雪飞同学果然很是强悍,不多会就给出了我一个解决方法。在 c# 这边的函数申明这里设置返回类型为 IntPtr 类型,然后使用 Marshal.PtrToStringAuto 方法进行转换为托管字符串。问题就解决了。
我们一起还讨论这个问题出现的原因,一个可能的原因是在64位平台上,c++ 返回的是一个64位的指针,但是c#在调用的时候,并没有作为64位指针来获取,或者说拿了一个错误的指针,导致字符串获取失败。有可能在 c# 64位平台上字符串的初始化的时候,从非托管代码到托管代码的构造函数里存在缺陷。当然这个问题,是不是这样的,我们就不清楚了。获取给 vs 的开发team发个邮件可以得到更详细的信息。
在今天的时候,我越想越愤懑,为什么别的语言可以,c# 就非得这样,在32位和64位平台上还要做区分代码编写。碰巧下午我测试时先申明了字符串,然后再调用,发现问题居然解决了。似乎验证了和雪飞同学一起讨论的结果。
可是,最好的一个解决方法居然是这样的。这一刻,我觉得太蛋疼了。真的。
string s=””;s=GetInfo(); 的写法和 string s=GetInfo(); 之间对于托管代码和非托管代码居然有这样的区别。
还有另外一个问题,就是结构体转换成字节时,进入了异常。也是字符串的问题,后来根据 google 上面的搜索解决了。如果结构体里包含字符数组,在转换成字节时,需要先定义长度,不然会转换失败。具体来说就是在结构体里字符数组前面添加属性定义。例如
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 6)] public char[] device ; //这里的 device 为 “iphone”,长度为6,所以 SizeConst=6
前面的文章中,我讲述了如何注册申请微软开发者帐号的大致流程。在这里,再来描述下苹果个人开发者帐号的注册申请好了。
我在申请前,都有看过网上的教程和帖子。比较坑爹的是,我看到的几乎所有的全部都是讲的企业开发者帐号的申请,看来都只有企业才有钱去搞 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 应用么,我安装到真机上,感觉福利图好爽的样子喔。
win8 在上个月的时候终于开始发售了,作为开发者,自然很关心新出来的应用商店开发的事情了。
在先前的时候,开发者帐号只针对于企业用户和有邀请码的个人用户。普通用户是申请不到的。现在普通用户终于也可以申请拉。
通过 vs 2012 的起始页或者干脆网页访问 http://msdn.microsoft.com/zh-cn/windows/apps/br229512 ,可以进入到微软开发中心的页面进行帐号的注册和申请。
注册流程很简单,事实上,你在安装 win8 的时候,系统就会提示你是否要注册一个帐号。该帐号和我们这里要注册的帐号其实是同一个概念,Microsoft ID 。需要提醒大家的是,信息里的个人邮箱和手机号码一定要填写真实的喔,在后面的流程里会经常地用到的。例如手机接收验证码,邮箱收取支付信息。
对于个人用户,一年的费用是300人民币,如果是学生的话,符合条件的可以减免第一年的费用,也就是说第一年不要钱的。我都离开学校好几个世纪了,还是老实地交钱吧。这里需要注意的是在用信用卡支付的时候,需要选择支持境外支付的卡片。
支付成功后,就可以进入到后台到处看一看拉。不过这个时候,还不能上传应用,需要一个二次确认。在这个时候,微软会对信用卡再一次扣费,扣费金额大小不等。在第二次扣费的对账单里,会有几个数字。二次确认就是需要你输入对账单里的数字,或者扣费的具体金额。通过了二次确认后,才是真正地可以上传程序了。
当然,第二次扣费,微软会再返回给我们的。
昨天头脑发热,从vs 里进去花了 300 块买了一个微软开发者帐号,然后晚上的时候又花了 98 块钱弄了个 win 8 的升级 key 。如果有兴趣的同学也想只花 98 块钱升级的话可以和我联系获取详细的攻略咯,支持一下正版。
大半夜的开始安装 win 8 镜像,先前通过工作的便利制作了 win 8 的启动U盘,安装过程倒是轻车熟路的。进入了系统后,发现 store 应用商店无法打开。其实这个问题以前也碰到过,再安装一次就可以。半夜的时候再重装就够呛了,想从网上搜一搜解决的方法,结果网上的内容很少,说什么修改 dns 解析为 8.8.8.8 啊,修改注册表啊什么的,看起来都不是好方法。
根据网上的资料不断地摸索,终于发现了问题的解决方法了。就是把当前的网络共享给关闭了就可以了。应用商店让人耳目一新,比先前内测时候的多了很多东西。QQ 、新浪微博、人人网这些应用也都是从内测一路走过来的,他们确实是修正了不少的bug,赞一个。
win 8 要使用应用商店的话,就必须有一个 Microsoft ID,但是我又很想用以前的 Administrator 账户怎么办呢,其实通过组策略也可以实现的。
虽然禁用了UAC,但是程序图标上的那个盾牌怎么都不消失,看着真别扭。这个目前还没有找到很好的解决思路。
昨天晚上没有睡好,现在好瞌睡啊。
这几天在调试当初的一个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);
播放是以当前系统的音量来进行后台播放,比较适合我在这个应用中的需要。