2012-12-27 110 views
36

我知道可以通過註冊自定義方案(例如://)直接鏈接到iOS應用程序,也可以通過應用程序鏈接到應用程序iTunes中。重定向到應用程序(如果已安裝),否則將其重定向到應用程序商店

在很多情況下,理想流程是提供一個鏈接,如果安裝了,則鏈接會重定向到應用程序,如果不是,則鏈接到商店。這是可能的,如果是的話,如何?

爲了清晰起見,添加了,該場景是我打開一個鏈接(http)從我的iphone上的電子郵件邀請我加入一個應用程序組中。如果用戶在該設備上安裝了應用程序,則應打開該應用程序,否則http鏈接應重定向到iTunes。

+1

我認爲理想的解決方案將意味着你可以重定向到iTunes的鏈接與指令。就像:https://itunes.apple.com/us/app/clear/id492134154?mt=8&uo=4&open=true where open = true告訴iOS應用程序商店打開應用程序... – ConfusedNoob

回答

22

無法檢查這個。 但是,有一個很好的解決方法。

的想法基本上是這樣的:

  1. 你打開你的應用程序中的第一次,你從你的應用程序中打開移動Safari預定義的URL服務器
  2. 上在該網址上設置了一個餅乾,像appInstalled用戶的移動Safari瀏覽器
  3. 然後你踢用戶返回到您的應用與您的註冊計劃(同FB不與SSO)
  4. 您的所有電子郵件中的鏈接指向你的網站,但該網站你檢查瀏覽器是否爲移動Safari以及appInsta lled cookie exists
  5. 如果瀏覽器不是移動版Safari瀏覽器或未找到cookie,則重定向到AppStore或停留在您的網頁中。
  6. 如果#4的條件爲真,您將用戶重定向到您的應用程序並註冊了
  7. 如果該應用程序已被用戶刪除,所以自定義url方案失敗,您將有一個自動安全重定向到AppStore的

的最後2個步驟進行了說明on this SO post

+1

第一步中的注意事項我嘗試用應用程序內部webview替換safari,但它不工作,因爲它們不共享相同的cookie存儲。 – Federico

+0

不幸的是,這需要更新ios客戶端。 – BananaNeil

+0

當用戶從設置中清除網站數據時,這不起作用 – Nishad

7

是的,它很容易。這需要你想要打開的應用程序在plist中聲明一個url方案:

//if you can open your app 
if([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"yourapp://"]]) 
{ 
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"yourapp://"]]; 
} 
else 
{ 
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"ituneappstorelink"]]; 
} 
+0

對不起,我的場景也許不清楚 - 這是假設我從另一個應用程序打開。在這種情況下,它將通過電子郵件或通過http網頁鏈接發送短信 - 所以遠程Web服務器需要重定向到適當的鏈接。 – ConfusedNoob

+0

您可能不得不鏈接到試圖以相同方式通過Javascript打開應用程序的網頁,如果它沒有打開它然後重定向到iTunes鏈接。我沒有這方面的資料,但它可以工作。 – rooster117

32

我認爲比較簡單的答案是建立一個網頁服務器上,使用下列的javascript:

(function() { 
    var app = { 
    launchApp: function() { 
     window.location.replace("myapp://"); 
     this.timer = setTimeout(this.openWebApp, 1000); 
    }, 

    openWebApp: function() { 
     window.location.replace("http://itunesstorelink/"); 
    } 
    }; 

    app.launchApp(); 
})(); 

這基本上會嘗試重定向到您的應用程序並設置超時重定向到應用程序商店,如果它失敗。

您甚至可以使代碼更加智能一些,並檢查用戶代理以查看它們是ios用戶,android用戶還是web用戶,然後適當地重定向它們。

+2

這應該被考慮用於接受的答案。 – user

+3

如果未使用此方法安裝應用程序,則iOS會引發相當不友好的「Safari無法打開頁面,因爲地址無效」消息。 –

+1

@RealWorld這聽起來像是ios 11的新增加。這幾天,對於這個話題,我會推薦實現通用鏈接。可能值得爲這個問題寫一個新的答案,概述它的工作原理。 – BananaNeil

13

如果您的電子郵件中包含iframe的網頁,並且src設置爲您的應用的自定義方案,則iOS會自動重定向到應用中的該位置。如果應用程序未安裝,則不會發生任何事情。這允許您深入鏈接到應用程序(如果它已安裝),或者如果未安裝,則重定向到App Store。

例如,如果您安裝了twitter應用程序,並導航到包含以下標記的網頁,您將立即轉到該應用程序。如果您沒有安裝Twitter應用程序,則會看到文字「Twitter應用程序未安裝」。

<!DOCTYPE html> 
<html> 
    <head> 
    <title>iOS Automatic Deep Linking</title> 
    </head> 
    <body> 
     <iframe src="twitter://" width="0" height="0"></iframe> 
     <p>The Twitter App is not installed</p> 
    </body> 
</html> 

這裏,如果沒有安裝應用程序重定向到App Store進行更徹底的例子:

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

爲了記錄,這就是我們在Syfy.com上所做的。如果已安裝,請轉到http://www.syfy.com/live以查看該站點是否自動將您深入鏈接到應用程序。 – q0rban

+0

這是問題的正確答案。我不是在頁面本身檢測iOS,而是在獲取請求中檢查用戶代理標題,並向重定向頁面或向用戶發送請求的頁面打開iOS設備中的鏈接。出於好奇,你怎麼知道iframe會以這種方式行事?在iframe html文檔中找不到這個。 –

+1

謝謝@CarlosGuzman!我不知道它會這樣工作,我只是不斷嘗試不同的東西,直到它的工作! :) – q0rban

相關問題