Apakah mungkin mendaftarkan Skema URL berbasis domain http + untuk aplikasi iPhone, seperti YouTube dan Maps?


223

Saya ingin iOS membuka URL dari domain saya (mis. Http://martijnthe.nl ) dengan aplikasi saya setiap kali aplikasi diinstal di ponsel, dan dengan Mobile Safari kalau-kalau tidak.

Saya membacanya adalah mungkin untuk membuat akhiran protokol yang unik untuk ini dan mendaftarkannya di Info.plist, tetapi Mobile Safari akan memberikan kesalahan jika aplikasi tidak diinstal.

Apa yang akan menjadi solusinya?

Satu ide:

1) Gunakan http: // URL yang terbuka di semua browser desktop dan render layanan melalui browser

2) Periksa Agen-Pengguna dan jika itu Mobile Safari, buka myprotocol: // URL to (upaya) untuk membuka aplikasi iPhone dan minta aplikasi itu membuka iTunes Seluler untuk mengunduh aplikasi seandainya upaya gagal

Tidak yakin apakah ini akan berhasil ... saran? Terima kasih!


4
Di kereta bawah tanah NYC, ada wifi oleh Boingo yang memberi Anda akses gratis ke WiFi jika Anda mengunduh aplikasi yang mereka rekomendasikan. Setelah Anda mengunduhnya, Anda kembali ke Safari dan browser mendeteksi apakah itu diinstal dan kemudian memberi Anda akses. Adakah yang tahu bagaimana hal itu dilakukan?
TommyG

2
Tautan Universal sekarang akan mendukung kasus penggunaan ini tanpa pesan kesalahan apa pun. Berikut ini cara mengonfigurasi domain dan aplikasi Anda: blog.branch.io/…
Alex Austin

Jawaban:


243

Saya pikir cara yang paling tidak mengganggu dalam melakukan ini adalah sebagai berikut:

  1. Periksa apakah agen-pengguna adalah iPhone / iPod Touch
  2. Periksa appInstalledcookie
  3. Jika cookie ada dan disetel ke true, atur window.locationke your-uri://(atau lakukan redirect sisi server)
  4. Jika cookie tidak ada, buka "Tahukah Anda Nama Situs Anda memiliki aplikasi iPhone?" modal dengan "Ya, saya sudah mendapatkannya", "Tidak, tapi saya ingin mencobanya", dan tombol "Biarkan aku sendiri".
    1. Tombol "Yep" mengatur cookie menjadi true dan mengalihkan ke your-uri://
    2. Tombol "Tidak" akan diarahkan ke " http://itunes.com/apps/namaappname " yang akan membuka App Store di perangkat
    3. Tombol "Biarkan aku sendiri" mengatur cookie menjadi false dan menutup modal

Opsi lain yang saya mainkan tetapi menemukan sedikit kikuk adalah melakukan hal berikut dalam Javascript:

setTimeout(function() {
  window.location = "http://itunes.com/apps/yourappname";
}, 25);

// If "custom-uri://" is registered the app will launch immediately and your
// timer won't fire. If it's not set, you'll get an ugly "Cannot Open Page"
// dialogue prior to the App Store application launching
window.location = "custom-uri://";

16
Solusi bagus Jika fallback Anda ke aplikasi lain, itu akan memuat SEGERA tanpa menampilkan kesalahan. Jadi, bukannya kembali ke itunes.com ... gunakan itms: //phobos.apple.com / ... untuk menghindari kesalahan sembulan!
jb.

47
Masalah : Ketika window.location="custom-uri://berhasil, batas waktu mundur tidak terbunuh. Saat pengguna kembali ke browser dari aplikasi Anda, timer masih ada di sana dan akan meluncurkan tautan app store. Ini adalah pengalaman pengguna yang buruk.
JoJo

5
Sepertinya Cookies di sandbox di # ios6 sehingga Anda tidak dapat mengakses cookie yang disetel oleh aplikasi dari yang lain. (App WebUI dan Safari Mobile misalnya)
Olivier Amblet

2
Adakah yang menemukan cara untuk mencegah batas waktu semula dari pembakaran ketika pengguna kembali ke browser? (masalah yang
diangkat

2
Untuk mengatasi masalah yang JoJo sebutkan, jalankan saja kode dalam batas waktu jika tidak "banyak waktu" telah berlalu sejak pengguna mengklik tautan tersebut. Lihat solusi ini: stackoverflow.com/a/14751543/533420
kkara

95

Sangat mungkin untuk melakukan ini dalam JavaScript selama fallback Anda adalah aplikasi lain. Membangun saran Nathan :

<html>
  <head>
    <meta name="viewport" content="width=device-width" />
  </head>
  <body>

    <h2><a id="applink1" href="fb://profile/116201417">open facebook with fallback to appstore</a></h2>
    <h2><a id="applink2" href="unknown://nowhere">open unknown with fallback to appstore</a></h2>
    <p><i>Only works on iPhone!</i></p>    

  <script type="text/javascript">

// To avoid the "protocol not supported" alert, fail must open another app.
var appstorefail = "itms://itunes.apple.com/us/app/facebook/id284882215?mt=8&uo=6";

function applink(fail){
    return function(){
        var clickedAt = +new Date;
        // During tests on 3g/3gs this timeout fires immediately if less than 500ms.
        setTimeout(function(){
            // To avoid failing on return to MobileSafari, ensure freshness!
            if (+new Date - clickedAt < 2000){
                window.location = fail;
            }
        }, 500);    
    };
}

document.getElementById("applink1").onclick = applink(appstorefail);
document.getElementById("applink2").onclick = applink(appstorefail);

</script>
</body>
</html>

Lihat demo langsung di sini .


7
Setuju dengan Lee, ini sepertinya solusi yang lebih mudah - meskipun saya masih mendapatkan pesan kesalahan dari safari jika aplikasi tidak ada dan dialihkan ke app store.
Jon

2
Saya menggunakan solusi ini untuk Android dan iOS. Saya menemukan jika saya mengubah nilai batas waktu dari 500 menjadi 100, saya tidak mendapatkan dialog sembulan "Tidak dapat membuka halaman" di iOS. Saya juga menemukan bahwa batas waktu harus 50 untuk Android
Rossini

14
Menggunakan "itms-apps:" bukan "itms:" menyimpan 1 redirect dan langsung membuka halaman aplikasi di appstore.
Latorre Jerman

6
@Rossini ini dibangun di Android dengan menyiapkan filter maksud untuk tindakan Anda yang menanggapi host tertentu
jwadsack

9
Adakah yang tahu cara menghindari pesan kesalahan "tidak bisa membuka halaman" dari safari jika aplikasi tidak diinstal dan sebelum mengarahkan ke app store?
davidk


24

Saya menemukan bahwa jawaban yang dipilih berfungsi untuk aplikasi browser tetapi saya mengalami masalah dengan kode yang bekerja di aplikasi non browser yang mengimplementasikan a UIWebView.

Masalahnya bagi saya adalah pengguna di aplikasi Twitter akan mengklik tautan yang akan membawa mereka ke situs saya melalui UIWebViewaplikasi Twitter. Kemudian ketika mereka mengklik tombol dari situs saya Twitter mencoba menjadi mewah dan hanya menyelesaikan window.locationjika situs tersebut dapat dijangkau. Jadi yang terjadi adalah UIAlertViewsembulan yang mengatakan Anda yakin ingin melanjutkan dan kemudian segera mengalihkan ke App Store tanpa popup kedua.

Solusi saya melibatkan iframe. Ini menghindari UIAlertViewdisajikan yang memungkinkan untuk pengalaman pengguna yang sederhana dan elegan.

jQuery

var redirect = function (location) {
    $('body').append($('<iframe></iframe>').attr('src', location).css({
        width: 1,
        height: 1,
        position: 'absolute',
        top: 0,
        left: 0
    }));
};

setTimeout(function () {
    redirect('http://itunes.apple.com/app/id');
}, 25);

redirect('custom-uri://');

Javascript

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 () {
    redirect('http://itunes.apple.com/app/id');
}, 25);

redirect('custom-uri://');

EDIT:

Tambahkan posisi absolut ke iframe sehingga ketika dimasukkan tidak ada sedikit spasi kosong di bagian bawah halaman.

Juga penting untuk dicatat bahwa saya belum menemukan kebutuhan untuk pendekatan ini dengan Android. Penggunaan window.location.hrefharus bekerja dengan baik.


1
Berhasil!! Terima kasih akhirnya saya menemukan solusi yang berfungsi pada setiap browser.
koleror

2
Ini adalah solusi terbaik jika ditemukan. Terima kasih. Tidak ada kesalahan sembulan lagi.
confile

1
@Tim jika Anda ingin kode ini dipecat saat tautan diklik, daripada bungkus kode ini dalam fungsi yang disebut setelah tautan diklik.
cnotethegr8

1
@ cnotethegr8 Saya telah memasukkannya ke dalam fungsi dan mengalihkan ke url khusus berfungsi dengan baik tetapi kembali ke iTunes tidak. Ini kode saya . Apa yang saya lewatkan?
Tim

1
Adakah orang lain yang mengalami masalah dengan ini di iOS 9. Tidak lagi berfungsi untuk saya di Safari.
bgolson

20

Di iOS9 Apple akhirnya memperkenalkan kemungkinan untuk mendaftarkan aplikasi Anda untuk menangani http://URL tertentu : Tautan Universal .

Penjelasan yang sangat kasar tentang cara kerjanya:

  • Anda menyatakan minat membuka http://URL untuk domain tertentu (url web) di aplikasi Anda.
  • Di server dari domain yang ditentukan Anda harus menunjukkan URL mana yang akan dibuka di aplikasi mana yang telah menyatakan minatnya untuk membuka URL dari domain server.
  • Layanan pemuatan URL iOS memeriksa semua upaya untuk membuka http://URL untuk pengaturan seperti yang dijelaskan di atas dan membuka aplikasi yang benar secara otomatis jika diinstal; tanpa melalui Safari terlebih dahulu ...

Ini adalah cara terbersih untuk melakukan tautan mendalam di iOS, sayangnya itu hanya bekerja di iOS9 dan yang lebih baru ...


dan itu tidak berfungsi di dalam browser ... hanya di luar, seperti dari imessage atau catatan
Mihey Mik

9

MEMBANGUN Lagi tentang Jawaban Nathan dan JB:

Cara Meluncurkan Aplikasi Dari url tanpa Klik Ekstra Jika Anda lebih suka solusi yang tidak menyertakan langkah sementara mengklik tautan, berikut ini dapat digunakan. Dengan javascript ini, saya dapat mengembalikan objek Httpresponse dari Django / Python yang berhasil meluncurkan aplikasi jika diinstal atau sebagai alternatif meluncurkan app store jika ada waktu habis. Catatan Saya juga perlu menyesuaikan periode batas waktu dari 500 hingga 100 agar ini berfungsi pada iPhone 4S. Uji dan sesuaikan untuk memperbaiki situasi Anda.

<html>
<head>
   <meta name="viewport" content="width=device-width" />
</head>
<body>

<script type="text/javascript">

// To avoid the "protocol not supported" alert, fail must open another app.
var appstorefail = "itms://itunes.apple.com/us/app/facebook/id284882215?mt=8&uo=6";

var loadedAt = +new Date;
setTimeout(
  function(){
    if (+new Date - loadedAt < 2000){
      window.location = appstorefail;
    }
  }
,100);

function LaunchApp(){
  window.open("unknown://nowhere","_self");
};
LaunchApp()
</script>
</body>
</html>

9
window.location = appurl;// fb://method/call..
!window.document.webkitHidden && setTimeout(function () {
    setTimeout(function () {
    window.location = weburl; // http://itunes.apple.com/..
    }, 100);
}, 600);

document.webkitHidden adalah untuk mendeteksi apakah aplikasi Anda sudah dipanggil dan tab safari saat ini untuk pergi ke latar belakang, kode ini dari www.baidu.com


Saya menguji solusi ini dan menemukan bahwa, meskipun memberikan peristiwa dengan benar, dialog galat "Safari tidak dapat membuka halaman ini karena alamatnya tidak valid" muncul sebentar. (Ini otomatis hilang setelah sepersekian detik).
michaelhanson

gunakan iframe untuk memuat appurldan weburlbisa menyelesaikan masalah Anda
zyanlu

1
@zyanlu: Saya sudah mencoba dengan iFrame. bt masih safari menunjukkan kesalahan yang sama.
kunjus

5

Jika Anda menambahkan iframedi halaman web Anda dengansrc skema set ke kustom untuk Aplikasi Anda, iOS akan secara otomatis mengarahkan ulang ke lokasi itu di App. Jika aplikasi tidak diinstal, tidak ada yang terjadi. Ini memungkinkan Anda untuk menautkan ke dalam Aplikasi jika itu dipasang, atau mengalihkan ke App Store jika itu tidak diinstal.

Misalnya, jika Anda menginstal aplikasi twitter, dan menavigasi ke halaman web yang berisi markup berikut, Anda akan langsung diarahkan ke aplikasi tersebut.

<!DOCTYPE html>
<html>
    <head>
    <title>iOS Automatic Deep Linking</title>
    </head>
    <body>
        <iframe src="twitter://" width="0" height="0"></iframe>
        <p>Website content.</p>
    </body>
</html>

Berikut adalah contoh yang lebih teliti yang mengarahkan ke App store jika Aplikasi tidak diinstal:

<!DOCTYPE html>
<html>
    <head>
    <title>iOS Automatic Deep Linking</title>
    <script src='//code.jquery.com/jquery-1.11.2.min.js'></script>
    <script src='//mobileesp.googlecode.com/svn/JavaScript/mdetect.js'></script>
    <script>
      (function ($, MobileEsp) {
        // On document ready, redirect to the App on the App store.
        $(function () {
          if (typeof MobileEsp.DetectIos !== 'undefined' && MobileEsp.DetectIos()) {
            // Add an iframe to twitter://, and then an iframe for the app store
            // link. If the first fails to redirect to the Twitter app, the
            // second will redirect to the app on the App Store. We use jQuery
            // to add this after the document is fully loaded, so if the user
            // comes back to the browser, they see the content they expect.
            $('body').append('<iframe class="twitter-detect" src="twitter://" />')
              .append('<iframe class="twitter-detect" src="itms-apps://itunes.com/apps/twitter" />');
          }
        });
      })(jQuery, MobileEsp);
    </script>
    <style type="text/css">
      .twitter-detect {
        display: none;
      }
    </style>
    </head>
    <body>
    <p>Website content.</p>
    </body>
</html>

Masalah dengan contoh pertama Anda adalah bahwa jika Anda kembali ke Mobile Safari, itu akan menampilkan "Aplikasi Twitter tidak diinstal" meskipun Twitter diluncurkan. Sama dengan contoh kedua, menampilkan "Konten situs web". Harus ada kode yang melakukan sesuatu yang berbeda (memuat URL lain, atau menampilkan salah satu dari dua pesan) jika aplikasi diinstal.
mahboudz

1
Ya, @mahboudz, jika Anda membaca teks, itu hanya contoh sederhana untuk menunjukkan bahwa dimungkinkan untuk secara otomatis mengarahkan ulang ke aplikasi.
q0rban

Saya kemudian menindaklanjuti dengan contoh yang lebih teliti yang akan menunjukkan konten situs web yang sebenarnya. Saya dapat menghapus teks "Aplikasi Twitter tidak diinstal" jika itu akan membuatnya lebih jelas.
q0rban

ios 6 masih menampilkan munculan Halaman itu tidak dapat dibuka karena url tidak valid
Andrei Shender

@AndreiShender, berikut adalah statistik penggunaan iOS pada saat penulisan ini: monosnap.com/image/8eXUcpEUi8fm94DiMZIdiIp4xUNaln.png iOS 8: 72%, iOS 7: 25%, Versi sebelumnya: 3%
q0rban

4

Inilah solusi.

Siapkan boolean sitiation menggunakan blur dan fokus

//see if our window is active
window.isActive = true;
$(window).focus(function() { this.isActive = true; });
$(window).blur(function() { this.isActive = false; });

Ikatkan tautan Anda dengan penangan klik jquery yang memanggil sesuatu seperti ini.

function startMyApp(){
  document.location = 'fb://';

  setTimeout( function(){
    if (window.isActive) {
        document.location = 'http://facebook.com';
    }
  }, 1000);
}

jika aplikasi terbuka, kita akan kehilangan fokus pada jendela dan penghitung waktu berakhir. kalau tidak kita tidak mendapatkan apa-apa dan kita memuat url facebook yang biasa.


Terima kasih banyak atas sarannya. Saya menghadapi masalah bahwa dialog "luncurkan aplikasi eksternal" tampaknya cukup untuk mengaburkan bendera. Ini terjadi bahkan jika aplikasi tidak diinstal (misalnya, ketika mengklik tautan yang dimaksudkan untuk meluncurkan Aplikasi iPhone di desktop). Ide ide?
fluxon

2

Anda tidak bisa, sejauh yang saya tahu, membuat seluruh OS memahami http:URL + domain. Anda hanya dapat mendaftarkan skema baru (saya gunakanx-darkslide: di aplikasi saya). Jika aplikasi diinstal, Mobile Safari akan meluncurkan aplikasi dengan benar.

Namun, Anda harus menangani kasus di mana aplikasi tidak diinstal dengan "Masih di sini? Klik tautan ini untuk mengunduh aplikasi dari iTunes." di halaman web Anda.


2
Ini tidak lagi benar: dengan iOS9 dan versi Android terbaru Anda dapat mendaftarkan aplikasi Anda untuk mendengarkan httpURL tertentu
severin

0

Periksa Agen-Pengguna dan seandainya itu Mobile Safari, buka myprotocol: // URL to (upaya) untuk membuka aplikasi iPhone dan minta itu membuka Mobile iTunes untuk mengunduh aplikasi seandainya percobaan gagal

Ini kedengarannya pendekatan yang masuk akal bagi saya, tetapi saya tidak berpikir Anda akan bisa membuatnya membuka iTunes seluler sebagai pilihan kedua. Saya pikir Anda harus memilih satu atau yang lain - baik mengarahkan ke aplikasi Anda atau ke iTunes.

yaitu jika Anda mengarahkan ulang ke myprotocol: //, dan aplikasi tidak ada di telepon, Anda tidak akan mendapatkan kesempatan kedua untuk mengalihkan ke iTunes.

Anda mungkin bisa mengarahkan ulang ke halaman pendaratan (dioptimalkan untuk iphone) dan memberikan opsi kepada pengguna untuk mengklik ke aplikasi Anda, atau ke iTunes untuk mendapatkan aplikasi jika mereka tidak memilikinya? Tapi, Anda akan mengandalkan pengguna untuk melakukan hal yang benar di sana. (Sunting: meskipun Anda dapat mengatur cookie sehingga hanya untuk pertama kali?)


1
Itu salah. Jika kesalahan ditampilkan bahwa halaman tidak dapat dibuka (Aplikasi tidak diinstal), JS masih dijalankan. Karena itu Anda dapat mengarahkan kembali ke solusi fallback lain.
Erik

0

Dalam upaya untuk memperbaiki masalah sembulan, saya menemukan bahwa Apple memiliki cara untuk mengatasi masalah ini.

Memang, ketika Anda mengklik tautan ini , jika Anda menginstal aplikasi, itu dialihkan untuk itu; jika tidak, Anda akan diarahkan ke halaman web, tanpa pop-up.


3
Saya menggali cukup dalam tentang bagaimana tautan itu bekerja, dan yang terbaik yang bisa saya dapatkan adalah bahwa itu bukan solusi JavaScript sama sekali. Apple tampaknya telah mendaftarkan penangan URL khusus untuk aplikasi mereka yang tidak memerlukan protokol khusus dan sebagai gantinya beberapa pencocokan pada string URL. Tautan yang Anda kirim segera dialihkan dengan 303 ke sini . Jika Anda mengirim tautan itu ke email Anda sendiri, Anda dapat mengamati bahwa mengkliknya akan langsung memunculkan aplikasi AppStore jika terpasang
Casey

Sangat menarik. Anda benar: jika saya mengkliknya, itu akan memunculkan aplikasi AppStore jika diinstal. Tetapi jika Anda menghapus beberapa parameter sampai "holydays", itu muncul di dalam Safari. Apple dapat mendaftarkan skema URL khusus ...
Titignes

@Titignes, bisa tolong jelaskan cara ini untuk membuka aplikasi atau halaman web. Apa pola untuk membangun url seperti itu?
Andrei Shender
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.