跨平台移动开发实战(十一)------各平台(chrome+android+ios+webos)上的项目结构

跨平台移动开发实战(一)------总体架构和技术路线 最近两个月以来工作之余一直在做一件事情,就是把现在的产品移植到各主流移动平台上。其实需求很简单,就是想让现有的产品能在各大移动平台上有个端,让客户能移动办公。这个需求大概也是个大众化普遍的需求,于是乎就饶有兴趣地把它当作一个主题比较深入地研究了一下。两个时间自己没事儿就倒腾一下,做了一个像模像样的产品,并覆盖到IOS、Andriod、WebOS、Chrome和Windows Phone(还在开发中 阅读详情

由于需要在把应用打包成各平台上的native app,所以需要按照各个平台的项目结构来组装应用,所以虽然主体程序都是基于HTML5开发,但依然需要在各个平台上都构建一套项目,下面介绍一下我开发的这么几个版本的项目结构:

  • Chrome
  • Android
  • IOS
  • Webos

1)Chrome

Chrome非常简单,标准的HTML代码结构,只不过添加一个manifest.json描述文件,就能使其成为一个Chrome APP,项目结构如下图所示:

manifest.json:

{
  "name": "Starteam chrome",
  "description": "Starteam mobile chrome version.",
  "version": "1",
  "app": {
    "launch": {
      "local_path": "app.html"
    }
  },
  "icons": {
    "24": "css/images/icon_24.png",
    "48": "css/images/icon_48.png",
    "128": "css/images/icon_128.png"
  },
  "permissions": [
    "unlimited_storage",
    "notifications"
  ]
}

之后在chrome的扩展程序里安装此项目文件夹即可。

2)Android

Android版本的项目结构基于Phonegap推荐的即可:

其中:

  • src:android native相关的类文件
  • assets/www:程序主体,包含HTML, JS, CSS和图片等静态资源
  • AndroidManifest.xml:项目描述文件

3)IOS

其中:

  • cordovaLib.xcodeproj:phonegap框架源码
  • www:程序主体,包含HTML, JS, CSS和图片等静态资源
  • Plugins:phonegap自定义插件
  • Supporting Files:项目资源和描述文件

4)Webos

这里没用mojo或enyo框架,因此,项目结构相对简单:

其中appinfo.json是项目描述文件:

{
	"id": "com.hp.starteam.mobile.webos",
	"version": "1.0.0",
	"vendor": "hp",
	"type": "web",
	"main": "app.html",
	"title": "starteam-mobile-webos",
	"icon": "icon.png",
	"uiRevision": 2
}

基于此文件可以把应用打包为webos的native app.

Apple_IOS、Android、WebOS系统体系架构对比 立即下载

相关推荐

手把手教你用HI3516CV610搭建智能安防摄像头(附完整开发资料)

本文详细介绍了基于海思HI3516CV610 SOC搭建智能安防摄像头的完整开发流程,包括硬件选型、系统架构设计、开发环境搭建、智能分析功能开发及系统调优。通过实战案例,展示了如何利用内置NPU实现人形检测和异常行为分析,并提供了量产测试方案,帮助开发者快速完成智能摄像头项目。

backprop5master的博客 539

OpenGL ES2之Android&iOS跨平台开发教程(一)Android端构建

本文目标是开发一款在Android&IOS上运行的跨平台图形应用,供各位初学者参考,同时也是过去几个月自己的学习总结,阅读本文前需要读者已有一定的OpenGL ES知识,如果没有,可以看看这个教程讲得不错。网上大多OpenGL ES教程,要么是仅适于Android的(Java),要么就是仅适于iOS的(Objective-C),其实OpenGL ES是跨平台的,使用C++可共用大部分代码,一次编写,两处运行,岂不美哉?...

屠龍之技的专栏 6004

工业组态软件Intouch(单机版)入门{第二篇}

第5步:*都装好之后,需要进行测试授权是否生效,测试1:能否正常运行项目和编辑项目(能否编辑项目,取决于你的授权是否包含开发功能,如果只是单一的runtime授权,则只能运行项目,不能编辑项目)。在线第3步:点击第一个框右边的按钮,弹出文件浏览窗口,选中你的XMl授权文件,打开,然后你的授权出现在下方的列表中,勾选你的授权,然后点击Activate,等待几秒,授权就会出现在管理器页面的列表中,并且Status会显示Activated。第1步:软件安装好之后,先要配置好授权服务器。等待几秒,激活完成。

weixin_41571357的博客 1万+

ios android 跨平台工具,15个很优秀的跨平台的移动开发工具

跨平台的移动开发指的是通过特定方式开发出来的移动应用可以用在多种移动平台,如iOS、Android 以及 WindowsPhone。利用现有的高质量移动框架来构建移动 Web 应用程序已成为非常容易,本文包含15个最佳的跨平台移动开发工具。1. Pusher2. RhoMobile3. Weex4. NativeScript5. CloudRail6. Kony7. Rikulo8. Phoneg...

weixin_39982537的博客 1798

CH569 USBSS库函数分析

CH569 USB3.0 解析

havc_W的博客 7683

Android SSL证书固定实战:原理、方案与避坑指南

SSL/TLS协议是保障网络通信安全的基石,其核心原理是通过非对称加密和数字证书实现身份认证与数据加密。在移动应用开发中,为了防止中间人攻击,证书固定技术应运而生,它通过将服务器证书或公钥的哈希值预置在应用内,强制校验服务器身份,从而大幅提升通信链路的安全性。这一技术对于金融、电商等高安全要求场景尤为重要。本文聚焦Android平台,深入解析SPKI固定、Network Security Configuration与OkHttp CertificatePinner等主流方案,并针对证书更新、调试兼容等常见痛

weixin_33935636的博客 402

OpenGL ES2之Android&iOS跨平台开发教程(二)iOS端构建

上一篇介绍了在Android端构建OpenGLES,这一篇介绍在iOS端调用OpenGLES。

屠龍之技的专栏 1971

详解Linux下使用vscode编译运行和调试C/C++

本教程将具体详解使用Visual Studio Code在Linux环境下使用C/C++方法。 GCC C++ 编译器 (g++) 和 GDB 调试器的方法。 GCC是GNU 编译器集合; GDB 是 GNU 调试器。 1.先决条件 安装Visual Studio Code. 安装C++拓展插件。点击在vscode界面最左侧的Extensions图标(打开快捷键:ctrl+shift+X),搜索“C/C++”,点击进行安装。 确保已安装gcc. 一般ubuntu系统会预装gcc.在终端窗口中输入如下命令

休的博客 6239

Flutter页面跳转

Flutter页面跳转 1、创建Flutter app工程,默认的main.dart文件如下: import 'package:flutter/material.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { // This widget is the root of your application. @override Widget build(BuildContex.

博客,是nsacer先森的 490

打脸来的太快了,又发现一个Trae的宝藏功能--内置浏览器可以指定机型来显示前端界面

今天给大家分享一个Trae的实用功能,就是SOLO模式下内置浏览器可以指定不同的手机、平板机型来查看前端页面显示效果,我感觉这个功能很棒,忍不住就跟大家分享一下。

cpp加油站的专栏 6561

【ComfyUI】SD1.5 + ControlNet 边缘检测融合动漫转真人

本文介绍了一个基于ComfyUI的动漫转真人图像生成工作流,通过多模型协同实现高质量的二次元图像转换。该工作流集成了Canny线稿预处理、ControlNet结构控制、VAE编码解码和人脸精细化处理等核心环节,采用majicmixRealistic_v7作为主模型,配合yolov8、SAM等辅助模型。整个流程包含11个标准化步骤,从图像输入、预处理到最终超分输出,通过ControlNet引导和CLIP语义控制确保生成图像的写实感和结构准确性,特别针对人脸区域进行专业优化,最终可输出高分辨率写实人像。

Mr数据杨 1120

跨平台移动开发实战(八)------移动客户端网络通信

服务器端搭建好后,移动客户端就需要基于HTTP和Websocket来和服务器端通信,HTTP就基于Ajax来实现,Websocket就得靠各个移动平台浏览器对Websocket的支持,基本的开发大家查查文档就比较容易掌握,这里我着重谈三点: Ajax安全策略移动平台对Websocket的支持文件传输 1)Ajax安全策略 大家都知道Ajax存在跨域的限制,而基于Phonegap的离线开发

走向架构师之路 7371

《网络安全自学教程》- 802.1x协议

802.1x协议架构,工作原理/认证流程,认证方式,MAB认证,触发认证的三种方式,EAP报文格式,EAPOL报文格式

wangyuxiang946的博客 2万+

免费 iOS 侧载工具 iloader 全流程指南:从连接设备到完成安装,一次讲清楚

iloader 是一款免费的跨平台 iOS 侧载工具,基于 Tauri 构建,不用越狱就能把 SideStore、LiveContainer 或者任意 IPA 签名安装到 iPhone / iPad 上,还会自动处理配对文件、个人证书与 App ID。很多新手卡住的地方,其实是流程里的固定几步:电脑认不认设备、Apple ID 能不能登录、免费账号的证书额度够不够。下面按真实使用顺序,把这整条链路

gitblog_09094的博客 503

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

nanoScrollerJS浏览器兼容性指南:解决99%的跨平台问题

想要为你的网站添加优雅的Mac OS X Lion风格滚动条吗?nanoScrollerJS是一个轻量级的jQuery插件,专门用于实现简洁美观的自定义滚动条效果。然而,在实际使用中,浏览器兼容性问题常常成为开发者的困扰。本指南将为你详细解析nanoScrollerJS的完整浏览器兼容性解决方案,帮助你轻松应对各种跨平台挑战!🚀 ## 为什么选择nanoScrollerJS? nanoScr

gitblog_00033的博客 490

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

使用Cordova 3.3.0在Android或iOS上部署Chrome应用

开发者现在可以使用Apache Cordova 3.3.0在Android和iOS上部署Chrome应用了。\u0026#xD;\n在Adobe发布PhoneGap 3.3六周之后,Cordova 3.3.0现身于PhoneGap Build云服务中。除了支持Android KitKat外,Cordova 3.3.0还支持在Android环境中使用Chrome远程调试Webview,以及在iOS环...

啊啊啊啊2 323

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

webOS将会运行在多种设备之上,Enyo将可用于所有主流浏览器

本文来源于我在InfoQ中文站翻译的文章,原文地址是:http://www.infoq.com/cn/news/2012/01/webOS-Enyo-2HP决定通过采用标准的Linux内核来延伸webOS的触角,其Enyo开发框架也将能运行在所有主流浏览器之上。此外,Enyo 2.0业已开源。Enyo是个面向对象的JavaScript框架,最初用于webOS与WebKit。去年12月,HP宣布开源...

weixin_33858249的博客 122

js如何判断是ios还是android,js如何判断当前运行环境是ios webview还是android webview?...

var os = this.os = {}, browser = this.browser = {},webkit = ua.match(/Web[kK]it[\/]{0,1}([\d.]+)/),android = ua.match(/(Android);?[\s\/]+([\d.]+)?/),osx = !!ua.match(/\(Macintosh\; Intel /),ipad = ua....

weixin_39797532的博客 307

判断浏览器是手机端还是pc端 以及判断安卓还是iOS

function IsPC() { var userAgentInfo = navigator.userAgent; var Agents = [“Android”, “iPhone”, “SymbianOS”, “Windows Phone”, “iPad”, “iPod”]; var flag = true; for (var v = 0; v < Agents.length; v++)...

weixin_44673034的博客 831

android js运行环境,js如何判断当前运行环境是ios webview还是android webview?

var os = this.os = {}, browser = this.browser = {},webkit = ua.match(/Web[kK]it[\/]{0,1}([\d.]+)/),android = ua.match(/(Android);?[\s\/]+([\d.]+)?/),osx = !!ua.match(/\(Macintosh\; Intel /),ipad = ua....

weixin_34684705的博客 416
上一篇: 跨平台移动开发实战(十)------与native集成
下一篇: 跨平台移动开发实战(十二)------HTML5安全
cutesource
博客等级 码龄17年 5041粉丝 151原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值