अगर iPhone पर वेब-पेज से कोई ऐप इंस्टॉल किया गया है तो कैसे जांचें?


142

मैं एक वेब-पेज बनाना चाहता हूं, एक ऐसा पेज जो आईफोन को ऐप-स्टोर पर रीडायरेक्ट करेगा यदि आईफोन में एप्लिकेशन इंस्टॉल नहीं है, लेकिन अगर आईफोन में ऐप इंस्टॉल है तो मैं चाहता हूं कि यह एप्लिकेशन को खोलें।

मैंने पहले ही iPhone एप्लिकेशन में एक कस्टम url लागू कर दिया है, इसलिए मेरे पास उस एप्लिकेशन के लिए एक url है जो कुछ इस प्रकार है:

myapp://

और अगर यह url अमान्य है, तो मैं चाहता हूं कि पेज ऐप स्टोर पर रीडायरेक्ट हो। क्या यह वास्तव में संभव है?

अगर मेरे पास फ़ोन पर एप्लिकेशन इंस्टॉल नहीं है और मैं myapp: // url को सफारी में लिखता हूं, तो मुझे केवल एक त्रुटि संदेश मिलता है।

यहां तक ​​कि अगर जावास्क्रिप्ट के साथ एक बदसूरत हैक मौजूद है, तो मैं वास्तव में जानना चाहूंगा?


1
यह हर iOS संस्करण में बदलता रहता है - iOS9 ने सब कुछ फिर से तोड़ दिया। मैं आपके लिए इसकी देखभाल करने के लिए Branch.io जैसी सेवा का उपयोग करने की सलाह दूंगा । मैंने शाखा लिंक सेवा के कुछ हिस्सों को बनाने में मदद की, और यह वर्तमान में 6000 से अधिक अलग-अलग पुनर्निर्देशन किनारे के मामलों को संभालती है ... पागल।
एलेक्स ऑस्टिन

1
2017 में, यदि आपकी ज़रूरत ईमेल से आपके ऐप से लिंक करने की है, तो आपको मेरे जवाब पर एक नज़र
डालनी

जवाबों:


198

जहां तक ​​मुझे पता है कि आप एक ब्राउज़र से, यह देख सकते हैं कि कोई ऐप इंस्टॉल है या नहीं।

लेकिन आप फोन को ऐप पर पुनर्निर्देशित करने की कोशिश कर सकते हैं, और अगर कुछ भी नहीं होता है तो फोन को एक निर्दिष्ट पृष्ठ पर पुनर्निर्देशित किया जाता है, जैसे:

setTimeout(function () { window.location = "https://itunes.apple.com/appdir"; }, 25);
window.location = "appname://";

यदि दूसरी पंक्ति का कोड परिणाम देता है तो पहली पंक्ति कभी निष्पादित नहीं होती है।

उम्मीद है की यह मदद करेगा!

इसी तरह का सवाल:


20
वर्तमान में iOS 6.1.2 में यह केवल वेबएप मोड में काम करता है। यदि ब्राउज़र से सीधे ऐप का उपयोग किया जाता है तो यह अपेक्षित रूप से बाहरी ऐप को खोलता है, लेकिन टाइमआउट भी निकाल दिया जाता है और ब्राउज़र को पुनर्निर्देशित किया जाता है।
मिका तुपुला

4
यदि एप्लिकेशन इंस्टॉल नहीं है, तो यह एक बदसूरत 'पृष्ठ नहीं मिला' अलर्ट फेंकता है। वैसे भी हम इसे दबा सकते हैं
अक्षत अग्रवाल

3
@ अक्षत अग्रवाल, क्या आप 'पेज नॉट अलर्ट' को दबाने के लिए कोड पर विस्तार से बता सकते हैं
हरप्रीत

2
इसे लागू करने के नए तरीके अब Android और iOS दोनों में हैं। एंड्रॉइड ऐप लिंक और आईओएस यूनिवर्सल लिंक
maledr53

1
इसका ऐप खोलें लेकिन ब्राउज़र को ऐपस्टोर / प्लेस्टोर पर भी रीडायरेक्ट करें। इसे रोकने के लिए कोई विधि / हैक?
सुजीत कुमार

157

स्वीकृत उत्तर को आगे बढ़ाने के लिए, आपको ऐप लॉन्च करने के बाद ब्राउज़र को वापस करने वाले लोगों को संभालने के लिए कभी-कभी अतिरिक्त कोड जोड़ने की आवश्यकता होती है- जब भी वे करते हैं तो सेटटाइमआउट फ़ंक्शन चलेगा। तो, मैं कुछ इस तरह से:

var now = new Date().valueOf();
setTimeout(function () {
    if (new Date().valueOf() - now > 100) return;
    window.location = "https://itunes.apple.com/appdir";
}, 25);
window.location = "appname://";

इस तरह, यदि कोड निष्पादन (यानी, ऐप स्विचिंग) में कोई फ़्रीज़ हो गया है, तो यह नहीं चलेगा।


2
यह समाधान दूसरों की तुलना में बहुत बेहतर है, मुझे 50
मैगिको

1
इसके बारे में मेरी टिप्पणी आईओएस 7 पर विफल रही थी, यह गलत था: मुझे बस 100 एमएस को एक जोड़े सेकंड तक बढ़ाना था (वास्तव में वैसे भी कम होने की कोई आवश्यकता नहीं है)।
देवियोस 1

Itunes.apple.com/appdir के बजाय , एक कदम (कोई HTTP पुनर्निर्देशन की प्रतीक्षा नहीं कर रहा है) सहेजें और सीधे ऐप स्टोर एप्लिकेशन योजना से लिंक करें। उदाहरण के लिए: itms: //itunes.apple.com/us/app/yelp/id284910350
जस्टिन

बहुत बढ़िया यह ios ऐप्स के लिए ठीक काम कर रहा है, एक ही कोड एंड्रॉइड ऐप में एक ही समय में दोनों यूआरएल पर रीडायरेक्ट करता है। क्या आपने ऐप्स और प्ले स्टोर खोलने के लिए android किया है?
मेहुल दूधत

6
यह लगातार मेरे ऐप और ऐप स्टोर दोनों को खोलता है, यहां तक ​​कि 50 पर भी। आईओएस 12
जोश वोल्फ

27

आईओएस सफारी में एक सुविधा है जो आपको अपने वेबपेज पर एक "स्मार्ट" बैनर जोड़ने की अनुमति देती है जो आपके ऐप से, यदि यह स्थापित है, या ऐप स्टोर से लिंक होगा।

आप metaपृष्ठ पर एक टैग जोड़कर ऐसा करते हैं । यदि आप चाहते हैं कि आप एप्लिकेशन को लोड होने पर कुछ विशेष करना चाहते हैं, तो आप एक विस्तृत ऐप URL भी निर्दिष्ट कर सकते हैं।

विवरण ऐप्पल के प्रचार ऐप में स्मार्ट ऐप बैनर पेज के साथ हैं।

तंत्र में आसान होने और एक मानकीकृत बैनर पेश करने के फायदे हैं। नकारात्मक पक्ष यह है कि आपके पास लुक या लोकेशन पर अधिक नियंत्रण नहीं है। इसके अलावा, यदि सफारी के अलावा पेज को ब्राउजर में देखा जाए तो सभी दांव बंद हो जाते हैं।


2
लेकिन अगर उपयोगकर्ता इसे स्थापित नहीं करता है, तो यह ऐप बैनर नहीं दिखाता है
TomSawyer

मेरे लिए न तो यूनिवर्सल लिंक या स्मार्ट बैनर काम करते हैं। मुझे विभिन्न ऐप्स के लिए कई मूल एप्लिकेशन लिंक की आवश्यकता है। चेक इफ़ इंस्टाल्ड के साथ प्रत्येक, इसे लॉन्च करें, अन्यथा स्टोर पर जाएं। मेरे पास सार्वभौमिक लिंक के लिए स्वामित्व फ़ाइल अपलोड करने के लिए डोमेन का नियंत्रण भी नहीं है। इसलिए दोनों विकल्प मेरे लिए अपमानजनक हैं। शुद्ध जावास्क्रिप्ट समाधान की आवश्यकता है।
फ्रान्टिकरॉक

16

2017 के अनुसार, ऐसा लगता है कि किसी ऐप का पता लगाने का कोई विश्वसनीय तरीका नहीं है, और रीडायरेक्शन ट्रिक हर जगह काम नहीं करेगी।

मेरे जैसे उन लोगों के लिए जिन्हें ईमेल से सीधे लिंक की आवश्यकता है (काफी सामान्य), यह निम्नलिखित ध्यान देने योग्य है:

  • AppScheme के साथ ईमेल भेजना: // ठीक काम नहीं करेगा क्योंकि लिंक जीमेल में फ़िल्टर किए जाएंगे

  • Appccheme के लिए स्वचालित रूप से रीडायरेक्ट करना: // क्रोम द्वारा अवरुद्ध है: मुझे संदेह है कि क्रोम को उपयोगकर्ता सहभागिता (एक क्लिक की तरह) के लिए पुनर्निर्देशन की आवश्यकता होती है

  • अब आप appScheme: // के बिना गहरे लिंक कर सकते हैं और यह बेहतर है लेकिन इसके लिए एक आधुनिक प्लेटफॉर्म और अतिरिक्त सेटअप की आवश्यकता है। Android iOS


यह ध्यान देने योग्य है कि अन्य लोगों ने पहले से ही इस बारे में गहराई से सोचा था। यदि आप देखते हैं कि कैसे स्लैक अपनी "मैजिक लिंक" सुविधा को लागू करता है, तो आप यह देख सकते हैं कि:

  • यह एक नियमित http लिंक के साथ एक ईमेल भेजता है (जीमेल के साथ ठीक है)
  • वेब पेज में एक बड़ा बटन है जो appScheme से लिंक करता है: // (क्रोम के साथ ठीक है)

9

आप इस प्लगइन को देख सकते हैं जो समस्या को हल करने की कोशिश करता है। यह उसी दृष्टिकोण पर आधारित है जैसा कि मिसेमिसा और एलेस्टेयर आदि द्वारा वर्णित है, लेकिन इसके बजाय एक छिपे हुए आइफ्रेम का उपयोग करता है।

https://github.com/hampusohlsson/browser-deeplink


मैंने इसे जोड़ा, लेकिन ऐप इंस्टॉल करने के बाद भी यह ऐपस्टोर पर रीडायरेक्ट हो जाता है।
कासिम

9

@ एटलैर ने इस जवाब में कहा कि कभी-कभी उपयोगकर्ता ऐप खोलने के बाद ब्राउज़र में वापस आ जाएंगे। उस उत्तर के लिए एक टिप्पणीकार ने संकेत दिया कि उपयोग किए गए समय मूल्यों को iOS संस्करण के आधार पर बदलना होगा। जब हमारी टीम को इससे निपटना था, तो हमने पाया कि शुरुआती टाइमआउट के लिए समय के मान और यह बताना कि क्या हम ब्राउज़र में वापस आ गए हैं, को ट्यून करना होगा, और अक्सर सभी उपयोगकर्ताओं और उपकरणों के लिए काम नहीं किया।

यह निर्धारित करने के लिए कि क्या हम ब्राउज़र में वापस आ गए हैं, यह निर्धारित करने के लिए एक मनमाना समय अंतर सीमा का उपयोग करने के बजाय, यह "पेजहाइड" और "पेजशो" घटनाओं का पता लगाने के लिए समझ में आया।

मैंने निम्नलिखित वेब पेज को विकसित करने में मदद करने के लिए विकसित किया कि क्या चल रहा था। यह HTML डायग्नोस्टिक्स को घटनाओं को प्रकट करता है, मुख्य रूप से क्योंकि कंसोल लॉगिंग, अलर्ट या वेब इंस्पेक्टर, jsfiddle.net आदि जैसी तकनीकों का उपयोग करते हुए इस कार्य प्रवाह में सभी अपनी कमियां थीं। समय सीमा का उपयोग करने के बजाय, जावास्क्रिप्ट "पेजहाइड" और "पेजशो" घटनाओं की संख्या को गिनता है कि क्या वे हुए हैं। और मैंने पाया कि सबसे मजबूत रणनीति 1000 के शुरुआती समय का उपयोग करना था (बजाय 25, 50, या 100 की सूचना दी गई / दूसरों के लिए सुझाव दिया गया)।

यह एक स्थानीय सर्वर पर पेश किया जा सकता है, जैसे कि python -m SimpleHTTPServerऔर आईओएस सफारी पर देखा गया।

इसके साथ खेलने के लिए, "या तो स्थापित ऐप खोलें" या "ऐप इंस्टॉल नहीं" लिंक दबाएं। ये लिंक क्रमशः मैप्स ऐप या ऐप स्टोर को खोलने के लिए होना चाहिए। फिर आप घटनाओं के अनुक्रम और समय को देखने के लिए सफारी लौट सकते हैं।

(नोट: यह केवल सफारी के लिए काम करेगा। अन्य ब्राउज़रों के लिए (जैसे क्रोम) आपको पेजहाइड / शो-समतुल्य घटनाओं के लिए हैंडलर स्थापित करना होगा)।

अपडेट: जैसा कि @ मिक्को ने टिप्पणियों में बताया है, हम जिस पेजशो / पेजहाइड घटनाओं का उपयोग कर रहे हैं, वह जाहिर तौर पर iOS8 में समर्थित नहीं है।

<html>
<head>
</head>
<body>
<a href="maps://" onclick="clickHandler()">Open an installed app</a>
<br/><br/>
<a href="xmapsx://" onclick="clickHandler()">App not installed</a>
<br/>

<script>

var hideShowCount = 0 ;
window.addEventListener("pagehide", function() {
    hideShowCount++ ;
    showEventTime('pagehide') ;
});

window.addEventListener("pageshow", function() {
    hideShowCount++ ;
    showEventTime('pageshow') ;
});

function clickHandler(){
    var hideShowCountAtClick = hideShowCount ;
    showEventTime('click') ;
    setTimeout(function () {
               showEventTime('timeout function '+(hideShowCount-hideShowCountAtClick)+' hide/show events') ;
               if (hideShowCount == hideShowCountAtClick){
                    // app is not installed, go to App Store
                    window.location = 'http://itunes.apple.com/app' ;
               }
            }, 1000);
}

function currentTime()
{
    return Date.now()/1000 ;
}

function showEventTime(event){
    var time = currentTime() ;
    document.body.appendChild(document.createElement('br'));
    document.body.appendChild(document.createTextNode(time+' '+event));
}
</script>
</body>
</html>

2

मुझे कुछ ऐसा करने की आवश्यकता है, जिसे मैंने निम्नलिखित समाधान के साथ समाप्त किया।

मेरे पास एक विशिष्ट वेबसाइट URL है जो दो बटनों के साथ एक पृष्ठ खोलेगा

1) बटन एक वेबसाइट पर जाएं

2) बटन दो एप्‍लीकेशन पर जाएं (iphone / android phone / tablet) यदि ऐप इंस्‍टॉल नहीं किया गया है तो आप यहां से डिफॉल्ट लोकेशन पर वापस जा सकते हैं (जैसे दूसरा url या ऐप स्‍टोर)

3) उपयोगकर्ताओं की पसंद को याद रखने के लिए कुकी

<head>
<title>Mobile Router Example </title>


<script type="text/javascript">
    function set_cookie(name,value)
    {
       // js code to write cookie
    }
    function read_cookie(name) {
       // jsCode to read cookie
    }

    function goToApp(appLocation) {
        setTimeout(function() {
            window.location = appLocation;
              //this is a fallback if the app is not installed. Could direct to an app store or a website telling user how to get app


        }, 25);
        window.location = "custom-uri://AppShouldListenForThis";
    }

    function goToWeb(webLocation) {
        window.location = webLocation;
    }

    if (readCookie('appLinkIgnoreWeb') == 'true' ) {
        goToWeb('http://somewebsite');

    }
    else if (readCookie('appLinkIgnoreApp') == 'true') {
        goToApp('http://fallbackLocation');
    }



</script>
</head>
<body>


<div class="iphone_table_padding">
<table border="0" cellspacing="0" cellpadding="0" style="width:100%;">
    <tr>
        <td class="iphone_table_leftRight">&nbsp;</td>
        <td>
            <!-- INTRO -->
            <span class="iphone_copy_intro">Check out our new app or go to website</span>
        </td>
        <td class="iphone_table_leftRight">&nbsp;</td>
    </tr>
    <tr>
        <td class="iphone_table_leftRight">&nbsp;</td>
        <td>
            <div class="iphone_btn_padding">

                <!-- GET IPHONE APP BTN -->
                <table border="0" cellspacing="0" cellpadding="0" class="iphone_btn" onclick="set_cookie('appLinkIgnoreApp',document.getElementById('chkDontShow').checked);goToApp('http://getappfallback')">
                    <tr>
                        <td class="iphone_btn_on_left">&nbsp;</td>
                        <td class="iphone_btn_on_mid">
                            <span class="iphone_copy_btn">
                                Get The Mobile Applications
                            </span>
                        </td>
                        <td class="iphone_btn_on_right">&nbsp;</td>
                    </tr>
                </table>

            </div>
        </td>
        <td class="iphone_table_leftRight">&nbsp;</td>
    </tr>
    <tr>
        <td class="iphone_table_leftRight">&nbsp;</td>
        <td>
            <div class="iphone_btn_padding">

                <table border="0" cellspacing="0" cellpadding="0" class="iphone_btn"  onclick="set_cookie('appLinkIgnoreWeb',document.getElementById('chkDontShow').checked);goToWeb('http://www.website.com')">
                    <tr>
                        <td class="iphone_btn_left">&nbsp;</td>
                        <td class="iphone_btn_mid">
                            <span class="iphone_copy_btn">
                                Visit Website.com
                            </span>
                        </td>
                        <td class="iphone_btn_right">&nbsp;</td>
                    </tr>
                </table>

            </div>
        </td>
        <td class="iphone_table_leftRight">&nbsp;</td>
    </tr>
    <tr>
        <td class="iphone_table_leftRight">&nbsp;</td>
        <td>
            <div class="iphone_chk_padding">

                <!-- CHECK BOX -->
                <table border="0" cellspacing="0" cellpadding="0">
                    <tr>
                        <td><input type="checkbox" id="chkDontShow" /></td>
                        <td>
                            <span class="iphone_copy_chk">
                                <label for="chkDontShow">&nbsp;Don&rsquo;t show this screen again.</label>
                            </span>
                        </td>
                    </tr>
                </table>

            </div>
        </td>
        <td class="iphone_table_leftRight">&nbsp;</td>
    </tr>
</table>

</div>

</body>
</html>

मुझे अपनी आवश्यकता के लिए इस प्रकार के कोड की आवश्यकता है लेकिन अपने लिंक को रखने में असमर्थ हूं। आवश्यकता: यदि app1 स्थापित किया गया है तो लिंक 1 पर जाएं, अन्य गोटो Link2। क्या कोई मदद कर सकता है?
SFDC_Learner

यदि उपयोगकर्ता 1 वेब चुनता है, तो एप्लिकेशन इंस्टॉल होने पर कुकी को बंद करने की आवश्यकता होती है।
चार्ली रिट्जेल

1

कुछ उत्तर संकलित करने के बाद, मैं निम्नलिखित कोड लेकर आया हूं। क्या आश्चर्य है मुझे उस घड़ी करता था नहीं एक पीसी (क्रोम, एफएफ) या Android क्रोम पर जमे हुए हो - ट्रिगर पृष्ठभूमि में काम किया, और दृश्यता की जांच केवल विश्वसनीय जानकारी थी।

var timestamp             = new Date().getTime();
var timerDelay              = 5000;
var processingBuffer  = 2000;

var redirect = function(url) {
  //window.location = url;
  log('ts: ' + timestamp + '; redirecting to: ' + url);
}
var isPageHidden = function() {
    var browserSpecificProps = {hidden:1, mozHidden:1, msHidden:1, webkitHidden:1};
    for (var p in browserSpecificProps) {
        if(typeof document[p] !== "undefined"){
        return document[p];
      }
    }
    return false; // actually inconclusive, assuming not
}
var elapsedMoreTimeThanTimerSet = function(){
    var elapsed = new Date().getTime() - timestamp;
  log('elapsed: ' + elapsed);
  return timerDelay + processingBuffer < elapsed;
}
var redirectToFallbackIfBrowserStillActive = function() {
  var elapsedMore = elapsedMoreTimeThanTimerSet();
  log('hidden:' + isPageHidden() +'; time: '+ elapsedMore);
  if (isPageHidden() || elapsedMore) {
    log('not redirecting');
  }else{
    redirect('appStoreUrl');
  }
}
var log = function(msg){
    document.getElementById('log').innerHTML += msg + "<br>";
}

setTimeout(redirectToFallbackIfBrowserStillActive, timerDelay);
redirect('nativeApp://');

जेएस फिडल


-2

तारीख समाधान दूसरों की तुलना में बहुत बेहतर है, मुझे 50 पर समय बढ़ाना पड़ा जैसे कि यह एक ट्वीटर उदाहरण है:

//on click or your event handler..
var twMessage = "Your Message to share";
var now = new Date().valueOf();
setTimeout(function () {
   if (new Date().valueOf() - now > 100) return;
   var twitterUrl = "https://twitter.com/share?text="+twMessage;
   window.open(twitterUrl, '_blank');
}, 50);
window.location = "twitter://post?message="+twMessage;

मोबाइल IOS सफारी पर एकमात्र समस्या यह है कि जब आपके पास डिवाइस पर ऐप इंस्टॉल नहीं है, और इसलिए सफारी एक अलर्ट दिखाती है कि जब नया यूआरएल खोला जाता है, तो ऑटोडिज़्म होता है, वैसे भी अब के लिए एक अच्छा समाधान है!


1
@AkshatAgarwal क्योंकि इस एलिस्टेयर एक के रूप में एक ही समाधान 7 दिन बाद में तैनात है
albanx

-5

इन सभी को नहीं पढ़ा, लेकिन एक iframe और "my app: // जो भी हो" स्रोत को जोड़ने का उपयोग किया जा सकता है।

फिर पृष्ठ के सेट अंतराल पर नियमित रूप से जांच करें 404or नहीं है।

आप अजाक्स कॉल का उपयोग भी कर सकते हैं। अगर 404 प्रतिसाद है तो ऐप इंस्टॉल नहीं है।


यह समाधान नहीं है।
एंड्री एम।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.