简体   繁体   English

不推荐使用 XCodeGLKit 的警告考虑迁移到 Metal 而不是 Apple email 不推荐使用 API 使用,使用 WKWebView 而不是 UIWebView

[英]Warning on XCodeGLKit deprecated consider migrating to Metal instead and Apple email Deprecated API Usage, use WKWebView instead of UIWebView

I've completed my game using Buildbox 2.3.3 and have cleaned up as many warnings as possible on Xcode.我已经使用 Buildbox 2.3.3 完成了我的游戏,并尽可能多地清理了 Xcode 上的警告。 However, I've been at this for weeks now on me migrating from OpenGL to Metal which I assume is the reason I have that error in Xcode saying GLKit is deprecated, consider migrating to metal instead.但是,我已经在这几个星期了,因为我从 OpenGL 迁移到 Metal,我认为这是我在 Xcode 中出现错误说 GLKit 已弃用的原因,请考虑迁移到金属。

I attempted to upload the game to App store connect without me solving this error but then I instantly got sent an email saying我试图在没有解决此错误的情况下将游戏上传到 App Store 连接,但随后我立即收到一条 email 说

ITMS-90809: Deprecated API Usage, New apps no longer use UIWebView, use WKWebView instead. ITMS-90809:已弃用 API 用法,新应用不再使用 UIWebView,改用 WKWebView。

I have no clue how to go about converting my code to cater for this I would really appreciate some guidance or if anyone can rewrite my code for me converting the OpenGL to metal.我不知道如何 go 关于转换我的代码以满足这一点我真的很感激一些指导,或者如果有人可以为我重写我的代码,将 OpenGL 转换为金属。

I'll attach the code I'm using below, I would really appreciate it if anyone can help me.我将在下面附上我正在使用的代码,如果有人可以帮助我,我将不胜感激。 I've been stuck at this final stage for weeks now, its very frustrating.我已经被困在这个最后阶段好几个星期了,这非常令人沮丧。

AppDelegate.h AppDelegate.h

#import <UIKit/UIKit.h>

@interface AppDelegate : UIResponder <UIApplicationDelegate>{
}

@property (strong, nonatomic) UIWindow *window;


@end

AppDelegate.mm AppDelegate.mm

#import "AppDelegate.h"
#import <GLKit/GLKit.h>
#include "PTPSettingsController.h"
#include "libs/cocos2dx/include/audio/include/SimpleAudioEngine.h"

@interface AppDelegate ()

@end

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    return YES;
}


- (void)applicationWillResignActive:(UIApplication *)application {
    cocos2d::CCDirector::sharedDirector()->pause();
}

- (void)applicationDidEnterBackground:(UIApplication *)application {
    cocos2d::CCApplication::sharedApplication()->applicationDidEnterBackground();
}

- (void)applicationWillEnterForeground:(UIApplication *)application {
    cocos2d::CCApplication::sharedApplication()->applicationWillEnterForeground();
}

- (void)applicationDidBecomeActive:(UIApplication *)application {
    cocos2d::CCDirector::sharedDirector()->resume();
}

- (void)applicationWillTerminate:(UIApplication *)application {
}

- (void)loadingDidComplete{
}

-(void)showCustomFullscreenAd{
}

- (void)screenOnEnter:(const char*) name{
}

- (void)screenOnExit:(const char*) name{
}

@end

GameViewController.h游戏视图控制器.h

#import <UIKit/UIKit.h>
#import <GLKit/GLKit.h>

@interface GameViewController : GLKViewController

@end

GameViewController.mm游戏视图控制器.mm

#import "GameViewController.h"
#import <OpenGLES/ES2/glext.h>
#import "PTModelController.h"
#import "PTModelGeneralSettings.h"
#import "PTPAppDelegate.h"
#import "cocos2d.h"
#import "PTPConfig.h"
#include "PTPSettingsController.h"


#define IOS_MAX_TOUCHES_COUNT     10

static PTPAppDelegate s_sharedApplication;

@interface GameViewController () {
    NSString* shareMessage;
    bool sheduledForShareWidget;
}
@property (strong, nonatomic) EAGLContext *context;

@end

@implementation GameViewController

- (void)viewDidLoad{
    [super viewDidLoad];

    sheduledForShareWidget = false;
    self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];

    if (!self.context) {
        NSLog(@"Failed to create ES context");
    }

    GLKView *view = (GLKView *)self.view;
    view.context = self.context;
    view.drawableDepthFormat = GLKViewDrawableDepthFormat24;
    [view setMultipleTouchEnabled: YES];

    [self setPreferredFramesPerSecond:60];
    [EAGLContext setCurrentContext:self.context];

    PTModelController *mc = PTModelController::shared();
    mc->clean();

    unsigned long size = 0;
    char* pBuffer = (char*)CCFileUtils::sharedFileUtils()->getFileData("data/data.pkg", "rb", &size);
    if (pBuffer != NULL && size > 0){
        mc->setUsingDataEncryption( true );
    }

    mc->loadDataForSplashScreen("data/data.pkg", processor().c_str());

    s_sharedApplication.setDataArchiveProcessor(processor());


    cocos2d::CCApplication::sharedApplication()->run();
}

- (void)dealloc{
    if ([EAGLContext currentContext] == self.context) {
        [EAGLContext setCurrentContext:nil];
    }
}

- (void)didReceiveMemoryWarning{
    [super didReceiveMemoryWarning];

    if ([self isViewLoaded] && ([[self view] window] == nil)) {
        self.view = nil;

        if ([EAGLContext currentContext] == self.context) {
            [EAGLContext setCurrentContext:nil];
        }
        self.context = nil;
    }

    // Dispose of any resources that can be recreated.
}

- (BOOL)prefersStatusBarHidden {
    return YES;
}

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect{
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    cocos2d::CCDirector::sharedDirector()->setViewport();
    cocos2d::CCDirector::sharedDirector()->mainLoop();
}


- (void)update{
    if(sheduledForShareWidget == true){
        sheduledForShareWidget = false;

        GLKView *view  = (GLKView *)self.view;
        UIImage* screenshot = view.snapshot;

        PTLog("Opens Share Widget: screenshot was taken");

        UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:@[shareMessage, screenshot] applicationActivities:nil];

        NSArray *excludeActivities = @[UIActivityTypeSaveToCameraRoll,
                                       UIActivityTypeAssignToContact];
        activityVC.excludedActivityTypes = excludeActivities;


        float iOSVersion = [[UIDevice currentDevice].systemVersion floatValue];
        if(iOSVersion > 8.0){
            activityVC.popoverPresentationController.sourceView = self.view;
        }

        [self presentViewController:activityVC animated:YES completion:nil];
        PTLog("opens Share Widget: view controller presented");
    }
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event{
    int ids[IOS_MAX_TOUCHES_COUNT] = {0};
    float xs[IOS_MAX_TOUCHES_COUNT] = {0.0f};
    float ys[IOS_MAX_TOUCHES_COUNT] = {0.0f};

    int i = 0;
    for (UITouch *touch in touches) {
        ids[i] = (intptr_t)touch;
        xs[i] = [touch locationInView: [touch view]].x * self.view.contentScaleFactor;
        ys[i] = [touch locationInView: [touch view]].y * self.view.contentScaleFactor;
        ++i;
    }
    cocos2d::CCEGLView::sharedOpenGLView()->handleTouchesBegin(i, ids, xs, ys);
}

- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event{
    int ids[IOS_MAX_TOUCHES_COUNT] = {0};
    float xs[IOS_MAX_TOUCHES_COUNT] = {0.0f};
    float ys[IOS_MAX_TOUCHES_COUNT] = {0.0f};

    int i = 0;
    for (UITouch *touch in touches) {
        ids[i] = (intptr_t)touch;
        xs[i] = [touch locationInView: [touch view]].x * self.view.contentScaleFactor;;
        ys[i] = [touch locationInView: [touch view]].y * self.view.contentScaleFactor;;
        ++i;
    }
    cocos2d::CCEGLView::sharedOpenGLView()->handleTouchesMove(i, ids, xs, ys);
}

- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event{
    int ids[IOS_MAX_TOUCHES_COUNT] = {0};
    float xs[IOS_MAX_TOUCHES_COUNT] = {0.0f};
    float ys[IOS_MAX_TOUCHES_COUNT] = {0.0f};

    int i = 0;
    for (UITouch *touch in touches) {
        ids[i] = (intptr_t)touch;
        xs[i] = [touch locationInView: [touch view]].x * self.view.contentScaleFactor;;
        ys[i] = [touch locationInView: [touch view]].y * self.view.contentScaleFactor;;
        ++i;
    }
    cocos2d::CCEGLView::sharedOpenGLView()->handleTouchesEnd(i, ids, xs, ys);
}

- (void)touchesCancelled:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event{
    int ids[IOS_MAX_TOUCHES_COUNT] = {0};
    float xs[IOS_MAX_TOUCHES_COUNT] = {0.0f};
    float ys[IOS_MAX_TOUCHES_COUNT] = {0.0f};

    int i = 0;
    for (UITouch *touch in touches) {
        ids[i] = (intptr_t)touch;
        xs[i] = [touch locationInView: [touch view]].x * self.view.contentScaleFactor;;
        ys[i] = [touch locationInView: [touch view]].y * self.view.contentScaleFactor;;
        ++i;
    }
    cocos2d::CCEGLView::sharedOpenGLView()->handleTouchesCancel(i, ids, xs, ys);
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    PTModelGeneralSettingsPtr generalSettings = PTModelGeneralSettings::shared();
    if(generalSettings->orientation() == PTModelGeneralSettings::LandscapeOrientation){
        return UIInterfaceOrientationIsLandscape( interfaceOrientation );
    }
    else if(generalSettings->orientation() == PTModelGeneralSettings::PortraitOrientation){
        return UIInterfaceOrientationIsPortrait( interfaceOrientation );
    }

    return NO;
}

- (NSUInteger) supportedInterfaceOrientations{
    PTModelGeneralSettingsPtr generalSettings = PTModelGeneralSettings::shared();
    if(generalSettings->orientation() == PTModelGeneralSettings::LandscapeOrientation){
        return UIInterfaceOrientationMaskLandscape;

    }
    else if(generalSettings->orientation() == PTModelGeneralSettings::PortraitOrientation){
        return UIInterfaceOrientationMaskPortrait;
    }

    return NO;
}

- (BOOL) shouldAutorotate {
    return NO;
}

-(void) scheduleOpenShareWidget:(const char*) message{
    shareMessage = [NSString stringWithUTF8String:message];
    sheduledForShareWidget = true;
}

@end

As you've already been told, your question is a little unsuitable for Stack Overflow.正如您已经被告知的那样,您的问题有点不适合 Stack Overflow。 You can start rewriting your project from OpenGL to Metal , and ask questions if anything goes wrong.您可以开始将您的项目从OpenGL重写为Metal ,并在出现任何问题时提出问题。

Apple documentation is a good starting point: Apple 文档是一个很好的起点:

You could also watch WWDC 2019 video and learn a step-by-step approach for transitioning OpenGL-based apps to the Metal API.您还可以观看WWDC 2019 视频并了解将基于 OpenGL 的应用程序转换为 Metal API 的分步方法。

OpenGL is portable and widely supported, so it's a pity not to be able to use it. OpenGL 便携,支持广泛,所以不能用很可惜。 Luckily the MetalANGLE framework is an almost perfect drop-in replacement for GLKit.幸运的是, MetalANGLE框架几乎是 GLKit 的完美替代品。 I have started using it in the development branch of my map rendering library, CartoType , and it works correctly: I can't see any difference in the graphics compared to GLKit, and I had to make only one minor change to my code to get it working - and that change was probably caused by an incorrect use of GLKit.我已经开始在我的 map 渲染库CartoType的开发分支中使用它,并且它工作正常:与 GLKit 相比,我看不到图形有任何区别,我只需要对我的代码做一点小改动就可以得到它起作用了——这种变化可能是由于对 GLKit 的不正确使用造成的。

So my advice is: stay with OpenGL and use MetalANGLE.所以我的建议是:继续使用 OpenGL 并使用 MetalANGLE。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何解决错误 OpenGLES 已弃用。 考虑改用 Metal - How to Solve the Error OpenGLES is deprecated. Consider migrating to Metal instead ITMS-90809:已弃用的 API 用法 - 不再接受使用 UIWebView 的新应用程序。 相反,在我的统一游戏中使用 WKWebView - ITMS-90809: Deprecated API Usage - New apps that use UIWebView are no longer accepted. Instead, use WKWebView on my unity game ITMS-90809:不推荐使用的 API 使用——Apple 将停止接受使用 UIWebView API 的应用程序的提交 - ITMS-90809: Deprecated API Usage -- Apple will stop accepting submissions of apps that use UIWebView APIs Cordova ITMS-90809:已弃用 API 用法 - 不再接受使用 UIWebView 的新应用 - Cordova ITMS-90809: Deprecated API Usage - New apps that use UIWebView are no longer accepted .dynamicType已弃用。请改用'type(of ...)' - .dynamicType is deprecated. Use 'type(of …)' instead 不推荐使用UITextalignment:您应改为在NSAttributedString上使用setTextAlignment:lineBreakMode: - UITextalignment is deprecated : You should use setTextAlignment:lineBreakMode:on your NSAttributedString instead 如何解决 Flurry iOS SDK 问题与已弃用的 API 使用 ZB99A6ADB30DD8ED2959260 - How do I solve Flurry iOS SDK issue with Deprecated API usage of UIWebView? 不推荐使用logInWithReadPermissions(_:handler :)&#39;:使用logInWithReadPermissions:fromViewController:handler:代替 - logInWithReadPermissions(_:handler:)' is deprecated: use logInWithReadPermissions:fromViewController:handler: instead 'statusBarStyle' 在 iOS 13.0 中已弃用:改用 window 场景的 statusBarManager 属性 - 'statusBarStyle' was deprecated in iOS 13.0: Use the statusBarManager property of the window scene instead withUnsafeMutableBytes&#39; 已弃用 xcode 警告 - withUnsafeMutableBytes' is deprecated xcode warning
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM