StompClientLib 1.4.1

StompClientLib 1.4.1

TestsTested
LangLanguage SwiftSwift
License MIT
ReleasedLast Release Mar 2021
SPMSupports SPM

Maintained by Kuray OGUN.



StompClientLib

License platform Cocoapods

Swift 5.0 Swift 4.2 Swift 3.0 Pod Version Issues

Swift 5+ StompClient Library

## Introduction

StompClientLib is a stomp client in Swift. It uses Facebook's SocketRocket as a websocket dependency. SocketRocket is written in Objective-C but StompClientLib's STOMP part is written in Swift and its usage is Swift. You can use this library in your Swift 5+, 4+ and 3+ projects.

This is original a fork from AKStompClient (This library is not working right now)

Supported Stomp Versions

Stomp version

  • 1.1
  • 1.2
  • Might not be worked with 1.0 (Never tested)

Example

To run the example project, clone the repo, and run pod install from the Example directory first.

Requirements

  • iOS 8.0+
  • XCode 8.1, 8.2, 8.3
  • XCode 9.0+
  • XCode 10.0 +
  • XCode 12.1 +
  • Swift 3.0, 3.1, 3.2
  • Swift 4.0, Swift 4.1, Swift 4.2, Swift 5.0

Installation

StompClientLib is available through CocoaPods. To install it, simply add the following line to your Podfile:

Cocoapods

pod "StompClientLib"

Carthage

github "WrathChaos/StompClientLib"

Usage

import StompClientLib

Once imported, you can open a connection to your WebSocket server.

var socketClient = StompClientLib()
let url = NSURL(string: "your-socket-url-is-here")!
socketClient.openSocketWithURLRequest(request: NSURLRequest(url: url as URL) , delegate: self)

After you are connected, there are some delegate methods that you need to implement.

StompClientLibDelegate

stompClientDidConnect

func stompClientDidConnect(client: StompClientLib!) {
print("Socket is connected")
// Stomp subscribe will be here!
socketClient.subscribe(destination: topic)
// Note : topic needs to be a String object
}

stompClientDidDisconnect

func stompClientDidDisconnect(client: StompClientLib!) {
print("Socket is Disconnected")
}

didReceiveMessageWithJSONBody ( Message Received via STOMP )

Your json message will be converted to JSON Body as AnyObject and you will receive your message in this function

func stompClient(client: StompClientLib!, didReceiveMessageWithJSONBody jsonBody: AnyObject?, akaStringBody stringBody: String?, withHeader header: [String : String]?, withDestination destination: String) {
print("Destination : \(destination)")
print("JSON Body : \(String(describing: jsonBody))")
print("String Body : \(stringBody ?? "nil")")
}

didReceiveMessageWithJSONBody ( Message Received via STOMP as String )

Your json message will be converted to JSON Body as AnyObject and you will receive your message in this function

func stompClientJSONBody(client: StompClientLib!, didReceiveMessageWithJSONBody jsonBody: String?, withHeader header: [String : String]?, withDestination destination: String) {
  print("DESTINATION : \(destination)")
  print("String JSON BODY : \(String(describing: jsonBody))")
}

serverDidSendReceipt

If you will use STOMP for in-app purchase, you might need to use this function to get receipt

func serverDidSendReceipt(client: StompClientLib!, withReceiptId receiptId: String) {
  print("Receipt : \(receiptId)")
}

serverDidSendError

Your error message will be received in this function

func serverDidSendError(client: StompClientLib!, withErrorMessage description: String, detailedErrorMessage message: String?) {
  print("Error Send : \(String(describing: message))")
}

serverDidSendPing

If you need to control your server's ping, here is your part

func serverDidSendPing() {
  print("Server ping")
}

How to subscribe and unsubscribe

There are functions for subscribing and unsubscribing. Note : You should handle your subscribe and unsubscibe methods ! Suggestion : Subscribe to your topic in "stompClientDidConnect" function and unsubcribe to your topic in stompClientWillDisconnect method.

Subscribe

socketClient.subscribe(destination: topic)
// Note : topic needs to be a String object

Unsubscribe

socketClient.unsubscribe(destination: topic)

Important : You have to send your destination for both subscribe or unsubscribe!

Unsubsribe with header

let destination = "/topic/your_topic"
let ack = destination
let id = destination
let header = ["destination": destination, "ack": ack, "id": id]

// subscribe
socketClient?.subscribeWithHeader(destination: destination, withHeader: header)

// unsubscribe
socketClient?.unsubscribe(destination: subsId)

Auto Reconnect with a given time

You can use this feature if you need to auto reconnect with a spesific time or it will just try to reconnect every second.

// Reconnect after 4 sec
socketClient.reconnect(request: NSURLRequest(url: url as URL) , delegate: self as StompClientLibDelegate, time: 4.0)

Auto Disconnect with a given time

// Auto Disconnect after 3 sec
socketClient.autoDisconnect(time: 3)

Login Passcode Implementation

This is just an example. You need to convert to your implementation. #42

let connectFrame = "CONNECT\n login:admin\n passcode:password\n\n\n\0"
socket.write(string: connectFrame)

Future Enhancements

  • Complete a working Example
  • Add Carthage installation option
  • Add Swift Package Manager installation option
  • XCode 9 compatibility
  • Swift 4 compatibility and tests

Changelog

Full Changelog

Implemented enhancements:

  • SUBSCRIBE and UNSUBSCRIBE Delegate is missing #16

Closed issues:

  • Error Domain=SRWebSocketErrorDomain Code=2132 "received bad response code from server 403" #86
  • the delegate should be weak #83

1.3.8 (2020-03-08)

Full Changelog

Implemented enhancements:

  • Socket stopped working once I moved from ws//: to wss//: #67
  • Self sign certificate, 400 error #66
  • How to increase output buffer #37

Fixed bugs:

  • unable to install #78
  • Number of received messages is limited #76

Closed issues:

  • Can't find header in initial call #81
  • Can't connect to websocket : received bad response code from server 422 #80
  • I just closed the issue because of the stale & reproducible problem #79
  • unable to install #77
  • stompClientDidConnect not called with Spring boot #73
  • Issue with Cookies in header #71
  • Can't see any Websocket traffic in Charles Proxy #70
  • End of stream error #69
  • Cannot connect with Stomp Websocket when custom header #64
  • Can't connect Socket with Spring Boot 2.x.x #63
  • Multiple clients #48
  • IPV6 #38

Merged pull requests:

1.3.7 (2019-08-26)

Full Changelog

Closed issues:

  • The problem when receiving the messages from the Spring boot. #68

1.3.6 (2019-08-06)

Full Changelog

Implemented enhancements:

Fixed bugs:

  • v1.3.4 replaced my custom header in open socket? #58

Closed issues:

  • Json error: The data couldn’t be read because it isn’t in the correct format. #60

Merged pull requests:

  • Fixed ACK id header and added new ACK type #62 (rodmytro)

1.3.5 (2019-07-25)

Full Changelog

Fixed bugs:

  • StompClientDidConnect not called on a fresh project #51

Closed issues:

  • SendJSONForDict error #57
  • Can't connect to websocket with authorization header #39

Merged pull requests:

  • #58 fix open socket with custom header issue #59 (marain87)

1.3.4 (2019-07-19)

Full Changelog

1.3.3 (2019-07-18)

Full Changelog

Closed issues:

  • Missing merge #55
  • Data garbled problem,help #41

Merged pull requests:

  • String body parameter and ':'-in-header-value fix #56 (Erhannis)

1.3.2 (2019-07-10)

Full Changelog

Implemented enhancements:

  • stompClientWillDisconnect missing #44

1.3.1 (2019-06-14)

Full Changelog

Closed issues:

  • Can I subscribe to multiple topics with one stomp client? #47
  • After subscribing to a topic, how to handle messages from server side? #46
  • socket?.readyState is .OPEN and it never goes to my own "stompClientDidDisconnect" method #45
  • Didconnect function cannot be callback after successful connection #43
  • Login, passcode #42
  • App goes in background lock the kepad the socket disconnected #40
  • stompClientDidConnect not called with Spring boot #35
  • Delegate StompClientDidConnect not called after connect->disconnect->connect #15

1.3.0 (2019-04-30)

Full Changelog

Implemented enhancements:

  • invalidate reconnect #36

Closed issues:

  • Should add Carthage #33
  • Invalid Sec-WebSocket-Accept response #32
  • Socket is disconnected with 1007 code as soon as it connected #31
  • enable Assert (self.readyState != SR_CONNECTING) #24

1.2.7 (2018-10-23)

Full Changelog

1.2.6 (2018-10-23)

Full Changelog

Fixed bugs:

  • Error when connected to socket #23

Closed issues:

  • Auto disconnects #11

1.2.5 (2018-10-22)

Full Changelog

Closed issues:

  • Value for "message-id" is always "1" #22
  • Multiple subscription to topics #20
  • I think there is a memory leak for the delegate #19
  • Getting error when framwork is installed in Objective c project #9

1.2.4 (2018-10-17)

Full Changelog

Closed issues:

  • didCloseWithCode 1000, reason: nil #21

1.2.3 (2018-10-17)

Full Changelog

Implemented enhancements:

  • How to receive heartbeat? #18

Closed issues:

  • Socket is not getting connected #30
  • didCloseWithCode 1002 #29
  • No response #27
  • didCloseWithCode 1001, reason: "Stream end encountered" #26
  • Stream end encountered #17
  • unsubscribe socketclient #14
  • It not able to connect web socket. #13
  • One of the delegate method is not being called. #12
  • StompClient Disconnection. #10
  • Unable to find a specification for 'StompClientLib' #8

1.2.2 (2017-11-03)

Full Changelog

1.2.1 (2017-10-31)

Full Changelog

1.2.0 (2017-10-29)

Full Changelog

Closed issues:

  • Let client decide what to do with stomp frame body #4
  • Send message support #3
  • Error when calling delegate #1

1.1.7 (2017-10-02)

Full Changelog

1.1.6 (2017-08-08)

Full Changelog

0.1.5 (2017-07-10)

Full Changelog

0.1.4 (2017-07-10)

Full Changelog

0.1.3 (2017-07-10)

Full Changelog

0.1.2 (2017-07-08)

Full Changelog

0.1.1 (2017-07-08)

Full Changelog

0.1.0 (2017-07-08)

Full Changelog

* This Changelog was automatically generated by github_changelog_generator

Author

FreakyCoder, [email protected]

License

StompClientLib is available under the MIT license. See the LICENSE file for more info.