Ios UnityAppController可以有多个子类吗?

Ios UnityAppController可以有多个子类吗?,ios,objective-c,unity3d,Ios,Objective C,Unity3d,我需要在UnityAppController中的application:didfishlaunchingwithoptions:中添加一些代码,该代码使用Objective-C SDK配置Google AdWords转换跟踪 每次Unity生成Xcode项目时手动编辑此文件似乎容易出错,因此我考虑使用PostProcessBuild属性添加一个生成后步骤,该属性将为生成的Unity代码应用补丁 然而,补丁文件很难维护,所以我正在寻找替代解决方案。似乎通过IMPL\u APP\u CONTROLL

我需要在
UnityAppController
中的
application:didfishlaunchingwithoptions:
中添加一些代码,该代码使用Objective-C SDK配置Google AdWords转换跟踪

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

然而,补丁文件很难维护,所以我正在寻找替代解决方案。似乎通过
IMPL\u APP\u CONTROLLER\u子类对
UnityAppController
进行子类化,并覆盖
application:didfishlaunchingwithoptions:
可以有一个

但在我这么做之后,另一个第三方插件(Google Play Games)也使用相同的方法将
UnityAppController
子类化,因为不再调用它的应用程序控制器而停止工作。下面是该插件中的一段相关代码:

@interface GPGSAppController : UnityAppController {
}

@end

IMPL_APP_CONTROLLER_SUBCLASS(GPGSAppController)
所以我想知道是否有可能从多个地方对Unity app controller进行子类化。我无法在线找到
IMPL\u APP\u CONTROLLER\u子类的任何文档


或者可能有更好的方法在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
#导入
...
#导入“UnityAppController.h”
名称空间{
类型DEF BOOL(*应用程序IDFinishLaunching with options imp)(UnityAppController*appController,
SEL选择器,
UIApplication*应用程序,
NSDictionary*启动选项);
ApplicationdFinishLaunching with options Imp origina ApplicationdFinishLaunching with options;
BOOL applicationdFinishLaunchwithoptions(UnityAppController*appController,
SEL选择器,
UIApplication*应用程序,
NSDictionary*启动选项){
//初始化谷歌游戏等等
返回原始应用程序IDFinishLaunchingWithOptions(应用程序控制器、选择器、应用程序、启动选项);
}
IMP SwizzleMethod(SEL选择器、类klass、IMP newImp){
方法=class_getInstanceMethod(klass,选择器);
如果(方法!=nil){
返回类_replaceMethod(klass,selector,newImp,method_getTypeEncoding(method));
}
返回零;
}
}//匿名命名空间
@接口AppController:UnityAppController
@结束
@应用控制器的实现
+(空)荷载{
OriginalApplicationIDFinishLaunchingWithOptions=(ApplicationIDFinishLaunchingWithOptions导入)
SwizzleMethod(@selector(应用程序:didFinishLaunchingWithOptions:),
[UnityAppController类],
(IMP)和应用程序IDFinishLaunchingWithOptions);
}
@结束
只需将此文件另存为
AppController.mm
,并将其添加到您的资产文件夹中即可。Unity会将其识别为Objective-C++源文件,并自动将其包含在生成的Xcode项目中


如果您需要包括框架或以其他方式修改您的Xcode项目,请查看和。

您能否解释一下您将此iOS模块保存在何处以及如何让您的Xcode项目使用它?非常感谢!