组件化通信图

设计之初

在编程中,两个变量如何交换?常用的解决方案会用第三个temp临时变量来存储做置换。那组件之间的通信也如此,如果要降低组件和组件之间的耦合或业务与组件之间的耦合,那么中间件是一个值得考虑的方案。你可以理解为它是第三方,或代理,或装饰器,或传递者。市场上常见的组件间通信方案有三种:URL路由、target action. interface or protocol. 各自有相关的优缺点。interface是从后端java衍生过来的,很多语言已经自带了面向接口编程。而swift正是为此诞生,面向协议编程。早在java ssh框架中,我们就看到过Spring ioc,aop等方式,这也就使得后端代码几乎都是面向接口API编程。依赖注入很好地通过protocol/interface降低了耦合度。

文章关联

依赖注入
泛型&协议
设计键盘

实现富文本多个link点击.

  1. 方案一:通过实现 shouldInteractWithURL 代理方法,判断不同的URL进行事件响应。 缺点:长按有类似网页的copy复选菜单弹出。
  2. 方案二:重写touchesBegan事件,分别做selectRange设置,拿到selectionRects(for: aRange), 通过记录rect集合和content. 点击触碰,拿到点判断在哪个集合中。再block事件回调。
  3. 方案三:自定义tap事件,关闭canBecomeFirstResponder. 识别点击哪一个link进行响应事件。这里重点讲一下方案3。以下为草稿代码:

自定义一个键盘

为什么要这样设计?

表单里引用键盘协议,XAppKeyboard协议定义在中间层,并且是遵循UIView。(为了设置TextField的inputView), 相关的功能api也定义在中间层。 实现层可import 对应的 journey library,可根据业务需要定制不同的键盘。比如车险投保键盘,金融账户的安全键盘等。WrappeKeyBoardView把具体的类型键盘进行包装,再注入到表单视图中。不同的target可根据开关配置决定是否启用。也可根据不同的场景注入不同的类型。好处就是具体的键盘代码不会和表单里代码耦合在一起。键盘的功能都可以在WrappedKeyBoardView里根据需要独立更改。

功能操作流程

  1. 从左侧拖入组件到中间容器内。左侧组件不变,只是clone节点到中间容器。
  2. 中间容器不可再拖入左侧。中间容器各个部件可以在容器内上下拖动进行排序。
  3. 支持同类型多组件。从左侧拖入相同组件的时候,会先从中间容器拷贝同类型的部件。重用样式。每个部件id值唯一。
  4. 中间容器 选中某个部件,在选中的部件右上角显示删除按钮。右边显示对应的部件属性。
  5. 修改右边对应的部件属性,中间容器对应的部件可实时显示效果。
  6. 右边部件的属性根据 每个部件的类型不同而决定。
  7. 中间容器下方底部可设置大容器的页面背景颜色。
  8. 最后提交保存全部部件的属性。这样就完成了一个页面模板。 下次页面模板编辑的时候,页面进入直接显示实时效果。
    图片
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

git reset --soft HEAD~N 回退到上N个版本
git reset --soft head^ 将最近一次提交记录回退到暂存区
Git reset --mixed head^ 将最近一次提交回退到工作区
git reset --hard head^ 将最近一次提交记录清除
git reset --hard commitId 回退版本

git cherry-pick commitid 把其他分支的某提交记录复制到当前分支
git cherry-pick --abort 取消cherry-pick
git merge --abort 取消合并
git checkout . 重置当前所有修改(危险)

git revert (用一次新的提交回滚之前的提交且用于非合并类型的提交,而get reset 是直接删除指定的commit)
git revert head 撤销前一次提交
git revert -n commitid 撤销指定提交记录

git checkout -b test origin/test 本地创建一个和远程同名的分支
git pull origin test 更新test这个分支的代码
git checkout test 切换到test分支
git branch -a 查看远程分支
git branch -vv 查看分支关联
git status 查看当前状态
git log 查看提交日志

git pull 的意思是 git fetch 再 git merge FETCH_HEAD
git pull --rebase 的意思是 先 git fetch 再 git rebase FETCH_HEAD
git pull --autostash --rebase
git rebase -i 将本地的多次提交合并为一个(简化提交记录,合并到develop的时候看到的提交记录更加清爽)
git rebase -i HEAD~2 //合并前两个提交记录
git rebase 也可以用于合并。例如在开发分支执行git rebase develop,有冲突就解决冲突,解决后直接git add . 再git rebase --continue 即可。(git rebase 与 git merge 的原理不同,合并后并不会产生新的提交记录。)。 功能开发完成最后切到develop分支把功能进行合并进来 git merge xxx分支名。

git branch —delete branchName 删除本地分支
git push origin --delete test 删除远程分支

git tag 1.0.2 打tag
git push origin --tags 推送tag到远程
git push origin test1:test1 关联分支到远程分支

H5微信支付的优点就是快,应用App通过内置浏览器一个支付链接,唤起微信App进行支付再跳转回应用App。

微信H5支付后台配置

for example:
第一步添加支付支付域名gaoying.cn(顶级域名,非二级或三级域名),应用服务器向微信服务器拿到支付链接称m_weburl,给到App。

  1. 如果App是应用内开WebView打开m_weburl,则m_weburl不需要拼接redirect_url参数。
  2. 如果出现“商家参数格式有误,请联系商家解决”说明在请求m_weburl时referer为空导致的。则需要拼接referer参数qiu.gaoying.cn (顶级域名的多级子域名)。
    如果不是设置的第一步中配置的支付域名的子域名,设置其他的子域名,比如xxx.abc.cn 则会出现“商家存在未配置的参数,请联系商家解决”。则需要再添加abc.cn到支付域名中。
  3. 支付成功后如果没有跳转回到应用App. 则把referer的值配置成scheme形式如:qiu.gaoying.cn:// 并在App应用配置好scheme为qiu.gaoying.cn。

支付成功后并返回App. 到此,并完成了。


多个App H5微信支付:
当手机装有多个公司应用,H5 支付后如何正确跳转回到对应 app

wechatSDK用在分享,支付等场景。 1.8.6 以上采取unverslink唤起app,当跳转失效时可以打开sdk日志开关来查看问题原因。

Xcode需要配置Associated Domains , 配置访问的域名。for example:
applinks:h5-vendor-prod.gaoying.com

Xcode 需要配置 apple-app-site-association 文件,该文件无后缀,里面是 json 配置。

1
2
3
4
5
6
7
8
9
10
11
{
"applinks": {
"apps": [],
"details": [
{
"appID": "yourDeveloperTeamId.com.livehome.com",
"paths": ["/livehome/*"]
}
]
}
}

wechatSDK 注册

1
2
3
4
5
6
7
let wechatFlag = WXApi.registerApp("wechatAppId", universalLink: "https://h5-vendor-prod.gaoying.com/livehome/")
NSLog("微信flag:\(wechatFlag)")
WXApi.startLog(by: .detail) { (logStr) in
NSLog("微信日志:\(logStr)")
}
let versionStr = WXApi.getVersion()
NSLog("微信sdk版本号:\(versionStr)")

需要到微信开放平台上设置 universLink。需要注意的是url必须要是https。

多Target场景配置:
iOS Project 多个 Target UniversLink 配置(付费文章)

版本管理

使用 git 来管理发布的文章。每次发布文章文章,提交到 git 仓库。 忽略 node_modules 以及 public 文件夹。

web page

hexo 引擎生成的 public page 部署到 github page. 或者部署到国内的 coding. coding需要进行本机配置 ssh key. 将本地生成的 RSA public 密钥内容配置到coding后台。 github 需要到官网上个人中心配置找到 AcccessKey. 配置时候 https://accesskey@github.com/username/username.github.io.git 。当部署失败时候,请检查SSHKey相关授权。 当部署时遇到脚本失败及 mode argument must be integer 相关错误时候,可通过 nodejs 降级以达到版本兼容。我是通过安装 hexo-deployer-git 高一点的版本来解决此问题。

域名映射

在阿里云域名管理后台配置DNS解析,把域名指向githubpage的服务器。

主题配置

将第三方主题fork到自己仓库,然后再clone下来。主题相关配置提交到自己仓库。当主题发生变更时候,我们可以选择同步需要的模块来达到使用最新主题功能。

其他配置

统计,分享,评论等插件需要到第三方平台进行配置。然后把相关key配置到config文件的对应模块。

https 配置

博客配置SSL 支持443端口。申请亚洲诚信SSL证书(/ssl),并绑定域名。在网络内容分发处(cdn/certificate)为域名配置该证书下的cdn加速。在域名管理处(cdn/domains)查看开启cdn加速。
ssl监控管理处添加监控,查看配置状态。(sslpod/monitor), 查看证书状态(sslpod/sslcert)
最后为网站关联域名,重新部署即可。

谈到属性的原子性,即操作读写的原子性(安全的,单一的,完整的) 可以这么理解。那有什么方法可以做到?自然,我们想到了锁的概念。

锁的种类

我们在开发Apps的时候,经常会用到多线程。而锁的概念可以抽象成线程同步。主要作用即保护授权某段代码块的原子性执行。iOS中锁有很多种类:

  • 信号量 Semaphore (允许N个有限线程在某一时间执行指定代码块)
  • 线程锁 Mutex 保证在某一时间内执行某代码块只有一个线程进入。
  • 自璇锁 Spinlock 指的是一个线程获取了一个自旋锁后,另外一个线程期望获取该自旋锁,获取不到的情况下会循环等待,不断的判断。
  • 读写锁 Read-write-lock 并发只读,串行写。
  • 递归锁 Recursive-lock 这个锁可以被同一线程多次请求,而不会引起死锁。它主要是用在循环或递归操作中。

Grand Central Dispatch (GCD),CPU多核处理,线程间异步高效地执行任务。在GCD的管理下,只需提供DispatchWorkItem作为单个任务,本质上是个swift 闭包。这些任务项item由GCD根据一定地规则排队自动执行。通过 queue.async(execute: workItem)。通过GCD可设置任务的优先级,以及执行顺序。
几个任务项也可以作为一个group, 通过DispatchGroup组织多任务执行,最后将所有处理完毕的结果作为单一整体汇总。
队列Queue管理着任务项的执行,可串行也可并发。串行队列一次执行一个任务,并发队列无需等待执行中的任务结束才开启下一个任务(即可同时执行多项任务)。两种队列都按照先进先出(FOFO)执行。
内部,有GCD线程池服务所有的队列。当某任务执行完成后线程即销毁。当所有的线程属于busy状态,新的线程需要暂时挂起。GCD预备了五种队列可直接使用。一种串行队列:主队列。四种异步队列分别权限为:hign,default,low,background。