整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

Fitbit Ionic智能运动腕表全方位上手评测

Fitbit Ionic智能运动腕表全方位上手评测

个星期,Fitbit 发布了一款全新的智能手表 Ionic,与该公司之前发布的 Blaze 和Surge 不同的是,这次发布的新品是一款真正意义上的智能手表,不仅拥有光电心率计、GPS定位等运动相关模块,还支持 NFC 移动支付、离线音乐播放以及其他第三方APP,可玩性大大增强。

也就是说,无论从功能还是定位上看,这款 Fitbit Ionic 智能手表都可以和AppleWatch、三星Gear S3等主流智能手表站在同一条竞争线上,这也让很多消费者对它抱有不小的期待。现在已经有外媒拿到了这款产品,并进行了全方位评测,那么实际使用体验到底如何呢?让我们来看看吧~

简单介绍及外观展示

快速上手视频▼

http://v.youku.com/v_show/id_XMzAwOTUyNzg1Ng==.html?spm=a2hzp.8253869.0.0

Fitbit Ionic 在配色上共提供了银色、深灰色、金色三种配色,售价均为299.95美元,约合人民币1982元。

P.S.Fitbit 还将与阿迪达斯合作推出一款特别版Iconic手表,预计在明年第一季度正式发布。这款特别版手表应该和苹果与Nike推出的Apple Watch Nike+一样,拥有定制版表带和运动APP。

Fitbit也为这款手表推出了不同材质不同配色的快拆表带,大家可以按照需要额外单独购买。

按材质来分的话,可以分成以下3种:

- 经典表带(随机附赠的表带款式),售价29美元,约合人民币189元。

- 运动表带,售价29美元,约合人民币189元。

- 皮质表带,售价59美元,约合人民币385元。

(从左到右:皮质表带/运动表带/经典表带)

这里要批评一下 Fitbit Ionic 随附的经典表带,虽然和运动表带同为硅胶材质,但是非常硬,不透气,戴在手腕上很不舒服,不得不说这可能是我见过的最难用的硅胶表带了。硬要说有什么优点的话,大概就是不用担心它会在运动中脱落了……

相比而言,运动表带的使用体验就很不错了,表带很软也很透气。

最后展示一下皮质表带(我拿到的是棕色款)

总的来说,现在能买到的款式都在下图中列出来了,想购买的同学可以 Fitbit 官网选购,现在这款手表已经开始预定了。

下面我们来看看这款手表的外观部分。

Fitbit Ionic 采用了方形表盘的设计,表壳为航天级铝合金制成。

支持50米防水,可在游泳时使用。

看似一体成型的机身,想知道里面都藏着什么东西么?下面就拆解给你看~

我们挑几个比较重要的模块来着重介绍:

- NFC:手表的移动支付功能主要就靠它实现

- 蓝牙模块:可以与其他设备联动,如连接Fitbit新推出的Flyer无线耳机播放音乐

- GPS+GLONASS双星定位

此外,Fitbit Ionic 还采用了全新的光学传感器,精确度更高,据说在设计上也更加科学,能够更好更舒服的贴合手腕。

升级的光学传感器除了可以监测全天心率,还能够追踪血液中的氧气含量(SpO2 ),这一数据可以用来监测人们的睡眠,特别是能够解决人们在睡眠中出现的停止呼吸的问题,让睡眠监测更加全面和实用。

Fitbit Pay 移动支付

前有 ApplePay,后有三星、华为、小米的各种Pay,越来越多厂商开始在移动支付领域发力。这次 Fitbit 在 Ionic 发布的同时,也带来了自家的移动支付平台Fitbit Pay。以后佩戴 Fitbit Ionic 手表出门,就可以直接通过NFC刷表付款,不用再带手机钱包在身上了。

使用方法如下:

首先你需要在 Fitbit Ionic 的配套手机App上绑定一张银行卡(目前支持Mastercard、Visa、Amex 发行的卡类产品)

绑定之后,你需要设置一个Pin码(交易密码),在交易付款时使用,以防手表丢失后被他人盗取,这个步骤在AppleWatch上也有相同操作,完成后就可以出门买买买了。

购物时,需要按下手表左侧按键(长按2秒)来调出付款界面。

然后把手表放近终端机,再点按一下画面就能完成付款了。

我们在加油站用 Fitbit Ionic 成功地「刷表」支付了一次,并把全过程录了下来,具体就是这样der~

http://v.youku.com/v_show/id_XMzAwOTUzMDkyOA==.html

操作系统及第三方App

去年 Fitbit 收购知名智能手表厂商pebble也算是个大新闻了,他们保留了 Pebble 主要的软件开发人员,并利用 pebble 的技术优势开发出了自家的智能手表操作系统——Fitbit OS,并向第三方App开发者伸出橄榄枝。

之所以说,Fitbit Ionic是Fitbit第一款真正意义上的智能手表,是因为这款手表终于支持第三方App了。

与Pebble操作系统类似,Ionic的应用程序非常简单,它使用的是基于Javascript和SVG Web标准的SDK。开发者可以完全访问设备上的所有传感器,包括心率、GPS、加速度计等。除了应用之外,用户还可以通过安装App实现更多的操作界面,而这也是来自于Pebble的特性。

Fitbit Ionic 的应用还会增加一个名为 Fitbit App Gallery 的选项,这款应用将出现在首发应用的名单中,并且在面向第三方开发者之前,Fitbit会让部分开发者提前试用。此外,用户还有多种不同的方式来加载App和表盘界面,同时还可以直接从隐私连接中加载内容,而那些想要在App内分享应用的用户则需要通过审核才可以。

相比苹果、谷歌,Fitbit进入智能手表市场已经算很晚了,目前苹果和谷歌都已经拥有了非常强大的第三方支持,并且分别在各自的OS和AndroidWear系统中集成了大量的天然优势。而目前来看,Fitbit Ionic在应用的支持方面还比较基础,只能说他们在打造自己的生态系统这件事上还有很长的路要走。

离线音乐播放功能

Fitbit 已经和几家第三方公司合作,在手表中内置了Strava、星巴克、Pandora和Accuweather 四款第三方App,其中 Pandora 是一款音乐应用程序,配合 Fitbit Ionic内建的2.5GB的本地存储空间,大约可以存放300首音乐。

你可以选择在 Pandora App中同步3个音乐播放列表,或自动同步「Thumbprint 电台」(类似“私人FM”的音乐台,会自动推荐曾被你点赞的歌曲,以及你有可能感兴趣的同类音乐作品)

为了配合 Fitbit Ionic 实现离线听音乐的功能,Fitbit还专门发布了一款无线运动耳机——Fitbit Flyer。

它的外壳采用了独特的纳米涂层,具有防雨防汗等户外使用特性,续航时间为6小时左右,有黑、金两色可选,售价129.95美元,约合人民币857元。

在耳机右侧有三个按键,可以实现接打电话或播放/暂停/切换歌曲/调节音量等操作,这样一来,出门锻炼就不用带手机了。

不过需要提醒的是,除了 Fitbit Flyer 耳机,其他蓝牙耳机是不能与Fitbit Ionic 同步的,所以要想用到音乐功能的话,必须要入手这款耳机了。

运动教练及语音指导服务

Fitbit 在2015年收购了健身应用程序 Fitstar(一款以视频方式提供个人训练指导的手机App),此后它就成为了Fitbit旗下可穿戴产品的原生程序,主要用于收集和分析心率在内的各项运动数据。

现在,这款App正式更名为Fitbit Coach,在功能上也做出了很大的调整,比如之前只能在手机上看到的真人指导视频,现在Fitbit Ionic手表上也能播放了。

Fitbit Coach App 还将提供多种运动指导,大家可以按照自己需要的运动强度来选择不同的导师和运动项目。

此外,这项App还打算开放两个付费服务,一项是针对跑步训练的语音指导服务,提供5名导师和多达40门课程可选;另一项服务是个性化定制长期的运动指导方案。当然别忘了,想要参加前面那项语音服务的前提——首先你要有他们家的Flyer蓝牙耳机。

运动监测

说了这么多,终于说到Fitbit最拿手的运动监测功能了,我们跳过上面讲到了的运动教练功能,直接进入运动模式。

首先,你需要在 Fitbit Ionic 上选择你的运动类型,如:跑步、骑自行车等。

这款手表新增了室内游泳模式,不过它目前还不支持公开水域游泳。

在「设置」中可以设置自动计圈(Auto Lap)、自动暂停(Auto Pause)、以及设定你需要的数据页,包括运动距离、时间、心率、速度等等。点击屏幕中间可切换、循环查看各项数据。

我们重点来看一下心率监测的精确性吧,毕竟这次的新品采用了全新的光电心率计。

使用Garmin Forerunner 935(蓝)与Fitbit Ionic(红)两款产品同步记录,这样对比可以看到数据的一些差异。下面是游泳运动的数据变化:

下面是骑行时的数据变化:

可以看出来,两款腕表在记录游泳时的心率数据大致相近,但在记录骑行数据是有些出入,主要集中在6min和21min两个时间点。

总结

最近一段时间,笔者一直在佩戴这款 Fitbit Ionic 手表,通过这几天的实际体验,感觉它并不是在某一方面做到极致的手表,论运动监测比不过Garmin,在智能应用上拼不过AppleWatch,但它应该是目前为止最全面的智能手表,算是运动手表里比较智能的,智能手表里比较运动的了。

至于续航方面,Fitbit Ionic 大概能用4天左右,开启GPS的话大概有10小时续航时间。这方面比不了Gamrin的跑步手表,不过在上文提过,它并不是一款完美的产品,如果你看上了它的离线播放音乐+移动支付功能,恰巧又对运动监测有一些要求,那么不妨考虑一下它~

于新入门的移动开发者而言,摆在面前的移动应用开发有三种口味

  1. Native App: 本地应用程序(原生App)
  2. Web App:网页应用程序(移动web)
  3. Hybrid App:混合应用程序(混合App)

Hybrid App兼具了Native App良好用户体验的优势,也兼具了Web App使用HTML5跨平台开发低成本的优势。目前已经有众多Hybrid App开发成功应用,比如美团、爱奇艺、微信等知名移动应用,都是采用Hybrid App开发模式,今天实训邦带你学习利用Ionic+angular如何快速开发混合应用App。

分享目录

  1. 概念介绍
  2. 开发环境及搭建
  3. 项目文件目录结构
  4. 技术模型及动态数据请求流程图
  5. Ionic组件及storage本地缓存

一、 概念介绍

1.1 Ionic介绍

2013年第一个版本,目前已经发布到了4.0 Beta 也是发展比较快的一个

开发框架。Ionic以AngularJS和ApacheCordova为基础,使用Node.js进行模块管理,使用Html5、Css(SASS)和Javascript技术进行APP开发。

1.2 Node.js与npm简单介绍

Node.js(http://nodejs.cn/download/)是基于Chrome'sV8 Javascript engine 构建的一个Javascript runtime(Javascript运行时),特点是事件驱动、非阻塞等。

npm(https://www.npmjs.com/)是Node.js中的Javascript包管理。

1.3 相关资料

Ionic文档:https://ionicframework.com/docs/v3/

Ionic Github: https://github.com/ionic-team/ionic

Ionic Cli:https://github.com/ionic-team/ionic-cli

Ionic Icons: https://ionicframework.com/docs/v3/ionicons/

Ionic 开发博客: https://www.joshmorony.com/

二、 开发环境搭建

2.1 开发环境

2.1.1、Node.js不管是Window|Mac系统,都需要Node.js

2.1.2、代码编辑器,如VsCode、Sublime等

2.1.3、开发IOS需要Mac系统,安装Xcode即可,上架需开发者证书

2.1.4、 开发Android,推荐Android Studio

2.2 Node.js搭建

2.2.1、安装Node.js(Windows下安装)

2.2.2、下载地址:https://nodejs.org/en/download/

2.2.3、安装后命令行下执行:node --version出现版本号表示安装成功

2.3npm安装

2.3.1、执行:npminstall npm -g 命令

2.4 Cordova、Ionic 安装

2.4.1、资源包下载地址:http://ionicframework.com/docs/overview/#download

2.4.2、命令行下执行:npminstall -g cordova ionic 命令进行安装

2.4.3、 设置npm 淘宝镜像(GFW,导致很多插件下载失败) :npm install -g cnpm --registry=https://registry.npm.taobao.org 命令进行设置

2.4.4、创建应用实例:ionicstart 应用名称 初始类型, 有 blank、tabs、sidemenu3 种类型可选(例如:ionic start myApp tabs)

2.4.5、试运行看是否安装成功(需要进入到myApp目录):ionic serve(浏览器运行调试)

http://localhost:8100/tabs/tab1

2.4.6、帮助

· 指定版本安装: npm install -g ioniccordova@beta

· npm install -g ionic@beta

· 升级到最新版本命令: npm install --save-dev--save-exact ionic@latest

· cordova卸载命令:npm uninstall cordova -g

· ionic卸载命令: npm uninstall ionic -g

· 浏览器调试技巧:http://localhost:8100/?ionicplatform=android | ios

三、项目文件目录结构

myapp/

|- node_modules 依赖包文件 包括ionic框架本身

|– platforms/ 生成android或者ios安装包需要的资源---(cordova platform add android后会生成)

| |– android/

| |– ios/

|– plugins/ 插件文件夹,里面放置各种cordova安装的插件

| |– cordova-plugin-device/

| |– ionic-plugin-keyboard/

| |– cordova-plugin-ionic-webview/

| |– cordova-plugin-splashscreen/

| |– cordova-plugin-whitelist/

| |– android.json

| |– fetch.json

|- resources android/ios 资源(更换图标和启动动画)

| |– android/

| |– ios/

|- src (ionic4.x中开发工作目录,页面、样式、脚本和图片都放在这个目录下)

| |– app/

| | |– app.component.ts/ 表示前端的逻辑,可以理解为typeScript或者js逻辑控制层;

| | |– app.html/ 核心文件(http拦截器、全局加载动画等)

| | |– app.module.ts/ 应用的根组件,每创建一个页面都要在这里注册申明才可以使用

| | |– app.scss/ 用于声明在应用中全局使用的样式

| | |– main.ts/ 申明根模块的位置

| |– assets/ 静态资源文件夹

| |– pages/ 创建的页面组件都在此目录之下

| |– providers/ 共享的服务组件

| |– theme/ 关于主题的文件 全局样式定义

| |– mainfest.json/

| |– index.html App的主要入口,这个文件主要是用设置css样式和引入js脚本,程序的启动也是在这里进行的

| |– service-work.js

|– .gitignore git配置文件

|– config.xml 打包成app的配置文件,可以配置app的id,名称、描述起始页等

|– ionic.config.json ionic配置文件

|– package.json 配置项目的元数据和管理项目所需要的依赖

|– tsconfig.json TypeScript项目的根目录,指定用来编译这个项目的根文件和编译选项

|– tslint.json :格式化和校验typescript

|– www/ ionic4.x中静态文件,ionic build --prod 生成的单页面静态资源文件 编译文件夹

| |– assets/

| |– build/

| |– mainfest.json/

| |– index.html 引入资源的地方

| |– service-work.js

四、Ionic组件

4.1 Ionic生命周期

4.1.1 官方文档 (https://ionicframework.com/docs/v3/api/navigation/NavController/)

Event

Desc

ionViewDidLoad

当页面加载的时候触发,仅在页面创建的时候触发一次,如果被缓存了,那么下次再打开这个页面则不会触发

ionViewWillEnter

顾名思义,当将要进入页面时触发

ionViewDidEnter

当进入页面时触发

ionViewWillLeave

当将要从页面离开时触发

ionViewDidLeave

离开页面时触发

ionViewWillUnload

当页面将要销毁同时页面上元素移除时触发

4.1.2 Ionic技术栈模型

41..3 Ionic动态登录流程图

4.2 tab控件

4.2.1 可分为,图标选项卡,顶部图标+文字选项卡,单文字。

<ion-tabs>
 <ion-tab-barslot="bottom">
 <ion-tab-buttontab="tab1">
 <ion-iconname="flash"></ion-icon>
 </ion-tab-button>
 <ion-tab-buttontab="tab2">
 <ion-label>Tab Two</ion-label>
 </ion-tab-button>
 <ion-tab-buttontab="tab3">
 <ion-iconname="send"></ion-icon>
 <ion-label>Tab Three</ion-label>
 </ion-tab-button>
 </ion-tab-bar>
</ion-tabs>

4.3 button按钮

<ion-button>Default</ion-button>
<ion-buttonhref="#">Anchorion</ion-button>
<ion-buttoncolor="primary">Primaryion</ion-button>
<ion-buttoncolor="secondary">Secondaryion</ion-button>
<ion-buttoncolor="tertiary">Tertiaryion</ion-button>
<ion-buttoncolor="success">Succession</ion-button>
<ion-buttoncolor="warning">Warningion</ion-button>
<ion-buttoncolor="danger">Dangerion</ion-button>
<ion-buttoncolor="light">Lightion</ion-button>
<ion-buttoncolor="medium">Mediumion</ion-button>
<ion-buttoncolor="dark">Darkion</ion-button>
<ion-buttonexpand="full">FullButtonion</ion-button>
<ion-buttonexpand="block">BlockButtonion</ion-button>
<ion-buttonshape="round">RoundButtonion</ion-button>
<ion-buttonexpand="full"fill="outline">Outline+ Fullion</ion-button>
<ion-buttonexpand="block"fill="outline">Outline+ Blockion</ion-button>
<ion-buttonshape="round"fill="outline">Outline+ Roundion</ion-button>
<ion-button>
<ion-iconslot="start"name="star"></ion-icon>
Left Icon
</ion-button>
<ion-button>
Right Icon
<ion-iconslot="end"name="star"></ion-icon>
</ion-button>
<ion-button>
<ion-iconslot="icon-only"name="star"></ion-icon>
</ion-button>
<ion-buttonsize="large">Largeion</ion-button>
<ion-button>Defaultion</ion-button>
<ion-buttonsize="small">Smallion</ion-button>

4.4 input按钮

<ion-input></ion-input>
<ion-inputvalue="默认值"></ion-input>
<ion-inputplaceholder="提示语"></ion-input>
<ion-inputclearInputvalue="可清空"></ion-input>
<ion-inputtype="number"value="数字类型"></ion-input>
<ion-inputvalue="禁用"disabled></ion-input>
<ion-inputvalue="只读"readonly></ion-input>
<ion-item>
<ion-label>Default Labelion</ion-label>
<ion-input></ion-input>
</ion-item>
<ion-item>
<ion-labelposition="floating">FloatingLabelion</ion-label>
<ion-input></ion-input>
</ion-item>
<ion-item>
<ion-labelposition="fixed">FixedLabelion</ion-label>
<ion-input></ion-input>
</ion-item>
<ion-item>
<ion-labelposition="stacked">StackedLabelion</ion-label>
<ion-input></ion-input>
</ion-item>

4.5 Loading组件

import{Component}from'@angular/core';
import{LoadingController,AlertController}from'@ionic/angular';
 
@Component({
selector:'app-tab2',
templateUrl:'tab2.page.html',
styleUrls:['tab2.page.scss']
})
exportclassTab2Page{
 constructor(publicloadingController:LoadingController,publicalertController:AlertController) {}
 
 ionic3Loading(){
 letloading=this.loadingCtrl.create({
 content:"Pleasewait....",
 duration:1000,
 });
 loading.present(loading);
 }
 asyncpresentLoading() {
 constloading=awaitthis.loadingController.create({
 message:'Hellooo',
 duration:2000
 });
 returnawaitloading.present();
 }
 
 asyncpresentLoadingWithOptions() {
 constloading=awaitthis.loadingController.create({
 spinner:null,
 duration:5000,
 message:'Please wait...',
 translucent:true,
 cssClass:'custom-class custom-loading'
 });
 returnawaitloading.present();
 }
 
}

4.6 Alert组件

import{Component}from'@angular/core';
import{LoadingController,AlertController}from'@ionic/angular';
 
@Component({
selector:'app-tab2',
templateUrl:'tab2.page.html',
styleUrls:['tab2.page.scss']
})
exportclassTab2Page{
 constructor(publicloadingController:LoadingController,publicalertController:AlertController) {}
 ionic3Alert(){
 letalert=this.alertCtrl.create({
 title:'操作',
 message:'成功',
 buttons:['关闭']
 });
 alert.present();
 }
 asyncpresentAlert() {
 constalert=awaitthis.alertController.create({
 header:'Alert',
 subHeader:'Subtitle',
 message:'This is an alert message.',
 buttons:['OK']
 });
 awaitalert.present();
 }
 asyncpresentAlertMultipleButtons() {
 constalert=awaitthis.alertController.create({
 header:'Alert',
 subHeader:'Subtitle',
 message:'This is an alert message.',
 buttons:['Cancel','Open Modal','Delete']
 });
 awaitalert.present();
 }
}

4.7 Toast控件

import{Component}from'@angular/core';
import{LoadingController,ToastController,AlertController}from'@ionic/angular';
 
@Component({
selector:'app-tab2',
templateUrl:'tab2.page.html',
styleUrls:['tab2.page.scss']
})
exportclassTab2Page{
 constructor(publicloadingController:LoadingController,publicalertController:AlertController,publictoastController:ToastController) {}
 asyncpresentToast() {
 consttoast=awaitthis.toastController.create({
 message:'Your settings have been saved.',
 duration:2000
 });
 toast.present();
 }
 
 asyncpresentToastWithOptions() {
 consttoast=awaitthis.toastController.create({
 message:'Click to Close',
 showCloseButton:true,
 position:'top',
 closeButtonText:'Done'
 });
 toast.present();
 }
}

4.8 Grid布局

<ion-content>
 <divclass="floatMenu">
 <ion-grid>
 <ion-row>
 <ion-colcol-4text-center>
 <div(tap)="gotoQuestion()">
 <ion-iconname="create"></ion-icon>提问
 </div>
 </ion-col>
 <ion-colcol-4text-center>
 <div>
 <spanclass="line-float-left">|</span>
 <ion-iconname="albums"></ion-icon>回答
 </div>
 </ion-col>
 <ion-colcol-4text-center>
 <div(tap)="gotoQuestion()">
 <spanclass="line-float-left">|</span>
 <ion-iconname="share-alt"></ion-icon>分享
 </div>
 </ion-col>
 </ion-row>
 </ion-grid>
 </div>
</ion-content>

4.9 List控件

<ion-list>
 <ion-item-sliding>
 <ion-item>
 <ion-label>Item</ion-label>
 </ion-item>
 <ion-item-optionsside="end">
 <ion-item-option(click)="unread(item)">Unread</ion-item-option>
 </ion-item-options>
 </ion-item-sliding>
 <ion-item-sliding>
 <ion-item>
 <ion-label>Item</ion-label>
 </ion-item>
 <ion-item-optionsside="end">
 <ion-item-option(click)="unread(item)">Unread</ion-item-option>
 </ion-item-options>
 </ion-item-sliding>
</ion-list>

4.10 Navigation控件 路由导航

· ion-nav-pop 自动返回

· ion-nav-push 用于导航到指定的组件

· ion-nav-set-root 设置当前导航根源

· ion-nav 导航不绑定到一个特定的路由器

五、storage本地缓存

5.1 在app.module.ts中

5.2 在页面中的.ts中设置缓存内容

5.3 应用赋予GPS权限!

publicdoLogin(username,password): Observable<string> {

returnthis.http.get(LOGIN_URL,{ params:{"username":username,"password":password}})

.map(this.extractData)

.catch(this.handleError);

}


到此本次分享就结束了,想学习更多移动开发技能,欢迎交流,提出你们想要学的内容或者想法哦!

pp开发是一个非常有趣的事情,如果你试着开发一个自己的app的话,你一定会爱上这项活动。

编者按:React Native愈发火爆,如果你尚未接触过,不如看看本文作者的入门指南,他会带你体验基于RN平台开发一款电子商务搜索类App的奇妙旅程!本文编译自Hackernoon,原文标题为:Building an e-commerce search app with react native,推荐有一定编程基础的读者阅读。

今天我们来聊一聊是如何在RN平台开发一款用于查找图书数据库的电子商务移动app。如果你之前没有使用过RN,那么现在就跟我一起开启你的移动端Javascript开发之旅吧。

2018年Javascript迎来了前所未有的发展,各种库、框架、开发工具都已经发展的相当的成熟了,整个社区也都在致力于使网上冲浪变得更加方便快捷。当然,开发过程中还是会存在一些bug,但是,如果你会用Javascript,那么这些小问题就都不是事。你可以利用JS来制作web app、后台服务器、移动端app。

React Native不仅可以像Cordova/Ionic/Phonegap等利用WebView架构和Javascript进行移动端APP开发,而且支持native编译,因此如果有需要也可以编写native代码。

你需要提前知道的事情

现在React Native非常的火,网上有很多的资源,所以你可以很容易从互联网上获取学习资源,因此,在你进行RN程序开发之前最好有一定的学习基础。如果你是刚接触这个项目,你可以先尝试学习下官方教程,如果,你更愿意跟着视频课程进行学习,那么我会强烈推荐你去看Kent C. Dodds在egghead上的免费课程“The Beginner’s Guide to ReactJS”

如果你对ES6+同样了解的话,那就再好不过了。这有一本ES6的入门指南,有了它,你就能很快上手了。

作为一个初学者,虽然我建议你去认真学习一下React,并开发一些网络版的APP,但是,如果你想抓紧时间上手开发自己的程序的话,好好的了解React的基本架构也是很有必要的,因为React和React Native具有相通的架构,只是他们最后的目标不同,一个是服务于Web APP的,另一个是服务于native APP

如果,你使用React或React Native 进行产品开发,你将节省大部分的时间和精力,因为,无论是IOS还是Andriod平台,社区上都有很多其他人共享的代码。这也是为什么RN开发平台被像爱彼迎,脸书,照片墙,沃尔玛和特斯拉等公司接受并利用它开发移动端app的原因。

基本概念

简单的介绍一下React Native是如何进行工作的以及JavaScript的代码是如何装换成到一个强大的移动端app。我们需要知道的是任何的一个React Native 应用都是双线程的:

1. 主线程

主线程管理着程序的用户界面,处理包括手势和触摸在内的所有本地交互。因为RN允许在源代码中添加android java,Objective C或swift代码,所以这些代码块也可以在此线程中执行。是不是感觉这样开发变得很舒服。

2. JavaScript 线程

这个线程执行在JavaScript编译器写的JavaScript代码(默认状态下是在iOS平台中,并且通过构件可以发送到Android设备上。)

为了使应用程序正常工作,两个线程之间就需要搭一座桥接器来实现交流,就像下面的示意图展示的那样。

React Native core architecture

正如名字所表示的,中间件可以帮助实现JavaScriprt线程和主线程之间的数据(信息)处理。这些信息可以被异步和批量处理。中间件可以保证JS代码与本机模块进行对话并且与设备API交互。

现在我们对RN的结构有了基本的了解,接下来我们来介绍实现的过程。

搭建开发环境

如果你已经安装了RN并且对开发系统比较了解,你就可以跳过去看下一部分内容了。如果你是刚入门的新手,那么你可以按照官方的安装指南(会有更加详细的介绍)去操作,或者按照我下面说的去做。首先确认你的电脑上已经成功安装了node和yarn模块。我们将利用CRNA(create-react-native-app )工具来创建模版,运行下面的指令实现程序“HelloNative”

create-react-native-app HelloNative

cd HelloNative

npm start

这将为你启动一个可扩展的服务器,并在终端输出一段QR代码。使用CRNA工具出现的警告只有:

it may not use the latest version of react-native

如果出现这个警告,你可以使用Expo CLI 或者 Expo XDE去解决。

然后安装Expo 在你的iOS系统或者Android系统上,并将手机和你的电脑一样联接到网络中。使用Expo app你就可以在你的手机上进行操作啦,想想就很令人激动把。就像下面图显示的一样:

React Native app

你可以运用yarn ios 和yarn android指令分别在iOS和Android模拟器上测试,这样你就可以运行你的React-Native app啦。

如果你知道如何打开app中的扩展菜单,你将会看到有支持热加载和实时重载选项。这些可以使你可以迅速在Andriod环境下加载你的app

A closer look at the developer options

扩展操作同时具有了debugging模块,在后面的内容中我们将进行详细的介绍。

调试模块

远程调试JS程序可以让我们查看相关的控制信息和错误信息。这让我们的开发和调试过程变得更加容易,另外,你还需要安装 React Native debugger

React Native Debugger in action

这是一个非常实用的工具,可以帮助我们查看React Native app中的模块声明和类树,你也可以在上面查看和码上你开发的app需要运用的模块。

准备阶段

React Native提供了一些开发app的基本模块,你可以在list of available components here中找到React Native提供的不同平台下对应的功能模块,这些模块可以帮助你进行开发属于你自己的app,这让开发过程变得更加简单。React Native支持fetch 功能,这样使得开发人员在开发过程中就可以像网页一样从服务器上获取数据和处理http请求。

对于我们将要设计的搜索app,我们将使用能够在短时间内遍历大量数据的NoSQL数据架构进行开发。它将对以JSON为对象的所有文档进行全文搜索。

可能你以前没有接触过Elasticsearch,但是你不得不接受使用Elasticsearch是个趋势。你可以从下面的介绍中学习相关的基础。

Elasticsearch的起步并不是那样的简单,设置环境、添加数据、查看数据等等操作对于一个初学者来讲并不是一件简单的事,因此,Elasticsearch的社区里面提供了很多开源的工具来帮助初学者进行开发。

· Importer 添加数据到Elasticsearch中

· Data Browser 以excel表格的形式查看Elasticsearch中的数据。

· Query Builder 组织管理关联的Elasticsearch队列。

在这些工具的帮助下,我们可以直接利用这些工具和React Native 去组建一个强大的移动端图书馆app

你可以按照官网的指导安装设计Elasticsearch服务器,或者你可以申请一个appbase.io 的账号,appbase.io 提供了一个Elasticsearch的服务器,这样就更加方便了,因此,我们就用appbase.io平台开始我们的开发。

我已经简单的创建了一个基本的数据搜索的app,你可以进入下图进行查看。

Dataset of books

你可以利用最下面的 Clone this app选项复制已经存在的模版作为你开发的基础。这些授权信任书可以帮助我们连接到UI上,我们在这篇教程中要使开发的app的授权信任模块如下

{

app: "good-books-ds",

credentials: "nY6NNTZZ6:27b76b9f-18ea-456c-bc5e-3a5263ebc63d",

type: "good-books-ds"

}

开启 Reactive search之旅

我们将使用ReactiveSearch来进行开发,因为ReactiveSearch是一个Elasticsearch上的UI模块的React和React Native通用的开源库,它提供了一个丰富的资源库、完善的配置环境以及架构,这样你就可以连接到任何一个Elasticsearch的服务器上,

为什么我们需要ReacttiveSearch呢?

ReactiveSearch提供了一整套连接到Elasticsearch服务器上的模块,可以创建队列、具有灵活直观的特点。并且可以让你的模块可以与其他的模块实现通信,比如说你创建了一个A模块,A模块实现了升级更新,这样需要B模块可以获取信息并且可以实现不依靠任何关联额自主的实现更新。

Reactivesearch-native上有很多的nativeUI模块,这些可以使你开发app的UI 模块的时候有所借鉴,让你的app变得更加的美观和智能。

开发搜索app

我们需要在我们的React Native项目下利用下面的代码安装reactivesearch-native

yarn add @appbaseio/reactivesearch-native

全部的ReactiveSearch的模块都被包装在ReactiveBase 的容器中,

我们将使用这些在App.js中Adding ReactiveBase component React Native 中的Styling和网页类似,我们这里采用的是Flex中的基本Styling,如果你之前没有接触过这个Flex的话呢,个人建议你可以尝试从FlexBox Froggy开始起步。

除了Stylesheet以外,我们的代码中还使用了React Native中的两个其他的模块。

· View 在React Native中和html中的div元素差不多是一个容器,可以支持多种操作。

· Text 这个是React Native中可以查阅相关内容的的模块。

在我们设计的BookSearch app中,我们将需要尝试Reactivesearch-native中的另外的两个模块:

1. Search box for searching the books:

我们这里将使用reactivesearch-native中的DataSearch模块去实现多区域的搜索功能,其核心如下所示

<DataSearch

componentId="searchbox"

dataField={[

'original_title',

'original_title.search',

'authors',

'authors.search',

]}

placeholder="Search for books"

autosuggest={false}

/>

DataSearch使用起来相当的方便,由于其本身就是在dataFied(s)的队列中,因此这个模块就可以轻松的帮助我们实现转入到ReactiveBase模块中,并且可以传递和接收一切索引的信息,这样就不需要我们自己去编写相关的队列算法了。

2. Result List View for displaying the search results:

结果展示模块

我们在结果的输出上主要采用的是reactivesearch-native 中的ReactiveList模块:

<ReactiveList

componentId="results"

dataField="original_title"

size={7}

showResultStats={false}

pagination={true}

react={{

and: "searchbox"

}}

onData={(res)=> (

<View style={styles.result}>

<Image source={{ uri: res.image }} style={styles.image} />

<View style={styles.item}>

<Text style={styles.title}>{res.original_title}</Text>

<Text>{res.authors}</Text>

</View>

</View>

)}

/>

上面的代码是如何工作的呢?

· dataField: 通过name field去调整结果

· onData: 接收返回值为JSX相关结果的函数,这是我们常用来查看部分结果的方式。

如果你想让你的app变得美观,想要调整一些字体的话,可以在你的程序里面输入下面的代码

async componentWillMount() {

await Expo.Font.loadAsync({

Roboto: require('native-base/Fonts/Roboto.ttf'),

Roboto_medium: require('native-base/Fonts/Roboto_medium.ttf'),

Ionicons: require('@expo/vector-icons/fonts/Ionicons.ttf'),

});

}

编后语:如果你很有兴趣,还想了解更多,不妨去看看这两个论坛,和更多朋友交流下你的想法:

1. ReactiveSearch GitHub repo

2. ReactiveSearch docs

原文链接:

https://hackernoon.com/building-an-e-commerce-search-app-with-react-native-2c87760a2315