Mac NSOpenGLView NSOpenGLProfileVersion3_2Core glGetString取GL_EXTENSIONS时返回null

实验NSOpenGLViewNSOpenGLProfileVersion3_2Core时发现通过glGetStringGL_EXTENSIONS时一直返回null,不管是放在prepareOpenGL里还是awakeFromNib里,甚至是drawRect:里都不行。尝试调整NSOpenGLView的layer host或layer backed模式结果也都一样。后来查文档发现说3.0+的profile对glGetStringGL_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…

Unity3D项目使用SVN进行版本控制时的注意事项

Unity3D自有一个叫Asset Server的东西可以用来实现项目版本控制,但是,由于习惯,我更倾向于用纯代码项目常用的工具,比如SVN来进行版本控制,就算Unity3D没有像VS Eclipse等IDE那样对SVN提供整合支持,配合TortoiseSVN也一样可以方便的做到SVN项目版本控制。

一开始,我直接讲整个Unity3D的项目文件夹都Import进了svn,后来发现,稍有改动就会有很多类似缓存性质的文件发生变化,需要commit上传,这时才想到是不是并不需要上传所有文件,于是在Unity官方文档中发现了这篇:http://docs.unity3d.com/Documentation/Manual/ExternalVersionControlSystemSupport.html,写的不少,但关键就是以下这几点:

1.这是Pro Only的feature,应该是指生成asset的meta。

2.在Edit->Project Settings->Editor的 Version Control里面选择Meta files。

3.完全关闭unity编辑器,并在服务器端(如果曾经误传的话)和客户端都删除Library文件夹,这是一个本地的缓存目录,不需要版本控制。为了方便保险,最好直接Ignore掉!

4.按住左Alt或mac的option重新在编辑器中打开项目。

5.Commit到此为止的所有改动。

升级Xcode 4.4后项目build提示”address not in any section for architecture armv7″的解决方法

本来以为这月最后一天了,应该可以相安无事,结果Mountain Lion发布,强迫症患者更新系统后接着更新了Xcode到Version 4.4 (4F250),然后就发现很多项目build都报下面这个链接错误:
ld: In section __TEXT,__text reloc 5: sectionForAddress(0x394) address not in any section for architecture armv7
不知道这次更新又对build tool做了什么改动,导致了上个版本build没问题的项目现在ld报错…查了一下,发现是相关target的build settings->Apple LLVM compiler 4.0 – Code Generation中Generate Position-Dependent Code这个选项的问题,换成No就可以正常link了!

iOS的UDID废用以及UUID配合keychain的替换方案实现

首先,简单介绍一下UDID这个东西:

UDIDUnique Device Identifier的简称,也就是唯一设备标识的意思。于iOS SDK中取得的方法是UIDevice的一个叫uniqueIdentifier的NSString*,由于这个ID字符串是基于设备的,应用开发人员可以通过获取此ID来用于记录区分设备。正是由于这个特性,可能会导致一些隐私等等相关的问题,Apple于iOS5中将这个UDID废掉了,SDK中被标记为了Deprecated,虽然为了兼容低版本的源代码而继续存在,但并不会再返回任何有实际意义的东西。

最近在做Flurry的统计功能时,发现还是需要用到可以识别设备的东西的,好方便分析数据,经过一段时间的研究、试验,发现了这个应该还算是比较靠谱的方法……

Continue reading…

在Mac OSX下编译用于iOS的FreeType静态库

记得上学的时候自己研究DirectDraw的文字绘制时,曾经用过FreeType开源库做过一些简单的TTF字库文字绘制操作,那时没什么强力CPU、GPU,而且又是用的DirectDraw,Alpha混合这种操作都是CPU计算,量稍微大一些的时候FPS是相当的不尽人意,就算做了MMX、SSE等的SIMD优化,感觉也不是很理想,而FreeType画文字没有半透明的抗锯齿的话效果也不是很好,所以当时就留下个印象:FreeType的确是非常强力的文字绘图解决方案。现在在像iOS、Android等移动设备的硬件都已经相当强大了(相对而言),所以我又忍不住想要继续一下当年的小研究了!

首先,先做好准备工作。因为是在Mac下编译,所以Xcode是必不可少的,这里需要注意一点,最近的某个版本(好像是4.3)开始Xcode被变成了独立app的形式发布,而这个默认是不带command line tools,而我们要做的FreeType编译是需要用到make等命令行工具的,所以进入Preferences->Downloads里把它下载下来吧,相对1.6G的Xcode来说,180M的命令行工具应该没什么痛苦。

Continue reading…

[译]如何指定iOS应用程序所支持的设备

免责申明:本博客提供的所有教程的翻译原稿均来自于互联网,仅供学习交流之用,切勿进行商业传播。同时,转载时不要移除本申明。如产生任何纠纷,均与本博客所有人、发表该翻译稿之人无任何关系。谢谢合作!原文链接:How to Indicate What Devices Are Supported by Your iOS App – http://blog.manbolo.com/2012/05/02/how-to-indicate-what-devices-are-supported-by-your-ios-app,由于本人水平有限,翻译不当之处欢迎留言指出!

Hypercritical n°64 “You Will Die Instantly!”这里,John Siracusa讨论了一个由于应用程序设备兼容性和iTunes信息之间不符导致的iOS问题。这个问题的具体是说有用户抱怨其所下载的游戏不能在iPhone 3G上运行,而iTunes上却声明这个游戏支持包括3G在内的全部设备。用户抱怨的同时,游戏开发人员却争执说应用介绍信息中明确指出了这个游戏不支持iPhone 3G,但是iTunes标签信息中却给出了相反的信息。这么看来,iTunes上的信息和应用描述信息之间似乎却有不一,而系统则应该尽量避免发生此类问题。

Continue reading…