存档

‘日常’ 分类的存档

ios 7 导航栏遮挡视图的问题

2013年10月9日 没有评论

在发布了新的 ios 7 系统后,发现导航栏会占据视图的位置,如果应用是在6 和7 上都有用户的话,那么就需要做兼容适配。

网上有看到2种方法。一种是设置 UINavigationBar的translucent属性,self.navigationController.navigationBar.translucent = NO;

另外的一个方法是设置边沿延伸的属性,但是需要先获取判断系统的版本,代码如下:

if ([[[UIDevice currentDevice] systemVersion] doubleValue] >= 7.0) {

self.edgesForExtendedLayout = UIRectEdgeNone;

}

 

在查看文档的时候,发现有段文字提及UINavigtaionBar的高度会自动根据实际情况变化为 44 或者64,没有确定的预测方法,如果对 UINavigationBar 有设置背景图片的话,按照别人的经验,最好是用一个64高度的图片,上面的20像素设置为透明的。更具体的内容可以查看这里

分类: iOS, 日常 标签: ,

中秋节还不错

2013年9月22日 没有评论

这个中秋节算是运气比较不错的。超市有活动是猜灯谜的,最后还中了6只笔,什么谜语忘记了,只记得有一个是柴门闻犬吠,打一字,谜底是个润。

买东西结账时,刷的信用卡,居然提示中奖了,赶紧去兑奖,是一个50块钱的充值卡,还不错。

后来又买了一套西服,结账时说可以换一捅金龙鱼的油,捡了个便宜。

最后东西买完了,说单张小票超过多少钱就可以抽奖,什么珠宝、美妆类的还不参与,恰好有一个满足,于是就摸了下,中了个二等奖,选择了一个双人帐篷,olay 美的不得了,人家是一直想去搞个露宿什么的,现在就多了一件装备了。

从超市出来,说运气这么好,就去买个彩票,就买了几张刮刮奖,居然有一张中了个 500 块,那一本刮刮奖里估计就再也不会有什么大奖了。

一个下午,就中了5种奖品,运气还真不错。不过买东西也花了老多钱了。

分类: 一句话, 日常 标签: ,

迁移服务器的小问题

2013年7月27日 没有评论

友人服务器最近到期,准备迁移到阿里云上面。

买好了云服务器后,就开始部署,结果一直报错。说不是有效的32位程序,由于网站的登陆页面使用了加密狗,而报错的就是这个加密狗相关的dll 文件。在IIS 里添加了对32位程序的支持,还是不行,错误提示说是无法加载指定的模块。

后来想到加密狗dll 是用c++开发的,是不是缺少相关运行时导致。不清楚dll是用c++的哪个版本开发的,只好把05、08、12的32/64位运行时都下载了安装。

还是不行。

有点小崩溃了。想到既然是无法加载指定的模块,那应该是缺少模块咯。又用depends查看加密狗dll引用了哪些系统dll。发现引用了msvcr71.dll和mscoree.dll,把这2个dll 从别的电脑上复制到服务器上。运行又报错,不过错误提示发生了变化。

说是   c:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root\946055b8\92eead15\xxxxxx.dll    拒绝访问。

开始以为是这个目录的权限问题,添加权限还加不上去,估计server 2008 默认是不允许的。后来查询了下,很多人说是需要给系统临时目录添加权限,果断给 temp 目录添加了 network service 权限,发现还是不行。

反复搜索,终于解决,原来是需要在应用程序池设置中将“加载用户配置文件”(Load User Profile)设置为true。

再次运行终于正常出现页面了。接下来又是数据库无法登陆,这个按照网上是说明,选择附加进来的数据库,右键属性,如上图,文件–〉所有者–〉选择用户sa,即可用此sa用户登录数据库。

弄好了这些,都深夜2点多了。

分类: 日常 标签: ,

iOS应用开发价格有多低

2013年7月22日 没有评论

7月份都过去大半了,今天才来写这个月的博客。今天可以来说一说最近发生的一件事情。

这个月,除了玩了很多的LOL外,就是写一个小应用了。某一次在威客网站上接了一个iOS的活,人家已经有android 的版本了,想再来一个iOS的,功能都比较简单。人家问我要多少钱,我很不自信,因为才学习iOS开发没有多久,所以准备说200块。然后又一狠心,又加了50块。

接着就轮到人家不相信了,我想如果从事开发的同学就知道,这个价格是非常低的了。在人家质疑能力的时候,幸好前不久在store上架了一个html5介绍的应用,于是人家也没有多说什么,当然这么低的价格也让人家最终选择了我。

当然最后结果还是不错的,人家主动说250块太低了,然后给加到350块了,后来觉得和我合作很舒服,于是又给添加了350块。虽然钱真的不多,也就一顿饭的支出。但那种被认可的感觉,真的很爽。

因为这个事情,妹子把我说了好几顿了。正所谓万事开头难嘛~再接再励好了。

分类: iOS, 日常 标签: ,

自定义协议及其在metro中的应用

2013年4月7日 没有评论

最近工作中有遇到这样的一个需求,就是在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中也实现了,和自定义协议大同小异,就留给大家去思考啦。

 

分类: 日常 标签: ,

c# 调用 c++ dll 问题的解决

2012年12月3日 没有评论

上一个星期,都在解决一个问题,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

 

分类: 日常 标签: , , , , ,

Apple 个人开发者帐号注册申请

2012年11月19日 没有评论

前面的文章中,我讲述了如何注册申请微软开发者帐号的大致流程。在这里,再来描述下苹果个人开发者帐号的注册申请好了。

我在申请前,都有看过网上的教程和帖子。比较坑爹的是,我看到的几乎所有的全部都是讲的企业开发者帐号的申请,看来都只有企业才有钱去搞 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 应用么,我安装到真机上,感觉福利图好爽的样子喔。

分类: iOS, 日常 标签: , ,

windows 8 个人开发者帐号注册申请

2012年11月19日 没有评论

win8 在上个月的时候终于开始发售了,作为开发者,自然很关心新出来的应用商店开发的事情了。

在先前的时候,开发者帐号只针对于企业用户和有邀请码的个人用户。普通用户是申请不到的。现在普通用户终于也可以申请拉。

通过 vs 2012 的起始页或者干脆网页访问 http://msdn.microsoft.com/zh-cn/windows/apps/br229512 ,可以进入到微软开发中心的页面进行帐号的注册和申请。

注册流程很简单,事实上,你在安装 win8 的时候,系统就会提示你是否要注册一个帐号。该帐号和我们这里要注册的帐号其实是同一个概念,Microsoft ID 。需要提醒大家的是,信息里的个人邮箱和手机号码一定要填写真实的喔,在后面的流程里会经常地用到的。例如手机接收验证码,邮箱收取支付信息。

对于个人用户,一年的费用是300人民币,如果是学生的话,符合条件的可以减免第一年的费用,也就是说第一年不要钱的。我都离开学校好几个世纪了,还是老实地交钱吧。这里需要注意的是在用信用卡支付的时候,需要选择支持境外支付的卡片。

支付成功后,就可以进入到后台到处看一看拉。不过这个时候,还不能上传应用,需要一个二次确认。在这个时候,微软会对信用卡再一次扣费,扣费金额大小不等。在第二次扣费的对账单里,会有几个数字。二次确认就是需要你输入对账单里的数字,或者扣费的具体金额。通过了二次确认后,才是真正地可以上传程序了。

当然,第二次扣费,微软会再返回给我们的。

win8 使用的几个小提示

2012年11月1日 没有评论

昨天头脑发热,从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,但是程序图标上的那个盾牌怎么都不消失,看着真别扭。这个目前还没有找到很好的解决思路。

昨天晚上没有睡好,现在好瞌睡啊。

分类: 一句话, 日常 标签: ,

MMHot 代码编写过程及心得

2012年10月17日 没有评论

把先前买的那本 ios 变成的书给撕了,每天在地铁上看一点点,又大致看了几个别人的代码,打算自己写一个应用出来练习下,经过一个星期的琢磨,应用 MMHot 代码部分终于完工了。本来打算花 $99 去买一个开发者帐号的,但是昨天晚上看了下水果的应用商店规范,发现 MMHot 应该不会被审核通过的,于是放弃了。$99 对我来说真心贵,不过这个不妨碍今天和大家一起分享这个应用编写的心得。

简单地说,MMHot 是一个浏览美女图片的 ios 应用。

项目使用了 2 个开源的库:EGOImage 和 ASIHttp,所以我觉得这个作为入口比较适合新手来初步了解和学习 objective-c ,既可以完成任务,又在学习的初期降低了门槛。ASIHttp  封装了网络应用中的大部分功能,可以满足常见的 get/post 例如文件下载、上传。EGOImageView 继承了 UIImageView,支持图片的异步下载。

作业的目标:1、大致了解 EGOImage 和 ASIHttp 的简单使用方法。2、代码添加视图。3、学习使用调试,了解 IDE 的功能。

应用是基于 Xcode 4.5.1 和 iOS 6 。新建项目时,我没有选择 Core Data 和 Automatic Reference Counting 。因为我看的代码都是基于用户自己手动管理内存的方式,ARC 跳跃太大,对我不合适。另外的原因是开源的库当前貌似还不支持ARC。

新建项目后,会自动包含 appDelegate 文件。这块需要注意的是 -(void)application:(UIApplication *) application didFinishLaunchingWithOptions:(NSDictionary *) launchOptions 方法。这个方法里用来设置需要第一个显示的视图。我们在很多应用中都看到当应用第一次运行的时候,会给出引导界面让用户了解大致的流程,第二次运行时就不显示引导界面了,为了实现这样的效果,也可以在这个方法里去实现。

在该方法里,包含下面的语句:

self.window=[[[UIWindow alloc] initWithFram:[[UIScreen mainScreen] bounds]] autorelease];
self.viewController=[[[MainViewController alloc] initWithNibName:@”MainViewController” bundle:nil] autorelease];
self.window.rootViewController=self.viewController;
[self.window makeKeyAndVisible];
return YES;
第一行代码是设置界面的window,由 IDE 自动生成,第二行代码是设置程序显示的第一个界面 MainViewController.xib ,第三回是设置窗体的根视图,对于 ios6 系统,要求每个窗体都必须有根视图。由旧系统转换的时候,如果没有添加的话,IDE 也会给出一个警告。第四、五也是自动生成的,很明了。

接下来,我们转到 MainViewController.h 文件。由于我们使用了前面说的2个开源库,所以需要引用进来。另外,由于应用中使用了手势和图片回调,所以还需要添加对应的 delegate:EGOImageViewDelegate 、UIGestureRecognizerDelegate 。该类有 3个变量和一个属性。

EGOImageView *imageView;
ASIHttpRequest *req;
NSMutableArray *list

@property (nonatomic,retain) EGOImageView *imageView;

然后就是具体的实现了。我们在 viewDidLoad 添加初始化代码,图片浏览嘛,当然要把顶部的任务栏给隐藏掉,所以我首先来隐藏任务栏:[[UIApplication sharedApplication] setStatusBarHidden:YES];

UIImage *image=[UIImage imageNamed:@”1.jpg”];
imageView=[[EGOImageView alloc]initWithImage:image];
[imageView setFrame:CGRectMake(0,0,[UIScreen mainScreen].bounds.size.width,[UIScreen mainScreen].bounds.size.height)];
imageView.delegate=self;
[self.view.assSubview:imageView];

//添加手势识别
UISwipGestureRecognizer *swipLeft=[[UISwipGestureRecognizer alloc] initWithtarget:self action:@selector(handleSwipGesture:)];
swipLeft.direction=UISwipGuestureRecognizerDirectionLeft;
[self.view addGuestureRecognizer:swipLeft]; //为了防止图片旋转后,手势也跟随变化,所以把手势添加到根视图中,而非 imageView
[swipLeft release];

//发送请求
req=[ASIHttpRequest requestWithURL:[NSURL URLWithString:@”http://www.withonly.com”]];
[req setDelegate:self];
[req setDidFinishSelector:@selector(ASIHttpRequestFinished:)];
[req setDidFailSelector:@selector(ASIHtppRequestFailed:)];
[req startAsynchronous];

视图在显示的时候,首先显示一个本地图片文件 1.jpg ,这样的话可以避免网络延迟带来的视觉等待,然后将视图添加到窗体视图中。手势识别没有什么好说的,都一样。最后是发送请求,请求成功时执行ASIHttpRequestFinished,失败时执行ASIHtppRequestFailed。需要提醒大家的是第 4 行,我3天晚上没有睡好觉就是因为少了这一行代码。

-(void) ASIHttpRequestFinished:(ASIHttpRequest *) request{
NSString *info=[request responseString];
NSMutableString *str=[[NSMutalbeString stringWithString:info];
NSError *error;
NSRegularExpression *regex=[NSRegularExpression regularExpressionWithPattern:@”img src=\”(.*?)\”” options:NSRegularExpressionCaseInsensitive| NSRegularExpressionDotMatchesLineSeparators error:&error];
NSArray *matches=[regex matchesInString:str options:NSMatchingCompleted range:NSMakeRange(0,[str length])];
if([matches count]>0){
[list removeAllObjects];
}

for(NSTextCheckingResult *match in matches){
NSRange range=[match rangeAtIndex:1];
[list addObject:[str substringWithRange:range]];
}
if([list count]>0){
[imageView setImageURL:[NSURL URLWithString:[list objectAtIndex:0]]];
[self ResizeImage]; //图片缩放
}

}

当请求成功后,通过正则提取返回结果里的图片 url 地址,并且保存在 list 变量里。最开始的时候是打算使用xml 来解析的。可是网上搜索了下2种关于xml解析的思路,和 java 是一个味道,擦的,难道没有net 风格的么。于是换做正则来提取。解析完了后,如果 list 里有记录,则显示第一条记录里放的图片。其它的方法都差不多了,没有啥好说的。

在文章的最后,我说一说那个让我好几天没有睡好觉的问题。因为在加载图片后,还需要对图片进行缩放。但是由于图片的下载过程是一个异步的操作,最开始的缩放代码里总是会崩溃,因为那时图片都没有下载回来。我很期待有一个类似图片加载完的回调方法。

后来,查看了EGOImageView 的源文件,发现里面有 imageViewLoadedImage 方法,然后添加到文件里,发现没有效果,后来又发现了imageButtonLoadedImage ,添加进去还是没有效果。很崩溃,于是在网上看到有用 NSNotification  来解决的。赶紧添加进去,还是不行。弄了几个晚上都没有有效的方法。

最后才发现,其实 EGOImageView 已经内部实现了 NSNotification 的相关方法了,只需要在代码里添加 imageView.delegate=self ,然后在 imageViewLoadedImage 实现回调例如图片的缩放就可以了。

分类: iOS, 日常 标签: , , , ,