Prévisualiser les liens embeddeds dans iOS App Like Facebook

J'essaie d'intégrer un aperçu de lien dans une application iOS de la même manière que Facebook:

entrez la description de l'image ici

J'essaie de find un moyen de saisir l'image la plus appropriée (et de lui renvoyer l'URL), le titre de la page et peut-être même une méta description et de la renvoyer à l'application, mais je ne suis pas sûr de la meilleure façon .

Il y a des API qui font cela, la plupart pour un prix, mais il semble que cela ne devrait pas être si difficile. Des pensées?

Vous pouvez le faire côté server ou côté client.

Côté server, vous pouvez utiliser un script (comme celui que vous avez construit) pour récupérer la <head> de la page HTML.

Côté client, vous pouvez download la page entière au format HTML (à titre d'exemple, Mashable est ~ 180KB) avec NSURLConnection ou une bibliothèque comme AFNetworking et l'parsingr avec un parsingur XML pour find la <head> .

Je vous suggère de créer un script de server, afin que vous puissiez le réutiliser dans d'autres projets ou sur d'autres plateforms.

J'allais pour la même cible et je l'ai fait du côté du client

J'ai utilisé ces pods

 pod 'HTMLReader' pod 'AFNetworking' 

Puis j'ai hérité de AFHTTPResponseSerializer et AFHTTPResponseSerializer returnné un object qui contient des détails de lien

 #import <UIKit/UIKit.h> @interface LinkDetails : NSObject @property (nonatomic,strong) NSSsortingng *linkURL; @property (nonatomic,strong) NSSsortingng *linkHOST; @property (nonatomic,strong) NSSsortingng *linkTitle; @property (nonatomic,strong) NSSsortingng *linkDescription; @property (nonatomic,strong) NSSsortingng *linkWebSiteName; @property (nonatomic,strong) NSSsortingng *linkImageUrl; @property (nonatomic,strong) UIImage *linkImage; @end 

C'est l'en-tête de ma réponseSerializer

 #import <AFNetworking/AFNetworking.h> @interface HTMLResponseSerializer : AFHTTPResponseSerializer @end 

et ceci est la mise en œuvre de ma réponseSerializer

 #import "HTMLResponseSerializer.h" #import <HTMLReader/HTMLReader.h> #import "LinkDetails.h" @implementation HTMLResponseSerializer -(id)responseObjectForResponse:(NSURLResponse *)response data:(NSData *)data error:(NSError *__autoreleasing _Nullable *)error{ NSSsortingng *responseStr = [[NSSsortingng alloc] initWithData:data encoding:NSUTF8SsortingngEncoding]; LinkDetails *details = [[LinkDetails alloc] init]; HTMLDocument *document = [HTMLDocument documentWithSsortingng:responseStr]; NSArray *metaTags = [document nodesMatchingSelector:@"meta"]; for (HTMLElement *metaTag in metaTags) { if ([[[metaTag atsortingbutes] objectForKey:@"property"] isEqualToSsortingng:@"og:url"] || [[[metaTag atsortingbutes] objectForKey:@"property"] isEqualToSsortingng:@"twitter:url"]) { NSLog(@"%@",[[metaTag atsortingbutes] objectForKey:@"content"]); details.linkURL = [[metaTag atsortingbutes] objectForKey:@"content"]; } if ([[[metaTag atsortingbutes] objectForKey:@"property"] isEqualToSsortingng:@"og:title"] || [[[metaTag atsortingbutes] objectForKey:@"property"] isEqualToSsortingng:@"twitter:title"]) { NSLog(@"%@",[[metaTag atsortingbutes] objectForKey:@"content"]); details.linkTitle = [[metaTag atsortingbutes] objectForKey:@"content"]; } if ([[[metaTag atsortingbutes] objectForKey:@"property"] isEqualToSsortingng:@"og:description"] || [[[metaTag atsortingbutes] objectForKey:@"property"] isEqualToSsortingng:@"twitter:description"]) { NSLog(@"%@",[[metaTag atsortingbutes] objectForKey:@"content"]); details.linkDescription = [[metaTag atsortingbutes] objectForKey:@"content"]; } if ([[[metaTag atsortingbutes] objectForKey:@"property"] isEqualToSsortingng:@"og:image"] || [[[metaTag atsortingbutes] objectForKey:@"property"] isEqualToSsortingng:@"twitter:image"]) { NSLog(@"%@",[[metaTag atsortingbutes] objectForKey:@"content"]); details.linkImageUrl = [[metaTag atsortingbutes] objectForKey:@"content"]; } if ([[[metaTag atsortingbutes] objectForKey:@"property"] isEqualToSsortingng:@"og:site_name"] || [[[metaTag atsortingbutes] objectForKey:@"property"] isEqualToSsortingng:@"twitter:site_name"]) { NSLog(@"%@",[[metaTag atsortingbutes] objectForKey:@"content"]); details.linkWebSiteName = [[metaTag atsortingbutes] objectForKey:@"content"]; } } if(!details.linkTitle){ details.linkTitle = [document firstNodeMatchingSelector:@"title"].textContent; } if(!details.linkDescription){ details.linkTitle = [document firstNodeMatchingSelector:@"description"].textContent; } if (!details.linkHOST) { details.linkHOST = [response.URL host]; } if (!details.linkURL) { details.linkURL = [response.URL absoluteSsortingng]; } return details; } @end 

N'oubliez pas d'assigner responseSerlializer à votre custom

Cela a très bien fonctionné pour moi