在坚果壳中,我有三种观看:Main View
,List View
(显示好友列表)和Chat View
(您聊天的地方)。
在此应用中正确设置了推送通知,因此我在接收推送通知有效负载方面没有任何问题,我的问题在于为什么在特定情况下收到的消息似乎丢失并且未显示在Chat View
中
我有一个奇怪的问题,所以请继续阅读整个说明:
所以我在这里放了一些代码来说明我如何处理推送通知:
在AppDelegate.m中
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
// Extract the Sinch-specific payload from the Apple Remote Push Notification
NSString* payload = [userInfo objectForKey:@"SIN"];
[self initSinchClientWithUserId:userid];
// Get previously initiated Sinch client
id<SINNotificationResult> result = [_client relayRemotePushNotificationPayload:payload];
if ([result isMessage]) {
// Present alert notifying
NSString *messageId = [[result messageResult] messageId];
NSLog(@"Received messageid: %@", messageId);
if([UIApplication sharedApplication].applicationState == UIApplicationStateBackground ||
[UIApplication sharedApplication].applicationState == UIApplicationStateInactive) {
self.messageSenderId = [[result messageResult] senderId];
[[NSNotificationCenter defaultCenter] postNotificationName:@"ReceivedRemoteNotification" object:self userInfo:nil];
NSLog(@"handle remote notification in modal");
} else {
self.messageSenderId = [[result messageResult] senderId];
// this will launch a modal of private chat, so better to invoke this when running in background
[[NSNotificationCenter defaultCenter] postNotificationName:@"SetUnreadIcon" object:self userInfo:nil];
NSLog(@"handle remote notification by marking icons");
}
} else if (![result isValid]) {
// Handle error
}
NSLog(@"Received Payload: %@", payload);
}
在主视图中,处理ReceivedRemoteNotification
和SetUnreadIcon
-(void) viewDidLoad {
[super viewDidLoad];
....
// setup a local notification handler
NSNotificationCenter *notifCentre = [NSNotificationCenter defaultCenter];
[notifCentre addObserver:self selector:@selector(invokeRemoteNotifications:) name:@"ReceivedRemoteNotification" object:nil];
[notifCentre addObserver:self selector:@selector(setUnreadIcon:) name:@"SetUnreadIcon" object:nil];
....
}
- (void)invokeRemoteNotifications: (NSNotification *) notification {
shouldDismiss = NO;
[self invokeNotifications];
}
- (void)invokeNotifications {
[self performSegueWithIdentifier:@"modalToChat" sender:self];
}
- (void)setUnreadIcon: (NSNotification *) notification {
AudioServicesPlaySystemSound (1300);
shouldDismiss = YES;
[self.rightbutton setCustomView:notifyButton];
}
当用户在MainView中点按rightbutton
时,会调出ListView
。
在ChatView中,它实现了SINMessageClientDelegate
委托方法(See Documentation),即
– messageClient:didReceiveIncomingMessage:
– messageSent:recipientId:
– messageDelivered:
– messageFailed:info:
– message:shouldSendPushNotifications:
假设用户Alice
向Bob
发送消息。 Bob
通过推送通知收到此消息。因此,Bob
会打开并点按通知,应用会显示并自动显示ChatView
的模态视图。
在这种情况下,推送通知中的消息可以显示在Chat View
假设用户Alice
再次向Bob
发送消息,此时Bob
在应用处于前台时收到通知。所以这个方法将被执行:
- (void)setUnreadIcon: (NSNotification *) notification {
AudioServicesPlaySystemSound (1300);
shouldDismiss = YES;
[self.rightbutton setCustomView:notifyButton];
}
然后Bob
会点按rightbutton
来调出ListView
,找到Alice并打开对话。 Bob
会发现Alice
刚刚收到的消息未显示在ChatView
在Sinch SDK中,即使在接收推送通知时检索到messageId
,也似乎没有手动检索消息的方法。我是对的吗?
在“不工作”的情况下,为什么邮件会丢失?如果sinch客户端负责转发消息,有什么理由让它丢弃消息?
仍在“不工作”的情况下,如何保留邮件,然后再显示它?我必须在其他地方实施SINMessageClientDelegate
吗?
谢谢,
答案 0 :(得分:3)
关于您的第一个问题,无法以您正在描述的方式查询特定邮件。
您的&#34; Not Working&#34; -case的问题很可能是在Sinch SDK获取即时消息并且即将通知消息客户端委托时,您的Chat View
还没有被实例化/指定为代表,因此消息被错过&#34;代表。
我建议您让非ViewController组件实现SINMessageClientDelegate
,并使该组件具有独立于视图控制器的生命周期。即在应用程序启动时创建充当委托的组件,并使其保持活动状态。然后,您可以确保始终接收所有onIncomingMessage:
,并且还可以放置逻辑以在那里保留消息。