Визначте, чи існує програма, і запустіть її на iOS


74

Чи є спосіб перевірити iOS, чи не встановлено, а потім запущено іншу програму? Якщо пам'ять мене обманює, це не було можливим у ранніх версіях, але чи було це змінено?


1
Я думаю, що це має бути якось можливим - я кажу це, оскільки реалізація Facebook SDK запустить програму Facebook, якщо її встановити інакше, вона повернеться до Safari. Вам потрібно знати деяку інформацію про інший додаток, оскільки з Facebook вам потрібно додати деяку інформацію про реєстрацію у свій власний додаток.
Томас Макгінес

Так, я думаю, якщо ви знаєте ідентифікатор програми, який ви могли б якось перевірити та запустити. Але я не можу знайти жодного посилання на це. Я сподівався, що хтось спробував це.
Роб

5
Досить просто, наприклад: NSURL * urlApp = [NSURL URLWithString: @ "fb: //"]; BOOL canOpenFBApp = [[UIApplication sharedApplication] canOpenURL: urlApp]; printf ("\ n canOpenFBApp:% i \ n", canOpenFBApp);
dijipiji

Відповіді:


66

Здійснено, але складно.

Запуск встановлених програм, таких як програми FB або Twitter, здійснюється за допомогою спеціальної схеми URL-адрес. Їх можна використовувати як в інших програмах, так і на веб-сайтах.

Ось стаття про те, як це зробити за допомогою власного додатка .

Перевірити, чи є там URL-адреса, може бути складно. Хорошим прикладом програми, яка виявляє встановлені програми, є Boxcar . Справа в тому, що Boxcar має глибокі знання користувацьких URL-адрес. Я досить впевнено (99%) впевнений, що це існує canOpenURL:, тому знання користувацької схеми програми, на яку ви хочете націлитись заздалегідь, робить це простим у реалізації.

Ось частковий список деяких найпопулярніших URL-адрес, проти яких можна перевірити.

Існує спосіб дізнатися користувацьку URL-адресу додатка: https://www.amerhukic.com/finding-the-custom-url-scheme-of-an-ios-app

Але якщо ви хочете просканувати програми та визначити їх URL-адреси, це не можна зробити на пристрої, що не є JB.

Ось допис у блозі, який розповідає про те, як люди з Bump вирішували проблему.


Ви можете переглянути iHasApps, щоб переглянути список програм на пристрої користувачів.
1789040

Дякуємо Дугу за надання цих посилань. У мене було подібне запитання до цього допису. Я згадав вас у своєму дописі (будь ласка, відредагуйте його, якщо ви не хочете, щоб вас там згадували).
Silex

6
Посилання мертві.
Грег Хілстон,


41

Існує такий сценарій, як наведений нижче.

<script type="text/javascript">
function startMyApp()
{
  document.location = 'yourAppScheme://';
  setTimeout( function()
  {
      if( confirm( 'You do not seem to have Your App installed, do you want to go download it now?'))
      {
        document.location = 'http://itunes.apple.com/us/app/yourAppId';
      }
  }, 300);
 }
</script>

Зателефонувавши до цього сценарію з Інтернету ( <a href="#" onclick="startMyApp()">Try to start MyApp</a>), ви можете визначити, чи встановлено на пристрої вашу програму зі схемою "yourAppScheme" чи ні.

Додаток запуститься, якщо він встановлений на пристрої та в ньому зареєстровано "yourAppScheme". Якщо програма не встановлена, ви можете запропонувати користувачеві встановити цю програму з iTunes.


22
але все одно ви побачите повідомлення про помилку, яке надходить від сафарі, якщо програма не існує.
shebelaw

9
Хтось знає, як уникнути цього повідомлення про помилку від сафарі, якщо додаток не встановлено?
davidk

1
Так, правильно, як ми можемо уникнути повідомлення про помилку "Не вдається відкрити сторінку" в сафарі, якщо додаток не встановлено ??
Хардік Таккар

3
Це здається хакерством, і нестабільним теж ... Після перенаправлення ( document.location) JS повинен припинити виконання, тому функція в setTimeoutніколи не повинна виконуватися. Не те, що я знаю кращий спосіб (якщо тільки банерів iOS Smart App недостатньо для ваших потреб). Хотілося б, щоб довели, що неправий.
johndodo

3
@johndodo Саме в цьому справа. Якщо переспрямування вдасться, JavaScript припинить виконуватись, тим самим уникаючи блоку тайм-ауту (однак, він дійсно повинен перевіряти поточний час щодо часу початку, оскільки він буде продовжувати виконуватися, коли користувач повернеться в Safari пізніше). Якщо переспрямування не вдасться, з іншого боку, користувач побачить два повідомлення: перше потворне, надане вже згаданим Safari, але потім друге, надане користувачем, і дещо вибачливе повідомлення для пояснення першого. Це не ідеально, але принаймні не так заплутано, як просто побачити першу помилку.
devios1

22

Щоб перевірити, чи встановлена ​​програма (наприклад, Очистити):

BOOL installed = [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"clearapp://"]];

Щоб відкрити цю програму:

BOOL success = [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"clearapp://"]];

1
Саме те, що я шукав!
Джамал Зафар


знайти користувальницький додаток: amerhukic.com/finding-the-custom-url-scheme-of-an-ios-app
computingfreak

13

Приховує повідомлення про помилку, якщо додаток не встановлено

У Branch ми використовуємо форму коду нижче - зауважте, що iframe працює у більшості браузерів. Просто замініть URI додатка та посилання на App Store.

<!DOCTYPE html>
<html>
    <body>
        <script type="text/javascript">
            window.onload = function() {
                // Deep link to your app goes here
                document.getElementById("l").src = "my_app://";

                setTimeout(function() {
                    // Link to the App Store should go here -- only fires if deep link fails                
                    window.location = "https://itunes.apple.com/us/app/my.app/id123456789?ls=1&mt=8";
                }, 500);
            };
        </script>
        <iframe id="l" width="1" height="1" style="visibility:hidden"></iframe>
    </body>
</html>

Є друга можливість, яка спочатку покладається на файли cookie, а переадресація javascript - лише як резервну копію. Ось логіка:

Коли користувач без програми вперше натискає посилання на вашу програму, він або вона перенаправляється прямо в App Store. Це досягається за допомогою посилання на ваш додаток, який фактично є динамічно генерованою сторінкою на ваших серверах із переспрямуванням. Ви створюєте cookie-файл і реєструєте "цифровий відбиток" IP-адреси, ОС, версії ОС тощо на вашому сервісі.

Коли користувач встановлює програму та відкриває її, ви збираєте та надсилаєте черговий "цифровий відбиток пальця" на ваш сервер. Тепер ваш сервер знає, що посилання встановлено. При будь-яких наступних відвідуваннях посилань, пов’язаних із вашим додатком, ваші сервери переконуються, що динамічно генерована сторінка переспрямування веде до програми, а не до App Store, на основі файлу cookie, надісланого із запитом.

Це дозволяє уникнути потворного перенаправлення, але вимагає ще тонни роботи.


1
Універсальні посилання надходять :)
st.derrick

Є my_app тут appnameабо appID?
Німсрулес,

2

Наскільки я розумію, через проблеми конфіденційності ви не можете побачити, чи встановлена ​​програма на пристрої. Шлях навколо цього - спробувати запустити програму, і якщо вона не запускається, щоб користувач натиснув URL-адресу назад. Щоб запобігти появі помилки мобільного сафарі, я виявив, що розміщення його в iframe допомагає вирішити проблему.

Ось фрагмент коду, який я використав.

<form name="mobileForm" action="mobile_landing.php" method="post">
        <input type="hidden" name="url" value="<?=$web_client_url?>">
        <input type="hidden" name="mobile_app" value="<?=$mobile_app?>">
        <input type="hidden" name="device_os" value="<?=$device_os?>">
    </form>
<script type="text/javascript">
        var device_os = '<? echo $device_os; ?>'; 


        if (device_os == 'ios'){

        var now = new Date().valueOf(); 
        setTimeout(function () { 
            if (new Date().valueOf() - now > 100) 
                return;

        document.forms[0].submit(); }, 5); 


        var redirect = function (location) {
            var iframe = document.createElement('iframe');
            iframe.setAttribute('src', location);
            iframe.setAttribute('width', '1px');
            iframe.setAttribute('height', '1px');
            iframe.setAttribute('position', 'absolute');
            iframe.setAttribute('top', '0');
            iframe.setAttribute('left', '0');
            document.documentElement.appendChild(iframe);
            iframe.parentNode.removeChild(iframe);
            iframe = null;
        };

        setTimeout(function(){
            window.close()
            }, 150 );

        redirect("AppScheme");

1

Нещодавно я боровся з цим, і ось рішення, яке я придумав. Зверніть увагу, що досі не існує надійного способу визначити, запущена програма чи ні.

Я обслуговую сторінку з мого сервера, яка перенаправляє на варіант, специфічний для iPhone, після виявлення User-Agent. Посилання на цю сторінку можна передавати лише електронною поштою / SMS або Facebook.

Сторінка відображає мінімальну версію документа, на який посилається, але потім автоматично намагається відкрити програму, як тільки вона завантажується, використовуючи прихований <iframe> (AJAX завжди виходить з ладу - ви не можете використовувати jQuery або XMLHttpRequest для цього ).

Якщо схема URL-адреси зареєстрована, програма відкриється, і користувач зможе зробити все необхідне. У будь-якому випадку, внизу на сторінці відображається таке повідомлення: "Чи запустилася програма? Якщо ні, ви, мабуть, ще не встановили її ...." із посиланням на магазин.


1
Це все одно відображатиме потворне "Safari не може відкрити сторінку, оскільки адреса недійсна." - попередження, якщо додаток не встановлено, так? Я дуже хочу знайти метод, щоб отримати таке сповіщення. Рішення, що пропонують автоматичне перенаправлення через короткий інтервал або відображення підтвердження, недостатньо для мого проекту.
Густав,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.