определить делегата, который не может быть разыменован? - PullRequest
0 голосов
/ 16 октября 2019

Сейчас я внедряю FIRMessaging для получения уведомлений от Firebase Cloud Messaging. Я сделал тест, создав новый проект в консоль Firebase, затем зарегистрировал свой идентификатор пакета, я скачал файл конфигурации и скопировал в свой проект (приложение Single View App), затем я установил необходимые модули. В моем AppDelegate я использую FIRMessaging для получения уведомлений и ядро ​​Firebase для подключения к firebase.

Я мог бы сделать эту работу. Я использую протокол <FIRMessagingDelegate> в своем AppDelegate и реализую методы, которые он определяет:

1.- messaging:didReceiveRegistrationToken:, который получает токен при запуске приложения.

2.- messaging:didReceiveMessage:который получает уведомления от firebase.

Я написал следующий код в моем application:didFinishLaunchingWithOptions

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
[FIRApp configure];
firebaseDelegate * delegateObject = [[firebaseDelegate alloc] init];
FIRMessaging * message = [FIRMessaging messaging];
message.shouldEstablishDirectChannel = YES;
message.autoInitEnabled = YES;
message.delegate = self;
NSLog(@"TOKEN : %@",message.FCMToken);

NSLog(@"Firebase initialization completed");
return YES;

}

Вот мой firebaseDelegate.h

#import <Foundation/Foundation.h>
#import <FirebaseMessaging/FIRMessaging.h>
@interface firebaseDelegate : NSObject <FIRMessagingDelegate> 
@end

Вот моя реализация

#import "firebaseDelegate.h"
@implementation firebaseDelegate 

- (void)messaging:(FIRMessaging *)messaging didReceiveRegistrationToken:(NSString *)fcmToken
{
    NSUserDefaults * userDefaults = [NSUserDefaults standardUserDefaults];
    [userDefaults setObject:fcmToken forKey:@"token"];
}

-(void)messaging:(FIRMessaging *)messaging didReceiveMessage:(FIRMessagingRemoteMessage *)remoteMessage
{
    NSLog(@"Message: %@",[remoteMessage appData]);
}
@end

А вот реализация второго метода, который я упоминал ранее (который находится внутри моего AppDelegate):

-(void)messaging:(FIRMessaging *)messaging didReceiveMessage:(FIRMessagingRemoteMessage *)remoteMessage{
NSLog(@"Message: %@",[remoteMessage appData]);}

И когда я запускаю уведомление,Я получил его и появился в журнале так: enter image description here

Но когда я пытаюсь определить класс, который соответствует этим двум методам, и изменить делегата (строка message.delegate = self;) дляэкземпляр этого класса, подобный этому:

message.delegate = delegateObject;

Я получаю это в журнале: enter image description here

Похоже, что ссылка на этот объект уничтожается,и при использовании AppDelegate (self) он работает нормально, я провел некоторые исследования и обнаружил, что AppDelegate iвсегда присутствует.

Как я могу создать класс, который может работать как делегат, и на него нет разыменования?

1 Ответ

1 голос
/ 16 октября 2019

Добавьте ваш делегат в AppDelegate, как показано ниже.

@interface AppDelegate : UIResponder <UIApplicationDelegate>{

firebaseDelegate * delegateObject;

}
@end

Тогда это должно сработать.

...