本篇的主题有三个:
1、封装思想的介绍
2、我的封装代码
3、我在封装sharesdk(采用的是简洁版本)分享功能是碰到的问题,以及解决方法。
PS:其实这个我之前封装过一次,不过最近在重构项目时发现,当时封装的是如此的垃圾,所以在这里再来一次。欢迎大家批评纠错。
封装思想
因为这次封装的第三方SDK的功能,所以我采用延展的方式来进行封装。这样有以下两种好处:
1、 这样将第三方功能给模块化,在项目中方便查找和修改。
2、 很多第三方功能都是需要在appdelegae初始化,采用category只需在扩展的类中申明一个public方法,将初始化的代码放在相应的分类public中即可。最 后只需在appdelegate调用相应的功能模块初始化方法即可。
下面两张图,是我的延展类的形式和我在项目中封装两个第三方功能后,Appdelegate中的代码情况。
ShareSDK功能的封装
AppDelegate+ShareSDk.h
1 // 2 // AppDelegate+ShareSDk.h 3 // CDL_optimize 4 // 5 // Created by 王立广 on 15/9/11. 6 // Copyright (c) 2015年 王立广. All rights reserved. 7 // 8 9 #import "AppDelegate.h" 10 11 @interface AppDelegate (ShareSDk) 12 13 /** 14 * shareSDK分享 15 */ 16 - (void)addShareSDKWithapplication:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions; 17 18 19 /** 20 * 定制平台分享内容分享 21 */ 22 - (void)platShareView:(UIView *)view WithShareContent:(NSString *)shareContent WithShareUrlImg:(NSString *)shareUrlImg WithShareTitle:(NSString *)shareTitle WithShareId:(NSNumber *)shareId WithShareType:(kShareType *)shareType; 23 24 @end
AppDelegate+shareSDK.m
2 // AppDelegate+ShareSDk.m
3 // CDL_optimize
4 //
5 // Created by 王立广 on 15/9/11.
6 // Copyright (c) 2015年 王立广. All rights reserved.
7 //
8
9 #import "AppDelegate+ShareSDk.h"
10 #import <ShareSDK/ShareSDK.h>
11 #import <ShareSDKExtension/SSEShareHelper.h>
12 #import <ShareSDKUI/ShareSDK+SSUI.h>
13 #import <ShareSDKUI/SSUIShareActionSheetStyle.h>
14 #import <ShareSDKUI/SSUIShareActionSheetCustomItem.h>
15 #import <ShareSDK/ShareSDK+Base.h>
16 #import <ShareSDK/ShareSDK.h>
17 #import <TencentOpenAPI/QQApiInterface.h>
18 #import <TencentOpenAPI/TencentOAuth.h>
19 #import "WXApi.h"
20 #import "WeiboSDK.h"
21 #import <ShareSDKConnector/ShareSDKConnector.h>
22
23 //新浪微博
24 #define kSinaWeiboAPPKey @"*********"
25 #define kSinaWeiboAPPSecret @"************"
26
27 //腾讯微博
28 #define kTencentWeiboAPPKey @"*********"
29 #define kTencentWeiboAPPSecret @"**********"
30
31 //QQ
32 #define kQQAPPId @"**********"
33 #define kQQAPPKey @"**********"
34
35 //微信
36 #define kWechatAPPId @"*************"
37 #define kWechatAPPSecret @"************"
38
39
40 //下面这个枚举用来判断分享哪个模块,建议放在pch文件中
41 //typedef enum
42 //{
43 // shareDartbar,//镖吧分享
44 // shareInfo, //资讯分享
45 //
46 //}kShareType;
47
48
49 @implementation AppDelegate (ShareSDk)
50
51 - (void)addShareSDKWithapplication:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
52 {
53 //初始化配置
54 [self shareInit];
55
56
57
58 }
59
60 #pragma mark 分享平台初始化
61 - (void)shareInit
62 {
63 NSArray *platformArray = [NSArray array];
64
65 platformArray = @[@(SSDKPlatformTypeSinaWeibo),
66 @(SSDKPlatformTypeTencentWeibo),
67 @(SSDKPlatformTypeWechat),
68 @(SSDKPlatformTypeQQ),
69 ];
70
71
72 /**
73 * 构造分享平台
74 *
75 * @param platformType 分享平台
76 *
77 * @param onImport 此时如果要分享到一些客户端这个block块必须要填。
78 *
79 * @param onConfiguration appkey的相关配置
80 */
81 [ShareSDK registerApp:@"712aaee4e6ee" activePlatforms:platformArray
82 onImport:^(SSDKPlatformType platformType) {
83
84 switch (platformType)
85 {
86 case SSDKPlatformTypeWechat:
87 [ShareSDKConnector connectWeChat:[WXApi class]];
88 break;
89 case SSDKPlatformTypeQQ:
90 [ShareSDKConnector connectQQ:[QQApiInterface class] tencentOAuthClass:[TencentOAuth class]];
91 break;
92
93 default:
94 break;
95 }
96
97 }
98 onConfiguration:^(SSDKPlatformType platformType, NSMutableDictionary *appInfo) {
99
100
101
102 switch(platformType)
103 {
104 case SSDKPlatformTypeSinaWeibo:
105 //设置新浪微博应用信息,其中authType设置为使用SSO+web形式授权
106 [appInfo SSDKSetupSinaWeiboByAppKey:kSinaWeiboAPPKey appSecret:kSinaWeiboAPPSecret redirectUri:@"http://www.sharesdk.cn" authType:SSDKAuthTypeBoth];
107 break;
108
109 case SSDKPlatformTypeTencentWeibo:
110 //设置腾讯微博应用信息,其中authType只能使用web形式授权
111 [appInfo SSDKSetupTencentWeiboByAppKey:kTencentWeiboAPPKey appSecret:kTencentWeiboAPPSecret redirectUri:@"http://www.sharesdk.cn"];
112 break;
113
114 case SSDKPlatformTypeQQ:
115 //QQ平台
116 [appInfo SSDKSetupQQByAppId:kQQAPPId appKey:kQQAPPKey authType:SSDKAuthTypeBoth];
117 break;
118
119 case SSDKPlatformTypeWechat:
120 //微信平台
121 [appInfo SSDKSetupWeChatByAppId:kWechatAPPId appSecret:kWechatAPPSecret];
122 break;
123
124 }
125
126 }];
127
128 }
129
130
131 - (void)platShareView:(UIView *)view WithShareContent:(NSString *)shareContent WithShareUrlImg:(NSString *)shareUrlImg WithShareTitle:(NSString *)shareTitle WithShareId:(NSNumber *)shareId WithShareType:(kShareType *)shareType
132 {
133 NSString *shareUrl = nil;
134 if(shareType == shareInfo){
135
136 shareUrl = kInfoShareRequest(shareId);
137
138 }else{
139
140 shareUrl = kDartBarShareRequest(shareId);
141 }
142
143
144
145 //创建分享参数
146 NSMutableDictionary *shareParams = [NSMutableDictionary dictionary];
147
148 #pragma mark 公共分享参数
149 // [shareParams SSDKSetupShareParamsByText:@"分享内容"
150 // images:imageArray
151 // url:[NSURL URLWithString:@"http://mob.com"]
152 // title:@"分享标题"
153 // type:SSDKContentTypeImage];
154
155 #pragma mark 平台定制分享参数
156 //新浪微博
157 [shareParams SSDKSetupSinaWeiboShareParamsByText:[NSString stringWithFormat:@"%@ %@",shareContent,shareUrl] title:shareTitle image:kLoadNetImage(shareUrlImg) url:nil latitude:0 longitude:0 objectID:nil type:SSDKContentTypeAuto];
158
159 //腾讯微博
160 [shareParams SSDKSetupTencentWeiboShareParamsByText:[NSString stringWithFormat:@"%@ %@",shareContent,shareUrl] images:kLoadNetImage(shareUrlImg) latitude:0 longitude:0 type:SSDKContentTypeText];
161
162 //QQ空间
163 [shareParams SSDKSetupQQParamsByText:nil title:shareTitle url:[NSURL URLWithString:shareUrl] thumbImage:kLoadNetImage(shareUrlImg) image:kLoadNetImage(shareUrlImg) type:SSDKContentTypeWebPage forPlatformSubType:SSDKPlatformSubTypeQZone];
164
165 //QQ好友
166 [shareParams SSDKSetupQQParamsByText:nil title:shareTitle url:[NSURL URLWithString:shareUrl] thumbImage:kLoadNetImage(shareUrlImg) image:kLoadNetImage(shareUrlImg) type:SSDKContentTypeWebPage forPlatformSubType:SSDKPlatformSubTypeQQFriend];
167
168 //微信收藏
169 [shareParams SSDKSetupWeChatParamsByText:nil title:shareTitle url:[NSURL URLWithString:shareUrl] thumbImage:kLoadNetImage(shareUrlImg) image:nil musicFileURL:nil extInfo:nil fileData:nil emoticonData:kLoadNetImage(shareUrlImg) type:SSDKContentTypeWebPage forPlatformSubType:SSDKPlatformSubTypeWechatFav];
170
171 //微信好友
172 [shareParams SSDKSetupWeChatParamsByText:nil title:shareTitle url:[NSURL URLWithString:shareUrl] thumbImage:kLoadNetImage(shareUrlImg) image:kLoadNetImage(shareUrlImg) musicFileURL:nil extInfo:nil fileData:nil emoticonData:nil type:SSDKContentTypeWebPage forPlatformSubType:SSDKPlatformSubTypeWechatSession];
173
174 //微信朋友圈
175 [shareParams SSDKSetupWeChatParamsByText:nil title:shareTitle url:[NSURL URLWithString:shareUrl] thumbImage:kLoadNetImage(shareUrlImg) image:kLoadNetImage(shareUrlImg) musicFileURL:nil extInfo:nil fileData:nil emoticonData:nil type:SSDKContentTypeWebPage forPlatformSubType:SSDKPlatformSubTypeWechatTimeline];
176
177 #pragma mark 不跳过编辑界面的分享框
178 // [ShareSDK showShareActionSheet:view items:[ShareSDK activePlatforms] shareParams:shareParams onShareStateChanged:^(SSDKResponseState state, SSDKPlatformType platformType, NSDictionary *userData, SSDKContentEntity *contentEntity, NSError *error, BOOL end) {
179 //
180 // switch (state) {
181 // case SSDKResponseStateSuccess:
182 // {
183 // UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"分享成功"
184 // message:nil
185 // delegate:nil
186 // cancelButtonTitle:@"确定"
187 // otherButtonTitles:nil];
188 // [alertView show];
189 // break;
190 // }
191 // case SSDKResponseStateFail:
192 // {
193 // UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"分享失败"
194 // message:[NSString stringWithFormat:@"%@", error]
195 // delegate:nil
196 // cancelButtonTitle:@"确定"
197 // otherButtonTitles:nil];
198 // [alertView show];
199 // break;
200 // }
201 // case SSDKResponseStateCancel:
202 // {
203 // break;
204 // }
205 // default:
206 // break;
207 // }
208 // }];
209
210
211 #pragma mark 设置跳过分享编辑页面,直接分享的平台。
212 SSUIShareActionSheetController *sheet = [ShareSDK showShareActionSheet:view items:nil shareParams:shareParams onShareStateChanged:^(SSDKResponseState state, SSDKPlatformType platformType, NSDictionary *userData, SSDKContentEntity *contentEntity, NSError *error, BOOL end) {
213
214 switch (state)
215 {
216 case SSDKResponseStateSuccess:
217 {
218 UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"分享成功"message:nil delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil];
219 [alertView show];
220 break;
221 }
222 case SSDKResponseStateFail:
223 {
224 UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"分享失败"
225 message:[NSString stringWithFormat:@"%@",error] delegate:nil cancelButtonTitle:@"确定"otherButtonTitles:nil];
226 [alertView show];
227 break;
228 }
229 case SSDKResponseStateCancel:
230 {
231 break;
232 }
233 default:
234 break;
235 }
236 }];
237
238 //删除和添加平台示例
239 [sheet.directSharePlatforms addObject:@(SSDKPlatformTypeSinaWeibo)];
240 [sheet.directSharePlatforms addObject:@(SSDKPlatformTypeTencentWeibo)];
241
242
243 }
244
245
246
247
248
249
250
251
252 @end
PS:在代码里注释我都加上去了,个人感觉算是十分详细了,如果有问题,可以留下你的留言。
封装过程中碰到的问题以及解决方法
1、面板上一直显示不出来,相应的分享平台
在shareSDK的初始化方法中,有个onImport参数,如果分享的到app里,要传递这个参 数,要不然,在面板中不会显示这些平台的
2、新浪微博分享时,怎么才能将shareSdk给的界面里填的分享内容(这个界面默认是),分享到新浪微博里
只有分享的参数是公共的时候,在编辑页面修改的内容才会显示在分享的平台上。如果是给各个平台定制分享内容的话,在编辑页面修改的内容不会显示在分享的平台上,另外此时需要隐藏编辑界面,在代码中已注释。
3、在平台分享时我选择的是自动匹配分享类型,但我分享的内容没有图片时却分享不成功
选在分享类型的时候,能确定属于哪个类型,就选择哪个,如果实在确定不了就选自动
如果分享的内容有url的时候,一般选择SSDKContentTypeWebPage类型,如果不行在选自动。