我需要一个有效的会话才能从我的网络应用程序下载文件.
当我在iOS设备上打开我的网络应用程序,登录并尝试从我的网站下载文件(PDF)时,我被踢出去并在Safari中打开链接.用户必须再次从Safari登录才能下载页面.
如何强制文件在Web应用程序中打开并在那里触发下载表单?
我正在使用Carrierwave,在控制器中我有这个触发下载:
class DocumentsController < ApplicationController
# .. code omitted
def download
if @document.name.file.exists?
send_file @document.name.path, x_sendfile: true
else
redirect_to documents_url, notice: t(:file_not_found)
end
end
end
Run Code Online (Sandbox Code Playgroud)
更新:我发现半工作解决方案直接在浏览器中打开文件:
$(document).ready ->
if 'standalone' of window.navigator and window.navigator.standalone
# For iOS Apps
$('a').on 'click', (e) ->
e.preventDefault()
new_location = $(this).attr('href')
if new_location != undefined and new_location.substr(0, 1) != '#' and $(this).attr('data-method') == undefined
window.location = new_location
return
return
Run Code Online (Sandbox Code Playgroud)
通过使用此代码片段,我们强制iOS用户以全屏模式(Web应用程序)运行,以打开a应用程序内的所有链接.但问题是,如果用户打开文件,则不会出现"后退"按钮.由于iPhone用户缺少物理后退按钮,他们将不得不强制重启整个应用程序以退出显示的文件.
ruby-on-rails download ios carrierwave iphone-standalone-web-app
阻止独立网络应用中的链接在移动版Safari中打开有很多流量,但引用的iOS版本要早得多(7-9?).在iOS 11中,我遇到了相反的问题:在我的独立Web应用程序中,我有指向需要显示的PDF文件的链接.当我点击它们时,无论我给出了什么选项,它们都会在Web应用程序浏览器内打开而不是在Safari内部打开.由于独立模式,结果是Web应用程序中的死胡同,需要重新启动应用程序.(Android似乎做了正确的事情并转移到pdf查看应用程序.)
单击处理程序(javascript/bootstrap/jquery):
function openDocument(docURL) {
window.open(docURL,'_blank');
return false;
}
Run Code Online (Sandbox Code Playgroud)
或者,可以为新页面打开Web应用程序内的导航,以便我可以避免死路一条吗?(我认为没有,因为我正在阅读;我已经尝试了一些选项来开窗.打开无济于事.)或者是否有可能以某种方式组合一个(多页)pdf查看器和一个用于解雇的UI元素?建议欢迎.
编辑:总结下面的讨论,iOS在独立的Web应用程序中处理内部和外部链接的方式不同.通过在服务器端重新映射使链接看起来是外部的,允许链接强制Safari打开.
javascript ios iphone-standalone-web-app progressive-web-apps
我在一些变体中搜索了这个问题,只能在使用PhoneGap或jQuery mobile的环境中找到答案.但是,我既不使用...只是简单的旧HTML和JavaScript.
我正在尝试使用window.open()从全屏web应用程序启动移动Safari,而不是内联锚.无论我做什么,网址都会在网页应用中打开,而不是在Safari中.有没有人有什么建议?
谢谢.
将其添加到我的网站:
<meta name="apple-mobile-web-app-capable" content="yes">
Run Code Online (Sandbox Code Playgroud)
虽然大多数人询问如何在全屏网络应用程序中禁用标注,但我需要启用它。
我基本上会有一个包含 iPhone 壁纸的滑块,因此我希望用户能够保存图像,就像他们在常规 Safari 中所做的那样。
这是我的演示,您需要将其添加到主屏幕,然后从那里打开它。保存图像被禁用 - 为什么?
这可能吗?
注意:指定-webkit-touch-callout: inherit;不会执行任何操作。
我有以下JS获取用户的当前位置并显示其邮政编码...
(function ($, geolocation) {
if (geolocation) {
geolocation.getCurrentPosition(function (position) {
$.getJSON(
"http://ws.geonames.org/findNearestAddressJSON?callback=?",
{
lat : position.coords.latitude,
lng : position.coords.longitude
},
function (data) {
$(function () {
$('#zip').text(data.address.postalcode);
});
}
);
});
}
}(jQuery, navigator.geolocation));
Run Code Online (Sandbox Code Playgroud)
在CodeReview上提供了帮助,因为我的原始代码非常糟糕,https://codereview.stackexchange.com/questions/13481/to-use-or-not-to-use-public-variables-in-javascript/13483#comment21844_13483
HTML:
<div id="zip"></div>
Run Code Online (Sandbox Code Playgroud)
...然后在div中显示邮政编码.
这在Mobile Safari和桌面Safari中都可以正常工作,但是一旦添加apple-mobile-web-app-capable元标记,代码就会中断.
我在每个步骤后都将代码记录到控制台,并且它在常规Safari和Mobile Safari中运行顺畅.一旦我将它添加到我的主屏幕(头部带有元标记),应用程序甚至不会运行JS代码.它也没有记录到控制台,这让我想知道WebApps中是否允许使用位置服务.
如果从主屏幕运行时重新加载页面也会发生此问题.
有没有什么办法解决这一问题?这是个常见的问题吗?
如果我在运行6.1.2的iPad上打开Safari中的以下页面,点击第一个链接会打开一个带有"Hello World!"的新标签页,第二个链接会加载"Hello Again!" 在iframe中.
<html>
<head>
<meta name="apple-mobile-web-app-capable" content="yes" />
</head>
<body>
<p>
<a href="data:text/plain,Hello World!" target="_blank">data: uri new tab test</a>
</p>
<p>
<a href="data:text/plain,Hello Again!" target="dataframe">data: uri iframe test</a>
</p>
<iframe name="dataframe" width="500" height="100"></iframe>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
如果我将此页面添加到主屏幕,则在生成的应用程序中,链接不执行任何操作.
是否有任何方法可以在IOS主屏幕Web应用程序中加载数据URI链接,方法是加载Safari以显示内容,或者以某种方式嵌入它?
或者可能是主屏幕Web应用程序本地存储和显示PDF的其他方法.
使用iOS网络应用视图时,我在使用Google+ API中的互动帖时遇到问题.在Safari或iOS或Android上的任何其他浏览器中,登录Google+并分享帖子没有问题,但在iOS的网络应用模式下,只要您填写凭据并点击Google登录上的"登录",就会抛出白页它在页面中给你.
我用它来定义移动Web视图:
<meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-touch-fullscreen" content="yes">
Run Code Online (Sandbox Code Playgroud)
有没有人有这方面的经验?
从iOS 9开始,此错误似乎已得到解决.
该视频在桌面常绿浏览器上播放,在Android设备上以独立模式播放.
它甚至可以在iOS8 Safari上播放,但是一旦用户将其添加到主屏幕,视频就不再播放了.
我在这里举了一个例子http://bugs.readingplus.com/ios8-video-test/.
如果您使用iOS8,则可以播放视频,将网址添加到主屏幕并加载.您将获得控件,但是一旦您触摸播放,您获得的就是第一帧.
我把页面的源代码放在Github上,或者你可以转到页面查看源代码.
我错过了什么,我的标记是否满足,这只是一个错误,是否有人找到了解决方法?
从iOS 8.3开始,该问题已得到部分解决.我已经验证了该示例中的视频现在在从"添加到主屏幕"链接启动时播放.
剩下的问题是音频,它没有被渲染/播放.
safari video ios iphone-standalone-web-app ios-standalone-mode
该“START_URL”适用于Android的浏览器,但对于iPhone,Safari浏览器总是使用当前页面的URL,而忽略了“START_URL”。
例如,当前页面是https://test.com/index.html,清单上的"start_url"设置为"start_url": "index.html?flag=1",但是当页面添加到Safari 上的主屏幕,它仍然使用https://test.com/index.html,没有参数。
有没有办法应用不同的 URL 作为 Safari 的启动 URL?
有一个以独立模式运行的 Web 应用程序,具有以下 manifest.json
{
"lang": "de",
"name": "Test.App",
"short_name": "Test.App",
"start_url": "/36485/",
"display": "standalone",
"theme_color": "#FF4500",
"background_color": "#FFFFFF",
"icons": [...]
}
Run Code Online (Sandbox Code Playgroud)
此模式下没有浏览器 UI,因此必须在新的 Safari 窗口中打开文档(如 pdf、文档等)。这让我想到一个问题:如何强制 Safari 打开一个新的浏览器窗口?我们现在找到的解决方案是给它一个不同的域名(!!),即。一个子域。所有其他选项 - 无论是它window.open还是taget=_blank- 都没有任何效果,所有链接都将在同一个独立窗口中打开,因此无法返回到实际的应用程序界面。外部域似乎可以解决问题。是否有任何解决方法可以避免使用子域?也许通过清单中的一些定义?
manifest mobile-safari iphone-standalone-web-app progressive-web-apps
ios ×7
javascript ×3
iphone ×2
manifest ×2
safari ×2
carrierwave ×1
data-uri ×1
download ×1
google-plus ×1
jquery ×1
video ×1