web-dev-qa-db-ja.com

PhoneGap for iPhone:外部URLの読み込みに関する問題

PhoneGapを使用してiPad用のアプリケーションを作成していますが、Safariをトリガーしたり、ChildBrowserなどの内部Webブラウザーを使用したりせずに外部URLをロードしたいと考えています。

PhoneGap iPad/iPhoneサンプルプロジェクトを使用していて、さまざまなアプローチを試しました。追加したonBodyLoad()関数で:

window.location.href('http://www.wordreference.com'); 

しかし、この行は新しいSafariウィンドウを使用してリンクを開きます。その時点からPhoneGapに戻ることはできません

その後、私はAJAXリクエストでdocument.writeを使用してページのコンテンツを置き換えてみました

function loadHTML(url, timeout) {
if (timeout == undefined)
    timeout = 10000;
var req = new XMLHttpRequest();
var timer = setTimeout(function() {
    try {
        req.abort();
    } catch(e) {}
    navigator.notification.loadingStop();
},timeout);
req.onreadystatechange = function() {
    if (req.readyState == 4) {
        if (req.status < 300) {
            clearTimeout(timer);

            var html = req.responseText;
            //just a debug print   
    alert(html);
    document.write(html);

        }
        navigator.notification.loadingStop();
        delete req;
    }       
};          
req.open('GET', url, true);
req.send();
}

次に、onBodyLoad()内から呼び出します。

loadHTML('http://www.wordreference.com',10000); 

PhoneGapコンテナでリンクを開きます。これで問題ありません。ポイントは、Pythonで書かれた動的ページをロードしたいということです

loadHTML('http://www.mysite.com/cgi-bin/index.py',10000)

この時点では、Safariは呼び出されませんが、PhoneGapコンテナーに黒いページが表示されます。 Safariに入力してもリンクが完全に機能していることを指摘したいと思います(プライバシーの問題については報告できません)。

それはある種の必要な許可に関連した問題でしょうか???

PhoneGap for BlackBerryに似たものが見つかりました。提案された解決策は、config.xmlファイルを次のように変更することでした。

<access subdomains="true" uri="http://www.mysite.com/" />

このタグを直接index.htmlに追加しようとしましたが、機能しません。

IPhoneに同様のアプローチはありますか?

どうもありがとう

26
Claus

私は解決策を見つけたと思います、

phoneGap Application Delegate .mファイル{YourProject} AppDelegate.mで、メソッドを変更します。

- (BOOL)webView:(UIWebView *)theWebView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
return [super webView:theWebView shouldStartLoadWithRequest:request navigationType:navigationType];
}

- (BOOL)webView:(UIWebView *)theWebView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
 NSURL *url = [request URL];
if ([[url scheme] isEqualToString:@"http"] || [[url scheme] isEqualToString:@"https"]) {
    return YES;
}
else {
return [ super webView:theWebView shouldStartLoadWithRequest:request navigationType:navigationType ];
}
}

これにより、PhoneGapコンテナ内のすべての外部リンクが開きます!!!

ps。あなたの周りにはこれへの参照があります link しかし、Safariはデフォルトで外部リンク用に開かれているため、0.9.5バージョンを使用して記述されたアプリでは機能しないと思います。

23
Claus

Androidでこの問題が発生している場合:

以前のバージョンについては知りませんが、PhoneGap 1.1.0ではres/xml/phonegap.xmlというファイルを作成し、外部ブラウザーで開かないドメインをリストできます。

からDroidGap.Java

 /**
 * Load PhoneGap configuration from res/xml/phonegap.xml.
 * Approved list of URLs that can be loaded into DroidGap
 *      <access Origin="http://server regexp" subdomains="true" />
 * Log level: ERROR, WARN, INFO, DEBUG, VERBOSE (default=ERROR)
 *      <log level="DEBUG" />
 */
private void loadConfiguration() {
[...]

phonegap.xml

<?xml version="1.0" encoding="UTF-8"?>
<phonegap>
    <access Origin="http://stackoverflow.com" subdomains="true" />
</phonegap>
10
nisc

Androidでは、PhoneGap 1.1.0以降、ページ遷移中に画面が黒くなる問題を回避するには、次のように配置できます。

super.setIntegerProperty("backgroundColor", Color.WHITE);
super.setStringProperty("loadingPageDialog", "Loading page...");

droidGapアクティビティのonCreate()メソッドのsuper.loadUrlの前。

詳細が記載されているPhoneGapディスカッションフォーラムへの参照を次に示します。

http://comments.gmane.org/gmane.comp.handhelds.phonegap/11491

2
Dave Curry

これは機能します-クラウスに感謝します。たぶん、いくつかのアプリは単に「http」と「https」よりも区別する必要があります。

私はPhoneGap Androidで同様のことを行いました。以下を参照してください。インターフェイス(ここではEXTERNALLINKと呼びます)を提供し、JavaScriptからloadExternalLinkを呼び出して、そのURLを現在のWebViewにロードします。私は専門家ではありませんが、私のために、そしてあなたがそれを適用したいリンクのためだけに働くようです。

アクティビティ:

_public class AndroidActivity extends DroidGap {  
  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    try
    {
      super.loadUrl("file:///Android_asset/www/index.html");  
      this.appView.addJavascriptInterface(new JavaScriptInterface(), "EXTERNALLINK"); 
    }
    catch(Exception lException)
    {
      throw new RuntimeException("hello hello", lException);
    }
  }

  class JavaScriptInterface
  {
      public void loadExternalLink(String lUrl)
      {          
        try
        {
          loadUrl(lUrl);
        }
        catch(Exception Lex)
        {
          int i = 0;
        }
      }
  }
}
_

JAVASCRIPT呼び出しの例:

window.EXTERNALLINK.loadExternalLink("http://www.google.com");

2
mayo

Androidでは、外部リンクを作成して、Webview内で開くことができます

super.setBooleanProperty("loadInWebView", true);

droidGapアクティビティのsuper.loadUrlの前。

これにより、すべての外部リンクがWebビューで開かれます。 WebViewで特定のドメインのみを開きたい場合は、代わりに addWhiteListEntry を使用します。例:

addWhiteListEntry("mydomain.com", true);
1
Epeli