|
|
|
@ -934,9 +934,10 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
NSString *localNumber = [TSAccountManager localNumber];
|
|
|
|
|
if ([localNumber isEqualToString:recipient.uniqueId]) {
|
|
|
|
|
BOOL isLocalNumber = [localNumber isEqualToString:recipient.uniqueId];
|
|
|
|
|
if (isLocalNumber) {
|
|
|
|
|
OWSAssert([message isKindOfClass:[OWSOutgoingSyncMessage class]]);
|
|
|
|
|
// Messages send to the "local number" should be sync messages.
|
|
|
|
|
// Messages sent to the "local number" should be sync messages.
|
|
|
|
|
//
|
|
|
|
|
// We can skip sending sync messages if we know that we have no linked
|
|
|
|
|
// devices. However, we need to be sure to handle the case where the
|
|
|
|
@ -957,6 +958,11 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
|
|
|
|
|
// 2. Check SignalRecipient's state.
|
|
|
|
|
BOOL hasDeviceMessages = deviceMessages.count > 0;
|
|
|
|
|
|
|
|
|
|
DDLogInfo(@"%@ mayHaveLinkedDevices: %d, hasDeviceMessages: %d",
|
|
|
|
|
self.logTag,
|
|
|
|
|
mayHaveLinkedDevices,
|
|
|
|
|
hasDeviceMessages);
|
|
|
|
|
|
|
|
|
|
if (!mayHaveLinkedDevices && !hasDeviceMessages) {
|
|
|
|
|
DDLogInfo(@"%@ Ignoring sync message without secondary devices: %@", self.logTag, [message class]);
|
|
|
|
|
OWSAssert([message isKindOfClass:[OWSOutgoingSyncMessage class]]);
|
|
|
|
@ -982,13 +988,28 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
|
|
|
|
|
OWSAssert(deviceMessages.count > 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (deviceMessages.count == 0) {
|
|
|
|
|
DDLogWarn(@"%@ Sending a message with no device messages.", self.logTag);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TSSubmitMessageRequest *request = [[TSSubmitMessageRequest alloc] initWithRecipient:recipient.uniqueId
|
|
|
|
|
messages:deviceMessages
|
|
|
|
|
relay:recipient.relay
|
|
|
|
|
timeStamp:message.timestamp];
|
|
|
|
|
|
|
|
|
|
[self.networkManager makeRequest:request
|
|
|
|
|
success:^(NSURLSessionDataTask *task, id responseObject) {
|
|
|
|
|
if (isLocalNumber && deviceMessages.count == 0) {
|
|
|
|
|
DDLogInfo(@"%@ Sent a message with no device messages; clearing 'mayHaveLinkedDevices'.", self.logTag);
|
|
|
|
|
// In order to avoid skipping necessary sync messages, the default value
|
|
|
|
|
// for mayHaveLinkedDevices is YES. Once we've successfully sent a
|
|
|
|
|
// sync message with no device messages (e.g. the service has confirmed
|
|
|
|
|
// that we have no linked devices), we can set mayHaveLinkedDevices to NO
|
|
|
|
|
// to avoid unnecessary message sends for sync messages until we learn
|
|
|
|
|
// of a linked device (e.g. through the device linking UI or by receiving
|
|
|
|
|
// a sync message, etc.).
|
|
|
|
|
[OWSDeviceManager.sharedManager clearMayHaveLinkedDevicesIfNotSet];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
dispatch_async([OWSDispatch sendingQueue], ^{
|
|
|
|
|
[recipient save];
|
|
|
|
|
[self handleMessageSentLocally:message];
|
|
|
|
|