Unless you have a good reason to do otherwise:
- Use authenticated encryption, for example GCM, CCM, or ChaCha20_Poly1305. Non-authenticated encryption allows some classes of generic attacks: oracle attacks, where the attacker learns information from causing the legitimate party to attempt to decrypt modified ciphertexts.
- No matter how the underlying library presents the information, treat encryption as providing a single output that contains the nonce/IV, the authenticated-but-not-encrypted data, the encrypted data proper, and the authentication tag. If the library gives you this output in pieces, just concatenate the pieces.
- For all standard authenticated encryption algorithms, either use a random nonce (and you can let the library generate it randomly), or use a counter (making sure it never repeats). Use the default nonce size unless you really know what you're doing. If you ever have to use CBC or CTR, use a random nonce: these two are badly broken with a simple counter.
All of these rules have exceptions. You'll easily find protocols that violate those rules. There are sometimes good reason to violate these rules, but you have to know what you're doing. The potential attacks are sometimes subtle, but nonetheless devastating.
For example, many communication protocols mandate a specific way to construct the nonce, which both parties follow on their own. This allows saving bandwidth to transmit nonces. That's ok, but only if you know that the way used to construct the nonce is safe, even in the presence of an attacker who sends specially-crafted messages.