开发喜地iOS版的时候,商品需要分享到微信、QQ、微博之类的社交网络。按照传统的方法,去各个官方平台的开发者网站,下载SDK,然后集成进去。这样做会导致最后打包的app体积增大不少,而且每个平台API使用方法都不统一,研究每个平台分享、登录功能,也浪费了不少时间。

于是为什么不封装一下呢?就像iOS Social framework。默认已经封装了下面几种社交网络:

#  SLServiceTypes.h
SOCIAL_EXTERN NSString *const SLServiceTypeTwitter NS_AVAILABLE(10_8, 6_0);
SOCIAL_EXTERN NSString *const SLServiceTypeFacebook NS_AVAILABLE(10_8, 6_0);
SOCIAL_EXTERN NSString *const SLServiceTypeSinaWeibo NS_AVAILABLE(10_8, 6_0);
SOCIAL_EXTERN NSString *const SLServiceTypeTencentWeibo NS_AVAILABLE(10_9, 7_0);
SOCIAL_EXTERN NSString *const SLServiceTypeLinkedIn NS_AVAILABLE(10_9, NA);

比如我们想分享到新浪微博:

if([SLComposeViewController isAvailableForServiceType:SLServiceTypeSinaWeibo]) {
    SLComposeViewController *controller = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeSinaWeibo];
    SLComposeViewControllerCompletionHandler myBlock = ^(SLComposeViewControllerResult result){
        if (result == SLComposeViewControllerResultCancelled) {
            NSLog(@"Cancelled");
        } else
        {
            NSLog(@"Done");
        }
        [controller dismissViewControllerAnimated:YES completion:Nil];
    };
    controller.completionHandler =myBlock;
    [controller setInitialText:@"Hellow world"];
    [controller addURL:[NSURL URLWithString:@"http://openshare.gfzj.us/"]];
    [controller addImage:[UIImage imageNamed:@"test.png"]];
    [self presentViewController:controller animated:YES completion:Nil];
}
else{
    NSLog(@"SinaWeibo UnAvailable");
}

如果想换成twitter,只需要把SLServiceTypeSinaWeibo换成SLServiceTypeTwitter就可以了。非常简单易用。

SLComposeViewController的分享并不用转到响应的社交网络客户端,只需要在系统中配置账号就可以了。对于其他类型的社交网络,比如微信暂时并没有集成,而且不支持「第三方登录」,不能设置appkey从而带个尾巴(也是一件好事,这样不用开发者去各自平台申请key了),也不能实现平台官方支持的分享类型。

Social framework是一个很好的设计,但是还是没有官方SDK提供的功能多。那我们能不能研究一下各个平台SDK和客户端通信的机制?然后对各个平台进行封装,这样就能想Social framework一样方便调用,又有官方SDK的功能?

实际上是可以的,而且已经实现了:https://github.com/100apps/openshare

OpenShare