Unity + Xcode iOS Build - отсутствуют символы для - PullRequest
0 голосов
/ 26 февраля 2019

Борьба с этой проблемой в течение пары дней и, наконец, придется сдаться и попросить о помощи.Im Building Unity Game, которая экспортируется в Xcode.Вместо прямого экспорта с использованием Objective C игра превращается в проект Swift 4.0. Проверьте здесь для получения дополнительной информации о том, как это делается .Я создал несколько приложений таким образом, и пока не сталкивался с этой проблемой, но ни у одного из предыдущих приложений не было push-уведомлений.

Несколько вещей, о которых стоит упомянуть:

  • Игра работает при прямом экспорте из Unity в Xcode.
  • Приложение не собирается с ошибкой, указанной ниже.
  • Приложение аварийно завершает работу, когда оно должно запрашивать разрешение на уведомление. (Когда код закомментирован, см. Ниже)

Так что мне удалось точно определить, где начинается ошибка и как она связана с этим классом LocalNotificationAppController.h

#import <UIKit/UIKit.h>
#import <Foundation/NSURLConnection.h>
#import <Foundation/NSURL.h>

#import "UnityAppController.h"

extern bool _unityAppReady;

@interface LocalNotificationAppController : UnityAppController
{}
- (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forLocalNotification:(UILocalNotification *)notification completionHandler:(void (^)())completionHandler;
@end

@implementation LocalNotificationAppController
- (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forLocalNotification:(UILocalNotification *)notification completionHandler:(void (^)())completionHandler
{
    [self notifyUnityOfAction:identifier inNotification:notification completionHandler:completionHandler];
}


- (void)notifyUnityOfAction:(NSString*)identifier inNotification:(UILocalNotification*)notification completionHandler:(void (^)())completionHandler
{
    if (_unityAppReady)
    {
        NSArray *parts = [identifier componentsSeparatedByString:@":"];
        if (parts.count == 3) {
            NSString *gameObject = parts[0];
            NSString *handlerMethod = parts[1];
            NSString *action = parts[2];
            UnitySendMessage(strdup([gameObject UTF8String]), strdup([handlerMethod UTF8String]), strdup([action UTF8String]));
            UnityBatchPlayerLoop();
        }

        if (completionHandler != nil)
            completionHandler();
    }
    else
    {
        NSNotificationCenter * __weak center = [NSNotificationCenter defaultCenter];
        id __block token = [center addObserverForName:@"UnityReady" object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) {
            _unityAppReady = true;
            [center removeObserver:token];
            [self notifyUnityOfAction:identifier inNotification:notification completionHandler:completionHandler];
        }];
    }
}
@end

//IMPL_APP_CONTROLLER_SUBCLASS(LocalNotificationAppController)

, который ссылается на

#define IMPL_APP_CONTROLLER_SUBCLASS(ClassName) \
@interface ClassName(OverrideAppDelegate)       \
{                                               \
}                                               \
+(void)load;                                    \
@end                                            \
@implementation ClassName(OverrideAppDelegate)  \
+(void)load                                     \
{                                               \
    extern const char* AppControllerClassName;  \
    AppControllerClassName = #ClassName;        \
}                                               \
@end 

внутри UnityAppController.h

, поэтому сборка завершается с ошибкой:

Неопределенные символы для архитектуры arm64: "_AppControllerClassName", на которую ссылается из: + [LocalNotificationAppController (OverrideAppDelegate) load] в LocalNotificationAppController.o ld: символ (ы) не найден для архитектуры arm64

и если закомментировать этострока в LocalNotificationAppController:

//IMPL_APP_CONTROLLER_SUBCLASS(LocalNotificationAppController)

Сборка работает, но есть исключение потока, происходящее именно там, гдеpp должен попросить разрешения.

...