Сейчас я внедряю 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]);}
И когда я запускаю уведомление,Я получил его и появился в журнале так:
Но когда я пытаюсь определить класс, который соответствует этим двум методам, и изменить делегата (строка message.delegate = self;
) дляэкземпляр этого класса, подобный этому:
message.delegate = delegateObject;
Я получаю это в журнале:
Похоже, что ссылка на этот объект уничтожается,и при использовании AppDelegate (self) он работает нормально, я провел некоторые исследования и обнаружил, что AppDelegate iвсегда присутствует.
Как я могу создать класс, который может работать как делегат, и на него нет разыменования?