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项目使用它?非常感谢!