2016-05-18 1 views
1

Je suis en train d'apprendre et d'essayer de développer des applications dans cocos2d-x. Comment implémenter un callback à partir de WebView? J'ai utilisé le cocos2d-x v3.10.Le rappel ne peut pas être obtenu à partir du Webview dans cocos2d-x (v3.10)

test_index.html

<head> 
    <meta charset="utf-8"> 
    <meta name="apple-mobile-web-app-capable" content="yes"> 
    <meta name="format-detection" content="telephone=no"> 
    <meta name="robots" content="none" /> 
    <meta name="viewport" content="width=device-width,height=device-height"> 
</head> 

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script> 
    <script src="js/sp.js"></script> 
    <ul class="slideshow"> 
     <li> 
     <a href="#" onclick='sp.call("test1")'> 
     <img src="img/test1.jpg" width="100%"/> 
     </li> 
    </ul> 
    <style> 
     .bx-default-pager { 
      display: none; 
     } 
     .bx-viewport { 
      border: none !important; 
     } 
    </style> 
</body> 

sp.js

(function(){ 
    var sp = {}; 
    var isAndroid = navigator.userAgent.match(/Android/); 
    var isIOs = navigator.userAgent.match(/iPhone/) || navigator.userAgent.match(/iPod/) || navigator.userAgent.match(/iPad/); 
    sp.call = function(text){ 
     if(isAndroid){ 
      window.Cocos2dx.call(text); 
     } else if (isIOs) { 
      window.location.href = "cocos2dx:" + text; 
     } else { 
      window.location.href = text; 
     } 
    }; 
    window.sp = sp; 
})(); 

TEST.CPP

bool TestScene::init() 
{ 
     auto webView = cocos2d::experimental::ui::WebView::create(); 
     webView->loadURL("http://test/test_index.html"); 
     webview->setONJSCallback(CC_CALLBACK_1(TestScene::callbackFromJS,this)); 
     webView->setAnchorPoint(Point(0,0)); 
     webView->setPosition(Point(0,150)); 
     webView->setContentSize(Size(WINSIZE.width,WINSIZE.height-150)); 
     this->addChild(webView,1); 

} 

void TestScene::callbackFromJS(cocos2d::experimental::ui::WebView* webview, std::string* url) 
{ 
    log("call this method"); 
} 

utilisation erronée de la "setOnJSCallback"?

+0

La configuration de votre projet permet-elle d'autoriser des chargements arbitraires à partir de sites non https? – Striker

+0

Non, Mon projet peut également accéder au https. – PluSmiles

Répondre

0

Vous ne pouvez donc accéder qu'à "https" mais pas à "http"? C'est à cause des nouvelles restrictions de l'IOS 9. Vous devez ajouter ce qui suit à votre plist afin de pouvoir accéder à http

<key>NSAppTransportSecurity</key> 
<dict> 
     <!--Include to allow all connection --> 
    <key>NSAllowsArbitraryLoads</key> 
    <true/> 
</dict> 
+0

Merci, mais il est déjà autorisé "NSAllows Arbitrary Loads". Le site Web peut être en cours de chargement. Mais je ne peux pas obtenir un rappel en appuyant sur le bouton Web. – PluSmiles

1

Le JSCallback fonctionne comme ceci.

Il vérifie chaque fois qu'une URL est chargée, si elle contient le nom JavascriptInterfaceScheme s'il est défini pour le webview. Si c'est le cas, il ne charge pas cette URL à la place, appelle la fonction JSCallBack. Sinon, il chargera normalement l'URL. Dans le cas @Plusmiles, vous n'avez défini aucun nom JavascriptInterfaceScheme.

Voici le code qui a fonctionné pour moi

cocos2d::experimental::ui::WebView * Practice::_webView; 
_webView = experimental::ui::WebView::create(); 
_webView->setContentSize(Size(1200, 1200)); 
_webView->setPosition(Vec2(900,768)); 
_webView->setJavascriptInterfaceScheme("cocos2dx"); 
_webView->loadURL("https://example.com"); 
_webView->setOnJSCallback(&Practice::callbackFromJS); 
this->addChild(_webView, 1); 


void Practice::callbackFromJS(cocos2d::experimental::ui::WebView* webview, const std::string &answer) { 
    std::string response = answer; 
} 

d'appeler depuis un fichier HTML, vous devez définir

window.location.href = "cocos2dx:" + text; 

où cocos2dx est le nom JavascriptInterfaceScheme situé dans le WebView. Chaque fois qu'il trouve ce nom dans l'url, il appellera la fonction avec l'objet webview en tant que premier paramètre et l'URL en second. Vous devez donc éviter cette page Web dans l'url si vous voulez charger l'URL plutôt que d'appeler la fonction JSCallback.

J'espère que cette réponse vous aidera.