- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我已经在我的应用程序中实现了 Cometchat SDK,并且我还按照通过 firebase 的所有要求将服务器遗留 key 添加到 Cometchat 控制台并使用“push_channel”订阅 channel 并使用以下命令:
Messaging.messaging().subscribe(toTopic: push_channel)
假设 iOS 设备向另一台 iOS 设备发送消息或什至尝试调用,并且该应用程序已关闭,没有通知发生以通知另一台设备正在接收调用或消息,直到用户打开应用程序,然后打开 CometChat 以便能够聊天或查看消息,我是否遗漏了什么? Cometchat 是一个 VOIP,应该在通话时唤醒应用程序吗?还是不是?
更新:
我们尝试向目标设备 fcm token 发送通知,它工作正常并被成功接收。(通过 firebase 控制台)。
我们还尝试通过 fire base 向 push_channel
主题发送通知,但任何设备都没有收到通知。 (通过 firebase 控制台)。
我们确信我们在 firebase 和 cometchat 控制台中实现了所有必需的信息。
关注:我有一个顾虑,但不应该是问题,但我会说我们在 firebase 云消息证书中使用推送通知 key 而不是 p12,但这不应该是问题吗?
代码和更新
我们将来自 firebase 的服务器遗留 key 添加到 Cometchat > 设置 > 移动中,很长时间以来它仍然无法正常工作。
下面的代码是我用来通信或实例化 Cometchat 并注册 token 的类,请告诉我我做错了什么,即使您的文档中没有完整的示例所以给你:
这是 CometChatHandler 类:
fileprivate let cometChat: CometChat = CometChat()
fileprivate let readyUI: readyUIFIle = readyUIFIle()
fileprivate let isCometOnDemand: Bool = true // For CometChat Cloud Users, Please set this to true
init(apiKey: String, licenseKey: String) {
cometChat.initializeCometChat("", licenseKey: licenseKey, apikey: apiKey, isCometOnDemand: isCometOnDemand, success: {(response) in
}, failure: { (error) in
})
}
func login(userUuid: String, userName: String) {
if self.cometChat.isUserLoggedIn() {
print("user already login")
} else {
let UID = "User_\(userUuid)"
cometChat.login(withUID: UID, success: { (dictionary: [AnyHashable: Any]!) -> () in
}, failure: { (error: Error!) -> () in
self.createUser(userUuid: userUuid, userName: userName)
})
}
}
func logout() {
cometChat.logout({ dictionary in
}, failure: { error in
})
}
func startChat(userUuid: String, delegate: UIViewController) {
if self.cometChat.isUserLoggedIn() {
self.cometChat.subscribeCallbacks(true, onMyInfoReceived: { (response) in
print("onMyInfoReceived \(String(describing: response))")
if let res = response as? Dictionary<String,Any>{
let push_channel = res["push_channel"] as? String ?? ""
print(push_channel)
DispatchQueue.main.async {
Messaging.messaging().subscribe(toTopic: push_channel)
}
}
}, onUserListReceived: { (response) in
print("onUserListReceived \(String(describing: response))")
}, onMessageReceived: { (response) in
print("onMessageReceived \(String(describing: response))")
}, onAVChatMessageReceived: { (response) in
print("onAVChatMessageReceived \(String(describing: response))")
}, onActionMessageReceived: { (response) in
print("onActionMessageReceived \(String(describing: response))")
}, onGroupListReceived: { (response) in
print("onGroupListReceived \(String(describing: response))")
}, onGroupMessageReceived: { (response) in
print("onGroupMessageReceived \(String(describing: response))")
}, onGroupAVChatMessageReceived: { (response) in
print("onGroupAVChatMessageReceived \(String(describing: response))")
}, onGroupActionMessageReceived: { (response) in
print("onGroupActionMessageReceived \(String(describing: response))")
}, onRecentChatListReceived: { (response) in
print("onRecentChatListReceived \(String(describing: response))")
}, onAnnouncementReceived: { (response) in
print("onAnnouncementReceived \(String(describing: response))")
}) { (error) in
}
openChatUI(userUuid: userUuid, delegate: delegate)
} else {
print("User not login")
}
}
#warning("TODO for left to right")
private func openChatUI(userUuid: String, delegate: UIViewController, isGroup: Bool = false, isFullScreen: Bool = true) {
self.readyUI.launchCometChat(userUuid, isGroup: isGroup,
isFullScreen: isFullScreen,
observer: delegate,
setBackButton: true, userInfo: { (response) in
print("Success Login with these data \(String(describing: response))")
}, groupInfo: { (response) in
print("Success groupInfo with these data \(String(describing: response))")
}, onMessageReceive: { (response) in
print("Success onMessageReceive with these data \(String(describing: response))")
}, success: { (response) in
print("Success success with these data \(String(describing: response))")
}, failure: { (error) in
}, onLogout: { (response) in
print("Success onLogout with these data \(String(describing: response))")
})
}
private func createUser(userUuid: String, userName: String) {
let UID = "User_\(userUuid)"
cometChat.createUser(UID,
userName: userName,
avatarUrl: "",
profileUrl: "",
role: "",
success: { (_) in
self.login(userUuid: userUuid, userName: userName)
}) { (error) in
print(error?.localizedDescription ?? "")
}
}
要在开始使用我的应用程序时登录用户,我使用 Cometchat 登录用户:
cometChatHolder.login(userUuid: "\(id)", userName: username)
然后稍后随时开始聊天并启动我调用的聊天:
cometChatHolder.startChat(userUuid: "the id of the user to start the chat with", delegate: self)
我真的陷入了死胡同,我希望我能得到一些帮助来解决这个问题,因为我别无选择。
更新(修复步骤):这就是我解决问题的方法,不要依赖 SDK 告诉您用户已登录,所以每次您都应该启动 cometChat 然后登录用户然后打开聊天,我所做的是检查用户是否通过 SDK 登录然后打开 SDK,这就是解决问题的技巧。
最佳答案
您似乎没有在 CometChat 管理面板中添加 Firebase Legacy key 。请按照以下步骤操作:
能否请您也检查以下几点是否已正确执行?这些是负责从 Firebase 接收推送通知的人 -
订阅一个 channel ,您将从中获得推送通知。当您使用 SDK 调用 subscribe 方法时,您将从 onMyInfoReceived() 回调中收到的响应中获取此 channel 。回调的响应包含一个名为“push_channel”的键。这包含推送通知 channel 。订阅此 channel 后,您将开始接收一对一聊天的推送通知。您可以使用以下方法订阅收到的 channel :
[[FIRMessaging messaging] subscribeToTopic:[NSString stringWithFormat:@"%@",push_channel]];
请参阅附图以获得更好的理解。
有关更多资源,您可以引用 iOS 中推送通知的文档:https://developer.cometchat.com/docs/ios-push-notifications
12 月 4 日更新:
我们创建了一个示例应用程序并向其添加了 Firebase 推送通知。您可以从以下网址下载该项目:
https://temp.cometchat.com/ios-swift-chat-sdk-demo-master.zip
请引用 ViewController.swift 和 AppDelegate.swift 文件中的代码。
希望这能解决问题。让我们知道问题是否仍然存在。
披露 - 此帐户归 CometChat 团队所有。
关于ios - Cometchat 不会在通话或收到消息时唤醒应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53462714/
这与 What is call/cc? 有关,但我不想为了自己的目的劫持这个问题,并且它的一些论点(例如与 setjmp/longjmp 的类比)回避了我。 我想我对什么是延续有足够的了解,我认为它是
我一直在浏览 Skype 开发 API,并想知道是否有一种方法可以让我知道 Skype 是否正在通过某些 API 运行事件调用。 Skype.Client.IsRunning 告诉 Skype 应用程
这个问题的两个小部分希望能为我消除一些歧义。 首先,调用WCF服务哪个更好? using (var myService = new ServiceClient("httpBinding")){
我在我的 Objective-C 应用程序中使用 CallKit。 我可以使用 CallKit 调用电话。如果有第二个电话打进来,我成功地将其设置为保持状态。当我结束第二个电话时, - (void)p
是否可以使用 java(JME 或 Android)捕获语音音频流,对其进行自定义加密,然后通过常规 GSM 调用将其作为常规流发送?当然,在其他手机上解密密码。是否允许应用程序级别的 java 拦截
我正在为 iOS 进行个人调整。我想在电话显示任何内容之前断开/连接电话。我连接到类 SBUIFullscreenAlertAdapter 的 initWithAlertController: 方法。
我对 callkit 有疑问(但不是真的)。 我在我的应用程序中实现了 callkit,它运行良好。我可以接到我的应用程序的第二个电话,callkit 为我提供了结束并接受、拒绝或保留并接受的选项。如
我一直在寻找在两个同伴之间进行实时语音(通话)的方法,但只找到了如何录制语音并发送它们或发送照片和文本。但我想要的是两个同伴能够互相打电话。那么,在 Android 上使用 WiFi P2P 管理器是
怎么了伙计们!好久没问过关于SO的问题了,感觉有点脱节,哈哈。无论如何,我最近使用 VOIP 发现了美妙的网络语音通话世界。和 WebRTC 我正在为我的一个想法进行一些研发,并且我基本上会喜欢以下问
我正在制作一个可以调用电话的应用程序,但我需要帮助才能在不显示拨号界面的情况下调用电话,例如,如果我按下按钮调用,它会调用电话但会停留在同一位置: 这是我的应用程序界面: 我不需要这个拨号界面,当按下
我是 Android 开发的新手(例如,我知道在 iOS 中这是不可能的)。 我知道,我需要打电话: Intent intent = new Intent(Intent.ACTION_CALL); i
注意:事实证明,原始问题的假设是不正确的。在底部查看有关其编辑的更多详细信息。 现在是关于节电模式,而不是节电模式和打盹模式。它也不是关于 Service&BroadcastReceiver,而只是
我正在开发一个机器人,您可以通过 Skype 向其发送消息和调用。该机器人在 Azure 函数中运行。我的消息部分正在工作。我已在 Azure 中将机器人配置为具有调用功能,并且我可以调用该机器人,但
在我的应用中,用户可以选择 call 联系人簿中的其他人。启动 call 应用程序很容易,但是我想知道的是,在 call 发生时我们是否可以播放简短的音乐文件,因此用户可以通过直接 call 他们的
我正在开发一个机器人,您可以通过 Skype 向其发送消息和调用。该机器人在 Azure 函数中运行。我的消息部分正在工作。我已在 Azure 中将机器人配置为具有调用功能,并且我可以调用该机器人,但
在这个问题的某些版本中,OP 会说“我如何在下午 5 点在我的应用程序中触发方法调用?” 然后人们会回答“你怎么知道你的应用会在下午 5 点打开”?这变成了另一个问题,原来的问题消失了。 所以让我们避
我想在单击按钮时发起 Skype 通话。我查找了几种可用的解决方案,但我猜大多数都已经过时并且无法正常工作。有人可以帮我解决这个问题吗?我是 Android 编程的新手。我已经包含在下面的代码中。任何
在 iOS 上,是否可以通过 URI 启动 Skype 语音通话,同时将我的应用程序保持在前台? 如果是这样,是否也可以通过启用扬声器的 URI 启动 Skype? (为什么?我正在尝试支持语音通信,
我在 Play 商店中有十几个应用程序,它们都是相同的,但针对不同的客户端进行了 UI 调整。我最近收到一封来自 Google Play 的自动电子邮件,内容涉及我的 2 个应用程序(但不是其他应用程
我想在 android 中进行 SIP 点对点 VoIP 调用。此调用应在本地网络中进行,无需访问互联网。事实上,我不想使用任何外部服务器来注册配置文件。但是我不知道在配置文件生成器的 serverD
我是一名优秀的程序员,十分优秀!