react-native框架源码学习(iOS)(上)

2018-02-26

react-native框架源码学习(iOS)(上)

注意事项

要学习react-native框架iOS端源码,先要了解一下注意的事项。

  • 一、 首先需要非常熟悉objective-c语言,对OC的runtime机制更是必不可少。源码里大量用了runtime特性。然后也要熟悉c++语言。除了OC语言,里面还有大量的c++代码,OC与c++混合代码。对c++的template和std库也要熟悉。我本人对c++也熟悉,但是不够深入,对一些高级特性不是很了解,所以相关的一些代码看起来很吃力。最后当然也熟悉js语言。我大学时学习过js,但是那还真是远古时代了,js近年来发展很快,我对很多新特性不是很了解,这也对我学习有一定的阻碍。另外还有要比较了解iOS的JavaScriptCore框架,这个是js与OC通信的基础。
  • 二、 要对react-native的版本了解。查看网上的资料时也要注意他们所说的RN版本。现在网上很多研究资料,他们所研究的版本都是很早之前的版本。新的版本跟老版本有很多细节和流程改变了。如果你发现有些文章里说的东西跟你所看到的对不上,那就是研究的版本不一致。
  • 三、如果看不懂,多看看别人的分析文章。如果对某种语言或者框架库不熟悉,建议先把该补的补上。

我所研究的RN版本是0.49,而最新版是0.51 ...

Category: 技术 Tagged: ReactNative 源码 iOS

comments

Read More

浅谈ReactNative技术的优劣

2018-02-06

浅谈ReactNative技术的优劣

去年大概10月份开始使用ReactNative技术来开发项目,现在也已经有几个月时间了。也上线了三个ReactNative开发的项目。一直想谈谈使用ReactNative的开发感受。

  • 使用react-native确实可以提高界面开发效率,因为两个平台,只需要编写一套代码。react-native在这方面做了很多工作,让界面开发跟web开发基本一致。web开发人员可以很方便的写react-native界面,不需要二次学习。而且在react-native里面的像素是逻辑像素,可以比较好的适配界面。
  • react-native界面开发方式跟web开发是基本一致的,这跟native开发界面有很大不同。react-native界面开发是声明式开发,而且是继承于react框架,而纯native开发人员根本不了解这个框架,需要学习成本。它的View布局层次跟原生的布局层次不太一样。我自己也搞了挺久才搞清楚。
  • react-native很适合那些纯http数据交互的应用。即那些数据和内容都是从服务器拉取,APP只是展示和消费的场景应用。这样不但界面可以react-native来写,HTTP请求也可以很方便的用ReactNative来写。
  • react-native不适合用于那些需要复杂的通信方式的应用,也不适用于那些强多媒体资源的应用,例如要做相册,音视频播放的应用。因为react-native上不方便用socket的那些通信方法,需要自己封装。然后内存问题也不太好把控。对于相册,多媒体播放,ReactNative也没有封装。
  • react-native对于web转native开发是很有用,对纯native开发转react-native开发不是很友好,主要是思维方式发生比较大的变化。
  • react-native不能隔绝native开发的知识。要做APP开发,最终还是需懂得native开发的一些知识,react-native并不能完全屏蔽这些。一个纯web开发想要转react-native开发,还是需要懂native开发的人来帮助和指导,或者自己需要先学习native相关知识。

react-native开发会是未来的方向吗

这个我也不敢说。不过ReactNative开发未来会代替掉一些native发 ...

Category: 技术 Tagged: react-native

comments

Read More

Code Review方案

2018-01-10

Code Review方案

定义

Code Review代码评审是指在软件开发过程中,通过对源代码进行系统性检查的过程。通常的目的是查找各种缺陷,包括代码缺陷、功能实现问题、编码合理性、性能优化等;保证软件总体质量和提高开发者自身水平

code review 的好处

    1. 提高代码质量。
    1. 及早发现潜在缺陷,降低修改/弥补缺陷的成本。
    1. 促进团队内部知识共享,提高团队整体水平。
    1. 评审过程对于评审人员来说,也是一种思路重构的过程。帮助更多的人理解系统。
    1. 是一个传递知识的手段,可以让其它并不熟悉代码的人知道作者的意图和想法,从而可以在以后轻松维护代码。
    1. 鼓励程序员们相互学习对方的长处和优点。
    1. 可以被用来确认自己的设计和实现是一个清楚和简单的。

code review形式

一般code review有两种形式,一种是代码评审会议,我称之为Code Review Meeting,就是将团队成员都组织起来开会,让代码Owner上去讲自己代码的实现和思路,其它人发表意见和进行讨论,也有把这种叫做team review。另外一种是一对一评审,我称之为Single Review,就是项目owner提交代码之后,让reviewer在空闲的时候帮忙评审代码,并且写出批注,owner收到批注后,进行修改或者回复 ...

Category: 技术 Tagged: codereview

comments

Read More

手机局域网内(包括热点)发现和组网通讯实现

2017-11-05

手机局域网内(包括热点)组网通讯实现

最近在做一个应用,需要多个手机一起组网,一个充当主机,其他多个手机充当从机。主机跟每个从机之间可以相互通信,发送消息和文件。这不就是个CS(client-server)模式吗,只不过server不是在云端,只是在同一个局域网的手机上罢了。

这里面有两个关键的地方,一个是如何发现同一个局域网内的手机客户端,包括自建的热点,一个是知道各个手机的Ip地址后,用什么方式来建立通信。这里说一下热点,手机开启热点之后,别的手机连上这个特点,其实也是一个小型局域网,只不过这个局域网稍微有点不一样(Ip地址),其他的都一样。

局域网发现

局域网发现主要难点在于如何得到对方Ip地址。我们的做法是发送UDP包。UDP协议是无面向连接的,也就是不需要像TCP协议那样提前建立连接。所以我们向局域网内某一个特定的端口广播UDP包,接收到这个包的人,发送回包,那么我们就知道彼此的存在和地址。

那么关键地方是

  • 有人一直在监听一个端口X,接收UDP包
  • 有人在一直往这个端口X发送UDP包

监听端的人收到了UDP包后,就知道了发送者的Ip地址。但这时发送者是不知道接收者的,因为这是UDP包,无连接的状态的。那怎么做才让发送者也知道了。其实只要发过来再做一次就行。发送者同时也是监听者,这就行了。不过发送者A监听的是另一个端口Y,接收者B接收到包后 ...

Category: 技术 Tagged: 局域网 热点 通讯 广播 WebSocket

comments

Read More

声纹识别之Android手机录音采集探讨

2017-10-08

声纹识别之Android手机录音采集探讨

声纹识别是人工智能语音方向的一个重要分支。最近人工智能的兴起也带动了声纹识别这一领域的发展。声纹识别也越来越准确。不过在声音采集方面,特别是手机端的声音采集,是一个很讲究的问题。我加入人工智能声纹识别公司也有两个多月了,对手机端的语音采集也有了一定的了解,准备整理一下做成文章,跟大家探讨。今天重点说Android手机的录音采集方面的东西。

语音采集的一些基础指标

首先要搞清楚的一点是我们的人声是一些声波,是模拟信号,我们计算机的采集是将这些模拟信号转化为数字信号存储起来。我们播放语音文件的时候,是将数字信号转化为模拟信号。说实话,这一块的知识我大学也学得不好,模电我们软件工程的学生没有专门的课程,数电倒是有。不过数电模电的转化这个概念这倒不难理解。这里面就涉及到了采样率和采样位数这两个指标。

  • 采样率,或者叫采样频率,指每秒钟取得声音样本的次数。采样率越高,数据越精确。我们也需要了解常用的采样率是多少:8k(8000),16k, 44.1k,48k。8k是电话所用的采样率,对于我们人说的声音的频率,基本在这个采样率之内。所以电话就才采用这个频率采样。48k采样率是CD,DVD所采用的。超过这个频率人耳是分辨不出来的了。
  • 采样位数,说的是每个采样数据占的位数。每个采样数据记录的是振幅, 采样精度取决于采样位数的大小。常用的位数是8位,也就是一个字节。还有16位或者32位 ...

Category: 技术 Tagged: 声纹识别 人工智能 录音 Android

comments

Read More

适配iOS11与iPhone X需要注意事项

2017-09-26

适配iOS11与iPhone X需要注意的事项

最近苹果发布了iOS11和iPhone X,我之前开发的一个应用界面出现了问题,然后需要适配。记录一下需要注意的事项。

适配iOS11

第一个问题是iOS11导航栏改变了。除了加入largeTitle这种特性以外,还改变了很多东西,可以说是完全重写了导航栏。我遇到的问题是导航栏返回按钮图片变得很大,巨丑无比,所以得看看什么原因。

  • 我看了下我导航栏的设置代码,还做了挺多事,而且做了很多hack。第一是通过 [UINavigationBar appearance].backIndicatorImage[UINavigationBar appearance].backIndicatorTransitionMaskImage设置了返回按钮图片,还有
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(NSIntegerMin, NSIntegerMin) forBarMetrics:UIBarMetricsDefault];

设置了把返回按钮右边的文字隐藏掉。还有通过hack 方式找到 _UINavigationBarBackIndicatorView把它的frame给改了。

因为iOS11的导航栏变化很大,_UINavigationBarBackIndicatorView这个类找不到了,所以frame修改就失败了。然后因为我发现我设置的返回按钮的那种图片本来是很大,因为设置了frame把它缩小了。而现在frame已经设置不了,所以就按图片原本的大小显示了。最后解决办法就是把图片大小设置成符合导航栏的大小。

图片大小是正常了,但是还是有别问题 ...

Category: 技术 Tagged: iOS11 iPhoneX

comments

Read More

Coturn在iOS端应用和libevent的编译

2017-07-02

Coturn在iOS端应用和libevent的编译

coturn是一个Google的开源库,用于客服端-服务器-客户端之间建立数据通道,传输数据流。现在直播所有的技术WebRTC就是基于coturn的。这个技术真的很牛。

我们的产品个人私有云,一款智能硬件,接上你的硬盘,就可以通过手机消费你硬盘里的文件,任务时候任何地方,只要你联网。从智能盒子和手机之间的数据传输就需要coturn这种技术。WebRTC很好,但是不适用于智能硬件.

Coturn依赖的库有libevent和OpenSSL。OpenSSL有很多iOS的库,使用也很广泛。libevent也是一个使用挺多的C库,但是在移动平台上很少用。我在iOS平台上编译libevent遇到了很多问题。一个是不能直接用同时用在真机和模拟器上,一个是iOS10以下系统会闪退。第一个问题比较好解决,但是第二个问题不太好解决。我一直以为是我编译的库有问题,后来另一个同事他把崩溃堆栈发给我看,我发现是iOS9的系统库缺少一个get_clocktime的函数。经过搜索,发现是libevent确实是有这个东西,也有人遇到同样的问题。可以通过一个编译参数来禁用掉。

下面是libevent的编译脚本主要内容

###########################################################################
# Choose your libevent version and your currently-installed iOS SDK version:
#
VERSION="2.1.8-stable"
USERSDKVERSION="10.3 ...

Category: 技术 Tagged: iOS Coturn libevent

comments

Read More

事件循环机制之于Android的Looper和iOS的NSRunLoop

2016-12-04

事件循环机制之于Android的Looper和iOS的NSRunLoop

Android和iOS同为手机操作系统,有很多相同之处。有很多设计几乎是一样的,统一种设计模式,不同的实现。例如事件模型,它大体逻辑是这样的:

function loop() {
    initialize();
    do {
        var message = get_next_message();
        process_message(message);
    } while (message != quit);
}

对于这样的一种模式, Android系统和iOS系统是一样的,只不过是不同的平台不同的实现方式。应该说很多平台或者框架都是采用这一种模式。Android系统对应的就是Looper机制,iOS对应的就是NSRunLoop机制。你看名字都是loop,这是它的核心。

对于移动开发者来说,理解平台是怎么实现这个事件循环机制,或者叫消息机制,是很重要的。因为在你的开发工作当中,无时无刻不在用着这种机制。不理解它的机制,充其量也只能算个初级程序员,无法深入理解系统。如果我们能了解不同平台对这一机制的实现,可以加深理解,可以提高自己。我既做过Android开发,也研究过它Looper机制。现在做iOS开发都有一段时间了,最近开研究它的NSRunLoop机制。我发现他们整体的设计思想确实一致的,但是不同的平台却也有很多差异性。

共同的设计点

首先loop跟线程是一一对应的,这是基础。然后iOS或者Android都是一个应用一个进程 ...

Category: 技术 Tagged: Android iOS Looper NSRunLoop

comments

Read More

iOS持续集成记(iOS+Jenkins+Cocoapods+蒲公英)

2016-07-18

iOS持续集成记(iOS+Jenkins+Cocoapods+蒲公英)

原来我们iOS项目是有持续集成环境的,但是有一次升级系统还是升级xcode后,Jenkins就打不出可用的安装包了。原来负责整个打包机的同事又离职了,有一段时间我们都是手动打包给QA同事安装测试,现在领导要求必须把持续集成环境弄好,我们花了大约两周才基本弄好整个持续集成环境,现在把我整个过程中遇到的坑记录一下。

重装系统

打包机自从某一次升级系统之后就变得非常慢,打个包需要1个小时左右,简直要命。所以新的环境必须要建立在重装后的系统上。因为要格式化硬盘,所以要制作系统启动盘,这个网上也有不少教程,这里有个需要注意的,下载macOS系统时,一定要从官方下载。我一开始是自己在百度云上下的,制作好安装盘后重启电脑,并且将硬盘格式化后安装系统,发现验证不通过,好在另外一个同事在官网下了一个,我在它的电脑上重新制作了一次安装盘。假设你只要一台Mac电脑,遇到这种情况你就悲剧了。

git拉取代码的坑

系统装好了,Jenkins也装好了,然后配置拉去代码,可是代码死活拉不下来,为此我的同事搞了差不多一天,试了各种方法,也搞不下来代码,都是在一半的时候失败了。后来我也去弄了半天,同样的错误。主要原因可能是代码量太大了,因为其他的小工程可以git clone 下来。我突然想到换一下拉取协议试试,不采用HTTP方式,而是采用git ...

Category: 技术 Tagged: Jenkins Cocoapods 蒲公英

comments

Read More

浅谈VR

2016-06-11

浅谈VR

最近VR火得不行,就连央视财经也有报道说“4年后VR市场规模高达550亿元!人才缺口达80万”。然后刚刚结束的高考,某一个省份的语文作文题也是跟VR相关。所以说,VR是今后几年最热门的一个话题和技术之一,没有人会反对。

VR, 是Virtual Reality的缩写,即虚拟现实,它其实不是最近新的技术,它只是因为移动互联网的兴起而变得热门起来。我记得真正被全世界人认识和讨论的触发事件是Facebook发重金收购了Oculus VR公司。而除了VR,实际上还有另外一个相近技术AR. AR是Augmented Reality缩写,即增强现实。AR跟VR有挺大不同的,我现在研究得也不多,以后有机会我也想写一下AR相关的文字。

VR的应用

前几天我配老婆去海雅缤纷城逛街,然后发现那里有一个VR体验区,主要是VR电影和游戏结合的项目,还有一个是VR自行车。我体验了一下一个叫《地城游记》的游戏,感觉还可以。它主要是你坐在一个机器上,带上头盔,手可以握着一个杆,杆上有个按键,游戏中你可以按那个键来进行射击怪物。你坐在机器上,机器会根据游戏来进行晃动,例如我体验的是坐着过山车,它就会根据过山车来进行晃动,模拟你看到场景,就好像你真的在坐过山车一样。游戏中会有一些蝙蝠或者龙飞在你前面,然后有声音提示你射击它,你就会知道按那个键 ...

Category: 技术 Tagged: VR AR

comments

Read More
Page 3 of 4

« Prev Next »