目前,我正在实施FIRMessaging,以接收来自Firebase Cloud Messaging的通知。我通过在Firebase控制台中创建一个新项目进行了测试,然后注册了我的捆绑软件ID,下载了配置文件并复制到了我的项目(单视图应用程序)中,然后安装了必要的Pod。在我的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]);}
但是当我尝试定义一个符合这两个方法的类并更改此类的实例的委托(行message.delegate = self;
)时,如下所示:
message.delegate = delegateObject;
看来该对象的引用被破坏了,当使用AppDelegate(自身)时,它工作正常,我进行了一些重新搜索,发现AppDelegate始终存在。
我如何创建一个可以充当委托且不会被取消引用的类?
如下所示将您的代表添加到AppDelegate
中。
@interface AppDelegate : UIResponder <UIApplicationDelegate>{
firebaseDelegate * delegateObject;
}
@end
然后必须运行。