解决ios5.0.1之苹果推送APNs失败

说来也巧,我在去年的最后一天晚上(2013年12月31日),成功的修复了一个强劲的bug–小恩爱应用在iOS5.0.1设备无法成功进行消息推送。

不知道这是上天给我一次机会,还是因为我的孜孜不倦的努力,感动了上天!!!或许“两者皆有吧”。现在来看这次重构是价值连城的,不管重构的结果如何,至少现在我们已经因此而获益了,解决了可能已为期一年的bug。

同事们都对我的发现欢呼雀跃,也对我表示赞许和膜拜。对此我也非常开心,毕竟这样我们就能够让这部分的小恩爱用户能正常使用到我们的消息推送服务了。我们整个团队必将加倍努力,服务好每一对情侣爱人。

一通闲扯之后,我们现在还是进入正题吧~O(∩_∩)O

iOS5.0.1苹果推送APNs失败

  • 现象: 自己搭建的苹果推送APNs后台服务器显示发送成功,并且也无任何错误提示反馈,但是推送的苹果手机未收取到任何推送相关的消息
  • 排查: 根据其他正常可推送的消息,分析payload参数的不同,发现是自定义参数有所不同,所以自己尝试了不同的自定义参数名称以及值,最后很明显的得出一个结论就是,当我的自定义参数值为负值时,能够重现此问题。
  • 根本原因是自定义字典(自定义参数)中,我们所传递的参数是负值。

根据测试的结论,跟CTO讨论得知,原来此问题我们一直都未解决,所以我就这样误打误撞的解决了公司尘封已久的死bug了。高兴之余大家也在感叹,没想到修复bug也是要讲究缘分的啊~~~

>> 继续阅读 <<

苹果推送机制APNs(二)

上一篇介绍了一下APNs的基本原理和处理流程,通过介绍,对APNs的机制有了大致的了解后,我们就来看看如何把APNS服务集成到我们自己的项目中来,首先登陆我们的Apple Developer后台为将要使用推送服务的App新建一个App ID,如下图,点击新建后输入基本信息:

新建完毕后找到我们刚申请的App ID,把“Enable for Apple Push Notification service”的勾选上

从上面可以看到,推送证书分为两个版本,一个是Development版,一个是Production版,分别对应开发证书和发布证书(这样确实有点麻烦,不过Apple这么做肯定是有自己的理由的)。由于现在我们用做开发测试用,所以只配置Development Push的SSL证书,如果是要发布App到市场的话,就配置Production证书,流程是完全一样的。点击右侧的Configure,进入认证界面,在下一步操作之前,我们要准备好我们本机的认证证书,这个证书在我们配置开发者账号时就申请过,如果没保存的话也可以重新生成一个,其生成方式如下: 首先打开“钥匙串”程序,点击菜单选项如下图:

然后输入基本信息,确认后将后缀名为.certSigningRequest的认证证书文件保存到本地:

保存证书到本地,待会会用到:

然后回到之前的页面,点击Configure进入,点击Continue后然后选择文件,上传我们刚刚申请的.certSigningRequest文件:

上传成功后,点击Generate按钮,Apple会根据我们上传的证书颁发一个开发板的推送证书给我们:

继续点击Continue,最后就进入到下载界面,下载推送证书到本地,保存备用:

下载下来的文件名为aps_development.cer,如果是发布版的推送证书,就为aps_production.cer。然后双击该证书,将推送证书安装到我们的Mac机器上,安装成功后会看到如下界面(如果是发布版,则证书的Development部分显示的是Production)

到这里,推送证书的申请和安装就完成了,接下来的操作就是根据我们之前申请的App ID,为其产生Provisioning证书,该证书申请完成后同样双击安装到我们的Xcode里面,开发时,将签名证书选择我们对应的Provisioning文件即可。这里主要介绍如何申请和安装推送证书,太详细的就不再叙述了,如果想了解更多,可以参考前人总结的文章(个人觉得很不错)http://article.ityran.com/archives/194

好了,时间比较赶,就简要介绍到此了,另外,这篇博客是在机场候机时写的,嘿嘿,因为飞机晚点了,闲着没事,正好机场有无线,所以把这篇文章补上,写的不好不够详细的地方大家可以另外跟我交流,谢谢! 加入我们的QQ群或微信公众账号请查看:Ryan’s zone公众账号及QQ群

转自于 Ryan‘s zone

>> 继续阅读 <<

苹果推送机制APNs(一)

推送是解决轮询所造成的流量消耗和电量消耗的一个比较好的解决方案,在Android上,虽然Google提供了GCM(之前为C2DM),但在国内基本等于没用,各大Android应用基本都自己架设推送Server或是使用第三方推送平台,例如新浪微博使用第三方推送平台“个推”(非广告大笑)。今天要学习的是苹果提供的推送服务APNs(Apple Push Notification services)基本原理和工作流程。 apns 苹果的推送服务APNs基本原理简单来说就是苹果利用自己专门的推送服务器(APNs)接收来自我们自己应用服务器的需要被推送的信息,然后推送到指定的iOS设备上,然后由设备通知到我们的应用程序,设备以通知或者声音的形式通知用户有新的消息。推送的前提是装有我们应用的设备需要向APNs服务器注册,注册成功后APNs服务器会返给我们一个device_token,拿到这个token后我们将这个token发给我们自己的应用服务器,当有需要被推送的消息时,我们的应用服务器会将消息按指定的格式打包,然后结合设备的device_token一并发给APNs服务器,由于我们的应用和APNs维持一个基于TCP的长连接,APNs将新消息推送到我们设备上,然后在屏幕上显示出新消息来。整个过程基本就这样,下面我们看一下设备注册APNs的流程图: 注册apns流程图 上图完成了如下步骤: 1.Device连接APNs服务器并携带设备序列号 2.连接成功,APNs经过打包和处理产生device_token并返回给注册的Device 3.Device携带获取的device_token向我们自己的应用服务器注册 4.完成需要培推送的Device在APNs服务器和我们自己的应用服务器注册 执行顺序如下所示: 执行顺序 这里要提到的一点是,我们的设备和APNS服务器之间的通讯是基于SSL协议的TCP流通讯,二者之间维持一个长连接,当从APNS服务器注册成功后,一定要将device_token发送给我们的应用服务器,因为在推送过程中,首相是由我们的应用服务器(上图中Provider)将需要推送的消息结合device_token按指定格式(后面会提到)打包然后发送给APNS服务器,然后由APNS服务器推送给我们的设备。 好了,注册设备的过程完成了,接下来就是如何推送了: 推送方法 推送的过程经过如下步骤: 1.首先,安装了具有推送功能的应用,我们的设备在有网络的情况下会连接苹果推送服务器,连接过程中,APNS会验证device_token,连接成功后维持一个长连接; 2.Provider(我们自己的服务器)收到需要被推送的消息并结合被推送设备的device_token一起打包发送给APNS服务器; 3.APNS服务器将推送信息推送给指定device_token的设备; 4.设备收到推送消息后通知我们的应用程序并显示和提示用户(声音、弹出框) 比较直观的流程参照下图: 流程图 上图显示了我们的应用服务器将消息推送到我们的App的完整路径,其实真正完成推送的是APNS服务器,我们自己的应用服务器只是将需要推送的消息告诉苹果服务器,至于如何维护消息队列或如何保证消息能被推送到指定的设备上,这些都由苹果APNS给我们做完了。

>> 继续阅读 <<

我踏上了新路

##概述 在上周,我告别了带我进入互联网游戏行业的公司-范特西,并于昨日正式加入创业团队-小恩爱。

##范特西总结 我将花一些时间对我在范特西的一年做一些总结,把我在这说短不短说长不长的一段人生经历做一些沉淀和分享,希望有共鸣的朋友们一起交流。 我在范特西所经手的项目

  1. 饭特稀娱乐体育-在线体育娱乐社区
  2. 饭特稀手机应用-手机版体育娱乐应用(android和iOS)
  3. 范特西游戏平台-网页游戏运营平台,范特西体育产品基础数据支持平台
  4. 范特西极速大亨-腾讯版的一款赛车网页游戏
  5. 范特西篮球大亨-腾讯版的一款篮球实时数据经营类网页游戏

##个人思考 自己喜欢做什么?自己能为这个社会创造什么?

在范特西的日子里,我了解了互联网,了解了网页游戏,移动应用,移动游戏。并结合公司的需要也做了部分切合自己的东西,比方说饭特稀应用。

##新的挑战 小恩爱,致力于为情侣用户服务的移动产品。

>> 继续阅读 <<

如何在mac上安装cocos2d-x-2.2

网络上有很多的安装cocos2d-x教程,但是我搜索之后发现,大部分都是关于1.x版本的,而cocos2d-x-2.X版本已经发生了根本的变化,所以导致很多人都无法正常安装和使用。

其实cocos2d-x-2.2的安装在论坛中是由一篇文章有做简单的回复。how to install cocos2d-x 2.2 on mac.

简单说明记录一下。

  1. 首先到www.cocos2d-x.org官网上下载2.2版本的压缩包
  2. 解压文件包
  3. 在mac电脑上用terminal,进入到你所解压的文件目录,我本机为:/Users/admin/Downloads/cocos2d-x-2.2/tools/project-creator
  4. 然后再在命令下输入./create_project.py -project cocos2dxTest2 -package com.yourcompany.cocos2dxTest2 -language cpp 以上几个参数很简单,就是指定项目名称,包名称,以及语言类型(目前提供三种c++/cpp,lua,javascript)
  5. 当输入回车键后显示以下结果,则表示你创建项目成功 MarstekiMacBook-Pro:project-creator mars$ ./create_project.py -project cocos2dxTest2 -package com.vancing.cocos2dxTest2 -language cpp

proj.ios : Done! proj.android : Done! proj.win32 : Done! proj.winrt : Done! proj.wp8 : Done! proj.mac : Done! proj.blackberry : Done! proj.linux : Done! proj.marmalade : Done! New project has been created in this path: /Users/mars/Documents/Library/Cocos2d-x/cocos2d-x-2.2/projects/cocos2dxTest2

Have Fun!

然后你进入到cocos2d-x主目录的projects下,点击proj.ios/mac通过xcode打开项目,然后你点击运行即可使用iOS模拟器打开创建的demo项目效果了。

真心很简单。剩下的就是你对产品和cocos2d-x以及c++语言的结合使用了。祝我好运!

>> 继续阅读 <<

[译]特殊的Xamarin Libgdx 0.9.9预发布版本

So, i’m about to purge all Xamarin related things from our repository. For those users that are still using Xamarin, i prepared a special release, which you can find here. I also created a Git tag so you can still browse the source online easily.

因此,我要从我们的仓库中清除所有xamarin相关的东西。对于仍然使用xamarin这些用户,我准备了一个特殊的发布版本,你可以在这儿找到它。我也创建了一个Git Tag,你仍然可以轻松的在线浏览源码。

This release contains the current master version of libgdx, and the latest IKVM-Monotouch version. I tested it with on all iOS versions >= 5.0 via the simulator, as well as on iOS 6 and iOS 7 on devices. If you run into any IKVM-Monotouch issues, i’m afraid we won’t be able to help you.

这个发布版本包含了当前libgdx主版本和IKVM-Monotouch最近版本。我在所有的大于等于iOS 5.0 的模拟器,iOS 6,iOS7设备上测试了它。如果你运行IKVM-Monotouch有问题,我恐怕我们不能帮你。

I also removed any mention of Xamarin from our Wiki over at Github. You can find the Xamarin/iOS notes are still available, but not linked from the TOC.

我也把我们在github WIKI里任何提及Xamarin的都移除掉。你可以找到Xamarin/iOS笔记仍然可用,但是没有TOC的链接。

I will now remove the backend from the build, Git repo and setup-ui.

我现在将移除构建,git仓库和setup-ui的后台。

The real 0.9.9 release will happen soonish, i want to finish the new setup-ui based on Gradle first. We (read: i just force this on everybody) also have some plans to let you share your own extensions much more easily with others through Gradle. More on that soon.

真正的0.9.9发布版本不久将发布,我想首先完成基于Gradle的新setup-ui。我们(阅读:我只是迫使这样对大家)也有一些计划去让你分享你们自己的扩展与他人更容易通过Gradle。更注重短期效应。

>> 继续阅读 <<

[译]Libgdx和子弹物理RoboVM iOS上通过

Silky smooth 60fps. All hail Xoppa!

如丝般的60fps.向Xoppa致敬!

JNI invocation overhead is extremely low with RoboVM, and we compile Bullet with NEON enabled for iOS. Really impressive. Take that Unity :p

用RoboVM JNI调用开销格外低,并且我编译iOS的带霓虹灯的子弹。真的令人印象深刻。接受整合吧!

>> 继续阅读 <<

[译]Xamarin的问题和构建变更

I’ve been checking on the progress on the Xamarin front. As you may remember, we are phasing out the Xamarin backend.

我一直在坚持Xamarin前面的进展。您可能还记得,我们正在逐步淘汰掉Xamarin后台。

It seems the problems with the Xamarin backend are not resolvable. Michael Bayne from ThreeRings has fixed up many things, but it seems many of our users are still having issues despite those fixes. I’m in favor of not releasing the Xamarin backend in the upcoming 0.9.9 release. I would tag or branch the Git repository to keep the Xamarin backend available, then remove all remnants of the Xamarin backend from the repo. The nightlies and release would not contain any Xamarin related things anymore (drastically cutting down the download size of libgdx as well). What are your thoughts on this matter?

看来Xamarin后台问题不能解决。来自ThreeRings的Michael Bayne修复了许多问题,但是似乎我们的许多用户仍然又问题尽管有这些修复。我赞成在接下来的0.9.9Release版本中不释放Xamarin后台。我将标记或者分支git资源库去保持Xamarin后台可用,然后从资源库移除所有残余的Xamarin后台。每日构建和发布版本将不包括任何Xamarin相关的东西了(大大降低了下载libgdx包的大小)。你对这件事情有什么想法呢?

Also, i want to kill the unholy Ant build script of death in favor of our Maven build. Reason being that the setup-ui will be transitioned to use Gradle in the near future, and Gradle requires our stuff to be in a Maven repository. By forcing myself to fix up the Maven build (it is up to date and fully functional, including gdx-freetype and gdx-bullet), i can guarantee that the Maven releases are pristine. I’d also like to get input on this.

还有, 我想要杀死邪恶的ant构建脚本倾向于我们的Maven构建。原因是在不久的将来,setup-ui将转换到使用Gradle,而我们的东西Gradle需要在一个Maven资源库。通过自己强迫修复Maven构建(这是最新的功能齐全的,包括gdx-freetype和gdx-bullet),我能保证maven版本是原始的,我也喜欢在这里输入。

RFC!

>> 继续阅读 <<

[译]欢迎你的新领地:Gradle

I’ve been sick the last few days, and figured i’d learn Gradle. I created a Gradle based libgdx template, which you can start using now. It will eventually replace our current Setup-UI to make my life more enjoyable. IT will also allow you to build and run your libgdx projects on the CLI, Eclipse, IntelliJ and even Netbeans. And on top of that, you’ll not have to juggle any JARs or native libraries anymore, everthing is taken care off for you. You can update to different version of gdx, and easily include extensions or other 3rd party libraries. So, what is this magical Gradle?

我最近几天一直在生病,设想我学习Gradle.我创建了一个基于libgdx模板的Gradle,你现在能启动。它现在就可以开始使用,它最终将替代我们目前的setup-ui,使我的生活更有趣。它也将允许你构建和允许你的libgdx工程在CLI,Eclipse,IntelliJ和Netbeans.而最重要的是,你将不必在任何JARs或者更多本地库之间周旋,每一件事情将为你小心关闭。你能更新到不同libgdx版本,并且容易包含扩展的或其他第三方库。那么,这个神奇的Gradle是什么呢?

Gradle is a build and dependency management system, using Groovy and some domain specific language sugar. A build system is responsible for compiling your application and packaging it up. A dependency management system allows you to define which 3rd party libraries you want to use, and the system will automatically pull those libraries in for you. Provided the libraries are available in some sort of repository. The most established type of repository in Java land are Maven repositories, with Maven Central being the global central hub to which almost all things get published to.

Gradle是构建和依赖管理系统,用Groovy和一些特定域的语言sugar.构建系统是负责编译你的应用程序和打包。一个依赖管理系统允许你定义你想用的第三方库,且系统将自动为你放那些库。准备的库是可用的在一些资源库里。历史最悠久的库在Java领地和Maven资源库,Maven中央仓库,几乎所有的事情都发布在全球中央仓库。

Here’s what defining such dependencies looks like in Gradle for a libgdx project that also uses the FreeType and Bullet extensions (no GWT and iOS yet):

下面是定义了一个libgdx工程在Grdle的许多依赖是什么,也用于FreeType和Bullet扩展(还没有GWT和iOS)。

>> 继续阅读 <<

[译]第一个基于RoboVM/Libgdx应用上架AppStore

For about 2-3 weeks now i’ve been actively switching our libgdx game dev framwork’s iOS efforts over from Xamarin/IKVM to RoboVM. For those of you who missed the last few weeks of libgdx updates, here’s a breakdown what RoboVM is and why we use it.

大约2-3周,现在我一直积极地切换我们的libgdx游戏开发引擎的iOS从Xamarin/IKVM到RoboVM.对于哪些近几周未更新最新版libgdx,这儿有一个详细说明为何我们要用RoboVM.

##What’s RoboVM?

##RoboVM是什么?

The promise of RoboVM is a fully workable ahead-of-time compiler for JVM bytecode for iOS (and 32-bit Linux/Mac if you fancy that). RoboVM uses Soot and LLVM to transform the bytecode to native x86 or thumbv7 ARM code. RoboVM employs Android’s latest runtime class library iteration, making it compatible with pretty much any JVM library/language out there. RoboVM also comes with a set of bindings to the ObjC APIs of iOS. These bindings are realized via a custom Java-to-native bridge called Bro, and generated automatically from header files, with minor manual intervention. JNI is of course also supported, pending some more esoteric features.

RoboVM许诺它是一个完全可运行的ahead-of-time编译为JVM字节码iOS(和32位的Linux/Mac,如你看中的那个)。RoboVM使用Soot和LLVM转换字节码为本地X86货thumbv7 ARM代码。RoboVM采用Android的最新运行类库迭代,使其兼容几乎任何JVM库/语言。RoboVM还带有一组绑定iOS的ObjC API.这些绑定实现通过一个自定义JAVA到本地的桥叫弟兄,并自动生成头文件,有轻微的人工干预。当然也支持JNI,处理一些更深奥的功能。

##Libgdx, Xamarin & RoboVM Previously we leveraged [Xamarin iOS] plus a port of IKVM by Michael Bayne of PlayN fame to get our Java based game dev framework to work on iOS. This combination worked, but had its flaws. For one, not all of the Java runtime classes were supported, most prominently the java.net package. Also, some parts we heavily rely on in libgdx, like JNI, were extremely slow with the Xamarin/IKVM hack. Note that this is not an issue with Xamarin iOS itself, but due to the nature of the IKVM port. Xamarin have been extremely helpful and gave us a few licenses at a very low discount for development. All this limitations also meant that running anything complex was always a gamble, and using other JVM languages was pretty much out of the question.

之前我们利用Xamarin iOS附加PlayN的Michael Bayne开发的IKVM的部分整合我们的基于Java游戏开发框架工作在iOS上。这种组合工作,但是有它的缺陷。例如,不能支持所有的Java运行时类,特别显著的是java.net包。此外,一些地方我们严重依赖于libgdx,像JNI,Xamarin/IKVM极其缓慢。注意这个不是Xamarin iOS自身的问题,而是归咎于IKVM端口的性质。Xamarin一直有非常有帮助,给了我们几个很低折扣的开发许可证。所有这个限制也意味着运行任何复杂的都是一场赌博,并使用其他JVM语言几乎都出问题。

RoboVM fixes many of these issues. The JNI bridge is considerably faster, there are less layers of abstractions, all of the Android runtime classes are available, it will allow us to write games in Scala and JVM languages other than Java, and best of all, it’s entirely open-source under Apache 2. Libgdx development on iOS thus becomes essentially free, apart from the Apple tax (developer license, need for a Mac). Note that Trillian AB will eventually have to start looking into options to further fund RoboVM. If we get a chance as a community to help fund RoboVM, we should definitely do so. RoboVM is shaping up to be an excellent tool, and i think it’s worthwhile to support, just like Xamarin.

>> 继续阅读 <<