Streaming messages
Streaming messages are generated by the server and delivered incrementally to the client SDK. The client receives a streaming message notification, then pulls the full content in chunks.
NCStreamMessage properties
| Property | Type | Description |
|---|---|---|
| content | NSString | Streaming message content |
| type | NSString | Text format |
| isComplete | BOOL | Whether content generation is complete |
| completeReason | NSInteger | Abnormal termination reason (from app server) |
| stopReason | NSInteger | Termination reason (from IM server, 0 = normal) |
| sync | BOOL | Whether the client has finished pulling |
| referenceInfo | NCStreamReferenceInfo * | Reference information for the streaming message |
tip
- The SDK cannot send streaming messages — they are server-initiated only.
- After receiving a streaming message, call
requestStreamMessage(Objective-C:requestStreamMessageWithCompletion:) to pull the full content.
Receive streaming messages
Register an NCMessageHandler and implement onMessageReceived: to detect incoming streaming messages:
- Swift
- Objective-C
swift
import NexconnChatSDK
final class MyMessageHandler: NSObject, MessageHandler {
func onMessageReceived(_ event: MessageReceivedEvent) {
guard let message = event.message else { return }
if let streamContent = message.content as? StreamMessage, !streamContent.sync {
// Streaming message received — start pulling content
pullStreamingContent(message)
}
}
}
let handler = MyMessageHandler()
NCEngine.addMessageHandler(identifier: "YourKey", handler: handler)
Objective C
[NCEngine addMessageHandlerWithIdentifier:@"YourKey" handler:self];
- (void)onMessageReceived:(NCMessageReceivedEvent *)event {
NCMessage *message = event.message;
if ([message.content isKindOfClass:[NCStreamMessage class]]) {
// Streaming message received — start pulling content
NCStreamMessage *streamContent = (NCStreamMessage *)message.content;
if (!streamContent.sync) {
[self pullStreamingContent:message];
}
}
}
Pull streaming message content
Implement streaming event callbacks
The NCMessageHandler protocol provides three methods for streaming events:
- Swift
- Objective-C
swift
import NexconnChatSDK
func onStreamMessageRequestInit(_ event: StreamMessageRequestInitEvent) {
// event.messageId: the server message ID — pull initialized
}
func onStreamMessageRequestDelta(_ event: StreamMessageDeltaEvent) {
// event.message: the message with the latest aggregated content
// event.chunkInfo.content: the delta (incremental text for this event)
}
func onStreamMessageRequestComplete(_ event: StreamMessageRequestCompleteEvent) {
if let error = event.error {
print("Stream error: \(error.localizedDescription)")
} else {
// event.messageId: pull complete — message is fully received
}
}
Objective C
- (void)onStreamMessageRequestInit:(NCStreamMessageRequestInitEvent *)event {
// event.messageId: the server message ID — pull initialized
}
- (void)onStreamMessageRequestDelta:(NCStreamMessageDeltaEvent *)event {
// event.message: the message with the latest aggregated content
// event.chunkInfo.content: the delta (incremental text for this event)
}
- (void)onStreamMessageRequestComplete:(NCStreamMessageRequestCompleteEvent *)event {
if (!event.error) {
// event.messageId: pull complete — message is fully received
} else {
NSLog(@"Stream error: %@", event.error.localizedDescription);
}
}
Start pulling
Call requestStreamMessageWithCompletion: on the received NCMessage instance. The method uses the server message ID (message.messageId) internally:
- Swift
- Objective-C
swift
import NexconnChatSDK
func pullStreamingContent(_ message: Message) {
message.requestStreamMessage { error in
if error == nil {
// Pull request sent — await streaming callbacks
}
}
}
Objective C
- (void)pullStreamingContent:(NCMessage *)message {
[message requestStreamMessageWithCompletion:^(NCError *error) {
if (!error) {
// Pull request sent — await streaming callbacks
}
}];
}
Streaming message summary
After the server finishes generating content, it may send a summary via message metadata. The metadata key is business-defined by your server implementation. Listen for metadata updates via NCMessageHandler:
- Swift
- Objective-C
swift
import NexconnChatSDK
func onMessageMetadataUpdated(_ event: MessageMetadataUpdatedEvent) {
guard let message = event.message,
message.content is StreamMessage else { return }
let summary = event.metadata["summary"]
if let summary {
// Update UI with summary
}
}
Objective C
- (void)onMessageMetadataUpdated:(NCMessageMetadataUpdatedEvent *)event {
NCMessage *message = event.message;
NSDictionary<NSString *, NSString *> *metadata = event.metadata;
if ([message.content isKindOfClass:[NCStreamMessage class]]) {
NSString *summary = metadata[@"summary"];
if (summary) {
// Update UI with summary
}
}
}