zoukankan      html  css  js  c++  java
  • 友盟分享小结

    因之前都写在了 AppDelegate 类中,看起来过于臃肿,此次基于友盟分享重新进行了一次优化,此次分享内容基于已经成功集成 SDK 后 code 层级部分.
    注:此次分享基于 SDK 6.9.3,若版本相差较大,仅供参考.
    友盟分享官方文档: https://developer.umeng.com/docs/66632/detail/66825

    Github: https://github.com/survivorsfyh/YHSampleCode/tree/master/UMShare 

    首先,为分享单独创建了一个类,为了可以更加清晰的划分其内容部分.

    注:创建该子类后,切记将其头文件引入到 AppDelegate 类中.

    #import "AppDelegate.h"
    // Share
    #import "AppDelegate+UMShare.h"
    

    其次,校验项目工程中是否配置正确相关参数.

    再其次,便是具体 code 相关内容,将申请的相关 key 预先设置成宏准备好,方便使用和变更时进行调用和更改.
    一.声明类中(.h)
    1.将初始化的相关接口配置优先声明准备好,并在 AppDelegate 类中调用.
    2.将调用分享的具体执行方法接口预留好,在需要调用的地方调用该方法.
    步骤一:

    #import "AppDelegate.h"
    #import <UMShare/UMShare.h>
     
    @interface AppDelegate (UMShare)
     
    /**
     UMShare 注册
     @param launchOptions 应用程序
     */
    - (void)registerUMShare:(NSDictionary *)launchOptions;
     
    /**
     调用友盟相关方法
     
     @param controller 当前视图控件
     */
    - (void)getUMShareRelevantMethodsWithCurrentViewController:(UIViewController *)controller;
     
    /**
     调用友盟相关方法(带参)
     
     @param controller  当前视图控件
     @param data        参数(shareType:分享类型(默认:base,若需要自定义则将 base 变更为其它) & descr:备注说明文字 & webpageUrl:跳转链接地址)
     */
    - (void)getUMShareRelevantMethodsWithCurrentViewController:(UIViewController *)controller AndParameter:(NSMutableDictionary *)data;
     
    @end  

    步骤二:

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        // Override point for customization after application launch.
        
        // Share
        [self registerUMShare:launchOptions];
        // Root ViewController
        [self setRootViewController];
        
        // CoreData
        [[CoreDataManager sharedCoreDataManager] managedObjectContext];
        
        return YES;
    }
    

    二.实现类中(.m)
    1.引入所需的头文件
    2.实现声明类中接口
    3.实现具体方法和代理事件

    #import "AppDelegate+UMShare.h"
    #import <UMShare/UMShare.h>
    #import <UMCommon/UMCommon.h>
    #import <UMCommonLog/UMCommonLogHeaders.h>
    #import <UShareUI/UShareUI.h>
     
    @implementation AppDelegate (UMShare)
     
    /**
     UMShare 注册
     
     @param launchOptions 应用程序
     */
    - (void)registerUMShare:(NSDictionary *)launchOptions {
        // UMConfigure 通用设置,请参考SDKs集成做统一初始化。
        // 以下仅列出U-Share初始化部分
        [self configUSharePlatforms];
        [self confitUShareSettings];
        
        BOOL isSetLog;
    #ifdef DEBUG
        isSetLog = 0;
    #else
        isSetLog = 1;
    #endif
        
        // Log
        [UMCommonLogManager setUpUMCommonLogManager];
        [UMConfigure setLogEnabled:isSetLog];
        [UMConfigure initWithAppkey:UMSHARE_APPKEY channel:@"App Store"];
    }
     
    /**
     共享平台配置
     */
    - (void)configUSharePlatforms {
        /*
         设置微信的 appKey 和 appSecret
         
         AppID:     xxxxxx
         AppSecret: xxxxxx
        申请相关参数的 URL:https://open.weixin.qq.com/
        腾讯相关 URL:https://open.tencent.com
         */
        [[UMSocialManager defaultManager] setPlaform:UMSocialPlatformType_WechatSession
                                              appKey:@"您项目申请的 key 值"
                                           appSecret:@"您项目申请的 Secret 值"
                                         redirectURL:@"您的官网门户链接即可"];
        
        /*
         设置分享到 QQ 互联的 appID
         U-Share SDK为了兼容大部分平台命名,统一用appKey和appSecret进行参数设置,而QQ平台仅需将appID作为U-Share的appKey参数传进即可。
         */
        [[UMSocialManager defaultManager] setPlaform:UMSocialPlatformType_QQ
                                              appKey:@"您项目申请的 key 值"  /*设置QQ平台的appID*/ 
                                           appSecret:@"您项目申请的 Secret 值"    /*QQ平台为appKey*/   
                                         redirectURL:@"您的官网门户链接即可"];// aC5dY6D15Uz5wCv9
        
        /*
         * 移除相应平台的分享,如微信收藏
         */
    //    [[UMSocialManager defaultManager] removePlatformProviderWithPlatformTypes:@[@(UMSocialPlatformType_WechatFavorite)]];
    }
     
    /**
     共享平台设置
     */
    - (void)confitUShareSettings {
        [UMSocialGlobal shareInstance].isClearCacheWhenGetUserInfo = YES;
        /*
         * 打开图片水印
         */
    //    [UMSocialGlobal shareInstance].isUsingWaterMark = YES;
        
        /*
         * 关闭强制验证https,可允许http图片分享,但需要在info.plist设置安全域名
         <key>NSAppTransportSecurity</key>
         <dict>
         <key>NSAllowsArbitraryLoads</key>
         <true/>
         </dict>
         */
    //    [UMSocialGlobal shareInstance].isUsingHttpsWhenShareContent = NO;
    }
     
     
     
    /**
     调用友盟相关方法
     @param controller 当前视图控件
     */
    - (void)getUMShareRelevantMethodsWithCurrentViewController:(UIViewController *)controller {
        // 设置预定义平台(即:需要分享至哪些平台就将其枚举值中的参数添加进数组中)
        NSArray *sharePlatforms = @[@(UMSocialPlatformType_WechatSession),
                                    @(UMSocialPlatformType_WechatTimeLine),
                                    @(UMSocialPlatformType_QQ)];
        [UMSocialUIManager setPreDefinePlatforms:sharePlatforms];
        
        kWeakSelf(self);
        // 显示分享面板
        [UMSocialUIManager showShareMenuViewInWindowWithPlatformSelectionBlock:^(UMSocialPlatformType platformType, NSDictionary *userInfo) {
            [weakself shareWebPageToPlatformType:platformType AndCurrentViewController:controller];
            
    //        [weakself checkUserInfoForPlatform:platformType AndCurrentViewController:controller];
        }];
    }
     
     
     
    /**
     校验用户信息平台
     @param platformType 平台类型
     */
    - (void)checkUserInfoForPlatform:(UMSocialPlatformType)platformType AndCurrentViewController:(UIViewController *)controller {
        kWeakSelf(self);
        [[UMSocialManager defaultManager] getUserInfoWithPlatform:platformType currentViewController:nil completion:^(id result, NSError *error) {
            // 当前设备 App 安装检测    [kApplication openURL:[NSURL URLWithString:@"weixin://"]] && [kApplication openURL:[NSURL URLWithString:@"mqq://"]]
            if ([kApplication openURL:[NSURL URLWithString:@"mqq://"]] && [kApplication openURL:[NSURL URLWithString:@"weixin://"]]) {// WeChat    @"weixin://"
                [weakself shareWebPageToPlatformType:platformType AndCurrentViewController:controller];
            }
            else {
                UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示"
                                                                message:@"当前设备未安装该程序"
                                                               delegate:nil
                                                      cancelButtonTitle:@"确定"
                                                      otherButtonTitles:nil, nil];
                [alert show];
                return;
            }
        }];
        
    }
     
     
     
    /**
     分享内容设置(网页)
    注:此处包含多种分享种类样式的,具体根据需求选择具体方法;
    方法实现大同小异,传递所需的参数和数据即可;
    具体详见友盟接口中所对应的方法;
    此 demo 是以分享网页链接为例,简单的图文介绍,点击后跳转进入预先设置好的 URL 链接.
     @param platformType 平台类型(网页)
     */
    - (void)shareWebPageToPlatformType:(UMSocialPlatformType)platformType AndCurrentViewController:(UIViewController *)controller {
        // 创建分享消息对象
        UMSocialMessageObject *messageObj = [UMSocialMessageObject messageObject];
        // 创建网页内容对象
    //    NSString *thumURL = @"http://xxx.png";// 注:URL 链接地址必须为 https,具体详见 confitUShareSettings 方法中注释掉的 code 部分
        NSDictionary *infoPlist = [[NSBundle mainBundle] infoDictionary];
        NSString *icon = [[infoPlist valueForKeyPath:@"CFBundleIcons.CFBundlePrimaryIcon.CFBundleIconFiles"] lastObject];
        UIImage *thumImg = [UIImage imageNamed:icon];
        UMShareWebpageObject *shareObj = [UMShareWebpageObject shareObjectWithTitle:@"分享标题" descr:@"分享内容描述" thumImage:thumImg];// 此处 thumImage 字段以当前 App 图标为例,若更换其它图片方法如此,支持 UIImage 或者 NSData 类型或者 image_url.
        // 设置网页地址
        shareObj.webpageUrl = @"http://xxxxxx";// 点击后欲跳转的 URL 链接地址
        // 分享消息对象设置分享内容对象
        messageObj.shareObject = shareObj;
     
        // 调用分享接口
        kWeakSelf(self);
        [[UMSocialManager defaultManager] shareToPlatform:platformType messageObject:messageObj currentViewController:controller completion:^(id result, NSError *error) {
            if (error) {
                NSLog(@"************Share fail with error *********
    Error:%@", error);
            }
            else {
                NSLog(@"************UMShare************
    Response data is:%@", result);
            }
     
            // Callback
            [weakself callbackAlterStateWithError:error];
        }];
    }
     
    /**
     分享内容设置(网页)
    注:此处包含多种分享种类样式的,具体根据需求选择具体方法;
    方法实现大同小异,传递所需的参数和数据即可;
    具体详见友盟接口中所对应的方法;
    此 demo 是以分享网页链接为例,简单的图文介绍,点击后跳转进入预先设置好的 URL 链接.
     @param platformType 平台类型(网页)
     @param controller 当前控件视图
     @param dataSource 分享数据
     */
    - (void)shareWebPageToPlatformType:(UMSocialPlatformType)platformType AndCurrentViewController:(UIViewController *)controller AndShareInfoData:(NSMutableDictionary *)dataSource {
        /** 分享类型(base 则分享默认内容)*/
        NSString *shareType = [NSString stringWithFormat:@"%@", [dataSource objectForKey:@"shareType"]];
        
        NSDictionary *infoPlist = [[NSBundle mainBundle] infoDictionary];
        NSString *icon = [[infoPlist valueForKeyPath:@"CFBundleIcons.CFBundlePrimaryIcon.CFBundleIconFiles"] lastObject];
        NSString *strTitle = @"分享标题";
        NSString *strDescr = @"分享内容描述";
        NSString *strWebpageUrl = @"分享链接地址";// 即:点击分享详情后跳转至相对应的 URL 链接地址
        
        if ([shareType isEqualToString:@"custom"]) {// 分享类型:自定义
            strTitle = [NSString stringWithFormat:@"%@", [dataSource objectForKey:@"title"]];
            strDescr = [NSString stringWithFormat:@"%@", [dataSource objectForKey:@"descr"]];
            strWebpageUrl = [NSString stringWithFormat:@"%@", [dataSource objectForKey:@"webpageUrl"]];
            icon = [NSString stringWithFormat:@"%@", [dataSource objectForKey:@"imgUrl"]];// 注:该字段必须为 https,详见 confitUShareSettings 方法
            if (kStringIsEmpty(icon)) {
                icon = [[infoPlist valueForKeyPath:@"CFBundleIcons.CFBundlePrimaryIcon.CFBundleIconFiles"] lastObject];
            }
        }
        
        // 创建分享消息对象
        UMSocialMessageObject *messageObj = [UMSocialMessageObject messageObject];
        // 创建网页内容对象
        UIImage *thumImg = [UIImage imageNamed:icon];
        UMShareWebpageObject *shareObj = [UMShareWebpageObject shareObjectWithTitle:strTitle
                                                                              descr:strDescr
                                                                          thumImage:thumImg];
        // 设置网页地址
        shareObj.webpageUrl = strWebpageUrl;
        // 分享消息对象设置分享内容对象
        messageObj.shareObject = shareObj;
     
        // 调用分享接口
        kWeakSelf(self);
        [[UMSocialManager defaultManager] shareToPlatform:platformType messageObject:messageObj currentViewController:controller completion:^(id result, NSError *error) {
            if (error) {
                NSLog(@"************Share fail with error *********
    Error:%@", error);
            }
            else {
                NSLog(@"************UMShare************
    Response data is:%@", result);
            }
     
            // Callback
            [weakself callbackAlterStateWithError:error];
        }];
    }
     
    /**
     回调分享状态
     @param error 异常
     */
    - (void)callbackAlterStateWithError:(NSError *)error {
        NSString *callback = nil;
        if (error) {
            NSString *strError = [self callbackErrorWithErrorCode:error.code];
            if (kStringIsEmpty(strError)) {
                callback = @"分享失败";
            }
            else {
                callback = strError;
            }
            
        }
        else {
            callback = @"分享成功";
        }
        
        // Show
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"欢迎使用【xxx App 名称】"
                                                        message:callback
                                                       delegate:nil
                                              cancelButtonTitle:@"确定"
                                              otherButtonTitles: nil, nil];
        [alert show];
    }
     
    /**
     回调异常提示
     http://dev.umeng.com/wsq/android/errorcode
     
     @param code    异常代码
     @return        异常提示
     */
    - (NSString *)callbackErrorWithErrorCode:(NSInteger)code {
        NSString *result = nil;
        if (code == 10002) {
            result = @"用户不存在";
        }
        else if (code == 10003) {
            result = @"用户未登录";
        }
        else if (code == 10004) {
            result = @"用户没有执行操作的权限";
        }
        else if (code == 10005) {
            result = @"用户的id无效";
        }
        else if (code == 10006) {
            result = @"用户已经被创建";
        }
        else if (code == 10007) {
            result = @"已经关注过该用户";
        }
        else if (code == 10008) {
            result = @"注册时用户信息不完整";
        }
        else if (code == 10009) {
            result = @"用户不能关注自己";
        }
        else if (code == 10010) {
            result = @"用户名长度超出范围,用户名为2~20个字符";
        }
        else if (code == 10011) {
            result = @"用户不可用";
        }
        else if (code == 10012) {
            result = @"用户名存在敏感词";
        }
        else if (code == 10013) {
            result = @"用户已经存在";
        }
        else if (code == 10014) {
            result = @"用户自定义字段从长度超出范围";
        }
        else if (code == 10015) {
            result = @"该操作一次只能被一个用户操作";
        }
        else if (code == 10016) {
            result = @"用户名存在非法字符";
        }
        else if (code == 10017) {
            result = @"用户设备在黑名单中";
        }
        else if (code == 10018) {
            result = @"该用户收藏 feed 数量最多50条";
        }
        else if (code == 10019) {
            result = @"该 feed 已经被收藏";
        }
        else if (code == 10020) {
            result = @"该 feed 还未被收藏";
        }
        else {
            result = @"";
        }
        
        return result;
    }
     
    /*
     case UMSocialPlatformErrorType_Unknow:
     result = @"未知错误";
     break;
     case UMSocialPlatformErrorType_NotSupport:
     result = @"不支持(url scheme 没配置,或者没有配置-ObjC, 或则SDK版本不支持或则客户端版本不支持";
     break;
     case UMSocialPlatformErrorType_AuthorizeFailed:
     result = @"授权失败";
     break;
     case UMSocialPlatformErrorType_ShareFailed:
     result = @"分享失败";
     break;
     case UMSocialPlatformErrorType_RequestForUserProfileFailed:
     result = @"请求用户信息失败";
     break;
     case UMSocialPlatformErrorType_ShareDataNil:
     result = @"分享内容为空";
     break;
     case UMSocialPlatformErrorType_ShareDataTypeIllegal:
     result = @"分享内容不支持";
     break;
     case UMSocialPlatformErrorType_CheckUrlSchemaFail:
     result = @"schemaurl fail";
     break;
     case UMSocialPlatformErrorType_NotInstall:
     result = @"应用未安装";
     break;
     case UMSocialPlatformErrorType_Cancel:
     result = @"您已取消分享";
     break;
     case UMSocialPlatformErrorType_NotNetWork:
     result = @"网络异常";
     break;
     case UMSocialPlatformErrorType_SourceError:
     result = @"第三方错误";
     break;
     case UMSocialPlatformErrorType_ProtocolNotOverride:
     result = @"对应的    UMSocialPlatformProvider的方法没有实现";
     break;
     default:
     */
     
     
     
    #pragma mark - Callback
    // 兼容所有 iOS 设备
    - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
        //注:该方法为建议使用的系统openURL回调,且 新浪 平台仅支持以上回调。还有以下两种回调方式,如果开发者选取以下回调,也请补充相应的函数调用。
        //6.3的新的API调用,是为了兼容国外平台(例如:新版facebookSDK,VK等)的调用[如果用6.2的api调用会没有回调],对国内平台没有影响
        BOOL result = [[UMSocialManager defaultManager] handleOpenURL:url
                                                    sourceApplication:sourceApplication
                                                           annotation:annotation];
        if (!result) {
            // 其他如支付等SDK的回调
        }
        
        return result;
    }
     
    //仅支持iOS9以上系统,iOS8及以下系统不会回调
    - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
        //6.3的新的API调用,是为了兼容国外平台(例如:新版facebookSDK,VK等)的调用[如果用6.2的api调用会没有回调],对国内平台没有影响
        BOOL result = [[UMSocialManager defaultManager]  handleOpenURL:url
                                                               options:options];
        if (!result) {
            // 其他如支付等SDK的回调
        }
        
        return result;
    }
     
    - (BOOL)application:(UIApplication *)app handleOpenURL:(nonnull NSURL *)url {
        BOOL result = [[UMSocialManager defaultManager] handleOpenURL:url];
        if (!result) {
            // 其他如支付等SDK的回调
        }
        
        return result;
    }
     
    @end 

    最后,分享相关方法实现完毕后,便到了最终调用如上方法实现具体需求功能的时刻,定位到所需分享的代码块部分,调用之前预先预留好的接口方法即可.

    #pragma mark - 缩写
    #define kApplication        [UIApplication sharedApplication]
    #define kKeyWindow          [UIApplication sharedApplication].keyWindow
    #define kAppDelegate        ((AppDelegate*)[UIApplication sharedApplication].delegate)
    #define kUserDefaults       [NSUserDefaults standardUserDefaults]
    #define kNotificationCenter [NSNotificationCenter defaultCenter]
    
    [kAppDelegate getUMShareRelevantMethodsWithCurrentViewController:self];
    

    以上便是此次分享的全部内容,较为简易的分享小结,具体还以实际需求为准,可以自行 diy 调整,希望对大家有所帮助,也希望大神多多指点共进步!

  • 相关阅读:
    Hanoi塔问题
    《OD学hive》第六周20160731
    《OD学Hive》第六周20160730
    《OD学Sqoop》数据转换工具Sqoop
    《OD学hive》第五周0723
    《OD学hive》第四周0717
    《OD学hadoop》第四周0716
    hadoop环境搭建笔记
    《OD学hadoop》第三周0710
    《OD学hadoop》第三周0709
  • 原文地址:https://www.cnblogs.com/survivorsfyh/p/9597520.html
Copyright © 2011-2022 走看看