LOCATION BEACON - Read a JSON file


#1

Hello!
Currently, I am developing an application that reads the storage of a location beacon in which I inserted JSON content. In JSON content, I save an image in Base64. But, when an image is too big, it is not displayed.

To get the Base64 of an image, I use this function:

- (NSString *)encodeToBase64String:(UIImage *)image {
    return [UIImagePNGRepresentation(image) base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithCarriageReturn];
}

So, I save the JSON, which is below, in the beacon with the application for which Estimote gives the source code on its GitHub:

{
    "name" : "Tour des 4 sergents",
    "image" : "iVBORw0KGgoAAAANSUhEUgAABdw ... cXkO+kTO/Mi+WFcyHY+yV2rq6M/ghgYjATkCi5sDN",
    "description" : "La tour de la Lanterne (xve siècle) est, avec la tour Saint-Nicolas et la tour de la Chaîne, l'une des trois tours du front de mer de La Rochelle, vestiges des fortifications médiévales qui protégeaient le port. Elle est également connue sous les noms de tour du Garrot, tour des Prêtres et tour des Quatre Sergents. Elle a été classée monument historique le 17 février 1879. Une ordonnance du corps de la ville datant de 1209 mentionne déjà l'existence d'une « tour de la Chaîne », n'ayant aucun rapport avec l'actuelle tour de la Chaîne, mais ayant la même fonction. En effet, celle-ci barrait alors l'entrée du port primitif de La Rochelle situé sur le ruisseau du Lafond, et fut par la suite dénommée « tour du Garrot » du nom de l'appareil de levage qui servait à désarmer les vaisseaux avant que ceux-ci puissent entrer dans le port. Le capitaine de tour était désigné comme étant le « désarmeur des nefs ». Selon Claude Masse, le nouvel ouvrage, commencé en 1445, incorpora par chemisage cette ancienne tour. Il ne fut achevé que 23 ans plus tard (1468), grâce aux deniers personnels du maire de l'époque, Jean Mérichon. À l'origine, elle formait l'angle sud-ouest de l'enceinte médiévale et sa tourelle à lanterne servait de phare et d'amer. Elle se situait à cette époque au bord de l'eau. Conservé lors du rasement des fortifications en 1629, elle fut ensuite intégrée dans la nouvelle enceinte de 1689. De 1900 à 1914, on entreprend la restauration de la tour. Suivant les projets de Juste Lisch, puis sous la direction d'Albert Ballu, la restauration lui redonne son aspect médiéval. Lors des rénovations de 2014-2015, deux gargouilles ont été recréées à l'effigie des dessinateurs et caricaturistes Cabu et Wolinski3."
}

And when I read the content with my application, the image is not displayed. I use the following function to decode base64:

- (UIImage *)decodeBase64ToImage:(NSString *)strEncodeData {
    NSData *data = [[NSData alloc]initWithBase64EncodedString:strEncodeData options:NSDataBase64DecodingIgnoreUnknownCharacters];
    return [UIImage imageWithData:data];
}

However, when I reduce the image (for example, 60x80), it is displayed well. So is this because the Base64 of a large image is too long to save to a JSON file? You should know that when I display the base64 of the image directly, everything is recovered but when I want to display the image, it should not be well interpreted.
Here is an extract of my code that read the content of the beacon:

- (void)estDeviceConnectionDidSucceed:(ESTDeviceConnectable *)device {
    NSLog(@"SUCCESS : Beacon connecting!");
    self.status = StatusConnected;
    [self updateUI];
    NSLog(@"STATE : Reading storage.....");
    [self.selectedBeacon.storage readStorageDictionaryWithCompletion:^(NSDictionary * _Nullable value, NSError * _Nullable error) {
        if (!error) {
            self.status = StatusRead;
            [self updateUI];
            NSString *key = value.allKeys[0];
            self.storageRead = value[key];
            //NSLog(@"SUCCESS : Informations read : %@",self.storageRead);
            
            NSData *jsonData = [self.storageRead dataUsingEncoding:NSUTF8StringEncoding];
            NSError *e;
            NSDictionary *dictJSON = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&e];
            
            NSString *nameJSON = [dictJSON objectForKey:@"name"];
            NSString *imageJSON = [dictJSON objectForKey:@"image"];
            NSString *descriptionJSON = [dictJSON objectForKey:@"description"];
            
            self.title = nameJSON;
            
            self.storageReadImage = [self decodeBase64ToImage:imageJSON];
            self.ivBeaconImage.image = self.storageReadImage;
            
            self.tvBeaconDescription.text = descriptionJSON;
            [self.selectedBeacon disconnect];
            
        }
        else {
            NSLog(@"ERROR : Read failed : %@", error.localizedDescription);
        }
    }];
}