UIWebView与CRITTERCISM冲突

问题描述:
今天做TAG,UIWebView有时正常。有时无任何显示,并报如下错误:

2013-12-05 14:49:49.028 TAG[2680:c817] void SendDelegateMessage(NSInvocation *): delegate (webView:decidePolicyForNavigationAction:request:frame:decisionListener:) failed to return after waiting 10 seconds. main run loop mode:

问题解决:
网上搜了一圈。原因是UIKit不支持多线程,必须在主线程上修改。具体原因是UIWebView是CRITTERCISM冲突,UIWebView需要在CRITTERCISM前初始化,但是项目里办不到。因为项目用了Segment.io,所以直接off了。

iOS SDK5升级类库问题

问题描述:今天小新升级iOS SDK5,发现Stupid不能编译了。具体报错信息如下:

Ld /Users/terrence/Library/Developer/Xcode/DerivedData/FSStupid-btpugnuitaisoebkwchzpplpvjuq/Build/Products/Debug-iphonesimulator/FSStupid.app/FSStupid normal i386
    cd "/Users/terrence/Desktop/FSStupid 10.14 2"
    setenv MACOSX_DEPLOYMENT_TARGET 10.6
    setenv PATH "/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin"
    /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/clang -arch i386 -isysroot /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.0.sdk -L/Users/terrence/Library/Developer/Xcode/DerivedData/FSStupid-btpugnuitaisoebkwchzpplpvjuq/Build/Products/Debug-iphonesimulator "-L/Users/terrence/Desktop/FSStupid 10.14 2/FSStupid/WeiboEngine" "-L/Users/terrence/Desktop/FSStupid 10.14 2/FSStupid/WeiboEngine/Libraries & Headers" "-L/Users/terrence/Desktop/FSStupid 10.14 2/FSStupid/WeiboEngine/WeiboEngine" -F/Users/terrence/Library/Developer/Xcode/DerivedData/FSStupid-btpugnuitaisoebkwchzpplpvjuq/Build/Products/Debug-iphonesimulator -filelist /Users/terrence/Library/Developer/Xcode/DerivedData/FSStupid-btpugnuitaisoebkwchzpplpvjuq/Build/Intermediates/FSStupid.build/Debug-iphonesimulator/FSStupid.build/Objects-normal/i386/FSStupid.LinkFileList -mmacosx-version-min=10.6 -Xlinker -objc_abi_version -Xlinker 2 -Xlinker -no_implicit_dylibs -D__IPHONE_OS_VERSION_MIN_REQUIRED=30100 -framework CoreAudio -framework AudioToolbox -framework StoreKit -lz.1.2.3 -framework MessageUI -lsqlite3 -licucore -framework SystemConfiguration -framework MobileCoreServices -framework Security -framework CFNetwork -framework MediaPlayer -framework AVFoundation -framework UIKit -framework Foundation -framework CoreGraphics -lOAuth -o /Users/terrence/Library/Developer/Xcode/DerivedData/FSStupid-btpugnuitaisoebkwchzpplpvjuq/Build/Products/Debug-iphonesimulator/FSStupid.app/FSStupid

ld: library not found for -lz.1.2.3
Command /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/clang failed with exit code 1

问题分析:看来是找不到类库的问题,lz.1.2.3对应的是libz.1.2.3.dylib。而/Developer/Platforms/iPhoneOS.platform/DeviceSupport/Latest/Symbols/usr/lib目录下只有libz.1.2.5.dylib。

问题解决:在project设置里重新引到新版本的类库,一切ok了。

iPhone 接近传感器 无响应

问题描述:今天施佳音做FSStupid,一个益智类iPhone游戏,需要做接近传感器检测。在单独的例子里是可以运行,但是把同样代码加入到项目中接近传感器没有响应。

问题分析:仔细查找并论证,发现接近传感器只能在竖向的时候工作。

问题解决:把应用程序切换到竖向显示,一切OK了。

控制iPhone短信收发

盛大最近在做“有你”类似iMesssage、TextFreek、biteSMS的应用,主要功能是拦截短信录取联系人并控制短信收发。Android、Symbian等其他移动平台都可以,唯独iOS这块不行,没有这个官方SDK和权限。需要越狱才能达到以上这些功能。

虽然这个有点不太道德,但是还是答应下来。最近两天潜心研究,得出成果,如下:

发短信一般有两种方式,一是打开/dev/tty.debug使用AT命令操作,二是直接使用apple的私有库(CoreTelephony)操作。

第一种:
使用通过minicom的sendmodem(http://code.google.com/p/iphone-elite/wiki/sendmodem)发送AT。
像设置信息格式等一般的命令都可以很好的执行,但是像读取信息、发送信息等这样的命令一概会报ERROR。
而且这个方法有个弊端,因为minicom一定要再关闭通讯中心(launchctl unload -w /System/Library/LaunchDaemons/com.apple.CommCenter.plist
后才能使用,所以在执行AT命令过程中是没有其他程序能够通过运营商通道通讯,比如不能通过原有程序打电话和发短信。

以下是收集的一些AT资源:
sendmodem:http://code.google.com/p/iphone-elite/wiki/sendmodem
C:http://blog.csdn.net/xinghexiyue/archive/2011/03/23/6270732.aspx
iphone-sms:http://code.google.com/p/iphone-sms/
A Convenient Tool to Send AT Commands:http://george.insideiphone.com/index.php/2007/11/25/a-convenient-tool-to-send-at-commands/

第二种:
添加CoreTelephony框架(在4.0以下是Private API),但是在4.0以上这个框架变成Public API,取消了所有的通讯功能,只有一些无关痛痒的功能(比如返回运营商信息)。

第三种:
使用 MessageUI框架中的MFMessageComposeViewController,可以在App中发送短信。但是不能修改发送短信UI,也不能自动发送短信。

总结:
以上方法对于“有你”的要求都不行。还有几个方法在尝试中,测试完毕也会及时更新。

iPad和iPhone的Safari“添加至主页”功能自定义图标

今天知道嘉实多要买100台iPad赠送给客户,我们要配合安装预置程序以及初始化设置。其中要把嘉实多主页保存到iPad主界面上,但是图标需要自定义。

方法如下:

对收藏的页面加入代码:
<link rel="apple-touch-icon-precomposed" href="/icon.png" />
icon.png的尺寸是114×114,不需要做圆角和高光,iPad会自动加。

PS:如果不做如上设置,则iPad会对网页截图并做为图标。

UIImageView frame设置顺序问题

问题描述:
今天做AD ipad版展示功能点,背景不显示。

问题分析:
检查代码,其他都没什么问题。发现设置frame在设置image之前。

代码如下:

UIImage *backgroundImage=[UIImage imageNamed:BACKGROUND_FILE_NAME];
_backgroundImageView=[[UIImageView alloc] initWithFrame:CGRectMake(0, 0, backgroundImage.size.width, backgroundImage.size.height)];
_backgroundImageView.image=backgroundImage;

问题解决:
把设置frame代码放置在设置frame之后,一切安逸了。

代码如下:

_backgroundImageView=[[UIImageView alloc] init];
UIImage *backgroundImage=[UIImage imageNamed:BACKGROUND_FILE_NAME];
_backgroundImageView.image=backgroundImage;
_backgroundImageView.frame=CGRectMake(0, 0, backgroundImage.size.width, backgroundImage.size.height);

Core Data 修改 Model 出错

问题描述:这几天在做Red Frog,使用了Core Data。修改了.xdatamodel,程序就莫名跳出。

问题分析:因为是iOS 3.0开始才有的,我的《iPhone开发基础教程》 中还没有。借了vin的《iPhone开发基础教程3》看了下,还是没找到解决方法。

问题解决:设置断点一步一步跟踪,发现是与代码无关。然后就想倒是不是数据库结构改了,导致原来版本的数据库不能用。把模拟器上的程序删了,再调试,一切ok了。