Instead of having manual one off error methods like this

[self.delegate connectionCoordinator:self didFailConnectionAttemptWithError:[self errorCouldNotWakeup]];
- (NSError *)errorCouldNotWakeup
{
    NSDictionary *userInfo = @{
            NSLocalizedDescriptionKey: @"Could not wake up.",
            NSLocalizedFailureReasonErrorKey: @"Application may not be installed.",
            NSLocalizedRecoverySuggestionErrorKey: @"Ensure application is installed."
    };
    return [NSError errorWithDomain:RemoteErrorDomain
                               code:RemoteCouldNotFindApp
                           userInfo:userInfo];
}

A nice alternative is to decorate NSError with categories.

[self.delegate connectionCoordinator:self
               didFailConnectionAttemptWithError:[NSError xxx_backgroundWakeupFailedErrorWithUnderlyingError:nil]];

NSError+Remote.h

@interface NSError (Remote)

/**
 *  Constructs a user facing error for a connection terminated event.
 *
 *  @param underlyingError The underlying error which caused the event, if any.
 *
 *  @return A new user facing error.
 */
+ (instancetype)xxx_connectionTerminatedErrorWithUnderlyingError:(nullable NSError *)underlyingError;

NSError+Remote.m

+ (instancetype)xxx_errorWithCode:(NSInteger)code userInfo:(NSDictionary *)userInfo underlyingError:(nullable NSError *)underlyingError
{
    NSMutableDictionary * const mutableUserInfo = [userInfo mutableCopy];

    if (underlyingError != nil) {
        mutableUserInfo[NSUnderlyingErrorKey] = underlyingError;
    }

    return [NSError errorWithDomain:RemoteErrorDomain
                               code:code
                           userInfo:[mutableUserInfo copy]];
}

+ (instancetype)xxx_connectionTerminatedErrorWithUnderlyingError:(nullable NSError *)underlyingError
{
    NSMutableDictionary * const userInfo = [NSMutableDictionary dictionaryWithDictionary:@{
        NSLocalizedDescriptionKey: @"Connection terminated.",
        NSLocalizedFailureReasonErrorKey: @"The app might have been suspended.",
        NSLocalizedRecoverySuggestionErrorKey: @"Try to reconnect."
    }];

    return [self xxx_errorWithCode:RemoteConnectionTerminatedError
                          userInfo:userInfo
                   underlyingError:underlyingError];
}

And then use it like this

- (void)transport:(id<RemoteTransport>)transport didDisconnectWithError:(NSError *)error
 {
    NSError * const userFacingError = [NSError xxx_connectionTerminatedErrorWithUnderlyingError:error];
    [self.delegate Remote:self didDisconnectWithError:userFacingError];
 }