pod疑问汇总

title: pod

tags:

npm手动下载:
npm install react-native-baidu-map –save

pod手动下载:
pod install安装非常慢的时候,可以考虑使用手动下载的方式,如下载BaiduMapKit的3.4.4版本:自己去github上查找这个版本的源码下载下来,然后手动拷贝到目录:/Users/lynn/Library/Caches/CocoaPods/Pods/Release/BaiduMapKit/3.4.4-4ac88
其中,4ac88为podfile.lock文件中baiduMapKit校验码的前五位

Mac上的ssh 公钥设置

  1. 查看用户目录 ~/.ssh/ 目录下是否有密钥,如果没有则创建:

    1
    2
    3
    4
    5
    $ cd ~/.ssh
    $ ls
    id_dsa known_hosts
    config id_dsa.pub
    $ ssh-keygen -t rsa -C "chenglini@163.com" //然后连按好几个回车就行
  2. 把公钥添加到ssh的缓存中

    1
    $ ssh-add ~/.ssh/id_dsa

ui提效工具

  1. pxcook: 作图完成后,自动生成标注

  2. lottie(airbnb出品):制作完动画后,可以直接生成ios、android及react native代码
    After Effects工具(adobe)
    bodymovin插件

iconfont vs emoji

  1. 在iOS项目中,一般对图片资源要求有@2x,@3x两套,以适配不同分辨率的设备。为了释放开发者、设计者的双手以及给APP“减重”,iconfont被引入到iOS开发中来。在一些公司中同样会使用到iconfont,笔者所在的公司就有使用到。接下来主要讲解一下在iOS移动开发中如何使用iconfont
    iconfont,让开发者像使用字体一样使用图标。
    制作/获取iconfont
    进入http://www.iconfont.cn,登录账号以官网提供的字体图标为例,选择要使用的图标,添加到购物车

  2. emoji: 等同与文字,可以直接使用;且xcode提供了所有支持的emoji

Kamailio

在centos系统下编译安装

  1. 安装编译环境

    1
    sudo  yum  install  gcc  gcc-c++  flex bison make  openssl  openssl-devel libxml2  libxml2-devel  zlib-devel  ncurses*  e2fsprogs-devel  uuid-devel  libuuid-devel  readline6  readline-devel curl-devel
  2. 安装mysql

    1
    2
    3
    wget http://repo.mysql.com/mysql57-community-release-el7-8.noarch.rpm 
    rpm -ivh mysql57-community-release-el7-8.noarch.rpm
    yum -y install mysql-server
  3. 下载kamailio源码

    1
    2
    wget http://www.kamailio.org/pub/kamailio/latest/src/kamailio-5.2.0_src.tar.gz
    tar xvf kamailio-5.2.0_src.tar.gz
  4. 编译

    1
    2
    3
    4
    cd kamailio-5.2.0
    make FLAVOUR=kamailio cfg
    make all
    sudo make install
  5. 配置 && 运行
    需要为kamailio配置mysql数据库,…..

    1
    2
    kamctl  add user1 123456  //添加用户
    kamailio start //启动

实时语音通话

方案选型:

  • linphone:仅适合双方通话
  • webrtc
  • doubango:适合多方通话,回声消除功能略差

ios实现客户端:voip push + callkit
android实现客户端:android系统自带sip接口
sip server: opensips/kamailio + asterisk/freeswitch能够构建超大容量的VOIP平台,

技术方案:

  • voip - sip
  • webrtc
  • xmpp
  • mqtt

相关开源软件:

  • Speex:是一套主要针对语音的开源免费,无专利保护的音频压缩格式。[http://www.speex.org] 目前最新的版本是Speex 1.2rc2 and SpeexDSP 1.2rc3。它的特点有:
    • 窄带(8kHz),宽带(16kHz)和超宽带(32kHz)压缩于同一位流。
    • 强化立体编码
    • 数据包丢失隐蔽
    • 可变比特率(VBR)
    • 语音捕捉(VAD)
    • 非连续传输(DTX)
    • 定点运算
    • 感官回声消除(AEC)
    • 噪音屏蔽
  • react-native-webrtc:支持ios/android系统
  • Linphone:是一种开源的IP语音电话(或SIP电话),可以通过互联网与人们进行免费的语音,视频和文本即时通讯。它使用SIP协议(互联网电话的开放标准),可以与任何SIP VoIP运营商一起使用,包括一些免费的SIP音频/视频服务http://www.linphone.org,
  • idoubs:doubango for ios基于doubango(Doubango 是一个基于3GPP IMS/RCS 并能用于嵌入式和桌面系统的开源框架。该框架使用ANSCI-C编写,具有很好的可移植性。并且已经被设计成非常轻便且能有效的工作在低内存和低处理能力的嵌入式系统上。苹果系统上的idoubs功能就是基于此框架编写) .音视频编码格式大部分都支持(H264(video),VP8(video),iLBC(audio),PCMA,PCMU,G722,G729)。NAT支持ICE(stun+turn)
    官方网站:https://github.com/DoubangoTelecom/imsdroid http://www.doubango.org/
  • imsdroid: doubango for android
  • csipsimple
  • Openfire:是开源的、基于可拓展通讯和表示协议(XMPP)、采用Java编程语言开发的实时协作服务器。 Openfire安装和使用都非常简单,并利用Web进行管理。单台服务器可支持上万并发用户。
  • WebRTC:名称源自网页实时通信(Web Real-Time Communication)的缩写,是一个支持网页浏览器进行实时语音对话或视频对话的技术。现在许多SDK都是使用WebRTC作为框架来实现。
    官方网站:https://webrtc.org/

其他可参考第三方商用sdk:
http://sdk.anychat.cn/html/price.html
http://developer.juphoon.com/home/voip
https://cloud.tencent.com/product/trtc
https://dev.yunxin.163.com/docs/product/音视频通话/SDK开发集成/Linux开发集成/sdk库文件下载

KVO最佳实践

数据源状态机:

1
2
3
4
5
6
7
8
import Foundation

enum ProviderState {
case idle
case loading
case submit
case failed(_ message:String)
}

数据源基类:

1
2
3
4
5
6
7
8
9
10
11
import Foundation
@objcMembers class ProviderObject: NSObject {
var state:ProviderState? {
didSet {
stateMonitor = !stateMonitor
}
}
var noMoreData:Bool = false

dynamic var stateMonitor: Bool = false
}

使用方法:监听数据源的stateMonitor属性,如果有改变,则手动去获取实际数据、state状态等;优点:

  • 可以绕开关联性枚举值无法通过observe监听的问题
  • 只需要监听一个属性

测试类:

1
2
3
4
class DemoProvider: ProviderObject {
var dogAges:[Int] = []
var catAges:[Int] = []
}

KVO实现

1
2
3
4
5
6
7
8
9
10
11
12
var ob: NSKeyValueObservation?

func setupKVO() {
ob = DemoProvider.observe(\.stateMonitor, changeHandler: { (demo, value) in
switch demo.state {
case idle:
//reload data
case loading:
//show loading animation
....
}
}) }

ios app元素

  1. 启动页:

    • app启动
    • app从后台返回前台
  2. 引导页:可采用图片、文字、音频、视频等多种样式,类型包括:

    • 功能介绍类:首次安装、版本更新时; 告诉用户咋玩
    • 使用说明类:
    • 推广类:广告..
  3. 数据存储:

    • UserDefaults
    • KeyChain
    • coredata/sqlite
    • plist
  4. 皮肤主题:切换皮肤风格时需要考虑已加载的视图;

    • 颜色
    • 图片
    • 风格?
  5. 弹窗:

    • toast
    • alertview
  6. 社会化分享

  7. 用户数据分析

    • Firebase Analytics 作者是 Google Developers
    • 友盟

facebook/AsyncDisplayKit - iOS app 的平滑异步用户界面。

  • playground
  • pod
  • 埋点
  • uibutton: 小红点、执行动作时的菊花
  • UI框架:imui、qmui (阿里的SUI Mobile)

git命令

  1. 放弃本地修改:
1
2
3
4
5
6
7
8
9
10
11
未使用 git add 缓存代码时:
可以使用 git checkout -- filepathname (比如: git checkout -- readme.md ,不要忘记中间的 “--” ,不写就成了检出分支了!!)。放弃所有的文件修改可以使用 git checkout . 命令。
此命令用来放弃掉所有还没有加入到缓存区(就是 git add 命令)的修改:内容修改与整个文件删除。但是此命令不会删除掉刚新建的文件。因为刚新建的文件还没已有加入到 git 的管理系统中。所以对于git是未知的。自己手动删除就好了。

已经使用了 git add 缓存了代码:
可以使用 git reset HEAD filepathname (比如: git reset HEAD readme.md)来放弃指定文件的缓存,放弃所以的缓存可以使用 git reset HEAD . 命令。
此命令用来清除 git 对于文件修改的缓存。相当于撤销 git add 命令所在的工作。在使用本命令后,本地的修改并不会消失,而是回到了如(一)所示的状态。继续用(一)中的操作,就可以放弃本地的修改。

已经用 git commit 提交了代码:
可以使用 git reset --hard HEAD^ 来回退到上一次commit的状态。此命令可以用来回退到任意版本:git reset --hard commitid
你可以使用 git log 命令来查看git的提交历史。git log 的输出如下,之一这里可以看到第一行就是 commitid:
  1. Git合并某个分支的一个commit到另一个分支
    1
    2
    3
    4
    5
    6
    例如要将A分支的一个commit合并到B分支:
    首先切换到A分支git checkout A
    git log找出要合并的commit ID :例如0128660c08e325d410cb845616af355c0c19c6fe
    然后切换到B分支上git checkout B
    git cherry-pick  0128660c08e325d410cb845616af355c0c19c6fe
    然后就将A分支的某个commit合并到了B分支了

wxBot

itchat

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
# -*- encoding:utf-8 -*-
import requests
import itchat

KEY = '334c99571f96486683dde04cc998ac56'

def get_response(msg):
question = msg.replace("@毛毛球", "")
apiUrl = 'http://www.tuling123.com/openapi/api'
data = {
'key' : KEY,
'info' : question,
'userid' : 'wechat-robot',
}
try:
r = requests.post(apiUrl, data=data).json()
return r.get('text')
except:
return ""

@itchat.msg_register(itchat.content.TEXT, isGroupChat=True)
def group_reply(msg):
if msg['isAt']:
itchat.send(u'@%s\u2005 %s' % (msg['ActualNickName'], get_response(msg['Content'])), msg['FromUserName'])

itchat.auto_login(hotReload=True)
itchat.run()
,