2012
体验了一下Visual Studio 2012和Windows Phone 8 SDK 记录一下模拟器的联网问题
VS2012直接在MS的网站上就可以下载ISO,WP8 SDK直接搜索比较容易找到的是在线安装的版本,下载速度比较慢的话可以直接这里下载ISO直装版:
中文 http://go.microsoft.com/fwlink/?LinkID=257234&clcid=0x804 英文 http://go.microsoft.com/fwlink/?LinkID=257234&clcid=0x409
整个开发环境搭建比较轻松,需要说明的一点就是虽然安装VS2012并不需要Win8,但是WP8 SDK要求系统必须为Win8而且是要64位和一个忘了叫什么名字的CPU技术,因为WP8的emulator是基于Win8的Hyper-V虚拟机的。
还有一点要注意的就是VS和WP8 SDK的语言对应问题, Continue reading…
Unity3D使用VisualStudio作为脚本编辑器以及配合NShader插件编辑Shader的方法
Unity3D自带了Mono Develop作为脚本编辑、Shader、调试用的IDE,虽然Mono Develop的功能也算强大,但是对于习惯了VS的开发人员来说,换个新IDE就得适应一套新的…额,感觉!
其实看看Unity项目文件夹内的内容可以发现Unity实际上是生成了VS用的项目文件的,sln、csproj之类的,也就是说是可以比较容易地换用VS作为项目脚本编辑IDE的,简单设置一下就可以了,Edit->Preferences…中修改External Script Editor选项,选中VS的devenv,便会被自动识别出来,如下图所示:
这样,点击脚本等的时候Unity就会弹出VS并自动打开关联的项目和要编辑的文件给你了。后来在使用时发现一个小问题,就是我的VS是带VA(大番茄VS程序员的最爱!)的,但如果用Unity启动的话VA会被自动禁用… Continue reading…
iOS程序开发引用的第三方库之间出现duplicate symbol时的处理方法
iOS程序集成的第三方库过多时,很容易出现某几个库同时用到了一样的函数库,也就是在你的程序link时会提示duplicate symbol,而重复的符号又不是由你自己程序的代码造成的,也就说没法通过直接修改代码把重复的符号去掉!这样呢,要不就要求第三方库提供方该代码,要不就自己修改第三方库的库文件。第一种方法多少有点无理要求,所以还是直接用第二种方法自己解决了吧,也就是直接修改.a文件或framework里的库二进制文件:
Android系统实现横竖屏两方向自动旋转的方法
Android系统不像iOS有shouldAutorotateToInterfaceOrientation:以及项目info.plist中的支持屏幕朝向属性设置那么直白的屏幕朝向支持,而且2.2以下和2.3以上还有对自动旋屏功能支持的差异:
在2.2一下,manifest中可以通过android:screenOrientation=”landscape”属性设置朝向,但这显然没有像iOS那样指明是landscape right还是landscape left,而且测试发现实际效果也只是锁定在了landscape的一个朝向,并不支持根据重力感应的两方向自动旋转。
在2.3及以上的target下,可以通过设置android:screenOrientation=”sensorLandscape”实现landscape的两方向自动旋转,为了同时兼容两种情况,可以采用以下的方法:
public static final int ANDROID_BUILD_GINGERBREAD = 9; public static final int SCREEN_ORIENTATION_SENSOR_LANDSCAPE = 6; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (Build.VERSION.SDK_INT >= ANDROID_BUILD_GINGERBREAD) { setRequestedOrientation(SCREEN_ORIENTATION_SENSOR_LANDSCAPE); } }
Mac NSOpenGLView NSOpenGLProfileVersion3_2Core glGetString取GL_EXTENSIONS时返回null
实验NSOpenGLView和NSOpenGLProfileVersion3_2Core时发现通过glGetString取GL_EXTENSIONS时一直返回null,不管是放在prepareOpenGL里还是awakeFromNib里,甚至是drawRect:里都不行。尝试调整NSOpenGLView的layer host或layer backed模式结果也都一样。后来查文档发现说3.0+的profile对glGetString传GL_EXTENSIONS已经被deprecated,属于invalid enumeration,正确的方法是用glGetStringi代替:
GLint n, i; glGetIntegerv(GL_NUM_EXTENSIONS, &n); for (i = 0; i < n; i++) { printf("%s\n", glGetStringi(GL_EXTENSIONS, i); }
另外NVidia Cg的cgGLGetLatestProfile也一直返回Unknown,怀疑和这个性质类似……
UPDATE1:换回NSOpenGLProfileVersionLegacy后,cg问题解决,看来现在的cg sdk还不支持3.0+的profile。
我遇到的An error occurred uploading to the itunes store问题
最近一次更新App版本到itunes时遇到了An error occurred uploading to the itunes store,用的是XCode自带的Organizer做的归档上传操作,提示这个问题后存档被归为validating失败,感觉很奇怪,于是手动validate了一次,顺利pass,没有任何问题!
然后开始怀疑是网络问题,retry了3、4次,问题依旧,看来不是偶然,于是开始google,发现遇到同样问题的人还真是不少!
问题的根源就是XCode需要的Java环境出现了问题,网上找到的解决方案是这样:
cd /System/Library/Frameworks/JavaVM.framework/Versions
sudo ln -s CurrentJDK /System/Library/Frameworks/JavaVM.framework/Versions/1.5
sudo ln -s CurrentJDK /System/Library/Frameworks/JavaVM.framework/Versions/1.5.0
试了一下,问题依旧!
Continue reading…
UIImagePickerController在iPad上应用与iPhone类设备上的应用区别以及sourceType导致的crash
之前调用UIImagePickerController显示照相机和相册时用的一直是presentModalViewController:方法直接显示,后来发现这样的用法在New iPad上会导致:
Terminating app due to uncaught exception ‘NSInvalidArgumentException’, reason: ‘On iPad, UIImagePickerController must be presented via UIPopoverController’
这个错误,并且这个错误只出现在显示系统相册时,照相模式时不会提示这个错误。
按照错误字面意思来看,在iPad上UIImagePickerController必须通过UIPopoverController来显示,g了一下,发现提到相关问题的文章也有很多,替换的具体实现可以看下面的参考链接。可是奇怪的问题是直接presentModalViewController的方法实际测试在iPad2上面没有任何问题,关于这点我看到有老外提到说这个可能是UIKit的bug?!
另外,我发现在替换了UIPopoverController的实现后,打开相册时在小框里狂托时会有极大的可能性导致crash,有时候时EXC_BAD_ACCESS,有时候Collection mutated while being enumerated,还有时候提示数组0索引位置不可用…
Continue reading…
iOS6对于shouldAutorotateToInterfaceOrientation的改动以及其他一些窗口相关细节
iOS6正式版发布当天博主我就更新了,随后也更新了对应的XCode以及iOS SDK,更新到了4.5 (4G182)。然后更新原有4.4 iOS5 SDK的项目,目前最主要的发现就是iOS6对于app屏幕朝向支持以及自动旋屏时的处理方式的变动。
简而言之就是iOS6下的
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation { return UIInterfaceOrientationIsLandscape(toInterfaceOrientation); }
这个不会再被调用,取而代之的是这俩个组合:
- (BOOL)shouldAutorotate { return YES; } - (NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskLandscape; }
当然,为了保持对旧版本系统行为的兼容性,不要删掉不用的那个调用。另外还有一个这个preferred朝向也可以加上
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation { return UIInterfaceOrientationLandscapeRight; }
当我替换完这俩个操作后尝试运行app,发现会报如下的异常:
Terminating app due to uncaught exception ‘UIApplicationInvalidInterfaceOrientation’, reason: ‘Supported orientations has no common orientation with the application, and shouldAutorotate is returning YES’
Continue reading…