星点传媒诚聘iOS开发工程师

星点传媒是我的创业公司,情况之前的Blog也有介绍,我们现在主要从事O2O业务,诚聘iOS开发工程师。

岗位职责:
负责基于公司iOS应用的技术设计和开发工作。
完成模块代码编写、单元测试、代码维护工作;
编写相关技术文档。

岗位要求:
1、学历不限,一年以上iOS平台开发经验;
2、熟练掌握Objective-C,Xcode等相关技术;
3、熟练掌握iOS SDK中基础、图像2D、网络、位置等相关技术开发及应用,以及常用的iOS程序开发和调试方法和技巧;
4、熟悉TCP/IP和无线通讯协议,熟悉XML、JSON等数据交换格式;
5、良好的规范编程习惯和开发文档编写能力;
6、具备较强的学习能力和沟通能力,具备较好的团队合作能力;
7、有责任感,工作态度严谨,能够承担高强度、高压力的工作;
8、有App store上线应用者优先。

有兴趣的朋友,简历请发至 job@starrymedia.com

解决iOS开发中zxing在release下不能正常工作的问题

zxing是一个开源类库,用于解析条码二维码(1D/2D),实现语言为Java,但其中也提供了Objective-C的一个包,Objective-C的实现只能读取QRCode。

我们最近的一个iOS工程需要在手机上识别我们的二维码,所以我采用了zxing,按照zxing的文档将ZXingWidget工程导入自己的工程,过程比较顺利,在我的iPhone上调试也没什么问题,但当我打成AdHoc版交付测试时,测试发现程序不能识别二维码,我挺奇怪,就在网上搜索,在zxing的FAQ上确实有这个现象的解释

Why does my application decode okay in debug mode on iOS but not in release mode?

You’re compiling with an old version of llvm-gcc or clang. If you use Xcode 4.2, either supported compiler should be fine with optimizations turned on. Older compilers, shipped with Xcode 4.1 and earlier, had an optimization bug in llvm that miscompiled ZXing. If you are using Xcode 4.1 or older, you should use gcc to compile ZXing, not llvm-gcc or clang.

意思应该是说可能使用了老版本的编译器,Xcode4.2之前都存在问题,但我的Xcode已经是4.3了,应该不存在问题,继续搜索其他资料,基本都是英文,但说的也不是很明白,应该是编译器的Optimization问题,后来我将项目引用的ZXingWidget工程的Optimization Level设为None,即-O0,再打AdHoc就没问题了。

具体为选择ZXingWidget工程的Targets中选择Build Setting,将Optimization Level设为None,即下面的Debug和Release都设为None。

支付宝无线商户接入遇到的问题总结

最近我在为“星点无线”产品增加手机支付功能,支付当然首先想到的是支付宝,而且也在其他类似无线产品里看到集成支付宝应用。

首先在支付宝无线商户平台里签约,我们分别签了“手机网页支付”和“手机应用内支付”,所在行业的费率会有所不同,请根据实际情况选择,“手机网页支付”和“手机应用内支付”的费率也不同,“手机应用内支付”低一些。

最开始,我只想简单一点,在iOS应用里内嵌Web,采用手机网页支付,服务器端是用PHP,手机网页支付,采用MD5和RSA两种签名方式,MD5相对简单,但安全性不如RSA,我最开始测试MD5,而且之前在网站上集成支付宝,也没啥问题,开始是比较顺利的,到支付宝支付时,支付宝默认选择了短信支付方式(可能和我们签约的分类有关),也就是支付宝会通过手机短信发送一个验证码,然后回复验证码,支付宝再会发送一个短信,短信里包含一个URL,点击这个URL,会提示支付完成,然后转到我们网站的回调地址,我方程序完整成个订单,但支付宝提供的这个URL,有时候打开会报错误,而且也不是每次都错,非常的奇怪,更大的问题是在成功后回调我服务器程序时报签名不对,我仔细检查了配置,没有问题,只能一点点排错,最后发现支付宝提供的Demo包里alipay_function.php的para_filter方法有问题,这个方法会漏掉回传的out_trade_no参数,非常的奇怪,只有修改这个方法为

function para_filter($parameter) {
  $para = array();
  foreach ($parameter as $key=>$val) {
    if($key == "sign" || $key == "sign_type" || $val == "") {
      continue;
    } else {
      $para[$key] = $parameter[$key];
    }
  }
  return $para;
}

签名问题解决,但由于短信支付最后这个URL的诡异表现,我为此专门询问支付宝客户支持,得到的回答是他们也发现这个问题,但不知道是什么原因造成的,技术也解决不了,竟然也有支付宝解决不了的问题啊!

这个问题不能解决,确实对用户的体验不太好,我只能选择“手机应用内支付”,支付宝提供了iOS的集成代码,文档也算详尽,但iOS的签名采用RSA,所以在服务器端先要改为RSA的(RSA的alipay_function.php para_filter方法有同样的问题),生成公钥、私钥的方法在文档里比较清楚,就是注意上传商户公钥时一定要删除文件头“—–BEGIN PUBLIC KEY—–”与文件尾“—–END PUBLIC KEY—–”还有空格、换行,变成一行字符串并保存为TXT文件,商户私钥在PHP程序不需要转为PKCS8格式,而在其他语言里(比如Objective-C)需要转为PKCS8格式,并在iOS应用里设置plist文件中RSA private key变量时,要把PKCS8格式私钥的换行和头尾的“—–BEGIN PRIVATE KEY—–”与“—–END PRIVATE KEY—–”删除。

在iPhone真机调试过程中,跳到支付宝应用时报签名错误,我又仔细检查了好几遍,确定没什么问题,后来在支付宝的指导下先测试运行他们提供的Demo程序,没有问题,说明签名密钥没问题,肯定是要签名的数据有问题,我对比了一下发现AlixPayOrder中的productDescription不能为空,也就是传输数据中的body变量不能为空,终于完成了无线支付的集成。

支付宝提供的文档还算比较全面,但有些地方还是有些含糊,如果是iOS集成的话,先测试它提供的Demo程序,以确定密钥的正确性,仔细调试,记录Log,还是比较容易集成的。

星点无线1.5

今天,星点无线1.5已经通过App Store的审核,上架了,地址在http://itunes.apple.com/cn/app/id448294946?mt=8,也可以在App Store里搜索“星点无线”或是“StarryMobile”找到这个应用。

星点无线1.5的主要改变有
全新UI设计
支持iOS5
更加舒适的用户体验
提高运行速度与稳定性
支持调查任务筛选与优惠券排序
增加信息推送功能
修复优惠券显示文字高度的BUG

星点无线1.0和1.1的原始程序是我们找外包团队开发的,1.0和1.1发布时,我已经修改了其中很多的代码,在我们设计1.5的功能时,我觉得,不能在1.0/1.1的基础上改了,老版本存在许多的问题,特别是在性能及内存使用方面有很多不足,代码整体质量不高,我准备重写1.5版本,来个干净彻底,我是10.1假期之后开始重写,在美工设计的配合下,到10月底完成了这个版本,期间iOS5正好发布,这个工程也转到iOS5下开发。

 

 

星点调查 for iPad

星点调查 for iPad已在10月6日通过App Store的审核,上线了,星点调查是一款依托与星点调查平台的调研终端工具,支持多种调查题型,可以帮助商业用户快速进行调研数据收集,有兴趣的朋友可以下载使用:http://itunes.apple.com/us/app/id467284642?mt=8

星点调查是我独立编写的iOS程序,并且是建立在星点调查开放平台之上(http://open.starrysurvey.com/),因此验证了星点调查开放平台可以方便的为企业灵活构建调查业务。

  

星点无线

星点无线-StarryMobile是一个免费的iPhone应用程序,通过完成基于地理位置的调查任务,可以获得积分或相关优惠券,用户可以方便的管理与使用获得优惠券,或将积分兑换为奖品。

这个产品是我们公司开发的,我编写了其中很大一部分代码,也是我对iOS开发的第一次实践,在后面将不断增加新的功能,并与我们的星点网(www.xingdian.com)有更好的整合。

欢迎大家到App Store里下载使用,http://itunes.apple.com/us/app/id448294946?mt=8

 星点无线 星点无线

星点无线 星点无线 星点无线

iPad程序不能正常翻转显示的问题

最近做了一个星点调查的iPad客户端程序,提交App Store审核之后被打回了,说程序只支持纵向显示,在用户翻转之后(即Home键在上面时)也应该能正常显示。

我想只要在shouldAutorotateToInterfaceOrientation方法里加上反向的支持就可以了,即

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown);
}

但是修改之后,发一些页面没有问题,但有些页面还是不能正常显示,有些情况下翻转屏幕有效,有些情况下不行,我百思不得其解,搜索了大量资料(大多是英文的,中文的几乎没有),但也没有完全能解释清楚的,我只能不算试错,发现似乎是UINavigationController默认情况下不能支持UIInterfaceOrientationPortraitUpsideDown,网上的资料也好像提到这个原因,我仔细检查了一下,我的UINavigationController用法似乎不太对,于是我新建一个类,继承自UINavigationController,重写其shouldAutorotateToInterfaceOrientation方法,使其支持UIInterfaceOrientationPortraitUpsideDown,试了一下,果然好了:)