已越狱的iOS上查看app是否已安装

想在MoeApps里显示该app是否已经安装。如果已安装则是直接显示“已安装”而不是程序的价格。
首先是看到了iHasApp这个库。实际测试发现这个只能看到app被他们收录而且是带有URL Scheme的才能够显示,也就是说并不能显示全部的app。不过这个倒是能通过审核上架。

但是咱的要求不是上架而是要显示完全部的app。
网上查了下,找到了这个
不过如果说知道BundleID(比如com.apple.mobilesafari)的话倒是能直接用,可惜MoeApps只知道纯数字的AppID,不过倒是可以通过先用AppID从iTuneslookupAPI获取到BundleID再进行判断是否已安装。

继续阅读“已越狱的iOS上查看app是否已安装”

萌电波可以说话了

虽然很早就想制作这个功能了,之前都在想有没有cooca现成的方法,发现都是只有针对文本的…没有后台的语音。
然后昨天突然想到…既然iOS和Mac程序都可以通过调用system()参数来执行命令行命令,然后命令行又能直接使用say这个调用系统语音….不就能让程序说话了么!∑(゚Д゚)咱果然是Genius!(拖走

初版只用十几分钟就完成了,能够读出各种操作以及歌曲名+演唱着名称。
不过之后花了不少时间(至少超过2小时)来优化…要知道原本可是同步操作,也就是系统在朗读的时候程序根本就无法操作,当遇到歌曲名或者演唱者名称特别长的…那会是非常痛苦的等待啊233
于是解决方法….这还是咱第一次使用NSTherd…简单说就是新开一个线程然后丢语音到另外一个线程去..
最后得到的效果…和iPod Shuffle内置的VoiceOver类似,不过感觉有点像是一般的音乐电台呢~

话说现在可以下载体验了:地址

默认这个功能是关闭的,需要在调教面板里打开:
屏幕快照 2013-06-26 14.38.50

当然光开启这个还是不行的,毕竟Mac系统默认的是英文/中文的嗓音,这样是没办法正常读日文的歌曲名的。需要手动去调整为日文的系统嗓音:
打开系统偏好设置面板,找到“听写与语音”,然后在“文本至语音”下有个“系统嗓音”,点开之后有个“自定…”可选:
屏幕快照 2013-06-26 16.03.41
之后找到日文的,勾上之后点“好”,后台会自动下载安装。装好之后就能正常读日文了:
屏幕快照 2013-06-26 16.03.54
咱现在用的是10.9 beta2,所以日文多个男声的Otoya可选,10.8以及以下的应该只有女声的Kyoko可选,个人觉得Otoya声音更大一些…Kyoko的声音太容易被淹没了(囧rz
朗读速率的话建议设置稍快一些…这样不至于等读完等太久…

话说咱玩这个玩上瘾了连歌曲都懒得听了光想听它读歌曲名称了_(:з」∠)_

[Obj-c]匹配字段&NSArray里的Null问题&消除HTML转义字符

首先是监测字段匹配,假设要监测字符串string里是否含”a”这个字符:

if ([string rangeOfString:@"a"].location != NSNotFound) {
//do something
}

当NSArray为空或者里面某项为null的时候,在TableView或者其他什么界面经常会出现崩溃的问题。
解决方法:检测是否为空。但是普通的if (array != nil)是没用的,得这样操作:

if (array != [NSNull null]) {
//array not empty
}

尽管可能编译时会有警告…不过工作是正常的,至少程序不会再崩溃了。

最后,HTML输出的时候经常会连比如”&”或者空格之类的都转换成了“&”或者“ ”这样的字符。
解决方法:手动转换回来。
加入以下代码:(为了防止被转换,咱已经将英文标点”;”更换成了全角的“;”,使用前请先手动更换回来)

-(NSString *)htmlEntityDecode:(NSString *)string{
string = [string stringByReplacingOccurrencesOfString:@"";" withString:@"\""];
string = [string stringByReplacingOccurrencesOfString:@"'" withString:@"'"];
string = [string stringByReplacingOccurrencesOfString:@"&;" withString:@"&"];
string = [string stringByReplacingOccurrencesOfString:@"<;" withString:@"<"]; string = [string stringByReplacingOccurrencesOfString:@"&gt;" withString:@">"];
string = [string stringByReplacingOccurrencesOfString:@" ;" withString:@" "];
return string;
}

然后这么用:
string = [self htmlEntityDecode:string];
得到的string就是正常的了~