预览iOS应用程序中的embedded式链接,如Facebook

我试图在iOS应用程序中embedded链接预览,就像Facebook所做的一样:

在这里输入图像说明

我试图想出一个方法来获取最合适的图像(并返回到它的url),页面标题,甚至可能是一个元描述,并将其传递回应用程序,但我不确定最好的方法。

有API是这样做的,最重要的是价格,但似乎不应该这么难。 有什么想法吗?

你可以做这个服务器端或客户端。

在服务器端,你可以使用一个脚本(比如你创build的脚本)来获取HTML页面的<head>标签。

在客户端,您可以使用NSURLConnection或类似AFNetworking的库,将整个页面作为HTML(例如Mashable是〜180KB)下载,并使用XMLparsing器进行parsing,以find<head>标签。

我build议你创build一个服务器脚本,这样你可以在其他项目或其他平台上重复使用它。

我是为了同样的目标而在客户端做的

我用这些豆荚

 pod 'HTMLReader' pod 'AFNetworking' 

然后,我从AFHTTPResponseSerializerinheritance并返回一个包含链接详细信息的对象

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

这是我的responseSerializer头

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

这是我的responseSerializer的实现

 #import "HTMLResponseSerializer.h" #import <HTMLReader/HTMLReader.h> #import "LinkDetails.h" @implementation HTMLResponseSerializer -(id)responseObjectForResponse:(NSURLResponse *)response data:(NSData *)data error:(NSError *__autoreleasing _Nullable *)error{ NSString *responseStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; LinkDetails *details = [[LinkDetails alloc] init]; HTMLDocument *document = [HTMLDocument documentWithString:responseStr]; NSArray *metaTags = [document nodesMatchingSelector:@"meta"]; for (HTMLElement *metaTag in metaTags) { if ([[[metaTag attributes] objectForKey:@"property"] isEqualToString:@"og:url"] || [[[metaTag attributes] objectForKey:@"property"] isEqualToString:@"twitter:url"]) { NSLog(@"%@",[[metaTag attributes] objectForKey:@"content"]); details.linkURL = [[metaTag attributes] objectForKey:@"content"]; } if ([[[metaTag attributes] objectForKey:@"property"] isEqualToString:@"og:title"] || [[[metaTag attributes] objectForKey:@"property"] isEqualToString:@"twitter:title"]) { NSLog(@"%@",[[metaTag attributes] objectForKey:@"content"]); details.linkTitle = [[metaTag attributes] objectForKey:@"content"]; } if ([[[metaTag attributes] objectForKey:@"property"] isEqualToString:@"og:description"] || [[[metaTag attributes] objectForKey:@"property"] isEqualToString:@"twitter:description"]) { NSLog(@"%@",[[metaTag attributes] objectForKey:@"content"]); details.linkDescription = [[metaTag attributes] objectForKey:@"content"]; } if ([[[metaTag attributes] objectForKey:@"property"] isEqualToString:@"og:image"] || [[[metaTag attributes] objectForKey:@"property"] isEqualToString:@"twitter:image"]) { NSLog(@"%@",[[metaTag attributes] objectForKey:@"content"]); details.linkImageUrl = [[metaTag attributes] objectForKey:@"content"]; } if ([[[metaTag attributes] objectForKey:@"property"] isEqualToString:@"og:site_name"] || [[[metaTag attributes] objectForKey:@"property"] isEqualToString:@"twitter:site_name"]) { NSLog(@"%@",[[metaTag attributes] objectForKey:@"content"]); details.linkWebSiteName = [[metaTag attributes] 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 absoluteString]; } return details; } @end 

不要忘记将responseSerlializer分配给您的自定义的

这对我很有帮助