This app has invalid architecture, and may have been built with invalid build settings or incompatible tools

这两天iOS项目上线,中途遇到很多问题,说一下最坑的一个吧!哈哈:
按正常的流程打包上传都没问题,可是上传的包一会儿(两分钟左右),然后发了如下信息到我的邮箱。

Dear Developer,

We identified one or more issues with a recent delivery for your app, “** ** ***”. Please correct the following issues, then upload again.

Invalid architectures – This app has invalid architecture, and may have been built with invalid build settings or incompatible tools. Try rebuilding the app with the latest Xcode version. If you are using third party development tools, contact the provider.

Best regards,

The App Store Team

真的说的很笼统,根本看不出原因,猜测,以为是Xcode版本的原因,于是就把电脑系统还有Xcode升级,再来一遍,还是如此,来来回回折腾了三四遍,才找出原因:

原来是项目版本太低了,现在最低支持8.0,而我选的是填6.0,这真是太坑了,改完之后在打包上传就OK了,就算有其他原因导致上传失败,也会报错的(没改之前不会😄)。

Cocos2dx-lua functions

基于cocos2dx-lua 3.1 自己写的一些常用方法,现在分享出来,有不合理的地方还请指出来

–数组乱序
function XRLTools:arrayRandomSequence( array )
if not array or type(array) ~= “table” or #array < 2 then
print(“error array type !”)
return
end
local len = #array
for i=1,len do
math.randomseed(os.clock()+i)
local seed = math.random(1,len)
local seed2 = math.random(1,len)
local value = array[seed]
array[seed] = array[seed2]
array[seed2] = value
end
end

例如:local array = {1,2,3,4,5}
XRLTools:arrayRandomSequence( array )

–延时调用
function XRLTools:delaycall( time,callback )
if time <= 0 then
callback()
else
local delayAction = transition.sequence({
cc.DelayTime:create(time),
cc.CallFunc:create(callback),
})
local scene = display.getRunningScene()
scene:runAction(delayAction)
return delayAction
end
end

例如: XRLTools:delaycall( 1,function ( … )
print(“延时一秒打印”)
end)

–两区域是否重叠(可用于碰撞检测)
function XRLTools:rectIntersectsRect( A,B )
local rect1 = A:getBoundingBox()
local rect2 = B:getBoundingBox()
return cc.rectIntersectsRect(rect1, rect2)
end

–判断一个点是否落在一个node上面
function XRLTools:isTouchInNode(pt, node)
local s = node:getContentSize()
local rect
if s.width == 0 or s.height == 0 then
rect = cc.utils_:getCascadeBoundingBox(node)
else
pt = node:convertToNodeSpace(pt)
rect = cc.rect(0, 0, s.width, s.height)
end
if cc.rectContainsPoint(rect, pt) then
return true
end
return false
end


IOS Publish to the App store

写一个IOS 发布到appstore的流程供初学者参考。

第一步:登陆Apple developer 后台创建一个APP ID;

第二步:登陆APP Store Connect 选择 My App > ➕ > New App ,然后填一些信息,比如app name ,Platforms,Primary Language等,注意:SKU 的可以和Bundle ID相同,我一般都填一样的,方便记住。

第三步:完善app信息,比如app名字,副标题,分类,价格,截图,关键字,描述等等,需要注意的是Rating(评级)得跟app的内容符合,不然很容易被拒。

第四步:在Xcode打开你的项目,把build Configuration 改为Release,Bundle Identityicier改为你刚才创建APP ID时的bundle ID。然后完善一些信息,比如启动图,版本号,图标等,这里要注意的是图标不能带有透明通道。

第五步:点击product > Archive 等待编译完后会弹出一个页面,然后选择Distribute App,选择 iOS App Store 然后next,一路默认选择,一路next,最后点Upload,等待上传完成 。

第六步:上传成功后在Activity里就能看到你上传的版本了,在等大概10分钟左右,在Build里选择刚才上传的版本,然后点Submit for Review。如果app包涵广告,需要勾选Advertising Identifier,最后提交等待审核。

匆匆的写完了,写的很简单,有明白的地方或者不详细不正确地方可以联系我yang2686022430@163.com,也可以在评论区直接评论,我会在看到的第一时间回复你。《杰理的日记》是我发布的一款记事本软件,大家可以下载体验一下,虽然简单,但是“麻雀虽小,五脏俱全”。

cocos luacompile(coocs2d lua encrypt luac)

网上关于用cocos luacompile 把lua加密成luac的教程很多,我写在这里主要是方便自己查阅,废话不多说,在装好cocos环境后运行:cocos luacompile help 命令可以查看帮助。

cocos luacompile -s SRC_DIR_ARR  -d DST_DIR 该命令可以对lua文件简单的加密,直接这样加密很容易被解密,所以通常用下面的命令:

cocos luacompile -s SRC_DIR_ARR -d DST_DIR -e -k KEY -b SIGN –disable-compile

解释一下这几个参数-s 后的SRC_DIR_ARR 是资源路径即要加密文件的路径,-d 后的DST_DIR是输出的路径即加密后luac文件的路径, -e 后面可以不跟参数, -k 后的KEY是密匙,你自己设置一个字符串,复杂一点比较好, -b 后面的SIGN是签名,也是要自己设置一个字符串(在加密的文件中sign是明文)。执行完后会提示Compilation finished.说明成功了。

如果你设置了密匙和签名,还要在AppDelegate.cpp 中修改key和sign

LuaStack* stack = LuaEngine::getInstance()->getLuaStack();
stack->setXXTEAKeyAndSign(key, strlen(key), sign, strlen(sign));

如何生成xxx.fnt文件(Bitmap Font)

在游戏开发中(如:unity ,cocos等)我们经常会看到一些xxx.fnt的资源文件。这些文件是用来干什么的呢?它一般是用来显示玩家的金币数,倒计时等。今天来浅谈一下如何生成这种文件吧!得用到Bitmap Font Generator这个小工具。Windows下载

打开软件的界面是这样的,当鼠标在上面移动时,箭头指的地方会显示字符对应的ID,比如0的ID就是48。这个ID其实是一个十进制的Unicode编码,在线获取中文的unicode编码,比如:‘万’的unicode编码为:\u4e07,这还不是最终我们要的ID,还要将unicode编码的十六进制转换成十进制。(进制在线转换)如:4e07转换后为:19975,19975就是‘万’的ID,得到ID接下来看看怎么使用:

1.点击 Edit > open Image Manager 打开图片管理面板;
2.点击 Image > import image 选择要导入的图片,这时候你就看到有个地方让你填ID,你把我们最终得到的ID天就去点确认就好了;
3.点击 Options > Export options 打开导出设置面板,

注意红色箭头的地方要选对,其他的根据实际图片图设置。

4.点击 Options > Save bitmap font as … 给要生成的文件取个名字点击保存,然后你就看到生成了一个xxx.fnt 文件和一个 xxx_0.png的文件,把这两个文件拖到你的项目中就可以使用啦!!!

注意,注意,注意,重要的事情说三遍:导入的图片和路径都不能包含中文和空格,第二步点确认后还是没显示图片就请检查一下图片格式(不要只看后缀,之前就遇到一个坑,压缩的图片怎么都用不了,只好用ps重新导出)。

本文完!如果有不对或者不详细的地方请指出,链接的网站如有侵权请联系我删除。

Talk about skynet

skynet是云风发布的一个开源的轻量级服务器框架。底层采用C编写,逻辑层通常用lua,官方版只支持Linux系统。非常适合作为游戏的服务器框架。你只需要从GitHub上clone下来简单的编译一下就可以体验了。

安装和测试在wiki里写的很清楚了,我这里就不说了。需要注意的是要安装两个第三方工具readline-devel和autoconf,每个系统的安装指令不一样,wiki里都有写,我用的是centos命令如下:

yum install -y readline-devel autoconf

原谅我对服务器一无所知,当我把环境都搭好,并且成功启动了第一个服务后我却不知道要怎么让他停下来,也不知道怎么重启,在没停下来时候再次启动服务就会报错,百度了好久也没解决。嗯~糗事就不说了。快捷键command+.就可以了。也可以直接把进程给杀了,Linux查看进程:lsof -I 杀掉进程: kill -9 pid

在test文件夹下面有很多测试例子,如:mysql,socket,http等,你都可以亲自测试一遍。

lua 时间函数os.time()和os.date()

  • os.time()      –获取当前时间的时间戳
  • os.time({year =2016, month = 11, day =23, hour =17, min =17, sec = 00})     –获取指定时间的时间戳
注:任何一个时区,在相同的时间,同时调用os.time() 返回的结果都是一样的
  • os.date()    –把时间戳转化成可显示的时间字符串
  • print(os.date(“%Y–%m–%d %H:%M:%S”))    –获取当前时间戳的时间符串
  • print(os.date(“%Y%m%d %H:%M:%S”,1544084774))    –获取指定时间戳的时间字符串
注:如果服务器返回一个时间戳,客户端想要转换成可读样式,需要考虑到时区问题,因为是按照本地时区转换的,如果本地时区跟服务器所在时区不一致,就会导致时间显示错误,一般解决办法就是 加上时区差即可。
获取时区: tonumber(os.date("%z", 0))/100

Continue reading “lua 时间函数os.time()和os.date()”

mysql create database

  • create database  databasename ;
  • CREATE DATABASE databasename DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;     //support Chinese characters
  • CREATE DATABASE databasename DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;        //support Emoji characters

  • show character set;


今天创建数据库的时候报了以下错误:

BLOB/TEXT column ‘driaycontent’ can’t have a default value

是这两种数据格式不能有默认值,好奇就去查了一下,原来这两种数据类型还有些特殊,具体可以自己去百度,看了一下别人的解释是这样的