2018-7-23lesson

Aug 2, 2018

2018/7/23

今天又发布了Colox 的第二版本,感悟到其中一些思想。
要做好一个完整,商用的产品,需要经过:

  1. 核心功能研发
  2. 整体方向,回款(产品售卖、广告营收、产品获利、周边发展等)
  3. UI 整体视觉
  4. 上线
  5. 开发营收
  6. 产品推广、改进

这几个阶段我觉得是个人开发很好的流程,而且一经决定一定要坚持下去。
我好几次都把产品开发拖的很长。原因有几个:

  1. 我在学习后台(当时有这么好的学习资源)
  2. 后台差不多了,也使用当时的语言js 学习游戏开发(也是刚好有这资源)
  3. 一直的学习,心却是有点累。

所以有时在家里搞着搞着,才搞了一个功能,或者某些小功能就退却,打游戏到了深夜。
之前在粉粉,每天下班回来晚,已经是半条命;现在新的公司终于终于能抽出空了呀!而且目前还在开发阶段,也不会特别特别紧,所以整体感觉都好了很多。
目前把产品推进,“哈皮涂色” 进入到了开发营收。我觉得可以有这几个点营收:

  1. 设置页面给一个二维码,是“鼓励开发哥哥,让他快马加鞭做出更好的产品”
  2. 横幅广告、激励性广告营收
  3. 内购该产品

CollectionView 里面layer.frame = frame

http://adad184.com/2015/11/10/disable-uicollectionview-implicit-animation/
UICollectionView.reloadData 时会做隐式动画。
可以使用以下三种:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//方法一
[UIView performWithoutAnimation:^{

[collectionView reloadItemsAtIndexPaths:@[[NSIndexPath indexPathForItem:index inSection:0]]];
}];

//方法二
[UIView animateWithDuration:0 animations:^{
[collectionView performBatchUpdates:^{
[collectionView reloadItemsAtIndexPaths:@[[NSIndexPath indexPathForItem:index inSection:0]]];
} completion:nil];
}];

//方法三
[UIView setAnimationsEnabled:NO];
[self.trackPanel performBatchUpdates:^{
[collectionView reloadItemsAtIndexPaths:@[[NSIndexPath indexPathForItem:index inSection:0]]];
} completion:^(BOOL finished) {
[UIView setAnimationsEnabled:YES];
}];

但是我要做的是一个gradientLayer 的布局(单元格形状不一样,布局是一样的),不得已。
于是这句话拯救了我,不然我就要用一张图片解决我问题了,问题是:

1
2
3
4
5
6
7
如果你的cell中还包含有CALayer的动画 比如这样
- (void)layoutSubviews
{
[super layoutSubviews];

self.frameLayer.frame = self.frameView.bounds;
}

解决方法是:

1
2
3
4
[CATransaction begin];
[CATransaction setDisableActions:YES];
self.frameLayer.frame = self.frameView.bounds;
[CATransaction commit];

LaunchScreen.storyboard 动态设置版本号

https://www.jianshu.com/p/5253f671436b
哈哈,连header 都是拿的原作者的。
小弟这里记录记录。

  1. 选中LaunchScreen.storyboard 的label,为该label 的Show the Identity inspector(XCode 最右边栏从左到右边:文本、问好、xx -> 就是这玩意啦),在Document - Label 填入”APP_VERSION”.
  2. 点击Project - Target - Build Phases - “New Run Script Phase”
  3. 给新创建的”Run Script” 改名为 “Update Launch Version”, 同时展开它
  4. 在Shell 后面输入 /bin/bash,然后在下面输入脚本语句写入:
    1
    2
    versionNumber=$(/usr/libexec/PlistBuddy -c "Print :CFBundleShortVersionString" "${PROJECT_DIR}/${INFOPLIST_FILE}")
    sed -i bak -e "/userLabel=\"APP_VERSION\"/s/text=\"[^\"]*\"/text=\"v $versionNumber\"/" $PROJECT_DIR/XXT/resource/Base.lproj/LaunchScreen.storyboard

以上script 注意3个点:

  1. $PROJECT_DIR/XXT/resource/Base.lproj/LaunchScreen.storyboard
    XXT是工程target 名。
  2. /resource/ 是对应LaunchScreen 位置(ps 我改过他的位置了)
  3. sed 前面有折行。如果运行正确,效果没出来的,给sed 前面折行

至此以后就不用那么麻烦了。

记录一次iOS 上传release 包出现”ITMS-90037”,debug 正常

  1. debug 非常正常。打包到fir.im 里面OK。
  2. 上传testfly 的时候,总是出现ERROR ITMS-90037: "This bundle is invalid. The Info.plist file is missing or could not be parsed. Please check it for embedded control characters."
    查google,大部分说

    问题描述:这个包是无效的。Info。plist文件丢失或不能被解析。请检查plist的字符。
    问题解决:info.plist 里面有一个非法字符,用终端打开这个文件查看一下,可能会有中文的字符或其他不能识别的字符。

但是我大眼瞪小眼还是没看出来。
从另一个角度:APP 之前可以上传;中间重大改版,里面用到了AliyunvideoPlayer 我觉得有问题。
然后我看到这篇文章:https://www.jianshu.com/p/f62c7767e16b
里面链接到这篇https://blog.csdn.net/q_littlestone/article/details/51000112 里面的这篇:http://ios.jobbole.com/84323/
终于找到了最终问题,并说明了原因:
里面有第三方framework。其framework 里面的

1
2
3
Bundle version
Bundle identifier
Bundle versions string, short

没有和项目自己的对应。如果你自己还有bundle,里面取名不要使用Info.plist 或者info.plist
处理办法:

  1. 改变自己bundle 里面的Info.plist / info.plist
  2. 讲第三方的Info.plist 里面的 “Bundle version/Bundle identifier/Bundle versions string, short” 改为和主Info.plist 内容一致。
    最终终于通过了。
    我的天,我花了快1天半呀。
    需要不断尝试,同时看是否能上传成功,同时也要和以前对比。
    打包、上传。半条命。

记录一次Xcode release 下打包CFBundleVersion +1

打包增加CFBundleVersion 需要另外考虑一件事:几个同事之间打包,build 号可能会污染。可以使用时间或者git 上传次数。
当前使用的是自动+1 操作。
首先

  1. 在Build Phases 里面增加一个Run script.
  2. 修改下名字,比如:AutoIncreaseBuildVersion
  3. 把其拖到第一个下面
  4. 增加script 如:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #!/bin/bash
    // 判断是哪个configuration
    // Release Debug 或者只自定义的配置
    if [ "Release" != "${CONFIGURATION}" ]
    // 如果是Release做哪些事情
    then
    // 如果不是Release做哪些事情
    exit 0 退出 不执行下面的代码
    fi
    buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
    buildNumber=$(($buildNumber + 1))
    /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"

上面的exit 0 可以注释也可以加上。效果就是其他CONFIGURATION 不会执行下面动作

跟随时间变化

1
2
3
#!/bin/bash
buildNumber=$(date +%Y%m%d%H%M%S)
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"

获取info.plist信息 CFBundleVersion 可以更改为想获取的信息的名字

1
2
3
4
5
6
7
buildNumber=$(/usr/libexec/PlistBuddy -c "Print :CFBundleVersion" "${PROJECT_DIR}/${INFOPLIST_FILE}")  
shortVersion=$(/usr/libexec/PlistBuddy -c "Print :CFBundleShortVersionString" "${PROJECT_DIR}/${INFOPLIST_FILE}")
buildNumber=`date +"%m%d"`
buildNumber="$shortVersion.$buildNumber"

// 设置info.plist
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${PROJECT_DIR}/${INFOPLIST_FILE}"

修改项目显示名称为版本号(适用于不同版本号装到一个机器里面,便于区分是哪个版本)

1
2
3
4
5
6
7
8
9
10
11
12
13
#/bin/bash
if [ "Release" != "${CONFIGURATION}" ]; then

DisplayName=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "$INFOPLIST_FILE")
DisplayName="ep${DisplayName}-I"
/usr/libexec/PlistBuddy -c "Set :CFBundleDisplayName $DisplayName" "$INFOPLIST_FILE"

else

DisplayName="真正的项目名称"
/usr/libexec/PlistBuddy -c "Set :CFBundleDisplayName $DisplayName" "$INFOPLIST_FILE"

fi

记录一次使用Egret wing 调试出现

“No such module: atom_renderer_v8_util”
崩溃到这一句”return process.binding(atom_${process.type}_${name})”

然后换成debug 用chrome 可以用几次,但是用出错。
明明没有代码错误,把代码拷到另一个工程,又能运行。
最终解决:把翻墙关了。
网上也有一些解决方案,但都没有说到点,心里还嘀咕怎么可能跟我shadowSocks 有关。
后来确实没有再出现了。