2016年11月30日水曜日

cocos2d-x ios の UIWebView を WKWebViewに変更する。

ios10 にアップデートしたあたりから、UIWebViewの挙動がどうもおかしい。
不意に落ちたり、ほかのアニメーション実行中に落ちたりするような
よくわからないエラーが多数発生するようになった。


UIWebViewをどんだけいじってもらちがあかなさそうだったのでWKWebViewに思い切って変えてやろうと思った。
変更箇所は比較的少なくてすぐに変更はできた。 ライブラリーに WebKitを追加して
#
# cocos2d-x-3.13.1
#
# cocos2d-x/cocos/ui/UIWebViewImpl-ios.mm


#include "ui/UIWebViewImpl-ios.h"
#include "renderer/CCRenderer.h"
#include "base/CCDirector.h"
#include "platform/CCGLView.h"
#include "platform/ios/CCEAGLView-ios.h"
#include "platform/CCFileUtils.h"
#include "ui/UIWebView.h"

#import   // 追記


// 100行目あたり
@interface UIWebViewWrapper ()  //変更
@property(nonatomic, retain) WKWebView *uiWebView; //  変更


// 120行目あたり
- (void)dealloc {
    self.uiWebView.navigationDelegate = nil;   // 変更
    self.uiWebView.UIDelegate = nil;           // 変更 
    [self.uiWebView removeFromSuperview];
    self.uiWebView = nil;
    self.jsScheme = nil;
    [super dealloc];
}

- (void)setupWebView {
    if (!self.uiWebView) {
        self.uiWebView = [[[WKWebView alloc] init] autorelease]; //  変更
        self.uiWebView.navigationDelegate = self; //  変更
        self.uiWebView.UIDelegate = self; //  変更

        [self.uiWebView setOpaque:NO];
        [self.uiWebView setBackgroundColor:[UIColor clearColor]];
        
    }
    if (!self.uiWebView.superview) {
        auto view = cocos2d::Director::getInstance()->getOpenGLView();
        auto eaglview = (CCEAGLView *) view->getEAGLView();
        [eaglview addSubview:self.uiWebView];
    }
}


// 220行目あたり
- (void)evaluateJS:(const std::string &)js {
    if (!self.uiWebView) {[self setupWebView];}
//    [self.uiWebView stringByEvaluatingJavaScriptFromString:@(js.c_str())]; // コメントアウト
    
    // 以下を追記 コールバックは省略
    [self.uiWebView evaluateJavaScript:@(js.c_str()) completionHandler:^(NSString *result, NSError *error){
        NSLog(@"Error %@", error);
        NSLog(@"Result %@", result);
    }];
}

- (void)setScalesPageToFit:(const bool)scalesPageToFit {
    if (!self.uiWebView) {[self setupWebView];}
//    self.uiWebView.scalesPageToFit = scalesPageToFit; // WKWebViewでは使わなさそうなのでとりあえずコメントアウト
}

今はこれで動いているがまぁ問題があればそこでまた考えよう。

0 件のコメント: