SDWebImage / SDWebImageLinkPlugin

A SDWebImage loader plugin, to support load rich link image with LinkPresentation framework
MIT License
17 stars 2 forks source link

Issue with LPLinkMetadata returned with sd_setImageWithURL's completion block NSURL #3

Closed inPhilly closed 4 years ago

inPhilly commented 4 years ago

I think there is some sort of problem with the imageURL.sd_linkMetadata in sd_setImageWithURL's completion block;

        __weak typeof(self) weakSelf = self;

        [SDImageLoadersManager.sharedManager addLoader:SDImageLinkLoader.sharedLoader];
        SDWebImageManager.defaultImageLoader = SDImageLoadersManager.sharedManager;

        [self.imageView
            sd_setImageWithURL:linkURL
            placeholderImage:nil
            options:SDWebImageFromLoaderOnly
            completed:^(UIImage *sdImage, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {

                __strong typeof(self) strongSelf = weakSelf;
                if (strongSelf != nil) {
                    LPLinkMetadata *fetchedLinkMetadata = imageURL.sd_linkMetadata;
                       if (fetchedLinkMetadata != nil) {
                           [Link storeMetadata:fetchedLinkMetadata forURLString:strongSelf.linkDefaultFollowURL synchronize:YES];
                     }
                }
        }];
+ (void)storeMetadata:(LPLinkMetadata*)linkMetadata forURLString:(NSString*)urlString synchronize:(BOOL)synchronize  API_AVAILABLE(ios(13.0)) {

    NSData *linkMetadataArchived = [NSKeyedArchiver archivedDataWithRootObject:linkMetadata requiringSecureCoding:YES error:nil];
    NSMutableDictionary *linkMetadatas = [[LINK_PRESENTATION_METADATA_DEFAULTS objectForKey:LINK_PRESENTATION_METADATA_DICT_NAME] mutableCopy];
    if (linkMetadatas == nil) {
        linkMetadatas = [[NSMutableDictionary alloc] init];
    }

    linkMetadatas[urlString] = linkMetadataArchived;
    [LINK_PRESENTATION_METADATA_DEFAULTS setObject:linkMetadatas forKey:LINK_PRESENTATION_METADATA_DICT_NAME];
    if (synchronize) {
        [LINK_PRESENTATION_METADATA_DEFAULTS synchronize];
    }
}

Get this error:

+[Link storeMetadata:forURLString:synchronize:] (Line 721) - linkMetadatas[urlString]:{length = 41875, bytes = 0x62706c69 73743030 d4010203 04050607 ... 00000000 0000a285 } 2019-11-22 15:02:42.954465-0500 MyActionExtension[49857:5092204] [User Defaults] CFPrefsPlistSource<0x2804adc00> (Domain: group.com.mycompany.myapp, User: kCFPreferencesCurrentUser, ByHost: No, Container: (null), Contents Need Refresh: No): Attempting to store >= 4194304 bytes of data in CFPreferences/NSUserDefaults on this platform is invalid. This is a bug in MyActionExtension or a library it uses

Previously, I haven't had a problem using this method when I have valid LPLinkMetadata.

dreampiggy commented 4 years ago

Try version 0.2.0, which supports caching LPLinkMetadata, actually the first usable version.