Visualforceページで標準レコードへのリンクを作成したい場合は、『/{!recordId}』という感じに指定すれば問題ありませんが、Salesforce1アプリでこの方法を利用するとフルサイトモードのページが表示されてしまいます。
この問題を解決するには『sforce.one.navigateToSObject(recordId);』 を利用すればいいみたいです。
参考
Salesforce1でVisualforceページの画面遷移 - yusuke6197のブログ
これで問題なくSalesforce1向けのページに遷移できました。
リンク処理の問題は解決したので、もう一つフルサイトモードとSalesforce1モードのどちらでアクセスしているか判定する方法もないかなと探してみたところ次のサイトで紹介されていました。
if( (typeof sforce != 'undefined') && (sforce != null) ) {}という書き方ができるみたいです。
実際にデバッグで確認してみました。
フルサイトモード
Salesforce1モード
ちゃんと判定できているみたいです。
サンプルコードはこちらです。
追記
上の『sforce != null』という判定だと『connection.js』を読み込んだ際にも反応してしまうので、『if (typeof sforce !== 'undefined' && sforce.one) {}』という書き方の方が良さそうですと教えてもらいました。判定時には『sforce.one』を使うようにした方がいいみたいです。
connection.jsといえばJavaScriptからSalesforceの情報にアクセスできる便利なJSです。カスタムボタンのonClickイベントでお世話になるやつです。
せっかく教えてもらったので自分でも実際に試してみました。
一番最初に試してみた『if( (typeof sforce != 'undefined') && (sforce != null) ) {}』の処理に対してapex:includeScriptでconnection.jsを読み込んでからデバッグしてみます。
おお。。フルサイトモードのときにもSalesforce1と判定されてる。。。。
確かにconnection.jsを読み込んだときに誤作動してしまいました。ちなみにsforce.oneの方には値は入っていません。
それではSalesforce1モードのときにどうなるかも確認してみます。
フルサイトモードのときは値の無かったsforce.oneにきちんと値が入っています。
というわけでconnection.js読み込み時の挙動を確認できました。Salesforce1モードの判定を行うときは、『sforce.one』の方が確実でした。