Android Play商店市场://链接不再有效?

时间:2015-02-01 18:11:35

标签: android google-chrome google-play

我过去一年在我的域名中重定向了我的用户:

http://example.com/get

to:market:// details?id = com.example.myapp

今天我在Chrome浏览器应用程序的Nexus 5 / LG G3 / OnePlus One上查看了它,它停止了工作!

现在,当我的用户尝试下载应用时,他们会被重定向到断开的链接。

任何人都知道Android中的Chrome应用中有关此更改的信息吗?

3 个答案:

答案 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

  
      
  1. 如果正在加载的资源是重定向的结果,则会忽略源表达式的路径组件,如第4.2.2.3节“路径和重定向”中所述。

  2.   
  3. 默认情况下会阻止重定向,并使用新的不安全重定向表达式明确允许重定向。

  4.   

所以我做了一些测试。如果您的初始操作是从重定向开始的(无论是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))
            ])));
  }
}