我是一名不熟悉移动应用程序开发的Web开发人员,需要尽快启动项目.尽管在过去几周进行了研究,(我已经列出了迄今为止我在这篇文章的最后部分所做的事情)但我仍然没有在Phonegap或原生(仅适用于iOS/Android)之间做出决定.谷歌搜索"Phonegap vs native"之类似乎给出了相当均匀分裂的结果,但毫无疑问,本机将提供更快/更好的最终结果,但代价是不得不在短时间内学习这么多新东西大体时间.
关于Phonegap的一个常见问题是运行缓慢 - 但我也读过,因为V3现在运行速度要快得多 - 是这样吗?
我需要构建的应用程序非常像移动静态站点(但客户坚持认为它必须是应用程序) - 只是文本和一些图像和一些PDF.将添加新内容,例如新闻,因此我考虑的不是为每个新项目发布新的应用程序版本,应用程序将从Web API(JSON或XML)获取新数据,最后需要推送通知.
无需访问摄像头,GPS或任何其他硬件(禁止文件系统缓存图像/ PDF).
我看过类似的应用程序(比赛),他们似乎都广泛使用网页浏览量,这可能表明它们是用Phonegap制作的(或者是它?).
所以我的问题是,考虑到我需要做的简单类型的应用程序,为本机生成会有很大的好处,或者Phonegap(最新版本)也能正常工作.或者另一方面,因为它是一个简单的应用程序,在原生中是否容易(即从零到两个应用商店在10周内)?
我有一个安装了ADT/Xcode的mac,因此这不是选择的因素.
我的研究到目前为止.
跟随Android开始到这里http://developer.android.com/training/basics/actionbar/styling.html然后迷失了标签
然后得到了一本书,SAMS在24小时内,大约6小时内自学了android
几个Phonegap教程,如http://coenraets.org/blog/phonegap-tutorial/,但似乎都有问题让它们按原样运行.
我有一个AngularJS/Cordova应用程序,用于在远程服务器上轮询JSON服务:
$http({method: 'GET', url: 'http://example.com/index.php'})
Run Code Online (Sandbox Code Playgroud)
在浏览器中开发并运行我的Intranet apache服务器(http://dev)我得到"没有'Access-Control-Allow-Origin'标头存在"所以我通过添加以下内容来解决这个问题:
Header set Access-Control-Allow-Origin "http://dev"
Run Code Online (Sandbox Code Playgroud)
一切正常,我Origin:http://dev在Chrome开发工具中看到了.
因此,不得不首次考虑这个问题,我想知道当应用程序在Android/iOS网页浏览器中运行时,Origin会是什么.我决定在我的设备上进行构建和部署,并期望在远程调试中看到相同的错误(适用于iOS的Safari和适用于Android的Weinre),但令我惊讶的是它可以工作(不发送任何CORS标头)!我还发现,在两个设备中,应用程序在webview下以file://方案运行,而不是(我假设的)手机操作系统提供的某些类型的http服务器.
因此研究似乎表明文件不需要CORS:// - 这样的"网站"可以访问任何域上的任何XHR资源.但是,当我在桌面浏览器上测试时,我发现虽然Safari不需要CORS文件://但确实如此,FireFox可以在没有CORS的情况下工作
所以我的问题:
1)为什么我的应用程序在Android/iOS中没有CORS工作 - 是因为CORS不适用于file://,或者,Cordova是否正在做某些事情以使其在设备中运行?
我有<access origin="*"/>我的配置
2)如果,Q1的待定答案,我应该想要在安全的网站上并明确允许来自应用程序的请求,你为file://"hosts"提供了什么价值的Access-Control-Allow-Origin?在我的调试中,来自file的请求中没有Origin头://
3)除了阻止XHR请求到远程服务器,Chrome还阻止我的应用程序模板(我使用单独的文件),见下文.这是我的应用程序的潜在问题,还是我不需要担心的Chrome问题?
XMLHttpRequest cannot load file:///Volumes/projects/phonegap/www/templates/tabs.html. Cross origin requests are only supported for HTTP.
Run Code Online (Sandbox Code Playgroud) 我正在使用PhoneGap/Cordova开发混合应用程序(仅适用于iOS和Android),并希望使用HTML5 localStorage存储内容以供离线访问.
http://caniuse.com/#search=localStorage说 - "在iOS 5和6中,localStorage数据存储在可能偶尔被操作系统清除的位置."
iOS 7(及更高版本)webview的情况如何,localStorage在什么情况下会持续存在,或者被操作系统或用户清除?
该应用程序的更新是否会清除localStorage?
用户在Safari上清除浏览器历史记录怎么样?这也适用于webview吗?
我是否需要担心(或者我甚至可以控制)在fils系统上创建localStorage的位置.我知道它不应该在iCloud上备份.
我有一台设备(iPad)并检查文件系统我看到localStorage文件位于app沙箱中的〜/ Library/Caches中,见下图.
来自文档:
https://developer.apple.com/icloud/documentation/data-storage/index.html 可以再次下载或重新生成的数据应存储在/ Library/Caches目录中.您应该放在Caches目录中的文件示例包括数据库缓存文件和可下载内容,例如杂志,报纸和地图应用程序使用的内容.
我只是这样做来设置数据:
localStorage.setItem('foo','this is the FOO value');
localStorage.setItem('bar','and this is the BAR value');
Run Code Online (Sandbox Code Playgroud)

我有一个列出工作的移动网站,用户申请并上传他们的简历(简历) - 我希望他们能够从他们的Google云端硬盘中选择一个文件.
我在这里创建了Hello world示例 - https://developers.google.com/picker/docs/(为方便起见,此处转载的代码)
问题是,如果尚未登录到云端硬盘,则会启动登录弹出窗口.这在桌面上已经够糟了,但在手机上真的很糟糕.
我试过这个解决方案,但得到'TypeError:gapi.auth is undefined'
我还尝试从onclick事件启动选择器,而不是文档描述的onload.
function launchDrive()
{
gapi.load('auth', {'callback': onAuthApiLoad});
gapi.load('picker', {'callback': onPickerApiLoad});
}
<input type='button' value='Launch Drive' onclick='launchDrive();'>
Run Code Online (Sandbox Code Playgroud)
Google代码示例:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8"/>
<title>Google Picker Example</title>
<script type="text/javascript">
var developerKey = 'xxxxxxxYYYYYYYY-12345678';
var clientId = "1234567890-abcdefghijklmnopqrstuvwxyz.apps.googleusercontent.com"
var scope = ['https://www.googleapis.com/auth/photos'];
var pickerApiLoaded = false;
var oauthToken;
function onApiLoad() {
gapi.load('auth', {'callback': onAuthApiLoad});
gapi.load('picker', {'callback': onPickerApiLoad});
}
function onAuthApiLoad() {
window.gapi.auth.authorize(
{
'client_id': clientId, …Run Code Online (Sandbox Code Playgroud) 编辑 - 标题以前
OneDrive Web选取器SDK(Javascript)无法在移动设备上选择/打开文件
来自SO的自动电子邮件建议我将奖金更改为赏金期限到期.
我已根据这些说明https://dev.onedrive.com/sdk/javascript-picker-saver.htm在移动设备友好的网站上创建了一个OneDrive选择器,它在Windows桌面上运行良好.
然而,在移动浏览器(Android 4.2上的Android浏览器和Chrome以及iOS 7上的Safari)中,选择器启动并将我登录,我可以看到文件,但是当我点击选择文件时,"打开"按钮仍然处于禁用状态.
编辑,只是为了澄清:我不想将文件上传到OneDrive.我想在我的OneDrive帐户中选择一个文件并将其URL传回页面.这样我就可以将该URL发送到我的服务器并让服务器获取文件
如果我长按我选择的文件,会出现一个内容(我的意思就像Windows中的右键菜单)菜单,带有"打开"选项 - 选择这个似乎只是让Onedrive重新加载.
我的代码是:
<script type="text/javascript" src="https://js.live.net/v5.0/OneDrive.js" id="onedrive-js" client-id="0000000011111111"></script>
<script type="text/javascript">
var pickerOptions = {
success: function(files) {
console.log(files);
document.getElementById("cloud_cv_source_input").value = "onedrive" ;
document.getElementById("cloud_cv_file_url_input").value = files.values[0].link ;
document.getElementById("cloud_cv_file_name_input").value = files.values[0].fileName;
document.getElementById("cloud_cv_file_size_input").value = files.values[0].size;
},
cancel: function() {
// handle when the user cancels picking a file
},
linkType: "downloadLink", // or "downloadLink",
multiSelect: false // or true
}
function launchOneDrive()
{
OneDrive.open(pickerOptions);
}
</script>
Run Code Online (Sandbox Code Playgroud)
我确实在文档的末尾看到了这个:
The OneDrive …Run Code Online (Sandbox Code Playgroud) 2015年11月 - 仍在寻找解决方案.
我正在使用Google Picker API https://developers.google.com/picker/docs/#hiworld(显然!)让用户从其云端硬盘帐户中选择一个文件(选择要从云端硬盘下载的文件 - 不是将新文件上传到云端硬盘.这是在响应式网站上,而不是"应用程序"(本机或其他).
它在台式机和平板电脑上运行良好,但在手机上,Picker太大了.
在https://developers.google.com/picker/docs/reference#Picker中,它说:
PickerBuilder.setSize() 设置首选对话框大小.该对话框将自动居中.它的最小尺寸为(566,350),最大尺寸为(1051,650).
所以它似乎不适合在手机上工作?我错过了什么,或者有解决方法,还是替代方案?当Dropbox等其他服务开箱即用时,Google会排除手机用户使用Picker的情况,这似乎很奇怪.
我有工作网站.用户填写表格并从PC中选择CV(简历)文件,点击发送按钮.这将调用ajaxSubmit()函数,该函数执行本地验证(从下面的代码中删除),如果正常,则上传AJAX文件.服务器端进行进一步验证,并在JSON中返回SUCCESS或ERROR(加上错误文本).
当用户点击发送按钮时,我打开一个模态#apply_working_modal,它只显示一个微调器图标.在ajax.done上,我关闭#apply_working_modal,如果有错误,将它们放在模态#apply_errors_modal的主体上并打开它.
我第一次尝试它,故意出错,它的工作原理如上所述.如果我再次尝试,错误仍然存在,#apply_working_modal会显示并且不会关闭,直到我手动点击X或远离它.
这似乎是一些时间问题,因为当您在发生错误后重新提交时,CV文件已经在服务器上,因此JSON会很快恢复.事实上,如果我扼杀网络,我可以使它工作.
我尝试过等待模态事件的变种,还有setTimeout()来延迟打开#apply_errors_modal
function ajaxSubmit(whichForm){
$("#apply_working_modal").modal("show");
console.log('showing apply_working_modal');
var applyRequest =$.ajax({
url: postUrl,
etc: etc
});
applyRequest.done(function( data, textStatus, jqXHR ) {
console.log(data);
$("#apply_working_modal").modal("hide");
console.log("hiding #apply_working_modal ");
if (data.STATUS =='SUCCESS') {
// validation OK at server
}
else {// validation error at server
$('#apply_working_modal').on('hidden.bs.modal', function () {
$("#apply_errors_modal_body").html(data.ErrorText);
$("#apply_errors_modal").modal("show");
console.log("on hidden of #apply_working_modal");
})
}
});
}
Run Code Online (Sandbox Code Playgroud)
这是控制台输出的好/坏测试:
//Expected behaviour
15:58:45.981 myscript.js:179 showing apply_working_modal
// 10 seconds pass while server uploads file and returns errors in JSON
15:58:56.696 …Run Code Online (Sandbox Code Playgroud) 具有一个固定宽度列的Bootstrap 4网格问题IE11
我有一个三列网格,其中中间列必须是固定宽度,左右列可以是变量/换行.
代码如下,使用我自己的类作为行包装器.Bootstrap是4.1.1
<div class='centered_content'>
<div class="row">
<div class="col-md">
variable width content
</div>
<div class="col-md m d-none d-md-block ">
Fixed width content
</div>
<div class="col-md l d-none d-md-block">
variable width content
</div>
</div>
</div>
.centered_content {
max-width:1130px;
margin: auto;
}
Run Code Online (Sandbox Code Playgroud)
问题是在IE11(以及Android 4平板电脑上的"互联网"浏览器)中,当浏览器在最大宽度1100到大约800px之间(在小断点之前)调整大小时,右列与中间列重叠.在其他浏览器中,左右列收缩到足以允许中间保持其固定宽度.
下图说明了这一点.第一个展示了IE浏览器(以及所有其他浏览器)最大化浏览效果,第二张图片显示了宽度减小的Chrome(所需行为),最后一张图片显示IE宽度减小
我知道IE不完全支持flex所以猜测可能是问题.Edge适用于Chrome.任何解决方法?
首先,我回顾了以前的类似问题,但是他们的答案中有旧的或相互矛盾的,所以我问的是当前(2014年5月)构建/测试/部署iPhone/iPad应用程序的要求是什么?
更长的版本 - 客户已经要求我为iOS/Android开发应用程序,因为我对此我是全新的,我希望使用PhoneGap来使用我现有的网络技能来开发应用程序.我目前只拥有一部Android手机,因此安装了Android SDK和PhoneGap到Ubuntu(本周所有下载的内容都是Ubuntu所有当前版本)并最终获得了PhoneGap"hello world"示例,可以在模拟器和实际手机上运行(不是通过播放)商店,只是APK文件的本地副本)
我在这里和其他地方找到了许多指南,详细说明了如何使用PC(或我假设的Ubuntu)发布到App Store - 主要是谈论证书等等.但是,从我设置工具的经验来构建我的第一个hello world app ,PhoneGap需要针对您定位的每个设备的SDK,因此需要Apple SDK才能运行模拟器吗?或者你可以在Ubuntu上模拟iPhone吗?
所以在我看来,即使你认为你可以在没有Mac的情况下部署到App Store,你需要在开发过程中运行模拟器 - 这是正确的还是我错过了什么?
提前致谢!
我一直在尝试获得如下所示的 Bootstrap 4 布局:
在大型设备上,我需要搜索表单、CTA 和按钮广告进入垂直列 4 宽,而内容将占据右侧的所有空间(内容可变且能够根据需要向下增长)。
对于小型设备,我希望搜索表单、CTA、内容和按钮广告按该顺序显示,占据屏幕宽度的 100%。
我将使用网格排序类来改变正常流程。但是现在,我被困住了,无法为大型设备提供所需的布局。我试过的代码如下所示,但内容总是在其他项目的下面而不是在它旁边。
这个问题 似乎解决了这个问题,但是推/拉类现在消失了?
我的代码(2 次尝试)
<div class="row align-items-start">
<div class="col-md-4">
<div style="height:50px;width:100%;background-color: red;"></div>
</div>
<div class="w-100"></div>
<div class="col-md-4">
<div style="height:50px;width:100%;background-color: blue;"></div>
</div>
<div class="w-100"></div>
<div class="col-md-4">
<div style="height:50px;width:100%;background-color: green;"></div>
</div>
<div class="w-100"></div>
<div class="col-md-8 offset-md-4">
<div style="height:50px;width:100%;background-color: yellow;"></div>
</div>
</div>
<div class="row ">
<div class="col-md-4">
<div style="height:50px;width:100%;background-color: red;"></div>
</div>
<div class="col-md-4">
<div style="height:50px;width:100%;background-color: blue;"></div>
</div>
<div class="col-md-4">
<div style="height:50px;width:100%;background-color: green;"></div>
</div>
<div style='float:right;' class="col-md-8 offset-md-4">
<div style="height:50px;width:100%;background-color: yellow;"></div>
</div> …Run Code Online (Sandbox Code Playgroud) 我有一个Ionic选项卡菜单,显示4项(下面的代码和codepen只有2项清晰度)和一个"更多"项目,导致进一步的菜单选项显示为离子内容列表.它使用Angular ui-router.我有两个可能相关的问题.
问题1:首先应用程序似乎工作正常,但是当您开始浏览几个链接时(通常在访问"更多"之后,选项卡将开始返回错误的URL.例如:
说明新闻>联系>更多>体育>联系人>新闻>更多 - 在这里打破,我看到联系人内容而不是更多内容.
我已经在每个控制器和Chrome开发工具控制台中添加了一个console.log,我可以看到每个标签点击似乎都是额外的事件,例如点击新闻标签意味着"新闻"在控制台中出现两次.此外,在上面的导航示例中,控制台显示我单击"更多"时启动了联系人控制器.
总而言之,在对应用程序进行一些点击后,href目标似乎将我发送到了错误的位置,就好像在运行时编辑了代码一样.
问题2:直到如上所述导航中断的点,后退按钮对于从选项卡启动的页面正常工作,但对于从"更多"页面(即从列表)启动的页面,没有后退按钮.
对不起,所有这些初学者的问题!
Codepen:http://codepen.io/anon/pen/hBpfa
index.html的:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no, width=device-width">
<title></title>
<link href="lib/ionic/css/ionic.css" rel="stylesheet">
<link href="css/style.css" rel="stylesheet">
<script src="lib/ionic/js/ionic.bundle.js"></script>
<script src="js/app.js"></script>
</head>
<body ng-app="schoolApp" animation="slide-left-right-ios7">
<ion-nav-bar class="bar-stable nav-title-slide-ios7 bar-positive">
<ion-nav-back-button class="button-icon icon ion-ios7-arrow-back">
Back
</ion-nav-back-button>
</ion-nav-bar>
<ion-nav-view></ion-nav-view>
<script id="tabs.html" type="text/ng-template">
<ion-tabs class="tabs-icon-top">
<ion-tab title="News" icon="icon ion-ios7-paper-outline SS-tab-icon" href="#/tab/news">
<ion-nav-view></ion-nav-view>
</ion-tab>
<ion-tab title="Contact" icon="icon ion-ios7-telephone SS-tab-icon" href="#/tab/contact">
<ion-nav-view></ion-nav-view>
</ion-tab>
<ion-tab title="More" icon="icon …Run Code Online (Sandbox Code Playgroud) 我认为这应该很简单,但我无法弄明白或在这里找到解决方案.
我有一个表ITEM_PROPERTIES
item_ID int
property_name char(20)
property_value char(20)
Run Code Online (Sandbox Code Playgroud)
样本数据
5 Colour Black
5 Size M
6 Colour Blue
6 Size L
7 Colour Purple
7 Size M
8 Colour Blue
8 Size S
9 Colour Wine
9 Size M
Run Code Online (Sandbox Code Playgroud)
如果我做:
SELECT property_value, count(property_value)
FROM ITEM_PROPERTIES where property_name='Colour'
group by property_value
Run Code Online (Sandbox Code Playgroud)
我明白了:
Black 1
Blue 2
Purple 1
Wine 1
Run Code Online (Sandbox Code Playgroud)
我如何在一行中得到这样的:
Black 1, Blue 2, Purple 1, Wine 1
Run Code Online (Sandbox Code Playgroud)
我试过了 :
SELECT group_concat(property_value, count(property_value))
FROM ITEM_PROPERTIES where property_name='Colour'
group by property_value …Run Code Online (Sandbox Code Playgroud) 我有一个移动网站m.example.com - 我希望访问者从手机中选择Google云端硬盘中的文件,并将其发送到托管m.example.com的服务器.基本上仿真<input type="file">桌面上的简单文件上传.
据我所知,工作流程如下:
1)用户选择带有Picker的文件,该文件将所选文件的元数据发送到我的网站客户端(即手机/平板电脑上运行的HTML/Javascript)
2)我通过ajax或只是一个表单隐藏字段将它发送到我的服务器
3)我的服务器向Google API请求获取文件,然后将其存储在服务器的文件系统中
所以我需要帮助:
a)上述步骤是否正确,还有其他方法可以做到这一点,甚至是我可以使用的服务,这将允许我的网站用户从几个云存储提供商之一中选择他们的文件?
a)假设我的步骤是正确的,这是唯一的方法,我被困在3)部分 - 服务器与API谈话.
到目前为止,我已经停止了这里的选择器 - Google picker auth popup被阻止并获得了文件URL.我还没有完成2)但是,我现在只是手动将文件URL放入我的下载脚本中.
我正在使用PHP,我想要下载到我的服务器的文件可以是公共的或私有的,这取决于最终用户.
我迷失在API文档中(如在手册页中,而不是谷歌文档),并且与https://developers.google.com/api-client-library/php/start/get_started(调用此API文档)相混淆和https://developers.google.com/drive/web/quickstart/quickstart-php(调用此Drive文档) - 这两个不同的API?
我按照API文档中的链接从这里安装了客户端:https://github.com/google/google-api-php-client,但在Drive docs上尝试"第3步:设置示例"时得到很多错误,例如找不到的文件,类不是fount等等,所以这让我觉得这里有两个不同的API /客户端 - 有人可以指点我正确的方向开始吗?
UPDATE
我已经从这个https://developers.google.com/api-client-library/php/start/get_started链接的github安装了PHP客户端
这看起来像:

我在examples目录中运行了simplefileupload.php - 第一次工作,只需要输入我的项目详细信息
所以转到https://developers.google.com/drive/web/quickstart/quickstart-php#step_3_set_up_the_sample并在google-api的根目录中创建了drive_rest_api_step_3.php(如屏幕抓取所示)
拿到 Fatal error: require_once(): Failed opening required 'src/Google_Client.php' (include_path='.:/usr/local/lib/php') in /path/to/google-api/drive_rest_api_step_3.php on line 5
有没有Google_Client.php库,但为src /谷歌/ Client.php所以我编辑放在require_once使用的.
现在得到Failed opening required 'src/contrib/Google_DriveService.php' - 再次搜索该文件yeilds没有结果,但有一个src/Google/Service/Drive.php, …