Борьба с этой проблемой в течение пары дней и, наконец, придется сдаться и попросить о помощи.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 должен попросить разрешения.