Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 25 additions & 4 deletions ios/CodePush/CodePush.m
Original file line number Diff line number Diff line change
Expand Up @@ -583,7 +583,19 @@ - (void)saveFailedUpdate:(NSDictionary *)failedPackage
if ([[self class] isFailedHash:[failedPackage objectForKey:PackageHashKey]]) {
return;
}


// The server may return null for optional fields (e.g. assetDownloadUrl,
// bundleDiffBlobUrl), which NSJSONSerialization parses to NSNull. NSNull
// is not a property list type, so passing it to NSUserDefaults raises
// NSInvalidArgumentException ("Attempt to insert non-property list object").
NSMutableDictionary *sanitizedPackage = [NSMutableDictionary dictionaryWithCapacity:failedPackage.count];
for (NSString *key in failedPackage) {
id value = failedPackage[key];
if (value && ![value isKindOfClass:[NSNull class]]) {
sanitizedPackage[key] = value;
}
}

NSUserDefaults *preferences = [NSUserDefaults standardUserDefaults];
NSMutableArray *failedUpdates = [preferences objectForKey:FailedUpdatesKey];
if (failedUpdates == nil) {
Expand All @@ -594,9 +606,18 @@ - (void)saveFailedUpdate:(NSDictionary *)failedPackage
failedUpdates = [failedUpdates mutableCopy];
}

[failedUpdates addObject:failedPackage];
[preferences setObject:failedUpdates forKey:FailedUpdatesKey];
[preferences synchronize];
[failedUpdates addObject:sanitizedPackage];
@try {
[preferences setObject:failedUpdates forKey:FailedUpdatesKey];
[preferences synchronize];
} @catch (NSException *exception) {
// Defensive: if a future server response shape slips through the filter,
// clear the corrupt list so the app does not crash on every subsequent
// launch via initializeUpdateAfterRestart -> rollbackPackage.
CPLog(@"Failed to persist failed update list: %@. Clearing key.", exception);
[preferences removeObjectForKey:FailedUpdatesKey];
[preferences synchronize];
}
}

/*
Expand Down