轻量级分享框架源码与扩展说明

介绍

最近花了一点时间写了一个轻量级的分享框架ThinShareSDK,源码放在github上。本篇主要介绍一下整体的设计以及使用者怎么在原有的基础上简单的扩展。


接口说明

分享主要分两个步骤

  1. 构建模型
  2. 生成分享界面并分享
    1
    2
    3
    id model = [OKWShareSDK webContentTitle:@"分享链接" description:@"测试分享" webpageUrl:@"www.baidu.com" thumbImageData:data];   //构建Model

    [OKWShareSDK defaultShareMenu:@"title" model:model];

默认一共有7种分享,QQ好友QQ空间微信好友朋友圈微信收藏短信邮件。这些是可选的。

1
2
3
4
5
id model = [OKWShareSDK webContentTitle:@"分享链接" description:@"测试分享" webpageUrl:@"www.baidu.com" thumbImageData:data];   //构建Model

NSArray *typeArray = [OKWShareSDK getShareListType:OKWShareTypeQQ,OKWShareTypeWeChatFav,OKWShareTypeSMS ,nil]; //构建分享类型

[OKWShareSDK defaultOptionShareMenu:@"title" model:model types:typeArray];

我会根据构建Model的种类与分享的类型来判断把哪种类型的信息分享到哪里。


如果想要定制界面而不用默认的界面也分两个步骤

  1. 构建模型
  2. 调用分享接口
    1
    2
    3
    id model = [OKWShareSDK webContentTitle:@"分享链接" description:@"测试分享" webpageUrl:@"www.baidu.com" thumbImageData:data];   //构建Model

    [OKWShareSDK share:OKWShareTypeWeChatSession model:model]; //分享到微信好友

提供分享功能,界面自由定制,然后直接调用提供的方法即可。


关于分享后回调,在静态库中统一回调给OKWShareDelegate这个类,所有的回调操作统一在这里处理。


分享基类

静态库中有一个OKWBaseShare的类,这是分享的基类,所有种类的分享功能类都继承此类,OKWBaseShare提供基础分享接口,分享统一调用OKWBaseShare提供的接口,然后根据多态的特性,由OKWBaseShare决定到底哪一个子类来执行此功能。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@interface OKWBaseShare : NSObject
/**
* 发送链接消息
*
* @param content 内容
* @param type 分享到哪里
*/
+(void)sendLinkMessage:(OKWShareContent *)content messageType:(OKWShareType)type;
/**
* 发送文本消息
*
* @param content 内容
* @param type 分享到哪里
*/
+(void)sendTextMessage:(OKWShareContent *)content messageType:(OKWShareType)type;
@end

分享数据模型

分享的数据统一由OKWShareContent类管理,构建数据模型时生成的Model就是OKWShareContent类型,OKWShareContent里有一个OKWShareDataType枚举类型成员变量,当构建模型时用OKWShareDataType来区别应该构建哪种类型数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
typedef NS_ENUM(NSUInteger,OKWShareDataType) {
OKWShareWabURL,
OKWShareText
};
@interface OKWShareContent : NSObject

@property (nonatomic,copy) NSString *title; //标题
@property (nonatomic,copy) NSString *description; //描述信息
@property (nonatomic,copy) NSString *webpageUrl; //wap链接
@property (nonatomic,copy) NSData *thumbImageData; //缩略图数据
@property (nonatomic) NSString *text; //文本信息

@property (nonatomic) OKWShareDataType dataType; //内容类型
@end


扩展

扩展分享数据类型

默认只有分享链接与文本,如果想分享一个图片信息就需要在原有的基础上进行扩展

  1. OKWShareSDK中提供一个构建图片数据模型的方法
    参考
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    /**
    * 创建分享web的内容
    *
    * @param title 分享的链接
    * @param description 分享的描述
    * @param pageUrl 分享的URL
    * @param thumbImageData 分享的缩略图
    *
    * @return 分享的数据模型
    */
    +(id)webContentTitle:(NSString *)title description:(NSString *)description webpageUrl:(NSString *)pageUrl thumbImageData:(NSData *)thumbImageData;
    /**
    * 创建分享文本内容
    *
    * @param content 分享的内容
    *
    * @return 分享的数据模型
    */
    +(id)textContent:(NSString *)content;

2.在OKWBaseShare中提供发送图片信息的接口然后在其子类中实现该方法
参考

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
* 发送链接消息
*
* @param content 内容
* @param type 分享到哪里
*/
+(void)sendLinkMessage:(OKWShareContent *)content messageType:(OKWShareType)type;
/**
* 发送文本消息
*
* @param content 内容
* @param type 分享到哪里
*/
+(void)sendTextMessage:(OKWShareContent *)content messageType:(OKWShareType)type;

3.在OKWShareContent添加数据类型的种类,并且在构建数据模型时给dataType进行赋值
参考

1
2
3
4
typedef NS_ENUM(NSUInteger,OKWShareDataType) {
OKWShareWabURL,
OKWShareText
};

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
+(id)webContentTitle:(NSString *)title description:(NSString *)description webpageUrl:(NSString *)pageUrl thumbImageData:(NSData *)thumbImageData
{
OKWShareContent *shareContent = [OKWShareContent new];
shareContent.title = title;
shareContent.description = description;
shareContent.webpageUrl = pageUrl;
shareContent.thumbImageData = thumbImageData;
shareContent.dataType = OKWShareWabURL;
return shareContent;

}
+(id)textContent:(NSString *)content
{
OKWShareContent *shareContent = [OKWShareContent new];
shareContent.text = content;
shareContent.dataType = OKWShareText;
return shareContent;
}

4.在OKWShareSDK实现文件中实现分享的方法
参考

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
+(void)share:(OKWShareType)type model:(id)model
{
OKWShareContent *shareModel = model;
switch (shareModel.dataType) {
case OKWShareWabURL:
[OKWShareSDK shareLink:type model:model];
break;
case OKWShareText:
[OKWShareSDK shareLText:type model:model];
break;
default:
break;
}
}
+(void)shareLink:(OKWShareType)type model:(id)model
{
[OKWBaseShare sendLinkMessage:model messageType:type];
}
+(void)shareLText:(OKWShareType)type model:(id)model
{
[OKWBaseShare sendTextMessage:model messageType:type];
}

5.这样原有的分享就可以根据构建的数据模型的类型来进行图片分享。


扩展分享种类

默认有七种分享如果想添加一种分享就要扩展分享种类
1.在OKWShareSDK实现文件中有一个NSDictional的类别。在里面添加需要扩展的名称和图片的名称。将图片资源放在OKWShareResource.bundle中。
参考

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
@implementation NSDictionary (defaultShareData)
+(id)defaultShareData;
{
NSMutableDictionary *shareData = [NSMutableDictionary new];

NSDictionary *weChatSession = @{@"image":@"OKWShareResource.bundle/wechat_friends",@"title":@"微信好友"};
[shareData addEntriesFromDictionary:@{[NSNumber numberWithUnsignedInteger:OKWShareTypeWeChatSession]:weChatSession}];

NSDictionary *weChatTimeLine = @{@"image":@"OKWShareResource.bundle/wechant_timeline",@"title":@"朋友圈"};
[shareData addEntriesFromDictionary:@{[NSNumber numberWithUnsignedInteger:OKWShareTypeWeChatTimeLine]:weChatTimeLine}];

NSDictionary *weChatFav = @{@"image":@"OKWShareResource.bundle/wechat_fav",@"title":@"微信收藏"};
[shareData addEntriesFromDictionary:@{[NSNumber numberWithUnsignedInteger:OKWShareTypeWeChatFav]:weChatFav}];

NSDictionary *QQ = @{@"image":@"OKWShareResource.bundle/qq_friends",@"title":@"QQ好友"};
[shareData addEntriesFromDictionary:@{[NSNumber numberWithUnsignedInteger:OKWShareTypeQQ]:QQ}];

NSDictionary *QQSpace = @{@"image":@"OKWShareResource.bundle/qq_space",@"title":@"QQ空间"};
[shareData addEntriesFromDictionary:@{[NSNumber numberWithUnsignedInteger:OKWShareTypeQQSpace]:QQSpace}];

NSDictionary *mail = @{@"image":@"OKWShareResource.bundle/mail",@"title":@"邮件"};
[shareData addEntriesFromDictionary:@{[NSNumber numberWithUnsignedInteger:OKWShareTypeMail]:mail}];

NSDictionary *SMS = @{@"image":@"OKWShareResource.bundle/message",@"title":@"短信"};
[shareData addEntriesFromDictionary:@{[NSNumber numberWithUnsignedInteger:OKWShareTypeSMS]:SMS}];

return shareData;
}
@end

2.在OKWShareSDK中添加分享种类的枚举值
参考

1
2
3
4
5
6
7
8
9
typedef NS_ENUM(NSUInteger,OKWShareType) {
OKWShareTypeWeChatSession = 1000, //微信好友
OKWShareTypeWeChatTimeLine, //微信朋友圈
OKWShareTypeWeChatFav, //微信收藏
OKWShareTypeQQ, //QQ
OKWShareTypeQQSpace, //QQ空间
OKWShareTypeMail, //邮件
OKWShareTypeSMS //短信
};

3.创建要分享功能的类,继承OKWBaseShare,并实现要OKWBaseShare的方法。具体请参考OKWWeChatShareOKWQQShare类方法的实现。
4.在OKWBaseShare实现文件中添加新增分享种类的判断。
参考

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
+(void)sendTextMessage:(OKWShareContent *)content messageType:(OKWShareType)type
{
switch (type) {
case OKWShareTypeWeChatFav:
case OKWShareTypeWeChatTimeLine:
case OKWShareTypeWeChatSession:
[OKWWeChatShare sendTextMessage:content messageType:type];
break;
case OKWShareTypeMail:
case OKWShareTypeSMS:
[OKWSystemShare sendTextMessage:content messageType:type];
break;
case OKWShareTypeQQ:
case OKWShareTypeQQSpace:
[OKWQQShare sendTextMessage:content messageType:type];
break;
default:
break;
}
}