CVP接单有感:一定要和有理想的人谈理想和靠谱的人做靠谱的事.

前序:

和有理想的人谈理想, 会认为那是理想。同样的话说出来, 即便你再真诚, 也会有人觉得空洞. 觉得空高大. 因为不真诚的人也可以这么说. 但是时间久了.就能区分了. 因为还要做事的。如何避免重复造轮子,如何扬长避短, 如何协作,  程序员这个群体不能一味的善良的做资本的炮灰, 陪着烧钱烧脑细胞, 加班是万能的法宝吗? 如果可以有一种方式, 技术,时间,金钱互换,然后节省更多时间做擅长的事, 应该是最低碳环保的。

简单说一下这次接到CVP任务的感受.

这次接到这个任务也是机缘巧合, 也算是天时地利人和了。先是和cocos有缘. 因为一直以来, 去浏览 cocoachina 论坛已经是我生活的一个习惯了.  也许还有人记得 2008年时我曾经做过ccgamebox的项目模版. 当时其实是准备做IOS游戏的了. 不过后来转去搞3D MMO RPG了. 2012年开始关注点再次回到移动平台.

10-15号那天刚好看到CVP的任务在论坛发布,  我打趣的回了贴,  包食宿不, 没想到负责CVP的cocopeng同学很热情的和我交流.  很敬业的说. 其实当时还没决定要做。

处于好奇就多看了一下, 结果就发现个有趣的点,我一直都是比较喜欢捕捉这种新的技术点,觉得很好玩。微软正在做UWP的整合和过渡. 而cocos2dx引擎v3.5开始出现universal的模版工程了. 但是显然从某个版本干掉了老的 XAML C#结构的工程模版. 于是目前就出现了一个空档期. 就是新的基于UWP的架构的内购支持并没有人实现,至少没有人公开过. 搜索一下千篇一律都是老的结构模式.  所以我就打消了原本有些狐疑, 看来这的确是个技术问题, 估计谁要做都得折腾一下了.  看要求也只是说支持WP8就行了, B计划就是用XAML C#的那套方式吧。

不过内心里没有放弃过使用C++的方式来实现.  毕竟UWP是大势所趋. 用C++写岂不是很舒服. 也不用去看C#那些劳什子. 然后我做了个决定, 就是先做一下技术测试. 看看模拟器上是否可行.  然后就是各种问题. 都是细节, 有时间我会整理出来。一开始也没有什么头绪. 能解决也有点偶然。不过很多看似偶然也是必然的吧.  如果我也和其他人一样略做尝试一下就放弃了,也就没有这次接单了, 我想该坚持一下的时候,人还是得坚持一下。 而且还有个意外的收获, 就是同时还解决了Win10版本的商店接入问题。毕竟API接口都很相近,流程又一样。但如果只是偷懒去弄那个老的 XAML C#的话, 也就只能凑活着完成这次的任务了。

另外刚好4月份因为微软比赛的事, 已经配置好了开发环境. 所以这次就很顺手, 直接开始了. 之前安装环境其实还有些折腾.有点小坑的. 文档 开发环境  cocos引擎.  一切都是准备就绪的.这也节省了时间.很快我就可以开始动手了。

先从文档开始. 了解. 跑一下SDK的例子. 然后跑模拟器. 然后整理了一下流程图.  开始动手用3.5版本的引擎配置环境.  看文档之后.写了个最简化的版本的WPStore Helper  并很快可以run了. 当然直接就崩溃了.  这是第一个点. 估计很多人都卡在这里了.  我理解起来就是信息的不对称. 因为用cocos引擎的同学大多不太关心平台相关的部分. 而这部分cocos做的比较好可以无缝升级. 所以对于Windows平台很多同学并不是很熟悉.  而因为开发时间要求的比较紧张, 可能就有了这次任务发布。

另外选择可信的项目合作方是外包项目常见的问题,搞不好就会陷到项目里。这次任务从前到后都有专人负责接洽 负责督促 协助解决所需的 软硬件资源, 环环相扣, 如果不是各位同学专业的合作精神, 也不会这么顺利。这次任务基于 cocos 引擎可以把需求很好的独立出来, 可见未来基于 cocos 引擎 进行远程Remote协作也是可行的。

 

 

这个任务中遇到了那些技术难题, 是如何解决的?

技术难题我觉得其实就是一个. 如何在 cocos 里面调用系统的内购接口,而又不会导致系统崩溃。直接调用会崩溃是一个错误代码.   参考这个: https://social.msdn.microsoft.com/Forums/windowsapps/en-US/6efb19e6-579d-4bb4-9e7b-d7e394f1ae45/crash-when-inovde-currentapprequestproductpurchaseasync?forum=wpdevelop  大致就是不要在后台线程里面调用UI的操作请求. 解决办法就是找到UI线程. 然后把请求转移到这个线程. 原理是一样的。 解决方法参考这里: http://social.msdn.microsoft.com/Forums/en/winappswithnativecode/thread/e36f84be-db95-4764-951e-bfa662cdd11d

还有个点 :就像做手术要微创一样, 要选择一个最合适的地方嵌入代码. 我的思路就是做成模块, 只提供接口和捕鱼代码交互。尽量少的改动上层代码, 而集中于平台相关的底层部分,这样不会带来破坏性 引入bug。

其它的就是常规的内购流程实现和调试了. 这个基本按文档来就行了. 这里的难点不是技术上的, 而是环节比较多, 而且微软商店刚刚合并过一次. 实践起来细节有一些变化,多实验几次就好了。同时也得合理的设计一下代码结构,能在模拟和真机购买之间切换。

能和大家分享的其实就是善用搜索和梯子.

WP8支付的SDK怎么样, 有哪些坑是需要和大家分享的. 

文档过时: 现在这个时间点上.很多文档都是旧架构的. 没有UWP方式的. 而cocos2dx 3.5是最后一个支持 C# XAML架构的WP8工程的版本. 之后就被UWP替换掉了。目前可以搜索到的大部分信息都是这个老架构的。而我的目标是UWP架构,参考资料就少了很多. B计划是沿用 C# XAML的工程模版. 可见这个技术点其实很有市场的, 很多用cocos引擎的同学并不擅长做这些平台相关的工作。

异常崩溃问题的干扰: 因为代码会有崩溃问题. 只是需要处理异常捕获就可以了, 而不是彻底消除掉. 一开始也很困扰我, 后来确认并不会导致闪退之类的问题. 系统会抛出Platform::ComException^.  加上官方例子是 createtask 一层套一层… 头大啊。不像C#版本那样写的好看. 大家可以对比一下.

C++版本.

create_task(CURRENT_APP::LoadListingInformationAsync()).then([this](task<ListingInformation^> currentTask)
{
try{
auto listing = currentTask.get();

auto licenseInfo = CURRENT_APP::LicenseInformation;
//TODO: notify cocos after list products.
#ifdef _DEBUG
int count = listing->ProductListings->Size;
cocos2d::log(“total %d products”, count);
if (listing->ProductListings->HasKey(“goldcoin”))
{
cocos2d::log(“find product1”);
}
#endif
//clear cache first.
m_cacheProducts.clear();

for (auto pair : listing->ProductListings)
{
// do stuff
auto key = pair->Key;
cocos2d::log(“product key %s”,pstos( key).c_str() );// ProductListing(pair->Value).Name);
//Name,Price,Description
addStoreProduct(pair->Value);

}

}
catch (Platform::Exception ^exception){}

});
///////////////end core function.

 

C#版本.

private async void btnStoreLoad(object sender, System.Windows.Input.GestureEventArgs e)
        {
            try
            {
                var ProdList = await CurrentApp.LoadListingInformationAsync();
                lbProductsList.Items.Clear();
                string t = "";

                foreach (var item in ProdList.ProductListings)
                {
.......
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error: " + ex.Message);
            }
        }

 

测试设备解锁:  8.0版本的设备已经不能解锁成测试开发机了.  解锁时会有一些问题, 比如时间设置什么的. 另外屏幕锁定真是很烦人, 一不小心就会导致部署失败,习惯了就好了。 一般人看到红色错误就很紧张的。

注册第二个设备的问题. 需要改一下名字. 就是把资源管理器里面识别的 Windows Phone 改个名字就行了. 不然会提示错误.

真机购买提示商店状态不可用: 就是真机上不能真购买. 只能模拟测试购买. 直到提交审核上线以后 才可以. 无论是下载的,还是调试方式部署到真机的。

会遇到开发者账号登陆异常提示:  每次打包时不时的就会让你登陆一下开发者的账号。还有可能会弹出安全异常验证。 然后要绑定的手机号或者邮件接收验证码.  建议千万不要做这个联系人, 不然会半夜有人给你打电话要验证码的.

在这里任务中 C++和C#是如何互调的. 哪些经验是可以分享的. 

这次任务其实我并没有用常规的那种XAML C#  呼叫 C++ Runtime Component的架构 , 我选择的技术方案是基于流行的 UWP的项目结构. 是纯 C++的方式. 调用C++版本的Windows Store的接口。

能解决这个问题是基于 A+B+C的的拆解思路.

首先:  我对cocos2dx引擎一只保持关注, 所以清楚每一次版本变更的大部分细节, 进而会有一些结论和判断. 我想每个人做事都是有自己的选择, 而选择的前提就是基于自己的视角作出的判断. 比如上面提到的砍掉C#方式的工程模版, 我的结论是UWP会大行其道。那么IAP内购这事肯定UWP也是支持的.

然后我就去查了一下C++的IAP接口. 发现只有 Windows 的.  前面说是 加法模式起效果了,  UWP这个概念其实就是Windows所有平台一套代码. B就是UWP的概念告诉我们 Windows Phone 也是支持的.  当然了支持到什么程度还是有些差别的。

最后一点就是C了. 需要抛开cocos2dx来看这个需求. 然后再去寻找相关的资源. 哪怕是一句话, 就会引导我们沿着正确的方向前进了。 大部分文档都忽略了一些细节, 也就导致短时间想读懂读通比较困难。我刚好有些积累. 找到官方的一个例子是给DirectX Game添加内购的.

这是准备工作阶段了, 理论上没问题了, 就确保方案可行了。

简单的说 就是没有现成的白面包,但是会有面和烤箱之类的. 能让你得到一个白面包。很多问题都是可以通过拆解成一些小的点得到解决的。

是否愿意把这次的任务编成WP支付教程.并分享到CVP平台上.

大家都知道cocos2dx引擎是开源的, 所有我就有了一个测试沙盒, 可以和捕鱼达人一样的运行基础. 我只要在HelloCpp里面跑通了, 那么捕鱼达人项目一样也可以实现。如果不是这样的话, 就很难有这么轻松了。所以首先得感谢cocos引擎提供这样的协作方式。我其实一直有写BLOG的习惯. 也愿意和大家分享一些心得体会. 苦于知音难觅. 我尽快整理一下细节, 写成WP支付接入教程, . 甚至整理好开放源代码 加到 Cocos PluginX 里面. 现在代码还是比较暴力了一点。

支付教程整理打赏模式?

如果有人打赏当然更开心了。

谈谈对于CVP这种平台的看法和期望.

因为有cocos引擎,才使得这种解决问题的方式变得可行. 我可以先测试, 然后再一起合并代码. 延伸开来,岂不是会将很多事情变成可能, 我甚至能想象如果有一天我们每个产品都变得非常的模块化,  远程协作 以及基于模块级别的代码复用 进而可以极大提高生产效率,还能解决技术短板. 希望CVP平台能够完成这个使命, 实现双赢的未来。也许不久的将来, 不再有公司, 不再有无谓的加班, 我们只要做好自己擅长的部分, 集中在想法和创意环节。 时间是最宝贵的成本. 一个人能有几个10年呢。

开源的魅力不仅于此, 如果功能欠缺, 就可以自己动手添加, 调试等各方面的难度都会降低很多.  反观如果是Unity那种引擎, 是通过il2cpp转换的, 时不时的真机就会黑屏, 崩溃掉. 很是捉急。项目开发的时间和规模越久 出问题的几率越高. 如果刚好赶到上线阶段, 不光是要加班不可避免, 还要面临一些不确定性。时间紧任务急啊. 长此以往把程序员兄弟们的身体都搞坏了。而且明知道有一些bug,也没有办法自己修复.  Unity做个编辑工具应该很好用,负责美术资源的制作, 然后cocos作为Runtime. 是我心目中的理想组合。

CVP这个平台太好了, 希望能认识更多的朋友, 一起加速跑, 告别单枪匹马, 开启集体围猎模式。

我还得啰嗦几句, 就是开发人员得注意平时的积累, 多与人交流。一句话可能就会节省很多脑细胞, 希望大家都能来加入CVP这个平台, 做自己的主人。如果有技术问题欢迎交流。

 

Read More