web-dev-qa-db-ja.com

クロスドメインのExternalInterface "NPObjectのメソッドの呼び出しエラー"

ドメイン間でExternalInterfaceを介してJavascriptとFlash間の通信を有効にしようとしています。 Javascriptは、SWFと同じドメインにある場合にうまく機能します。しかし、あるケースでは、HTMLはドメインAにあり、JavaScriptとフラッシュは両方ともドメインBにあります。私は次のすべてを実行しました。

  • 埋め込みタグには_allowScriptAccess="always"_が含まれています(オブジェクトにはそれがパラメータとして含まれています)
  • SWFファイルのactionsciptにはSecurity.allowDomain("*")があります
  • 私のSWFもSecurity.allowInsecureDomain("*")を呼び出します
  • ドメインAとドメインBの両方に、_/crossdomain.xml_を持つ_allow-access-from domain="*"_ファイルがあります。

SWFはページ上のJavaScriptを呼び出すことができますが、Javascriptを使用してExternalInterfaceによって公開された関数を呼び出すと、

NPObjectのメソッドの呼び出し中にエラーが発生しました! [プラグインの例外:Actionscriptでエラーが発生しました。エラーを見つけるには、try/catchブロックを使用してください。]

これはActionScript 2であるため、_ExternalInterface.marshallExceptions_は使用できません。

19
Josh

これが機能するために必要なのは2つだけです。

1)_allowscriptaccess=always_を使用すると、swfがページにコンテンツを送信できるようになります

2)System.security.allowDomain("yourhtmldomain.com");

AS2ではSystem.security.allowDomain()であることに注意してください。AS3や上記で記述したものとは異なります。

上記の番号2により、domainAのhtmlページがdomainBのswf内のものを呼び出すことができます。

Jsがホストされているドメインはここでは重要ではありません。ブラウザがそれをdomainAに埋め込んでいるため、スクリプトはdomainAで実行されます。

crossdomain.xmlは主に、実行していないリモートファイルをロードするためだけのものなので、必要に応じて削除できます。 (そして、メインドメインに_allow="*"_が含まれるcrossdomain.xmlファイルはおそらく必要ありません。これは非常に悪い習慣です)

20
Geoff

私にとっていくつかの理由は(私はuploadifyを使用しています)でした:

httpサーバーにファイルを宛先に書き込む権限がありませんswfobject(フラッシュ)にクロスドメインアクセスがありません

解決策:htmlのオブジェクトタグにはallowScriptAccess = "always"が必要です。これは、次のようにパラメータを設定することで実行できます。

$('#file_upload').uploadifySettings('scriptAccess', 'always')
than flash object must have:
import flash.system.Security;
Security.allowDomain('remotedomain.com'); 

これは、このパラメーターを使用してソースをコンパイルすることで実行できます。必要に応じて、uploadifyの件名で私に書き込んでください。 Flashがページに含まれているリモートサーバーより、ルートのcrossdamoin.xmlファイルに次のようなコンテンツが含まれている必要があります。

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
1
Vladimir Shmidt

複数のSWFをロードしているため、ロードされているドメインB上の各SWFにセキュリティ設定を含める必要がある場合があります。

また、適切なセキュリティ設定を備えたローダーコンテキストが必要になる場合もあります。

import flash.system.LoaderContext;
import flash.system.ApplicationDomain;
import flash.system.Security;
import flash.system.SecurityDomain;
import flash.net.URLRequest;
import flash.net.URLLoader;

var context:LoaderContext = new LoaderContext(true, ApplicationDomain.currentDomain, (Security.sandboxType == Security.REMOTE) ? SecurityDomain.currentDomain : null);
var l:Loader = new Loader();
l.load(new URLRequest("http://example.com/myswf.swf"), context);
1
Alex Jillard

私の場合、アップローダーdivを含むDOM要素を変更していたためです。

Jquery hide()関数を使用して、アップローダーを含むdivを非表示にしました。それが上記のエラーの原因であることに気付いたとき、divの「float」属性を設定する別のアプローチを試しました。どちらの場合も、アップローダーが壊れました。

FWIW、アップローダーを含むdivの幅/高さを0に設定しても、エラーは発生しないようです。

0
Mark Bench

これと同じ問題(allowDomainなどは問題ありません)がありましたが、フラッシュに不良パラメーターを送信しました-ajax呼び出しからJSONを出力しただけです。そのjsonを ""に入れ、それを(jQuery.parseJSONを介して)javascriptオブジェクトに解析したところ、問題は解決しました。

0
lord_t

Flash Playerバージョン10でAS3を使用すると、ローカルでテストするためにExternalInterface.addCallback()を正しく機能させることができませんでした。私はようやく、「all」の値を持つパラメータ「allowNetworking」を追加することでローカルコピーを機能させました( http://www.Adobe.com/livedocs/flash/9.0/main/wwhelp/wwhimpl/common/ html/wwhelp.htm?context = LiveDocs_Parts&file = 00001079.html )。これで苦労している人に幸運を!

0
Robert Jones II