封装ShareSDK中的分享功能封以及对类似第三方功能封装的心得【原创】

本篇的主题有三个:

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类型,如果不行在选自动。

 

4、分享到腾讯微博、新浪微博,要添加连接时,在内容后面填上链接。

原文地址:https://www.cnblogs.com/g-ios/p/4804029.html