我已经创建了一个聊天应用程序。我已经使用QuickBlox互相聊天。
我已经注册了两个用户并相互聊天,它将可以完美地工作。
但是,当用户注销并再次登录时,它将崩溃。
错误-对话框必须在内存缓存中!
例如: A 和 B 用户使用他们的设备登录,然后在他们注销并再次登录以及发送消息应用程序崩溃时彼此聊天。
登录
- (void)loginWithQuickBlox:(NSString *)idandPassword {
[QBRequest logInWithUserLogin:idandPassword password:idandPassword successBlock:^(QBResponse *response, QBUUser *user)
{
// NSLog(@"User Id : %ld",(unsigned long)user.ID);
NSString *usrID=[NSString stringWithFormat:@"%ld",(unsigned long)user.ID];
[[NSUserDefaults standardUserDefaults]setObject:usrID forKey:@"LoginQuickbloxID"];
[self loginWithQuickBloxChat:idandPassword];
} errorBlock:^(QBResponse *response)
{
// error handling
NSLog(@"error: %@", response.error);
}];
}
- (void)loginWithQuickBloxChat:(NSString *)idandPassword {
QBUUser *selectedUser = [QBUUser user];
selectedUser.password = idandPassword;
selectedUser.login = idandPassword;
[ServicesManager.instance logInWithUser:selectedUser completion:^(BOOL success, NSString *errorMessage)
{
if (success)
{
[self getRecenetChatUsingInBadgeCount];
NSLog(@"Login in Quickblox");
[[NSUserDefaults standardUserDefaults]setObject:idandPassword forKey:@"QuickbloxIDPass"];
}
else
{
NSLog(@"Error in QuickBlox");
}
}];
}
聊天
与ChatViewController聊天。
注销
1)未订阅的设备 token
NSString *deviceUdid = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
[QBRequest unregisterSubscriptionForUniqueDeviceIdentifier:deviceUdid successBlock:^(QBResponse *response) {
// Unsubscribed successfully
NSLog(@"Unsubscribed successfully");
} errorBlock:^(QBError *error) {
// Handle error
NSLog(@"Unsubscribed ERROR");
}];
2)ServicesManager注销
[ServicesManager.instance logoutWithCompletion:^{
NSLog(@"logoutWithCompletion");
}];
3)注销成功块
[QBRequest logOutWithSuccessBlock:^(QBResponse *response) {
// Successful logout
NSLog(@"Successful logout");
} errorBlock:^(QBResponse *response) {
// Handle error
NSLog(@"Logout ERROR %@",response);
}];
当注销后发送消息并再次登录时,此处崩溃
QMChatService.m
- (void)sendMessage:(QBChatMessage *)message
toDialogID:(NSString *)dialogID
saveToHistory:(BOOL)saveToHistory
saveToStorage:(BOOL)saveToStorage
completion:(QBChatCompletionBlock)completion
{
NSCParameterAssert(dialogID);
QBChatDialog *dialog = [self.dialogsMemoryStorage chatDialogWithID:dialogID];
NSAssert(dialog != nil, @"Dialog have to be in memory cache!");
[self sendMessage:message toDialog:dialog saveToHistory:saveToHistory saveToStorage:saveToStorage completion:completion];
}
最佳答案
答案来晚了,但是也许有人会觉得有用。
为了使对话在内存中,必须使用正确的方法加载对话(某些方法不执行此操作)。
这是我的操作方法(但很抱歉,对不起)
private func sendMessage(message: QBChatMessage) {
if ServicesManager.instance().chatService.dialogsMemoryStorage.chatDialog(withID: self.dialog.id!) != nil {
self.send(message: message)
} else {
loadAndSaveToMemoryDialog(message)
}
}
private func send(message: QBChatMessage) {
ServicesManager.instance().chatService.send(message, toDialogID: self.dialog.id!, saveToHistory: true, saveToStorage: true) { (error in
if error != nil {
QMMessageNotificationManager.showNotification(withTitle: "SA_STR_ERROR", subtitle: error?.localizedDescription, type: .error, handler: nil)
}
}
}
private func loadAndSaveToMemoryDialog(_ message: QBChatMessage) {
ServicesManager.instance().chatService.loadDialog(withID: self.dialog.id!) {
[weak self] _ in
guard let self = self else { return }
self.sendMessage(message: message)
}
}
关于ios - QuickBlox-对话框必须在Objective-C中的内存缓存中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43802973/