这是一篇把Unity做的应用提审到AppStore的踏坑指南,记录这个过程中遇到的几乎所有问题。

!!注意!! 这篇文章可能具有一定时效性,由于苹果审核策略一直在更改,所以文章中所述言论仅仅基于当前的审核制度。

首先…Show一下苹果对我提交的应用的拒绝记录(我的内心此刻布满黑人问号)

从上图的时间看,苹果的审核速度大大加快,与2013年的审核速度简直云泥之别.然而反观国内的某些平台审核..越来越慢(客观非黑)

继续阅读

最近有个小需求,在移动设备(iOS / Android)中应用调用拍照并把所拍照片存入相册。我原本以为这是一个很简单的事情,不就拍个照然后把照片丢进相册?心想最多100行代码即可解决问题,谁知还是踩中坑。且听我一一分解。

必备权限

<uses -permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses>
<uses -permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses>
<uses -permission android:name="android.permission.CAMERA"></uses>

添加入 AndroidManifest.xml 中

执行拍照

File destDir = new File(m_ImageRootPath);
if (!destDir.exists())
{
      destDir.mkdirs();
}

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(new File(m_ImageRootPath , m_ImageName)));
startActivityForResult(intent, 100);

代码中 m_ImageRootPath 为照片所存目录,m_ImageName为照片名。注意,若拍照不止一张 则照片名字最好每次不一样,否则你打开相册有可能每次都只能看到一张照片。

继续阅读

忽然之间就到了年中,7月也在还没反应过来就已经到了最后一天。虽然才到年中,但是今年遇到的事情已经足够多了。简单记录一下。

工作

是的,和很多坚如磐石的同学朋友不一样,我的工作又变动了(上次变动是一年之前),又经历了一次 离职谈判散伙聚伙,还好这次也不需要经历那种 投简历 – 约面试 – 谈薪资 的过程。可能是由于不是第一次经历这种事情 所以丝毫没有任何的离别情绪和不舍,一年前从毕业后的第一家公司离职 满腔遗憾和愁绪还是略微大一点点,现在的这次反而落得轻松自在。目前我已经在新的公司入职半个月,从效率和任务完成度 心态 甚至代码量上看 这次的工作变动是一个好事。

这次离职也并不是那么的顺利,如果敞开说 甚至可以唠上一整天,我们这个环境下 10个公司有9个都是耍流氓的,原本以为可以轻松的拿到赔偿(N+1)走人,结果谈判了半个月才顺利结束了合同!这是这段工作中唯一的遗憾。

这次的离职后 有朋友邀请我去国外工作,这对我来说是巨大的诱惑,从金钱和发展上都是,毕竟从技术上讲 我现在应该处在一种舒适区,我内心迫切的想跳出这种舒适区,从金钱上讲,我目前的阶段已经很难找到直接double薪酬的工作了(除非天降大运),考虑半个月之后 我居然拒绝了他。目前已经在新的公司和项目组工作了半个月,由于组里基本都是熟悉的人 所以没磨合的压力。目前反而每天很乐意去上班,这与之前每天起床不想去上班简直是天地之别。我承认过去有超过半年的时间里 非常讨厌上班。现阶段的工作目标就是单纯的完成基本任务了 — 又回到这种单纯的工作状态。

继续阅读

这是一篇书评

西藏生死书,这本书我在两年前阅读了一遍,为何等待到今天才想起把当时的想法写下来?一来是两年之久 我还能存在于我心中的东西 才是我真正在这本巨作中得到的东西,二来因为针对书中的话题,我需要长久的去思考,实在是太沉重了。抛开书中的宗教倾向,这本书的主题是 — 生与死。这本书应该可以划分为宗教书籍(据我考察 它也确实是西藏佛学典籍),但是我认为剥开宗教信仰神论的部分 才是它的精髓所在。

从我很小的时候开始,我对死亡的好奇心就重于生

我从小就非常想知道 我死之后会发生什么(当然我还有其他很多好奇的事情),想知道宇宙浩瀚究竟是怎么回事?想知道我为何是独立的个体?我为何有“思想与想法”这种东西?我死后我的思想会不会在另一个个体里存在?想知道我眼里的红色和你眼里的红色是一个颜色么?想知道我对气味,阳光,雨露,风霜的感受是不是和每个人一样?

继续阅读

项目开发笔记(十)

最近真是繁忙,公司项目 业余项目都同步推进中

公司的项目最近略有松散,但是感觉自己也应该做到了称职。按照公司目前的项目开发模式,可以预见未来很长一段时间都会处在一种 改 改 改 改 的节奏中。在这种节奏下 很容易把代码写烂,在很多次产品改需求 催进度的时候 我都时刻暗示自己 不要因为时间紧迫,而生产垃圾代码,不要因为功能变动,而产生过多硬编码,从这种角度来看 可能这种开发模式可以磨练人呢。

业余项目最近也处在最关键的一个阶段,业余项目的一个好处就是 我可以把任意一个地方模块 写成我自己想要的样子,我不用担心任何人破坏我原本的代码思路,我可以无限次重构 直到自己觉得优雅为止。可喜可贺的是,业余的项目终于可以产生收益了 Orz,之前的独立游戏 也有国外渠道愿意推广(太有眼光了),虽然对独立游戏的收益不抱希望。不管这些事情结果如何 都感谢大家的赏识。

好了,我们接下来扯今天要分享的技术内容。针对Unity使用c#脚本编写逻辑的项目,逻辑代码的保护也就是DLL文件的防反编译(Anti-Decompile) 目前市面上还没有一套完整的方案。

一般的防破解思路

在软件保护中 一般分为 客户端软件的保护 和 web软件的保护。客户端软件一般的防破解思路基本都一致,无论是win/OSX/Linux/Android/iOS 还是其他单片机上的软件程序。防破解的做法都是从 静态保护动态保护 两个方面着手。有可能很多其他地方管着两种方式的命名不一样。通俗的叫法应该是 防止静态反编译 防止动态反编译。

静态反编译(Static decompile)

所谓的静态反编译,就是在不调试的情况下根据软件的本体去查看实现逻辑或者原理(Q.普通没代码的软件也可以调试? A.一般无论是什么系统 Win Linux Android OSX iOS,其核心库 – Kernel层中都会带有调试功能的API,即使是在发行版本的操作系统中 这些调试接口也会被保留,而这些调试接口可以调试任意User层的软件,而我们开发的大多都是属于User层的软件。)

举几个例子:

使用Dex2jar工具对安卓安装文件APK进行导出jar,就属于一种针对安卓软件的静态反编译技术,
使用IDA OD等工具对 .exe .dll进行反编译 也算是一种针对win平台软件的静态反编译的行为。
使用JDgui工具对jar进行查看代码,也算是针对Java软件的一种静态反编译行为

继续阅读

个人游戏杂谈(一)

今天,我的第二款游戏装机用户已经突破1000,这里统计的是启动并玩过的用户,只下载不启动的不算,在没有任何推广策略。没有任何商业运营手段的情况下,我觉得已经非常惊喜了。特别是锤子,从锤子商店过来的用户让我大大吃了一惊,看来我要把几年来黑过老罗的话收回去了。以后尽量不黑他了Orz。

以下是我后台收集的自然用户来源比率:

这张图让我大吃一惊,从平台用户基数(平台的总用户量)来讲。锤子商店是图中最少的。从锤子科技发布的锤子手机销售情况判断,注意 市面上并没有锤子商店这个APP 也就是说只有用锤子系统的用户才能够进入锤子商店APP,才能从锤子渠道下载到我的游戏,作为一个用户基数最少的平台 竟然是游戏里用户最大的来源渠道,真猜不透这是为何。按照一般的来说,在不买量不推广的情况下,上图的比率应该是各自平台用户基数比率才对。

继续阅读

项目开发笔记 (九)

今天第二款业余独立游戏终于成功在GooglePlay上发布了,共计花了约1个月多的业余时间(每天下班后)。代码行数刚好1W出头。第一次以付费下载的模式上线,不管能不能卖出去但整个过程都非常有趣 每天都非常高效,思绪缠绕。对比公司的项目,真是效率低下。查看我最近三月的日志 关于公司项目的每天就2-3条信息,真是忍无可忍啊。废话说到这里,最近写了一个Unity中根据资源反查在prefab中引用的工具,今天我扯扯其中的原理。

prefab

预设,类似各种UI编辑器编辑后的输出文件,Unity中几乎任何事物都可以打包成预设,然后通过外部文件的形式再加载进程序里。不过是PNG/JPG等图片图集资源; GameObject Chartater之类的对象资源。

Unity中提供的搜索选项

Unity本身提供了一个资源引用搜索的选项,不过是针对当前Scene进行逐个资源搜索的,使用如图

这个选项并不能满足我们的需求,除了搜索某个资源在那个prefab被引用之外,在项目后期 我们还可能需要删除尚未被引用过的资源。

继续阅读

项目开发笔记 (八) – 依旧是一个重复的轮子

之前说我参与了一个比较 “不一样” 的应用开发,我主要负责其中很多涉及Unity调用原生功能的部分,例如个人用户头像需要调用手机相册摄像头获取,GPS,指南针,内嵌浏览器,包括一些流氓功能(天呀)等等。偶尔还会写几个Unity小模块,其中个人用户头像在显示上,产品要求与各种社交软件一样显示为圆形图片。之前已经实现了如何类似很多社交软件一样获取手机照片 – 传送门

Unity加载显示一张图片,然后使用Shader显示为圆形,这是一个重复的轮子了,但是看了大家的分享之后 发现不是在 Android无法正常裁剪 就是在iOS上显示为白板。所以决定把目前项目中用的分享出来。主要原理就是计算指定范围的像素,然后把像素点的alpha设置为0 (每个像素点都有 RGBA 四个属性值)

如图所示,左下角为UV原点,当纹理uv在 1 区域的时候,也就是满足

uv.x < _Radius && uv.y < _Radius

的时候,当点距离中点的长度大于设定的半径的时候,设置像素透明度为0.其他三个小块以此类推。

继续阅读

这是一篇技术书籍读后感

早在2014年的时候我就已经购入《程序员的修炼之道》.还是由于慵懒一直没有翻开,最近才把它从书柜里翻出来看完。

老实说这本书相比CodeComplete2来说,还是差那么点味道,但是它依旧是一本好书。本书通篇都在向读者灌输一种做一个注重实效的程序员的概念,这句话出现了不下几百次,200页的书这句话都够填10页了Orz。为了阐明作者观点,书中从以下几个方面进行了自我论证:

为何要注重实效

作者举了温水煮青蛙曳光弹等 去论证注重实效在软件开发中的作用之大。在这过程中 还把如果做好一个程序员等问题 进行了自我解答。更有趣的是,读完这部分我发现全世界的程序员都应该有一个共性 — 沟通能力普遍不足,因为作者甚至在如何沟通这个问题上 进行了大篇幅的教学,如何和程序员沟通,如何和用户沟通,如何和产品经理沟通,如何减少沟通 等等。

如果觉得自己工作过程中 无法流畅的和其他人沟通 不妨多读一读这本书。

如何注重实效

DRY

这部分的章节,我认为是本书最精华的部分,作者在很多地方都提了DRY原则-Don`t Respeat Yourself(不要重复自己),翻译过来 应该就是不要重复造轮子了。关于DRY原则 推荐一篇反DRY原则的经典文章 – DRY原则的误区,作者是一位有着神奇精力的程序员,做程序员做到他这样 估计就算到头了吧?

DRY原则在细微的事情上 并不一定值得推崇,例如我的很多博客分享的小知识点 其实都是重复造轮子,但是我是发现别人造的轮子不够完美的情况下 才会去重复造。虽然可能我的轮子在你那里也转动不起来!

继续阅读