YouTube ve Haritalar gibi iPhone uygulamaları için http + alan adı tabanlı bir URL Düzeni kaydetmek mümkün müdür?


223

İOS, uygulama telefona her yüklendiğinde alanımdaki URL'leri (ör. Http://martijnthe.nl ) ve olmasa da Mobile Safari ile açmasını istiyorum .

Bunun için benzersiz bir protokol soneki oluşturmak ve Info.plist'e kaydetmek mümkündür, ancak mobil Safari, uygulamanın yüklü olmaması durumunda bir hata verecektir.

Geçici çözüm ne olurdu?

Bir fikir:

1) Herhangi bir masaüstü tarayıcısında açılan http: // URL'leri kullanın ve tarayıcı üzerinden hizmeti verin

2) User-Agent'ı kontrol edin ve Mobile Safari olması durumunda, iPhone uygulamasını açmak için bir myprotocol: // URL (açmak için) açın ve girişimin başarısız olması durumunda uygulamayı indirmek için Mobil iTunes'u açın.

Bunun işe yarayıp yaramayacağından emin değil misiniz? Teşekkürler!


4
NYC metroda, tavsiye ettikleri bir uygulamayı indirirseniz WiFi'ye ücretsiz erişim sağlayan Boingo tarafından wifi bulunmaktadır. İndirdikten sonra, Safari'ye geri dönersiniz ve tarayıcı, yüklü olup olmadığını algılar ve size erişim izni verir. Bunun nasıl yapıldığına dair bir fikrin var mı?
TommyG

2
Evrensel Bağlantılar artık bu kullanım durumunu herhangi bir hata mesajı vermeden destekleyecektir. Alan adınızı ve uygulamanızı şu şekilde yapılandırabilirsiniz: blog.branch.io/…
Alex Austin

Yanıtlar:


243

Bence bunu yapmanın en az müdahaleci yolu aşağıdaki gibidir:

  1. Kullanıcı aracısının bir iPhone / iPod Touch aygıtı olup olmadığını kontrol edin
  2. appInstalledÇerez olup olmadığını kontrol edin
  3. Çerez varsa ve true değerine ayarlandıysa window.location, your-uri://(veya yönlendirme sunucusu tarafını yapın) olarak ayarlayın
  4. Çerez yoksa, "Site Adınızın bir iPhone uygulaması olduğunu biliyor muydunuz?" "Evet, çoktan aldım", "Hayır, ama denemek isterim" ve "Beni rahat bırak" düğmesiyle modal.
    1. "Evet" düğmesi çerezi true olarak ayarlar ve your-uri://
    2. "Hayır" düğmesi , cihazda App Store'u açacak olan " http://itunes.com/apps/yourappname " adresine yönlendiriyor
    3. "Beni yalnız bırak" düğmesi çerezi yanlış olarak ayarlar ve kipi kapatır

Oynadığım ancak biraz hantal bulduğum diğer seçenek, Javascript'te aşağıdakileri yapmaktı:

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
Harika bir çözüm. Yedeklemeniz başka bir uygulamaya yönelikse , hatayı görüntülemeden HEMEN yükleyecektir . Yani itunes.com geri düşmek yerine ... pop-up hata önlemek için itms: //phobos.apple.com / ... kullanın!
jb.

47
Sorun : window.location="custom-uri://Başarılı olduğunda, geri dönüş zaman aşımı öldürülmez. Kullanıcı uygulamanızdan tarayıcıya döndüğünde, zamanlayıcı hala oradadır ve uygulama mağazası bağlantısını başlatır. Bu kötü bir kullanıcı deneyimidir.
JoJo

5
Görünüşe göre Çerezler # ios6'da korumalı olarak yerleştirilmiştir, böylece başka bir uygulama tarafından ayarlanan çerezlere erişemezsiniz. (Uygulama WebUI ve Safari Mobile)
Olivier Amblet

2
Kullanıcı tarayıcıya geri döndüğünde orijinal zaman aşımının tetiklenmesini önlemenin bir yolu var mı? (yükselen sorun JoJo'dan bahseder)
cobolstinks

2
JoJo'nun bahsettiği sorunu çözmek için, yalnızca zaman aşımındaki kodu, kullanıcı bağlantıyı tıklattığından beri "çok fazla zaman" geçmediyse çalıştırın. Bu çözümü görün: stackoverflow.com/a/14751543/533420
kkara

95

Yedeklemeniz başka bir uygulama bağlantısı olduğu sürece bunu JavaScript'te yapmak oldukça mümkündür. Nathan'ın önerisine dayanarak :

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

Buradan canlı bir demoya göz atın .


7
Lee ile aynı fikirdeyim, bu daha basit bir çözüm gibi görünüyor - yine de uygulama yoksa ve uygulama mağazasına yönlendiriyorsa safari'den hata mesajı alıyorum.
Jon

2
Bu çözümü hem Android hem de iOS için kullandım. Zaman aşımı değerini 500'den 100'e değiştirirsem iOS'ta "Sayfa açılamıyor" açılır iletişim kutusunu göremiyorum. Android için zaman aşımının 50 olması gerektiğini de öğrendim
Rossini

14
"İtms:" yerine "itms-apps:" kullanılması 1 yönlendirmeyi kaydeder ve uygulama sayfasını doğrudan uygulama mağazasında açar.
Alman Latorre


9
Uygulama yüklü değilse ve uygulama mağazasına yönlendirmeden önce safari'den "sayfa açılamıyor" hata mesajından nasıl kaçınılacağını bilen var mı?
davidk


24

Seçilen cevabın tarayıcı uygulamaları için çalıştığını buldum, ancak bir uygulama uygulayan tarayıcı olmayan uygulamalarda kodla ilgili sorunlar yaşıyordum UIWebView.

Benim için sorun, Twitter uygulamasındaki bir kullanıcının, Twitter uygulamasındaki bir aracılığıyla onları siteme götürecek bir bağlantıyı tıklamasıydı UIWebView. Sonra sitemden bir düğmeyi tıkladıklarında Twitter süslü olmaya çalışır ve sadece window.locationsiteye ulaşılabilir ise tamamlayın . Yani olan şey, UIAlertViewdevam etmek istediğinizden emin olduğunuzdan ve hemen ikinci bir açılır pencere olmadan App Store'a yönlendirdiğinizden emin olmanızdır.

Benim çözümüm iframe'leri içeriyor. Bu, UIAlertViewbasit ve zarif bir kullanıcı deneyimi sunarak sunulmayı önler .

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://');

DÜZENLE:

İframe'e mutlak konum ekleyin, böylece eklendiğinde sayfanın altında rastgele bir boşluk kalmaz.

Android ile bu yaklaşıma ihtiyaç duymadığımı da belirtmek gerekir. Kullanımı window.location.hrefiyi çalışmalıdır.


1
İşe yarıyor!! Teşekkürler Sonunda her tarayıcıda çalışan bir çözüm buldum.
koleror

2
Eğer bulunursa, bu en iyi çözümdür. Teşekkür ederim. Artık hata açılır penceresi yok.
yapılandırma dosyasındaki

1
@Bağlantı tıklatıldığında bu kodun tetiklenmesini istiyorsanız, bu kodu bağlantı tıklatıldığında çağrılan bir işleve sarmak yerine.
cnotethegr8

1
@ cnotethegr8 Bir fonksiyona koydum ve özel url'ye yönlendirme harika çalışıyor, ancak iTunes'a geri dönüş çalışmıyor. İşte kodum . Neyi kaçırıyorum?
Tim

1
İOS 9'da bununla ilgili başka bir sorun vardı. Artık Safari'de benim için çalışmıyor.
bgolson

20

İOS9'da Apple nihayet belirli http://URL'leri işlemek için uygulamanızı kaydetme olanağını tanıttı : Evrensel Bağlantılar .

Nasıl çalıştığına dair çok kabaca bir açıklama:

  • http://Uygulamanızdaki belirli alan adları (web URL'leri) için URL'leri açmaya ilgi duyduğunuzu beyan ediyorsunuz.
  • Belirtilen etki alanlarının sunucusunda, hangi uygulamanın hangi URL'lerde açılacağını, uygulamanın URL'lerini sunucunun alanından açmaya ilgi duyduğunu belirtmeniz gerekir.
  • İOS URL yükleme hizmeti http://, yukarıda açıklandığı gibi bir kurulum için URL'leri açma girişimlerini denetler ve yüklüyse doğru uygulamayı otomatik olarak açar; Önce Safari'den geçmeden ...

Bu, iOS'ta derin bağlantı yapmanın en temiz yoludur, maalesef sadece iOS9 ve daha yeni sürümlerde çalışır ...


ve tarayıcının içinde çalışmıyor ... sadece dışarıda, imessage veya notlar gibi
Mihey Mik

9

Nathan ve JB'nin Cevabı için yine BİNA:

Ekstra Tıklama Olmadan Url'den Uygulama Nasıl Başlatılır Bir bağlantıyı tıklatmanın ara adımını içermeyen bir çözümü tercih ediyorsanız, aşağıdakiler kullanılabilir. Bu javascript ile, Django / Python'dan bir uygulamayı yüklerse başarılı bir şekilde başlatan veya alternatif olarak zaman aşımı durumunda uygulama mağazasını başlatan bir Httpresponse nesnesi döndürebildim. Not Bunun ayrıca bir iPhone 4S'de çalışması için zaman aşımı süresini 500'den 100'e ayarlamam gerekiyordu. Durumunuza uygun olması için test edin ve değiştirin.

<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 uygulamanızın önceden çağrılıp çağrılmadığını ve mevcut safari sekmesinin arka plana gitmesini tespit etmektir, bu kod www.baidu.com adresinden


Bu çözümü test ettim ve olayları düzgün bir şekilde yayınlasa da, "Safari geçersiz olduğundan adres bu sayfayı açamıyor" hata iletişim kutusunun bir an için göründüğünü buldum. (Saniyeden kısa bir süre sonra otomatik olarak kapanır).
michaelhanson

yüklemek için bir iframe kullanın appurlve weburlsorununuzu çözebilir
zyanlu

1
@zyanlu: iFrame ile denedim. bt still safari aynı hatayı gösteriyor.
kunjus

5

iframeWeb sayfanıza srcUygulamanız için özel şema ayarlanmış olarak bir eklerseniz , iOS otomatik olarak Uygulamadaki o konuma yönlendirir. Uygulama yüklü değilse hiçbir şey olmaz. Bu, yüklüyse Uygulamaya derin bir bağlantı veya yüklü değilse App Store'a yönlendirmenizi sağlar.

Örneğin, twitter uygulaması yüklüyse ve aşağıdaki işaretlemeyi içeren bir web sayfasına giderseniz, hemen uygulamaya yönlendirilirsiniz.

<!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>

Uygulama yüklü değilse App store'a yönlendiren daha kapsamlı bir örnek:

<!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>

İlk örneğinizle ilgili sorun, Mobile Safari'ye geri dönerseniz, Twitter başlatılmış olsa bile "Twitter Uygulaması yüklü değil" i göstermesi. "Web sitesi içeriği" ni görüntüleyen ikinci örnekle aynı. Uygulama yüklüyse farklı bir şey yapan (başka bir URL yükleyen veya iki mesajdan birini görüntüleyen) bir kod olması gerekir.
mahboudz

1
Evet, @mahboudz, metni okursanız, uygulamaya otomatik olarak yeniden yönlendirmenin mümkün olduğunu göstermek için basit bir örnektir.
q0rban

Daha sonra, gerçek web sitesi içeriğini gösterecek daha kapsamlı bir örnek izledim. Daha net hale getirecekse "Twitter Uygulaması yüklü değil" metnini silebilirim.
q0rban

ios 6 hala pop-up görüntülüyor Geçersiz url nedeniyle bu sayfa açılamıyor
Andrei Shender

@AndreiShender, bu yazının yazıldığı sırada iOS kullanım istatistikleri: monosnap.com/image/8eXUcpEUi8fm94DiMZIdiIp4xUNaln.png iOS 8: 72%, iOS 7: 25%, Önceki sürümler: 3%
q0rban

4

Heres bir çözüm.

Bulanıklaştırma ve odaklama kullanarak bir boolean konumlandırma ayarlayın

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

Bağlantınızı böyle bir şeyi çağıran bir jquery tıklama işleyicisi ile bağlayın.

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

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

uygulama açılırsa pencereye odaklanmayı kaybederiz ve zamanlayıcı sona erer. aksi takdirde hiçbir şey almıyoruz ve normal facebook url'sini yüklüyoruz.


Öneri için çok teşekkürler. "Dış uygulamayı başlat" iletişim kutusunun bulanıklığın bayrağını devre dışı bırakması için yeterli olduğu sorunuyla karşı karşıyayım. Bu, uygulama yüklü olmasa bile gerçekleşir (örneğin, bir iPhone Uygulamasını masaüstünde başlatmak üzere tasarlanmış bir bağlantıyı tıkladığınızda). Fikirler?
fluxon

2

Bildiğim kadarıyla işletim sisteminin tamamının http:+ alan adı URL'sini anlamasını sağlayamazsınız . Yalnızca yeni şemalar kaydedebilirsiniz ( x-darkslide:uygulamamda kullanıyorum). Uygulama yüklüyse, Mobile Safari uygulamayı doğru şekilde başlatır.

Ancak, uygulamanın "Hala burada mı?" Uygulamasını yüklediğinizde, uygulamayı iTunes'dan indirmek için bu bağlantıyı tıklayın. web sayfanızda.


2
Bu artık doğru değil: iOS9 ve son Android sürümleriyle, belirli httpURL'leri dinlemek için uygulamanızı kaydedebilirsiniz
severin

0

User-Agent'ı kontrol edin ve Mobile Safari olması durumunda, iPhone uygulamasını açmak için bir myprotocol: // URL (açmak için) açın ve girişimin başarısız olması durumunda uygulamayı indirmek için Mobil iTunes'u açın.

Bu bana makul bir yaklaşım gibi geliyor, ancak mobil itunes'u ikinci bir çare olarak açabileceğinizi sanmıyorum. Uygulamanıza veya itunes'a yönlendirmek için birini veya diğerini seçmeniz gerektiğini düşünüyorum.

yani benim protokole: // yönlendirirseniz ve uygulama telefonda değilse, itunes'a yönlendirmek için ikinci bir şansınız olmaz.

Belki de ilk önce (iphone için optimize edilmiş) bir açılış sayfasına yönlendirebilir ve kullanıcıya uygulamanıza tıklama seçeneği sunabilir veya uygulama yoksa uygulamayı almak için itunes'a verebilir misiniz? Ancak, orada doğru olanı yapmak için kullanıcıya güveneceksiniz. (Düzenleme: bir çerez ayarlayabilmenize rağmen, yalnızca ilk kez mi olacak?)


1
Bu yanlış. Sayfanın açılamayacağı konusunda bir hata gösterilirse (Uygulama yüklü değil), JS yine de yürütülür. Bu yüzden başka bir yedek çözümüne yönlendirebilirsiniz.
Erik

0

Pop-up sorununu çözmek için Apple'ın bu endişe konusunda bir yolu olduğunu keşfettim.

Gerçekten, bu bağlantıyı tıklattığınızda , uygulamayı yüklediyseniz, yeniden yönlendirilir; aksi takdirde, herhangi bir açılır pencere olmadan web sayfasına yönlendirilirsiniz.


3
Bu bağlantının nasıl çalıştığına oldukça derinlemesine girdim ve gelebileceğim en iyisi, bunun bir JavaScript çözümü olmaması. Apple, uygulamaları için özel bir protokol gerektirmeyen ve bunun yerine bir URL dizesiyle eşleşen özel bir URL işleyici kaydetmiş görünüyor. Gönderdiğiniz bağlantı hemen bir 303 ile buraya yönlendirir . Bu bağlantıyı kendinize bir e-posta ile gönderirseniz, üzerine tıklandığında doğrudan AppStore uygulamasını getireceğini gözlemleyebilirsiniz
Casey

Çok ilginç. Haklısın: üzerine tıklarsam, AppStore uygulamasını açar. Ancak "bayram günlerine" kadar bazı parametreleri silerseniz, Safari'de bu durum ortaya çıkar. Apple özel URL düzenini kaydedebilir ...
Titignes

@Titignes, lütfen uygulamayı veya web sayfasını açmak için bu yolu ayrıntılı olarak açıklar mısınız? Böyle bir url oluşturmak için model nedir?
Andrei Shender
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.