我过去一年在我的域名中重定向了我的用户:
to:market:// details?id = com.example.myapp
今天我在Chrome浏览器应用程序的Nexus 5 / LG G3 / OnePlus One上查看了它,它停止了工作!
现在,当我的用户尝试下载应用时,他们会被重定向到断开的链接。
任何人都知道Android中的Chrome应用中有关此更改的信息吗?
答案 0 :(得分:6)
从阅读chrome的40版本开始,我想分享一些见解 http://blog.chromium.org/2014/12/chrome-40-beta-powerful-offline-and.html
他们更新了内容安全策略级别2,它可以更好地控制重定向。 https://w3c.github.io/webappsec/specs/content-security-policy/#changes-from-level-1
如果正在加载的资源是重定向的结果,则会忽略源表达式的路径组件,如第4.2.2.3节“路径和重定向”中所述。
- 醇>
默认情况下会阻止重定向,并使用新的不安全重定向表达式明确允许重定向。
所以我做了一些测试。如果您的初始操作是从重定向开始的(无论是window.location还是http 302),它将显示错误。但是,一旦我创建了一个到市场的超链接://并明确点击它,它工作正常。
现在我最终在两者之间创建了一个网页,我要求用户点击该链接继续。
答案 1 :(得分:5)
我在使用不同操作系统/ Play商店/播放服务/浏览器的不同设备上测试此网址。看起来它与浏览器有关,但与操作系统或播放服务无关。
最初我更新了Play服务和Google Play商店,我的旧Chrome(第18版)正在打开market://details?id=
网址。
之后我将Chrome( v18 )更新为 40 版本。它已不再适用了。
同时,FireFox和默认"浏览器"仍会打开此网址并重定向到Google Play商店应用。
P.S。我在Chromium bug tracker中注册了问题。让我们看看是否会有任何回应: https://code.google.com/p/chromium/issues/detail?can=2&q=market&colspec=ID%20Pri%20M%20Week%20ReleaseBlock%20Cr%20Status%20Owner%20Summary%20OS%20Modified&id=454396&thanks=454396&ts=1422888121
更新 [6.05.15]:不幸的是,他们决定不解决这个问题,说它是计划好的行为。正如他们所说,用户应该自己点击链接。只有这样才允许在设备上重定向到应用程序。
所以,我现在只看到一个"解决方法":创建一个页面,其中包含"单击下面的链接转到应用程序&# 34; ,后跟链接如:
<a href="market://details?id=com.example.myapp"> Load Example App </a>
或
<a href="intent://foo.bar#Intent;scheme=blabla;package=com.example.myapp;end" > Load App/ Activate your Profile </a>
答案 2 :(得分:1)
尝试下面的链接,用您自己的标识符替换your.app.id:
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(title: "Navigation", home: FirstPage());
}
}
class MyScaffold extends Scaffold {
final BuildContext context;
final Text title;
final Widget body;
MyScaffold({
@required this.context,
@required this.title,
@required this.body,
}) : assert(context != null),
assert(title != null),
assert(body != null),
super(
appBar: AppBar(title: title),
drawer: Drawer(
child: ListView(padding: EdgeInsets.zero, children: <Widget>[
SizedBox(height: 100.0),
ListTile(
title: Text("First Page"),
onTap: () => Navigator.of(context).push(MaterialPageRoute(
builder: (BuildContext context) => FirstPage()))),
ListTile(
title: Text("Second Page"),
onTap: () => Navigator.of(context).push(MaterialPageRoute(
builder: (BuildContext context) => SecondPage()))),
])),
body: body);
}
class FirstPage extends StatefulWidget {
@override
_FirstPageState createState() => _FirstPageState();
}
class _FirstPageState extends State<FirstPage> {
int _counter = 0;
void _increment() => setState(() => _counter++);
@override
Widget build(BuildContext context) {
return MyScaffold(
context: context,
title: Text("First Page"),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('$_counter'),
RaisedButton(onPressed: _increment, child: Icon(Icons.add))
])));
}
}
class SecondPage extends StatefulWidget {
@override
_SecondPageState createState() => _SecondPageState();
}
class _SecondPageState extends State<SecondPage> {
int _counter = 0;
void _increment() => setState(() => _counter++);
@override
Widget build(BuildContext context) {
return MyScaffold(
context: context,
title: Text("Second Page"),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('$_counter'),
RaisedButton(onPressed: _increment, child: Icon(Icons.add))
])));
}
}