友盟分享小结 - iOS

365网络股份有限公司总部 📅 2026-02-02 16:57:32 ✍️ admin 👁️ 8875 ❤️ 327
友盟分享小结 - iOS

因之前都写在了 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

@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

#import

#import

#import

@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设置安全域名

NSAppTransportSecurity

NSAllowsArbitraryLoads

*/

// [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 *********\nError:%@", error);

}

else {

NSLog(@"************UMShare************\nResponse 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 *********\nError:%@", error);

}

else {

NSLog(@"************UMShare************\nResponse 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 *)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 调整,希望对大家有所帮助,也希望大神多多指点共进步!

相关推荐

抽象类调用自己的抽象方法,实现来自子类
【原创】竞彩足球周一102精析:巴西VS哥斯达
挑战海外职场,却不知怎么开始?试试这 6 种海外求职管道