gpt4 book ai didi

ios - 你能拥有多个 UnityAppController 的子类吗?

转载 作者:可可西里 更新时间:2023-11-01 06:02:02 28 4
gpt4 key购买 nike

我需要向 UnityAppController 中的 application:didFinishLaunchingWithOptions: 添加一些代码,使用他们的 Objective-C SDK 配置 Google AdWords 转化跟踪。

每次 Unity 生成 Xcode 项目时手动编辑此文件似乎很容易出错,因此我正在考虑使用 PostProcessBuild 属性添加一个构建后步骤,为生成的 Unity 代码应用补丁。

但是,补丁文件很难维护,所以我正在寻找替代解决方案。似乎通过 IMPL_APP_CONTROLLER_SUBCLASS 宏子类化 UnityAppController 并覆盖 application:didFinishLaunchingWithOptions: 可能是其中之一。

但在我执行此操作后,另一个第三方插件 (Google Play Games) 也使用相同的方法子类 UnityAppController 停止工作,因为它的应用程序 Controller 不再被调用。这是该插件的一段相关代码:

@interface GPGSAppController : UnityAppController {
}

@end

IMPL_APP_CONTROLLER_SUBCLASS(GPGSAppController)

所以我想知道是否可以从多个地方子类化 Unity 应用程序 Controller 。我在网上找不到 IMPL_APP_CONTROLLER_SUBCLASS 的任何文档。

或者也许有更好的方法在 iOS 上的 Unity 中添加自定义初始化代码?

最佳答案

我最终调配了 UnityAppController 方法并在我的实现中进行了初始化。

如果有人感兴趣,这是我的解决方案:

#import <objc/runtime.h>

...

#import "UnityAppController.h"

namespace {

typedef BOOL (*ApplicationDidFinishLaunchingWithOptionsImp)(UnityAppController *appController,
SEL selector,
UIApplication *application,
NSDictionary *launchOptions);

ApplicationDidFinishLaunchingWithOptionsImp OriginalApplicationDidFinishLaunchingWithOptions;

BOOL ApplicationDidFinishLaunchingWithOptions(UnityAppController *appController,
SEL selector,
UIApplication *application,
NSDictionary *launchOptions) {
// Initialize Google Play Games, etc
return OriginalApplicationDidFinishLaunchingWithOptions(appController, selector, application, launchOptions);
}

IMP SwizzleMethod(SEL selector, Class klass, IMP newImp) {
Method method = class_getInstanceMethod(klass, selector);
if (method != nil) {
return class_replaceMethod(klass, selector, newImp, method_getTypeEncoding(method));
}
return nil;
}

} // anonymous namespace

@interface AppController : UnityAppController

@end

@implementation AppController

+ (void)load {
OriginalApplicationDidFinishLaunchingWithOptions = (ApplicationDidFinishLaunchingWithOptionsImp)
SwizzleMethod(@selector(application:didFinishLaunchingWithOptions:),
[UnityAppController class],
(IMP)&ApplicationDidFinishLaunchingWithOptions);
}


@end

只需将此文件保存为 AppController.mm 并将其添加到您的 Assets 文件夹中。 Unity 会将其识别为 Objective-C++ 源文件,并自动将其包含在生成的 Xcode 项目中。

如果您需要包含框架或以其他方式修改您的 Xcode 项目,请查看 PostProcessBuildAttributeXcode API .

关于ios - 你能拥有多个 UnityAppController 的子类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42508476/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com