Skip to content

Commit

Permalink
Don't make IAM requests with nil data
Browse files Browse the repository at this point in the history
* If subscription ID (most common) or other properties such as app ID are `nil`, the app crashes when requests for IAM impressions or clicks are created.
* The app will crash with Exception `[__NSPlaceholderDictionary initWithObjects:forKeys:count:]: attempt to insert nil object from objects[1]`
* Don't create the request in these cases.
* If we omit these properties in the payload or pass an empty string, the request will return 400 anyway, so don't make any requests.
  • Loading branch information
nan-li committed Jun 26, 2024
1 parent f0552dd commit 1910593
Showing 1 changed file with 33 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -487,12 +487,16 @@ - (void)messageViewPageImpressionRequest:(OSInAppMessageInternal *)message withP
[OneSignalLog onesignalLog:ONE_S_LL_VERBOSE message:[NSString stringWithFormat:@"Not sending page impression for preview message. ID: %@",pageId]];
return;
}

NSString *appId = OneSignalConfigManager.getAppId;
NSString *pushSubscriptionId = OneSignalUserManagerImpl.sharedInstance.pushSubscriptionId;
NSString *variantId = message.variantId;

if (!pageId) {
[OneSignalLog onesignalLog:ONE_S_LL_ERROR message:[NSString stringWithFormat:@"Attempting to send page impression for nil page id"]];
if (!appId || !pushSubscriptionId || !pageId || !variantId) {
[OneSignalLog onesignalLog:ONE_S_LL_ERROR message:[NSString stringWithFormat:@"Attempting to send IAM page impression with nil data, appId: %@, pushSubscriptionId: %@, pageId: %@, variantId: %@", appId, pushSubscriptionId, pageId, variantId]];
return;
}

NSString *messagePrefixedPageId = [message.messageId stringByAppendingString:pageId];

if ([self.viewedPageIDs containsObject:messagePrefixedPageId]) {
Expand All @@ -504,11 +508,11 @@ - (void)messageViewPageImpressionRequest:(OSInAppMessageInternal *)message withP

[OneSignalLog onesignalLog:ONE_S_LL_VERBOSE message:[NSString stringWithFormat:@"Page Impression Request page id: %@",pageId]];
// Create the request and attach a payload to it
let metricsRequest = [OSRequestInAppMessagePageViewed withAppId:OneSignalConfigManager.getAppId
withPlayerId:OneSignalUserManagerImpl.sharedInstance.pushSubscriptionId
let metricsRequest = [OSRequestInAppMessagePageViewed withAppId:appId
withPlayerId:pushSubscriptionId
withMessageId:message.messageId
withPageId:pageId
forVariantId:message.variantId];
forVariantId:variantId];

[OneSignalCoreImpl.sharedClient executeRequest:metricsRequest
onSuccess:^(NSDictionary *result) {
Expand Down Expand Up @@ -540,14 +544,23 @@ - (void)messageViewImpressionRequest:(OSInAppMessageInternal *)message {
if (![self shouldSendImpression:message])
return;

NSString *appId = OneSignalConfigManager.getAppId;
NSString *pushSubscriptionId = OneSignalUserManagerImpl.sharedInstance.pushSubscriptionId;
NSString *variantId = message.variantId;

if (!appId || !pushSubscriptionId || !variantId) {
[OneSignalLog onesignalLog:ONE_S_LL_ERROR message:[NSString stringWithFormat:@"Attempting to send IAM impression with nil data, appId: %@, pushSubscriptionId: %@, variantId: %@", appId, pushSubscriptionId, variantId]];
return;
}

// Add messageId to impressionedInAppMessages
[self.impressionedInAppMessages addObject:message.messageId];

// Create the request and attach a payload to it
let metricsRequest = [OSRequestInAppMessageViewed withAppId:OneSignalConfigManager.getAppId
withPlayerId:OneSignalUserManagerImpl.sharedInstance.pushSubscriptionId
let metricsRequest = [OSRequestInAppMessageViewed withAppId:appId
withPlayerId:pushSubscriptionId
withMessageId:message.messageId
forVariantId:message.variantId];
forVariantId:variantId];

[OneSignalCoreImpl.sharedClient executeRequest:metricsRequest
onSuccess:^(NSDictionary *result) {
Expand Down Expand Up @@ -939,19 +952,25 @@ - (void)sendClickRESTCall:(OSInAppMessageInternal *)message withAction:(OSInAppM
// Handles body, button, or image clicks
if (![self isClickAvailable:message withClickId:clickId])
return;
if (!clickId) {
[OneSignalLog onesignalLog:ONE_S_LL_ERROR message:@"sendClickRESTCall:withAction: call could not be made because the click action does not have an id."];

NSString *appId = OneSignalConfigManager.getAppId;
NSString *pushSubscriptionId = OneSignalUserManagerImpl.sharedInstance.pushSubscriptionId;
NSString *variantId = message.variantId;

if (!appId || !pushSubscriptionId || !variantId || !clickId) {
[OneSignalLog onesignalLog:ONE_S_LL_ERROR message:[NSString stringWithFormat:@"sendClickRESTCall:withAction: call could not be made due to nil data, appId: %@, pushSubscriptionId: %@, variantId: %@, clickId: %@", appId, pushSubscriptionId, variantId, clickId]];
return;
}

// Add clickId to clickedClickIds
[self.clickedClickIds addObject:clickId];
// Track clickId per IAM
[message addClickId:clickId];

let metricsRequest = [OSRequestInAppMessageClicked withAppId:OneSignalConfigManager.getAppId
withPlayerId:OneSignalUserManagerImpl.sharedInstance.pushSubscriptionId
let metricsRequest = [OSRequestInAppMessageClicked withAppId:appId
withPlayerId:pushSubscriptionId
withMessageId:message.messageId
forVariantId:message.variantId
forVariantId:variantId
withAction:action];

[OneSignalCoreImpl.sharedClient executeRequest:metricsRequest
Expand Down

0 comments on commit 1910593

Please sign in to comment.