アプリを携帯電話にインストールするたびにアプリでiOSを使用してドメインからURLを開きます(例: http://martijnthe.nl )。ありません。
このために一意のプロトコルサフィックスを作成してInfo.plistに登録することは可能ですが、アプリがインストールされていない場合、Mobile Safariでエラーが発生します。
回避策は何ですか?
一つのアイデア:
1)デスクトップブラウザーで開くhttp:// URLを使用し、ブラウザーを介してサービスをレンダリングする
2)User-Agentを確認し、Mobile Safariの場合は、myprotocol:// URLを開いて(試行)iPhoneアプリを開き、試行が失敗した場合にモバイルiTunesを開いてアプリをダウンロードします
これがうまくいくかどうかわからない...提案はありますか?ありがとう!
これを行う最も邪魔にならない方法は次のとおりだと思います。
appInstalled
Cookieを確認するwindow.location
をyour-uri://
に設定します(またはリダイレクトサーバー側で行います)your-uri://
にリダイレクトします私が遊んだが、少し不格好だった他のオプションは、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://";
フォールバックが別のアプリリンクである限り、JavaScriptでこれを行うことは非常に可能です。構築 ネイサンの提案 :
<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>
IOS 6デバイスの場合、オプションがあります。 スマートアプリバナーを使用したアプリのプロモーション
選択した答えはブラウザアプリで機能することがわかりましたが、UIWebView
を実装する非ブラウザアプリで動作するコードに問題がありました。
私にとっての問題は、TwitterアプリのユーザーがTwitterアプリのUIWebView
を介して私のサイトに移動するリンクをクリックすることでした。それから、彼らが私のサイトからボタンをクリックすると、Twitterは空想を出し、サイトが到達可能な場合にのみwindow.location
を完了しようとします。ですから、UIAlertView
のポップアップが表示され、続行してよろしいと言ってから、2番目のポップアップなしですぐにApp Storeにリダイレクトされます。
私のソリューションにはiframeが関係しています。これにより、UIAlertView
が表示されなくなり、シンプルでエレガントなユーザーエクスペリエンスが実現します。
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://');
編集:
Iframeに絶対位置を追加します。挿入すると、ページの下部に空白のランダムなビットがなくなります。
また、Androidでのこのアプローチの必要性を発見していないことに注意することも重要です。 window.location.href
を使用すると問題なく動作するはずです。
IOS9では、Appleが最終的に特定のhttp://
URLを処理するアプリを登録する可能性を導入しました: niversal Links 。
仕組みの非常に大まかな説明:
http://
URLを開くことに関心があることを宣言します。http://
URLを開こうとするすべての試行をチェックし、インストールされていれば正しいアプリを自動的に開きます。最初にSafariを経由せずに...これは、iOSでディープリンクを行う最もクリーンな方法です。残念ながら、iOS9以降でのみ機能します。
window.location = appurl;// fb://method/call..
!window.document.webkitHidden && setTimeout(function () {
setTimeout(function () {
window.location = weburl; // http://iTunes.Apple.com/..
}, 100);
}, 600);
document.webkitHidden
は、アプリが既に起動されているかどうかを検出し、現在のサファリタブをバックグラウンドに移動することです。このコードはwww.baidu.com
ネイサンとJBの答えを再び構築:
追加のクリックなしでURLからアプリを起動する方法リンクをクリックする暫定的なステップを含まないソリューションを希望する場合は、以下を使用できます。このjavascriptを使用して、Django/PythonからHttpresponseオブジェクトを返すことができました。これは、インストールされている場合はアプリを正常に起動し、タイムアウトした場合はアプリストアを起動します。注:これをiPhone 4Sで機能させるには、タイムアウト期間を500から100に調整する必要もありました。状況に合わせてテストして調整します。
<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>
iframe
をアプリのカスタムスキームに設定してsrc
をWebページに追加すると、iOSはアプリ内のその場所に自動的にリダイレクトします。アプリがインストールされていない場合、何も起こりません。これにより、アプリがインストールされている場合はアプリにディープリンクでき、インストールされていない場合はApp Storeにリダイレクトできます。
たとえば、Twitterアプリをインストールしていて、次のマークアップを含むWebページに移動すると、すぐにアプリに移動します。
<!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>
以下は、アプリがインストールされていない場合にアプリストアにリダイレクトするより完全な例です。
<!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>
私の知る限り、OS全体にhttp:
+ domain URLを理解させることはできません。新しいスキームのみ登録できます(アプリでx-darkslide:
を使用しています)。アプリがインストールされている場合、Mobile Safariはアプリを正しく起動します。
ただし、アプリが「まだここにありますか?このリンクをクリックしてiTunesからアプリをダウンロードします」でアプリがインストールされない場合に対処する必要があります。あなたのウェブページで。
解決策があります。
ぼかしとフォーカスを使用してブール型シテシエーションを設定します
//see if our window is active
window.isActive = true;
$(window).focus(function() { this.isActive = true; });
$(window).blur(function() { this.isActive = false; });
このようなものを呼び出すjqueryクリックハンドラーでリンクをバインドします。
function startMyApp(){
document.location = 'fb://';
setTimeout( function(){
if (window.isActive) {
document.location = 'http://facebook.com';
}
}, 1000);
}
アプリが開くと、ウィンドウへのフォーカスが失われ、タイマーが終了します。それ以外の場合は何も取得せず、通常のFacebookのURLを読み込みます。
User-Agentを確認し、Mobile Safariの場合は、myprotocol:// URLを開いて(試行)iPhoneアプリを開き、試行が失敗した場合にアプリをダウンロードするためにMobile iTunesを開きます
これは理にかなっているように思えますが、モバイルiTunesを2番目の手段として開くことができるとは思わないでしょう。どちらかを選択する必要があると思います-アプリまたはiTunesにリダイレクトします。
つまり、myprotocol://にリダイレクトし、アプリが電話にない場合は、iTunesにリダイレクトする機会が二度とありません。
おそらく最初に(iphoneに最適化された)ランディングページにリダイレクトし、ユーザーにアプリをクリックするか、iTunesがなければアプリを取得するためのiTunesをクリックするオプションを与えることができますか?しかし、あなたはユーザーが正しいことをするのを頼りにするでしょう。 (編集:Cookieを設定することはできますが、これは初めてのことですか?)
ポップアップの問題を解決しようとして、Appleがこの懸念を回避する方法があることを発見しました。
実際、 このリンク をクリックすると、アプリケーションをインストールした場合、アプリケーションに再ルーティングされます。それ以外の場合は、ポップアップなしでWebページにリダイレクトされます。