Определите, установлено ли мое настраиваемое приложение на устройстве мобильным браузером [duplicate]

Angular1

Для людей, которые используют AngularJS , может справиться с этой ситуацией, используя Promises.

Здесь it говорит,

Обещания могут использоваться для отключения асинхронных функций и позволяют объединять несколько функций вместе.

Вы можете найти приятное объяснение здесь .

Пример, найденный в docs , упомянутом ниже.

  promiseB = promiseA.then(
    function onSuccess(result) {
      return result + 1;
    }
    ,function onError(err) {
      //Handle error
    }
  );

 // promiseB will be resolved immediately after promiseA is resolved 
 // and its value will be the result of promiseA incremented by 1.

Angular2 and Later

In Angular2, посмотрите на следующий пример, но его рекомендовал использовать Observables с Angular2.

 search(term: string) {
     return this.http
  .get(`https://api.spotify.com/v1/search?q=${term}&type=artist`)
  .map((response) => response.json())
  .toPromise();

}

Вы можете использовать это таким образом,

search() {
    this.searchService.search(this.searchField.value)
      .then((result) => {
    this.result = result.artists.items;
  })
  .catch((error) => console.error(error));
}

См. здесь оригинал . Но TypScript не поддерживает native es6 Promises , если вы хотите его использовать, для этого вам может понадобиться плагин.

Кроме того, здесь представлены обещания spec определите здесь.

31
задан Itay Kahana 1 February 2015 в 17:14
поделиться

5 ответов

Вы имеете в виду, что JavaScript работает в браузере? Я думаю (надеюсь), что это невозможно. Я бы не хотел, чтобы какой-либо случайный веб-сайт мог видеть, какие приложения установлены.

Если вы хотите, чтобы пользователь установил конкретное приложение, вы можете указать ссылку на Market на своем веб-сайте: http : //developer.android.com/guide/publishing/publishing.html#marketintent

Изменить: после того, как вы пояснили в комментариях к моему ответу, появился более полезный ответ ниже , который по праву имеет больше оборотов.

16
ответ дан Thomas 6 September 2018 в 05:04
поделиться

Я нашел более полезное решение. Ниже представлен файл конфигурации Android:

<activity android:name="me.test.html.MainActivity" >
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />

        <category android:name="android.intent.category.LAUNCHER" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />

        <data
            android:host="xxxxx"
            android:scheme="mm" />
    </intent-filter>
</activity>

Ниже приведен код html:

<html>  
<head>  
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
<title>Insert title here</title>  
<script type="text/javascript">
function test2(){
    var di = document.getElementById("di");
    di.innerHTML = "app have not installed";
}
function newOpen(){//184 064 323 438
    var di = document.getElementById("di");
    di.innerHTML = "app have installed";
    var ifc = document.getElementById("ifc");
    ifc.innerHTML = "<iframe src='mm://xxxxx?a=b&c=d' onload='test2()'></iframe>";
    return false;
}
</script>
</head>  
<body>  
 <a href="#" onclick="return newOpen()">local3</a><br/> 
<div id="di"></div> 
 <div style="display:none;" id="ifc"></div>
</body>  
</html>

Таким образом, когда пользователь нажимает на тег, и если устройство имеет приложение установлено, то он не будет отображать диалог, позволяющий пользователю выбирать, но вместо этого открывать приложение напрямую; и если приложение не было установлено, тогда будет вызвана функция js «test2», поэтому мы знаем, что приложение не установлено, поэтому мы можем делать что-либо в «test2»! Преимущество в том, что нам не нужно использовать стандартную схему html, которая отображает диалог выбора, и если я сам использую определенную схему, страница не будет переходить на неправильную страницу! Я китайский, мой английский нехорошо, надеюсь, что все поймут меня, а другие узнают о резолюции.

14
ответ дан btx9000 6 September 2018 в 05:04
поделиться

Это может быть доступно в ближайшее время публично.

Команда Chrome говорит:

В Chrome 59 мы представляем новый API под названием getInstalledRelatedApps (). Этот новый API позволяет определить, установлено ли ваше родное приложение на устройстве. ( https://developers.google.com/web/updates/2017/04/getinstalledrelatedapps )

Тем не менее:

Примечание. Этот API находится за пробным запуском, это означает, что мы находимся в экспериментальном режиме и активно ищем обратную связь. Вы должны выбрать свой сайт в этом пробном номере ( https://github.com/jpchase/OriginTrials/blob/gh-pages/developer-guide.md ), потому что он недоступен в Интернете , Теперь вы можете подписаться на пробную версию ( https://docs.google.com/forms/d/e/1FAIpQLSfO0_ptFl8r8G0UFhT0xhV17eabG-erUWBDiKSRDTqEZ_9ULQ/viewform?entry.1999497328=getInstalledRelatedApps ).

< / blockquote>

Текущее состояние платформы этой функции: https://www.chromestatus.com/feature/5695378309513216

Проблема в bugtracker для этой функции: https://bugs.chromium.org/p/chromium/issues/detail?id=587623

/ Обновление 15.02.2018:

Испытание для getInstalledRelatedApps(): https://github.com/GoogleChrome/OriginTrials/blob/gh-pages/completed-trials.md : First available in Chrome M59. Trial ends on January 30, 2018., но он еще не реализован в стабильном Chrome: Feature team currently considering the next steps for the feature.

2
ответ дан derFunk 6 September 2018 в 05:04
поделиться

Вы можете использовать Android Intents. Вы можете создать якорь намерения для запуска приложения. Если приложение не установлено, браузер ищет имя пакета, указанное в якоре намерений. Мы также можем предоставить URL-адрес Fall Back.

example:

<a href="intent://scan/#Intent;scheme=zxing package=com.google.zxing.client.android;end"> Take a QR code </a>

Это не поддерживается во всех браузерах. Chrome и несколько других основных браузеров поддерживают его. Проверьте эту ссылку для более подробной информации.

Я знаю, что это поздно, подумал, что это может помочь кому-то.

5
ответ дан Ram Chandran 6 September 2018 в 05:04
поделиться

Существует способ достижения этого.

Вы не можете определить, установлено ли какое-либо конкретное приложение по соображениям безопасности и конфиденциальности. Но вы можете сделать трюк, чтобы открыть приложение, если оно установлено или открыть страницу Google Play, если это не так.

Чтобы сделать это, вы должны создать фильтр намерений для основного действия вашего приложения, чтобы откройте его, когда вызывается данный URL. Например:

    <activity android:name=".MainActivity >
        <intent-filter>
            <data
                android:host="www.myurl.com"
                android:pathPrefix="/openmyapp"
                android:scheme="http" >
            </data>

            <action android:name="android.intent.action.VIEW" />

            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity> 

Объяснение: когда пользователь переходит к http://www.myurl.com/openmyapp , если приложение установлено, будет создано намерение и активность будет показана.

Но что, если у пользователя нет установленного приложения? Затем вам нужно создать страницу перенаправления на вашем http://www.myurl.com/openmyapp/index.html . Когда пользователь достигает этого адреса, ваш сервер должен перенаправляться на market://details?id=com.your.app.package.

Таким образом, когда Intent не создается после того, как пользователь перейдет на http://www.myurl.com/openmyapp , веб-сервер вызовет другой URL-адрес. Этот URL, в свою очередь, откроет Google Play на устройстве прямо на странице приложения.

Надеюсь, что это поможет.

102
ответ дан Yabin Song 6 September 2018 в 05:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: