• 封装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、分享到腾讯微博、新浪微博,要添加连接时,在内容后面填上链接。

  • 相关阅读:
    get请求乱码情况
    write()和prinln()的区别?
    校验码实现
    下载图片代码并且解析乱码
    servlet下根据相对路径找资源
    url-pattern配置
    获取网站资源 getResourceAsStream
    Servlet线程安全性
    http1.1 协议响应方面参数
    HTTP1.1协议请求方面参数
  • 原文地址:https://www.cnblogs.com/g-ios/p/4804029.html
Copyright © 2020-2023  润新知