2017-02-28 17 views
2

application:didFinishLaunchingWithOptions:UnityAppControllerのコードを追加する必要があります。このコードでは、Objective-C SDKを使用してGoogle AdWordsのコンバージョントラッキングを設定しています。UnityAppControllerのサブクラスを複数持つことができますか?

UnityがXcodeプロジェクトを生成するたびに手動でこのファイルを編集するとエラーが発生する可能性が高いので、生成されたUnityコードにパッチを適用するPostProcessBuild属性を使用してポストビルドステップを追加することを考えています。

しかし、パッチファイルは維持するのが難しいので、私は別の解決策を探しています。 IMPL_APP_CONTROLLER_SUBCLASSマクロを使用してUnityAppControllerをサブクラス化し、application:didFinishLaunchingWithOptions:をオーバーライドしているようです。

私はこれを行った後、同じメソッドを使用してUnityAppControllerというサブクラスを持つ別のサードパーティプラグイン(Google Playゲーム)が、そのアプリケーションコントローラが呼び出されなくなったために機能しなくなりました。ここではそのプラグインからのコードの関連部分は次のとおりです。

@interface GPGSAppController : UnityAppController { 
} 

@end 

IMPL_APP_CONTROLLER_SUBCLASS(GPGSAppController) 

それが複数の場所からユニティアプリのコントローラをサブクラス化することが可能ですのであれば、私は思っていました。オンラインでIMPL_APP_CONTROLLER_SUBCLASSのドキュメントを見つけることができませんでした。

iOS上のUnityでカスタム初期化コードを追加する方がよいでしょうか?

答えて

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

10億に感謝! – seejaneworkit

関連する問題