我的GitHub
0%

Jenkins配合FastLane完成打包

FastLane的使用

Jenkins的安装

我们将两者组合起来.

首先说一下,ios打包用的xcbuild命令,所以必须是macos环境,这个不用多解释.

所以….Jenkins所在宿主机得是mac系统的(如果有大神知道别的方式,麻烦指点一下),因为没有多余的mac机子,我就搭在了我自己的机子上.

接下来我们说说怎么搞

启动Jenkins

首先,启动终端,输入

1
Jenkins
阅读全文 »

FastLane-ios自动打包效率神器

背景: 不想每次测试都喊我打包,很累的,所以开始寻找,有你的世界在哪里

一.安装fastlane

1.换ruby源

多话不说,墙,换成国内镜像源

1
2
3
4
$ gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/
$ gem sources -l
https://gems.ruby-china.com
# 确保只有 gems.ruby-china.com

2.开始用gem安装(不建议使用brew cask安装)

1
sudo gem install fastlane -NV

耐心等待,等装完

二.为项目配置fastlane

阅读全文 »

iOS内测分发

2019-12-10更新

gitee似乎不让下载了。可以考虑放到别的带https的地方,比如腾讯云的对象存储桶,github等等,反正有https就行,方法不变。

2019-11-15更新

不要再问android怎么搞了。。。直接apk往仓库一丢,网页给个链接,点一下不就完事了,比iOS省事多了

背景:

我写博客一般都会写背景,因为我觉得光写某个技术点没有意义,技术最终都是为业务服务,因此我喜欢交代自己的使用场景,基于什么原因,我做过哪些常识,为什么最终这么做,这么做能解决我的什么问题….

我们是一个小业务部,而且是传统行业转型互联网,业务部内还处于”史前洪荒”的状况,各种现在流行的东西都没有使用,移动端更是如此,开发迭代出的app都是靠微信/内部邮件转发来转发去,iOS更难受,由于ipa包不能像Android一样,随下随装,”必须”依赖电脑用iTools或类似的工具去安装ipa包,很是繁琐.

说到这里肯定就有人提到:”为啥不用蒲公英(fir)等内测分发平台?”

说实话我第一反应也是盯上了这些,但是要实名信息注册啊QAQ,企业要传营业执照,个人要传身份证信息,作为一个较为保守且不想这么兴师动众的人,我选择了放弃使用这些平台.那么没办法了,只能自己写了.那么接下来,我会告诉你,他们是怎么把ipa包,转成一个二维码让你能够下载的(都是猜的).当然,有企业账号自己做企业分发,也可以用我这个方式

阅读全文 »

本文写于2019-4-28,应该是最新安装教程了

一.安装Java

声明,我不是干安卓开发或者后台开发的,我以下安装的这些版本的java会不会对后台或者安卓项目产生影响我一概不知,我只是为了安装Jenkins而加入一个java8而已,不习惯的同学可以自行去Orcale的官网下载java8

1.安装sdkman

使用brew安装Jenkins的时候,如果你没有安装java8肯定会报错要求你安装java1.8版本(我试过装java11不行),所以不要挣扎了,装java8吧

这时候你肯定想用brew安装java,你会发现只有java6和java11,java8的安装包被删了

你肯定搜到过下面两个命令:

1
2
brew tap caskroom/versions
brew cask install java8

放弃吧.不行的

这里我推荐另外一个安装工具:SDKMAN

阅读全文 »

常用三方库

一. 如何引入三方库

上次分享我们讲到我们使用npm或者yarn进行管理

我们建议使用yarn进行管理,原因上节课也说过了,有下面几点

1
2
3
4
5
1.Yarn是由Facebook、Google、Exponent 和 Tilde 联合推出了一个新的 JS 包管理工具 ,我们写的RN是Facebook开源的,我们当然要用匹配的东西
2.npm很慢,因为是安装完一个package再安装下一个;yarn是并行安装,并且会生成离线库,安装过的库第二次安装都是从缓存的离线库读取,速度很快
3.yarn安装版本统一.存在yarn.lock文件去管理每个库的版本统一
4.yarn能对多注册来源进行处理:所有的依赖包,不管他被不同的库间接关联引用多少次,安装这个包时,只会从一个注册来源去装,要么是 npm 要么是 bower, 防止出现混乱不一致。
5.…………

1.常用命令符

1
2
3
4
5
6
7
8
9
#xxxx代表库名
#1.安装package.json中已经存在的库
yarn
#2.新增一个库
yarn add xxxx
#3.新增一个库到开发依赖
yarn add xxxx --dev
#4.移除一个库
yarn remove xxxx

附赠一个yarn的中文社区文档

二.常用三方库列表

三方库名称 描述
react-navigation 是RN上较为优秀的路由管理库,几乎可以说是项目必备的路由管理框架
moment 一个前端应该非常熟悉的时间库,用于前端的时间解析之类的
ESLint 一个前端应该非常熟悉格式规范库,用于规范代码编写
mobx 一个状态管理库,用于应用内部状态的统一管理
阅读全文 »

我们使用的是3.x版本,需要做如下操作

一.引入react-navigation

1
yarn add react-navigation

如图
如图,我们发现有很多warn,报的是一些依赖没满足,一般我们说程序员不看warn,肯定就直接运行了.

但是作为过来人,告诉你肯定会报错,缺少这个warn当中的一个库react-native-gesture-handler所以也别走弯路,把这些库都给加上

1
2
3
4
5
6
7
8
9
#这是一个手势库
yarn add react-native-gesture-handler
#我也不知道用来干嘛的库,大概是一些屏幕设计吧,这是它的github:https://github.com/browniefed/react-native-screens
yarn add react-native-screens

#react-native-gesture-handler又依赖如下库
yarn add react-art
yarn add react-dom
yarn add react-native-web

全都装完以后,link一下项目

1
react-native link

link警告

这里注意了,在0.59中已经提到,不建议这样做,后续会移除这个命令,必须带上包名link才行

阅读全文 »

背景

突然很想学swift…不怕死的我在完全没用过的情况下决定通过重构公司的古老项目来完成这段学习之旅….
model转json或者json转model是很常见的需求….所以这就是为什么我要用ObjectMapper了…(其实是我把# SwiftyJSON
的star数错了..我可能会趁用的还不多改成SwiftyJSON,毕竟ObjectMapper实在查不到什么资料不是吗…)

使用

初始化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import UIKit
import ObjectMapper

class BaseModel: Mappable {
//定义属性
var name : String? = "wuxing"
init() {
//为什么要写这个init,原因很简单,总有些时候你仅仅想初始化一个model,而非通过外部传入数据初始化
}

required init?(map: Map) {
//重写ObjectMapper的init
}

func mapping(map: Map) {
//转换规则
name <- map["name"]
}
}

如图,基本已经写得很清楚了emm

规则转换

有些时候,有的值是int或者bool,你会发现死活转换不出来…这时候就要自己写转换规则了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53

import UIKit
import ObjectMapper

class BaseModel: Mappable {
var man : Bool? = true

var age : Int? = 21
init() {
}

required init?(map: Map) {
print("BaseModel初始化")
}

func mapping(map: Map) {
man <- (map["man"],transformBool)

age <- (map["age"],transformInt)
}


// 转换规则


let transformInt = TransformOf<Int, String>(fromJSON: { (value: String?) -> Int? in
if let value = value {
return Int(value)!
}
return nil
}, toJSON: { (value: Int?) -> String? in
// transform value from Int? to String?
if let value = value {
return String(value)
}
return nil
})

let transformBool = TransformOf<Bool, String>(fromJSON: { (value: String?) -> Bool? in
if let value = value {
return (value as NSString).boolValue
}
return false
}, toJSON: { (value: Bool?) -> String? in
if let value = value {
return String(value)
}
return "false"
})


}

就这样,就能转换了.

阅读全文 »

多话8说,我就记录一个聊天记录,有空了一一证实一下

##问:NSKeyedArchiver存的是什么?二进制吗?
###答:嗯


##问:NSKeyedArchiver存在哪?沙盒还是内存
###答:沙盒


##问:NSFileManager和NSKeyedArchiver 是什么关系
###答:NSFileManager是操作文件的,和NSkeyedArchiver没太大关系


##问:所以使用NSFileManager操作文件并不一定会走归档解档对吗
###答:是的,就好比你是人,你需要吃饭,但是你和饭是不同的


##问:NSKeyedArchiver归档的文件路径可指定吗?
###答:可以的,方法都提供了路径


##问:NSUserDefaults这个呢,存在内存?
###答:NSUserDefaults也是沙盒


##问:那它和NSFileManager区别在哪
###答:NSFileManager就是操作文件的,和他么有任何关系.如果你说NSKeyedArchiver和它有什么差别,一个序列化了,一个没序列化

没了

阅读全文 »

1.创建git仓库

本项目由于属于商业项目,不开源,因此使用framework方式上传。

创建完毕以后,拉到本地

2.创建trunk账号

1
pod trunk register 邮箱地址 ‘用户名’ --verbose

这里我用了自己的账号

1
pod trunk register 329106954@qq.com 无星 --verbose

需要去邮箱验证链接

完成以后

阅读全文 »