## Establish Connection Before you can publish/subscribe to a topic, you need to establish a connection. You can do that using one of the following methods provided by the SDK. ### Certificate based mutual authentication To connect with the AWS IoT Core service on the standard MQTT port 8883, you can use the `connect` API as shown below. ```swift func mqttEventCallback(_ status: AWSIoTMQTTStatus ) { print("connection status = \(status.rawValue)") } iotDataManager.connect(withClientId: "", cleanSession: true, certificateId: "", statusCallback: mqttEventCallback) ``` The AWS IoT Core service also allows you to connect devices using MQTT with certificate based mutual authentication on port 443. You can do this using the `connectUsingALPN` API as shown below. See [MQTT with TLS client authentication on port 443](https://aws.amazon.com/blogs/iot/mqtt-with-tls-client-authentication-on-port-443-why-it-is-useful-and-how-it-works/) for more information. ```swift func mqttEventCallback(_ status: AWSIoTMQTTStatus ) { print("connection status = \(status.rawValue)") } iotDataManager.connectUsingALPN(withClientId: "", cleanSession: true, certificateId: "", statusCallback: mqttEventCallback) ``` You can take a look at the [API Reference](https://aws-amplify.github.io/aws-sdk-ios/docs/reference/AWSIoT/Classes/AWSIoTDataManager.html#/c:objc(cs)AWSIoTDataManager(im)connectUsingALPNWithClientId:cleanSession:certificateId:statusCallback:) to get more information. ### AWS Credentials based Authentication This method uses AWS Signature Version 4 Credentials to sign the request to connect to the AWS IoT endpoint. ```swift func mqttEventCallback(_ status: AWSIoTMQTTStatus ) { print("connection status = \(status.rawValue)") } iotDataManager.connectUsingWebSocket(withClientId: "", cleanSession: true, statusCallback: mqttEventCallback) ``` You can take a look at the [API Reference](https://aws-amplify.github.io/aws-sdk-ios/docs/reference/AWSIoT/Classes/AWSIoTDataManager.html#/c:objc(cs)AWSIoTDataManager(im)connectUsingWebSocketWithClientId:cleanSession:statusCallback:) to know more information. ### Custom Authentication AWS IoT allows you to define custom authorizers that allow you to manage your own authentication and authorization strategy using a custom authentication service and a Lambda function. Custom authorizers allow AWS IoT to authenticate your devices and authorize operations using bearer token authentication and authorization strategies. See [AWS IoT Custom Authentication](https://docs.aws.amazon.com/iot/latest/developerguide/iot-custom-authentication.html) for more details. Please follow the steps outlined in [Setting up Custom Authentication](https://aws.amazon.com/blogs/security/how-to-use-your-own-identity-and-access-management-systems-to-control-access-to-aws-iot-resources/) to create the custom authorizer and configure the workflow with AWS IoT. Once the custom authorizer workflow is configured, you can establish a connection as follows: ```swift func mqttEventCallback(_ status: AWSIoTMQTTStatus ) { print("connection status = \(status.rawValue)") } iotDataManager.connectUsingWebSocket(withClientId: uuid, cleanSession: true, customAuthorizerName: "", tokenKeyName: "", tokenValue: "", tokenSignature: "", statusCallback: mqttEventCallback) ``` You can take a look at the [API Reference](https://aws-amplify.github.io/aws-sdk-ios/docs/reference/AWSIoT/Classes/AWSIoTDataManager.html#/c:objc(cs)AWSIoTDataManager(im)connectUsingWebSocketWithClientId:cleanSession:customAuthorizerName:tokenKeyName:tokenValue:tokenSignature:statusCallback:) to know more information. This feature is available in the AWS SDK for iOS starting from `2.8.4` version. See [AWSIoT - 2.8.4](https://github.com/aws-amplify/aws-sdk-ios/blob/main/CHANGELOG.md#284) for more details. ## Subscribe to a topic In order to start receiving messages from your provider, you need to subscribe to a topic as follows; ```swift iotDataManager.subscribe( toTopic: "myTopic", qoS: .messageDeliveryAttemptedAtMostOnce, /* Quality of Service */ messageCallback: { (payload) ->Void in let stringValue = NSString(data: payload, encoding: String.Encoding.utf8.rawValue)! print("Message received: \(stringValue)") } ) ``` ## Subscribe to multiple topics To subscribe for multiple topics, just call `subscribe()` for each topic you wish to subscribe. ## Publish to a topic To send a message to a topic, use `publishString()` method with your topic name and the message: ```swift iotDataManager.publishString( "Hello to all subscribers!", onTopic: "myTopic", qoS:.messageDeliveryAttemptedAtMostOnce) ``` ## Unsubscribe from a topic To stop receiving messages from a topic, you can use `unsubscribeTopic()` method: ```swift iotDataManager.unsubscribeTopic("myTopic") // You will no longer get messages for "myTopic" ``` ## Close Connection In order to disconnect, you need to close the connection as follows: ```swift iotDataManager.disconnect() ``` ## API Reference For the complete API documentation for AWS IoT, visit our [API reference](https://aws-amplify.github.io/aws-sdk-ios/docs/reference/AWSIoT/Classes/AWSIoTDataManager.html).