Release Notes
4.3.0 - 2022-04-28
Added
-
pushNotificationTTL
property added toNXMClientConfig
to set TTL for push notifications. -
[NXMConversation sendMarkDeliveredMessage:message completionHandler:handler]
method added to send delivery receipts. -
[NXMConversation sendMarkSeenMessage]
now supports seen status for all messages. -
NXMMessageStatusTypeSubmitted
,NXMMessageStatusTypeRejected
,NXMMessageStatusTypeUndeliverable
states added toNXMMessageStatusEvent
4.2.1 - 2022-04-06
Fixed
-
[NXMClient uploadAttachmentWithType:name:data:completionHandler:]
method to upload attachments returns with image data
4.2.0 - 2022-03-24
Added
- Support for
call:transfer
withinNXMCall
-
[NXMCallDelegate call:didTransfer:event:]
to receive new call transfer event when call transferred to a new conversation.
Enhancements
- WebRTC dependency upgraded to version
84.0.22
.
4.1.0 - 2022-02-25
Added
-
[NXMClient getDeviceId]
to retrieve device identifier.
4.0.6 - 2022-02-15
Fixed
- Fix DSYM Warnings
4.0.5 - 2022-02-15
Added
- Bitcode Support
4.0.4 - 2022-01-14
Fixed
- Inbound call event processing queue defaults to non suspended
4.0.3 - 2021-12-13
Fixed
- Umbrella header.
4.0.2 - 2021-12-07
Fixed
- CocoaPods dependencies.
4.0.0 - 2021-12-06
Added
-
[NXMConversation sendMessage:completionHandler:]
method to sendNXMMessage
. -
[NXMClient uploadAttachmentWithType:name:data:completionHandler:]
method to upload attachments. -
NXMMessage
represents a message to send. -
NXMMessageType
for messages of typetext
,image
,audio
,video
,file
,template
,vcard
andcustom
. -
NXMEventTypeMemberMessageStatus
, a newNXMEventType
case, represents a member message status event that can be received on anNXMConversation
.
Enhancements
- WebRTC dependency upgraded to version
84.0.0
. - Enforce direction for
NXMCallMemberStatus
during calls.
Changed
-
NXMDirectionType
renamed toNXMChannelType
.
Deprecated
-
[NXMConversation sendText:completionHandler:]
method. -
[NXMConversation sendAttachmentWithType:name:data:completionHandler:]
method.
3.3.0 - 2021-11-22
Added
-
NXMClientConfig
'sapiPinning
andwebsocketPinning
optional fields to enable HTTP and web-socket SSL pinning. -
[NXMPinningConfig fromPublicKeys:]
method to create a public-key-based pinning configuration. -
NXMConnectionStatusReasonSSLPinningError
describing a client connection update due to an SSL pinning error.
Changed
- Minimum supported iOS version (
IPHONEOS_DEPLOYMENT_TARGET
) bumped to10.3
.
3.2.1 - 2021-11-08
Fixed
- Stash events while conversation is downloading to avoid missed events
3.2.0 - 2021-10-19
Added
-
NXMClientConfig.autoMediaReoffer
to allow to automatically reconnect media when network interfaces changes. -
[NXMClientConfig description]
for a quickNXMClientConfig
's instance description. -
NXMMediaConnectionStatus
enumerate. -
[NXMConversationDelegate conversation:onMediaConnectionStateChange:legId:]
to receive media connection state changed notification. -
[NXMConversation reconnectMedia]
to trigger a media reconnection. -
[NXMClient reconnectCallWithConversationId:andLegId:completionHandler:]
to reconnect a call given a conversation id and a leg id. -
NXMCall.conversation
to get the conversation associated to a call.
Deprecated
-
[NXMClientConfig initWithApiUrl:websocketUrl:ipsUrl:]
. -
[NXMClientConfig initWithApiUrl:websocketUrl:ipsUrl:iceServerUrls:]
. -
[NXMClientConfig initWithApiUrl:websocketUrl:ipsUrl:useFirstIceCandidate:]
. -
[NXMClientConfig initWithApiUrl:websocketUrl:ipsUrl:iceServerUrls:useFirstIceCandidate]
.
3.1.0 - 2021-09-06
Added
-
[NXMClient inAppCallWithCallee:completionHandler:]
method to perform in-app calls. -
[NXMClient serverCallWithCallee:customData:completionHandler:]
method to perform server calls, optionally specifyingcustomData
.
Enhancements
- Internal API calls optimized for conversation creation.
Deprecated
-
[NXMClient call:callHandler:completionHandler:]
method. -
NXMCallHandler
enumerate. -
[NXMLogger getLogFileNames]
method.
3.0.1 - 2021-07-12
Fixed
- Sending DTMF during calls.
- Prewarmed media termination.
Changed
-
NXMMemberEvent
'smember
substituted withmemberId
.
3.0.0 - 2021-07-01
Added
- Added
NXMMemberSummary
returned by[NXMConversation getMembersPageWithPageSize:order:completion:]
(paginated), representing a subset of member's information. - Added
NXMMemberEvent
'sinvitedBy
that represents the inviter name, if exists. - Added
NXMEventEmbeddedInfo
to all events returned byNXMEvent
'sembeddedInfo
and containing theNXMUser
linked to the event. - Added
[NXMConversation getMemberWithMemberUuid:completion:]
returning the member given its identifier.
Enhancements
- Allow 1K members on a conversation.
- Improved
callServer
setup time by pre-warming leg. - Disabled media after RTC hangup event.
- Fixed text typing events handling.
Breaking changes
- Removed
NXMCallMember
, replaced withNXMMember
. - Removed
NXMCallMember
'sstatus
, moved to[NXMCall callStatusForMember:member:]
. - Removed
[NXMCallMember mute:]
converted into[NXMMember enableMute]
and[NXMMember disableMute]
. - Removed
NXMConversation
'sallMembers
(replaced with[NXMConversation getMembersPageWithPageSize:order:completion:]
(paginated)). - Removed
[NXMConversationUpdateDelegate conversation:didUpdateMember:withType:]
, replaced with[NXMConversationDelegate conversation:didReceiveMemberEvent:]
with the following possible states:NXMMemberStateInvited
,NXMMemberStateJoined
andNXMMemberStateLeft
. Can be subscribed to usingNXMConversation
'sdelegate
. - Renamed
NXMCall
'sotherCallMembers
toallMembers
. - Renamed
NXMCall
'smyCallMember
tomyMember
. - The
legs
endpoint should be included inacl
paths onJWT
token creation.
"acl": {
"paths": {
...,
"/*/legs/**": {}
}
}
2.5.0 - 2020-11-23
Changed
- Renamed
NXMCallMemberStatusCanceled
toNXMCallMemberStatusCancelled
. - Renamed
NXMLegStatusCanceled
toNXMLegStatusCancelled
.
Enhancements
- Notified with
NXMCallMemberStatusCancelled
onNXMCallDelegate
for call hang up.
2.4.0 - 2020-09-24
Added
- Expose the reason
NXMConnectionStatusReasonTokenExpired
on connection statusNXMConnectionStatusDisconnected
for theNXMClientDelegate
.
2.3.0 - 2020-08-17
Added
-
[NXMClientConfig AMS]
static method.
Fixed
- Custom events parsing.
2.2.2 - 2020-07-20
Fixed
- Event syncing after socket disconnection.
2.2.1 - 2020-07-06
Fixed
- Server-call error reported by
NXMCallDelegate
on call completion.
Enhancements
- Improved call events handling.
- Improved conversation expiration handling.
2.2.0 - 2020-04-22
Added
- Added
isConnected
method toNXMClient
to show current connection state.
[NXNClient.shared isConnected]
Fixed
- API Event
client_ref
handling.
2.1.10 - 2020-04-16
Enhancements
- Improved single ICE candidate gathering implementation.
2.1.9 - 2020-04-14
Fixed
-
NXMClientConfig
convenience initializer implementations.
2.1.8 - 2020-04-02
Added
- Add
useFirstIceCandidate
parameters toNXMClientConfig
NXMClientConfig *config = [[NXMClientConfig alloc] initWithApiUrl:restUrl
websocketUrl:wsUrl
ipsUrl:ipsUrl
useFirstIceCandidate:NO];
2.1.5 - 2020-03-18
Enhancements
- Updated Device Registration format for production environments.
2.1.1 - 2020-03-05
Added
-
NXMClient
'sgetConversationsPageWithSize:order:filter:completionHandler:
method to get conversations with paging.
Deprecated
-
NXMClient
'sgetConversationsPageWithSize:order:completionHandler:
method to get conversations with paging.
Enhancements
- The Client SDK is now built with Xcode 11.
2.1.0 - 2020-01-31
Added
-
NXMPushPayload
for custom push notifications.
if (NXNClient.shared isNexmoPushWithUserInfo:pushInfo]){
NXMPushPayload *pushPayload = [myNXNClient processNexmoPushPayload:pushInfo];
if (!pushPayload){
// "Not a Nexmo push!!"
return;
};
if (pushPayload.template == NXMPushTemplateCustom) {
// Got custom push
pushPayload.customData // your customData
}
}
2.0.0 - 2020-01-15
Added
-
NXMHelper
withdescriptionForEventType:
method. -
NXMConversation
'sgetEvents:
method replaced bygetEventsPage:
,getEventsPageWithSize:order:completionHandler:
,getEventsPageWithSize:order:eventType:completionHandler:
.
[myNXMConversation getEventsPagePageWithSize:15
order:NXMPageOrderDesc
eventType:nil
completionHandler:^(NSError * _Nullable error, NXMEventsPage * _Nullable page) {
if (error || !page) {
// handle error...
return;
}
// use page...
}];
-
NXMConversationsPage
'snextPage:
andpreviousPage:
completion handlers are now non-null.
Fixed
- Calling
conversation.getEvents
returned aNXMMemberEvent
with the fieldmember
set tonil
.
1.2.3 - 2019-12-17
Fixed
-
conversation.getEvents
returned someNXMEvent
s containing a nilfromMember
- Added descriptive
userInfo
forNXMError
s.
1.2.2 - 2019-12-12
Fixed
- Added support for DTLS in WebRTC.
-
didReceiveCall
anddidReceiveConversation
being called only once for the same call or conversation. - Added option to enable push notification with only one
pushKit
oruserNotification
token. - Fix for
NXMClientConfig
region URLs. - On login with invalid user, return
NXMConnectionStatusReasonUserNotFound
. - Added build architectures:
armv7
andarmv7s
.
1.2.1 - 2019-12-05
Added
Configuration for ICE server:
NXMClientConfig *config = [[NXMClientConfig alloc] initWithApiUrl:restUrl
websocketUrl:wsUrl
ipsUrl:ipsUrl
iceServerUrls:iceUrls];
[NXMClient setConfiguration:config];
This configuration is optional and a default will be set if not specified.
Note: setConfiguration
should be used before accessing NXMClient.shared
.
Fixed
Corrected nil
values for fromMember
for NXMConversation
events.
1.2.0 - 2019-12-03
Added
NXMClient
's getConversationsPageWithSize:order:completionHandler:
method to get conversations with paging.
NXMConversationsPage
, which represents the retrieved page, provides the following instance methods:
-
hasNextPage
/hasPreviousPage
to check if forward/backward page retrieval is possible and -
nextPage:
/previousPage:
to asynchronously retrieve the next/previous page.
Changed
NXMClient
's getConversationWithUUid:completionHandler:
method's name typo (now called getConversationWithUuid:completionHandler:
).
1.1.1 - 2019-11-21
Added
NXMClientConfig
object in order to change data center configuration. How to use:
[NXMClient setConfiguration:NXMClientConfig.DC];
NXMClient setConfiguration
is optional, configuration will set to a default value.
Note: you must call setConfiguration
method before using NXMClient.shared
.
1.1.0 - 2019-11-14
Fixed
- iOS 13 push notifications support.
- Start server call stability.
- Receiving a DTMF event in call and conversation.
Added
NXMConversationDelegate
did receive DTMF event method:
- (void)conversation:(nonnull NXMConversation *)conversation didReceiveDTMFEvent:(nullable NXMDTMFEvent *)event;
Changed
NXMClient
- client enable push notifications method changed.
param pushKitToken
- only for VoIP push (incoming calls).
param userNotificationToken
- all push types:
- (void)enablePushNotificationsWithPushKitToken:(nullable NSData *)pushKitToken
userNotificationToken:(nullable NSData *)userNotificationToken
isSandbox:(BOOL)isSandbox
completionHandler:(void(^_Nullable)(NSError * _Nullable error))completionHandler;
1.0.0 - 2019-09-05
Fixed
-
NexmoClient
when disconnected returns error callback for all function. -
CallMember
status calculated by the current leg status. -
CallMember
supports failed, busy, timeout and canceled statuses. - Supports member invited.
-
Conversation
has media methods. -
NexmoClient
is now singleton. - Call method changed to string instead of array.
-
NexmoClient
delegate methods renamed.
Added
- Added conversation media:
NXMConversation myConversation;
[myConversation enableMedia]; // my media will be enabled
[myConversation disableMedia]; // my media will be disabled
- Added invite member:
NXMConversation myConversation;
[myConversation inviteMemberWithUsername:@"someUsername"
completion:myCompletionBlock];
- Added the member state initiator:
NXMMember *member = someMember;
NSDictionary<NSValue *, NXMInitiator *> *initiators = member.initiators;
NXMInitiator leftStateInitiator = initiators[NXMMemberStateLeft];
leftStateInitiator.isSystem;
leftStateInitiator.userId;
leftStateInitiator.memberId;
leftStateInitiator.time;
- Added
NXMConversationUpdateDelegate
to notify on member updates like media,leg, and state. - Added
updatesDelegate
property toNXMConversation
:
@property (nonatomic, weak, nullable) id <NXMConversationUpdateDelegate> updatesDelegate;
Example:
@interface MyClass() <NXMConversationUpdateDelegate>
@implementation MyClass
- (void)setConversation:(NXMConversation *conversation) {
conversation.updatesDelegate(self); // register to conversation updatesDelegate
}
- (void)conversation:(nonnull NXMConversation *)conversation didUpdateMember:(nonnull NXMMember *)member withType:(NXMMemberUpdateType)type {
if (type == NXMMemberUpdateTypeState) {
// the member state changed
}
if (type == NXMMemberUpdateTypeMedia) {
// the member media changed
}
}
@end
Changed
-
NXMClient
is now a singleton:
NXMClient.shared // the shared instance of NXMClient
- Renamed:
@property (nonatomic, readonly, nullable, getter=getToken) NSString *authToken; // was token
// was - (void)login;
- (void)loginWithAuthToken:(NSString *)authToken;
// was - (void)refreshAuthToken:(nonnull NSString *)authToken;
- (void)updateAuthToken:(nonnull NSString *)authToken;
// was callees array
- (void)call:(nonnull NSString *)callee
callHandler:(NXMCallHandler)callHandler
delegate:(nullable id<NXMCallDelegate>)delegate
completion:(void(^_Nullable)(NSError * _Nullable error, NXMCall * _Nullable call))completion;
completionHandler:(void(^_Nullable)(NSError * _Nullable error, NXMCall * _Nullable call))completionHandler;
-
NXMClientDelegate
renamed:
@protocol NXMClientDelegate <NSObject>
// was - (void)connectionStatusChanged:(NXMConnectionStatus)status reason:(NXMConnectionStatusReason)reason;
- (void)client:(nonnull NXMClient *)client didChangeConnectionStatus:(NXMConnectionStatus)status reason:(NXMConnectionStatusReason)reason;
// was - (void)incomingCall:(nonnull NXMCall *)call;
- (void)client:(nonnull NXMClient *)client didReceiveCall:(nonnull NXMCall *)call;
// was - (void)incomingConversation:(nonnull NXMConversation *)conversation;
- (void)client:(nonnull NXMClient *)client didReceiveConversation:(nonnull NXMConversation *)conversation;
@end
-
NXMConversation
otherMembers
property renamed toallMembers
:
NXMConversation myConversation = someConversation;
NSArray<NXMMember *> * allMembers = myConversation.allMembers // return the all conversation members
- (void)joinMemberWithUsername:(nonnull NSString *)username // username instead of userId
-
NXMConversationDelegate
renamed methods:
// was - (void)customEvent:(nonnull NXMCustomEvent *)customEvent;
- (void)conversation:(nonnull NXMConversation *)conversation didReceiveCustomEvent:(nonnull NXMCustomEvent *)event;
// was - (void)textEvent:(nonnull NXMMessageEvent *)textEvent;
- (void)conversation:(nonnull NXMConversation *)conversation didReceiveTextEvent:(nonnull NXMTextEvent *)event;
// was - (void)attachmentEvent:(nonnull NXMMessageEvent *)attachmentEvent;
- (void)conversation:(nonnull NXMConversation *)conversation didReceiveImageEvent:(nonnull NXMImageEvent *)event;
// - (void)messageStatusEvent:(nonnull NXMMessageStatusEvent *)messageStatusEvent;
- (void)conversation:(nonnull NXMConversation *)conversation didReceiveMessageStatusEvent:(nonnull NXMMessageStatusEvent *)event;
// was - (void)typingEvent:(nonnull NXMTextTypingEvent *)typingEvent;
- (void)conversation:(nonnull NXMConversation *)conversation didReceiveTypingEvent:(nonnull NXMTextTypingEvent *)event;
// was - (void)memberEvent:(nonnull NXMMemberEvent *)memberEvent;
- (void)conversation:(nonnull NXMConversation *)conversation didReceiveMemberEvent:(nonnull NXMMemberEvent *)event;
// was - (void)legStatusEvent:(nonnull NXMLegStatusEvent *)legStatusEvent;
- (void)conversation:(nonnull NXMConversation *)conversation didReceiveLegStatusEvent:(nonnull NXMLegStatusEvent *)event;
// was - (void)mediaEvent:(nonnull NXMEvent *)mediaEvent;
- (void)conversation:(nonnull NXMConversation *)conversation didReceiveMediaEvent:(nonnull NXMMediaEvent *)event;
Use
username
instead ofuserId
.NXMCallDelegate
renamed:
// was - (void)statusChanged:(nonnull NXMCallMember *)callMember;
- (void)didUpdate:(nonnull NXMCallMember *)callMember status:(NXMCallMemberStatus)status;
- (void)didUpdate:(nonnull NXMCallMember *)callMember muted:(BOOL)muted;
// was - (void)DTMFReceived:(nonnull NSString *)dtmf callMember:(nonnull NXMCallMember *)callMember;
- (void)didReceive:(nonnull NSString *)dtmf fromCallMember:(nonnull NXMCallMember *)callMember;
-
NXMEvent
andNXMMemberEvent
add member object instead ofmemberId
:
@property (nonatomic, readonly, nonnull) NXMMember *member;
-
NXMImageInfo
renamed properties:
@property NSInteger sizeInBytes; // was size
@property NXMImageSize size; // was type
-
NXMMessageStatusEvent
renamed property:
@property NSInteger referenceEventId; // was refEventId
-
NexmoClient
logger exposed -NXMLogger
object:
[NXMLogger setLogLevel:NXMLoggerLevelDebug];
NSArray *logNames = [NXMLogger getLogFileNames];
Removed
NXMLoggerDelegate
NXMClient myClient = ...;
[myClient setLoggerDelegate:LoggerDelegate];
0.3.0 - 2019-06-03
Added
- Interoperability with the JS and Android SDKs - Calls can now be placed between apps using the iOS, JS or Android SDKs.
Changed
-
NXMCallMember
- added member channel with direction data:
@interface NXMCallMember : NSObject
...
@property (nonatomic, readonly, nullable) NXMChannel *channel;
...
@end
@interface NXMChannel : NSObject
@property (nonatomic, readonly, nonnull) NXMDirection *from;
@property (nonatomic, readonly, nullable) NXMDirection *to;
@end
@interface NXMDirection : NSObject
@property (nonatomic, assign) NXMDirectionType type;
@property (nonatomic, copy, nullable) NSString *data;
@end
Removed
-
NXMCallMember
'sphoneNumber
andchannelType
were removed.
0.2.56 - 2019-01-24
Added
- Change log file.
Changed
- Memory management improvements.
- Fetch missing and new events on network changes.
- Returning User objects instead of Ids.
- Bug fixes.
- Add
non-null
ornullable
to properties. - Rename
call.decline
tocall.reject
.
0.1.52 - 2019-01-01
Initial beta release with basic call and chat features.
Please refer to list of features and usage: https://developer.nexmo.com/
Cocoapods: https://cocoapods.org/pods/nexmoclient