2017-02-28 179 views
2

我需要在中添加一些代码到application:didFinishLaunchingWithOptions:,它使用他们的Objective-C SDK配置Google AdWords转换跟踪。你可以有多个UnityAppController的子类吗?

每次Unity生成Xcode项目时手动编辑此文件看起来很容易出错,所以我在考虑使用PostProcessBuild属性添加一个构建后步骤,该属性将为生成的Unity代码应用修补程序。

但是,补丁文件很难保持,所以我正在寻找替代解决方案。看来,通过IMPL_APP_CONTROLLER_SUBCLASS宏和覆盖application:didFinishLaunchingWithOptions:继承UnityAppController,可以有其中之一。

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

@interface GPGSAppController : UnityAppController { 
} 

@end 

IMPL_APP_CONTROLLER_SUBCLASS(GPGSAppController) 

所以我在想,如果有可能继承来自多个地方的统一的应用程序控制器。我找不到IMPL_APP_CONTROLLER_SUBCLASS在线的任何文档。

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

回答

0

我最终调整了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,并把它添加到你的资产的文件夹。 Unity会将其识别为Objective-C++源文件并自动将其包含在生成的Xcode项目中。

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

+0

你能解释一下你在哪里保存这个iOS模块,以及如何让你的Xcode项目使用它? – seejaneworkit

+0

@seejaneworkit我添加了更多信息。 – iosdude

+0

谢谢! – seejaneworkit

相关问题