定义一个不被取消引用的委托?
define a delegate that not get dereferenced?
现在我正在实施 FIRMessaging 以接收来自 Firebase 云消息传递的通知。我通过在 firebase 控制台中创建一个新项目进行了测试,然后注册了我的包 ID,我下载了配置文件并复制到我的项目(单视图应用程序),然后我安装了必要的 pods。在我的 AppDelegate 中,我使用 FIRMessaging 获取通知,使用 Firebase 核心连接到 firebase。
我可以完成这项工作。我在我的 AppDelegate 中使用 <FIRMessagingDelegate>
协议并实现它定义的方法:
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]);}
当我发出通知时,我收到了它并像这样出现在日志中
但是当我尝试定义一个符合这两种方法的 class 并为这个 class 的实例更改委托(第 message.delegate = self;
行)时,如下所示:
message.delegate = delegateObject;
我在日志中得到这个:
该对象的引用似乎被销毁了,当使用 AppDelegate (self) 时它工作正常,我做了一些重新搜索,发现 AppDelegate 始终存在。
我如何创建一个 class 可以作为委托并且不会被取消引用的 class?
将您的代表添加到 AppDelegate
中,如下所示。
@interface AppDelegate : UIResponder <UIApplicationDelegate>{
firebaseDelegate * delegateObject;
}
@end
那一定是工作了
现在我正在实施 FIRMessaging 以接收来自 Firebase 云消息传递的通知。我通过在 firebase 控制台中创建一个新项目进行了测试,然后注册了我的包 ID,我下载了配置文件并复制到我的项目(单视图应用程序),然后我安装了必要的 pods。在我的 AppDelegate 中,我使用 FIRMessaging 获取通知,使用 Firebase 核心连接到 firebase。
我可以完成这项工作。我在我的 AppDelegate 中使用 <FIRMessagingDelegate>
协议并实现它定义的方法:
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]);}
当我发出通知时,我收到了它并像这样出现在日志中
但是当我尝试定义一个符合这两种方法的 class 并为这个 class 的实例更改委托(第 message.delegate = self;
行)时,如下所示:
message.delegate = delegateObject;
我在日志中得到这个:
该对象的引用似乎被销毁了,当使用 AppDelegate (self) 时它工作正常,我做了一些重新搜索,发现 AppDelegate 始终存在。
我如何创建一个 class 可以作为委托并且不会被取消引用的 class?
将您的代表添加到 AppDelegate
中,如下所示。
@interface AppDelegate : UIResponder <UIApplicationDelegate>{
firebaseDelegate * delegateObject;
}
@end
那一定是工作了