无法显示推送通知中的Sinch消息

时间:2014-08-11 17:04:59

标签: ios objective-c instant-messaging sinch

在坚果壳中,我有三种观看:Main ViewList 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);
}

在主视图中,处理ReceivedRemoteNotificationSetUnreadIcon

-(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:

工作场景

假设用户AliceBob发送消息。 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吗?

谢谢,

1 个答案:

答案 0 :(得分:3)

关于您的第一个问题,无法以您正在描述的方式查询特定邮件。

您的&#34; Not Working&#34; -case的问题很可能是在Sinch SDK获取即时消息并且即将通知消息客户端委托时,您的Chat View还没有被实例化/指定为代表,因此消息被错过&#34;代表。

我建议您让非ViewController组件实现SINMessageClientDelegate,并使该组件具有独立于视图控制器的生命周期。即在应用程序启动时创建充当委托的组件,并使其保持活动状态。然后,您可以确保始终接收所有onIncomingMessage:,并且还可以放置逻辑以在那里保留消息。