因之前都写在了 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 *********\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<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 调整,希望对大家有所帮助,也希望大神多多指点共进步!

友盟分享小结 - iOS的更多相关文章

  1. iOS开发-友盟分享(3)

    iOS 友盟分享 这个主要是提到如何通过友盟去自定义分享的步骤: 一.肯定要去友盟官网下载最新的SDK包,然后将SDK导入到你的工程文件夹里面去: 二.注册友盟账号,将你的APP添加到你的账号里面然后 ...

  2. iOS开发-友盟分享(1)

    1.集成友盟分享,需要先注册一个友盟账号,注册地址 友盟开发者平台官网  友盟集成文档 友盟sdk下载地址友盟sdk下载地址 2,成功下载sdk集成后,微信分享需要配置一下 新浪微博 之类到同样配置就 ...

  3. iOS开发——iOS10升级极光推送SDK、友盟分享SDK

    前不久升级了Xcode8 ,同时iOS10系统也推送久. 由于公司需要适配iOS 10系统,同时第三方sdk建议升级. 包含替换升级新的SDK和相应的代码修改. 主要分享如何升级极光推送SDK,友盟分 ...

  4. iOS开发——友盟分享

    ==========2016-01-29 更新=====刘成利 email:liu_cheng_li@qq.com========== 自己成功集成到公司的项目前,也已做了测试好的友盟分享demo 目 ...

  5. iOS友盟分享的使用总结

    现在几乎所有的APP都会集成分享,为了可以更好的推广自己的APP. 目前市面上常用的分享无非就三个: 1.友盟分享; 2.shareSDK(mob); 3.苹果原生. 由于苹果原生的分享使用起来不方便 ...

  6. 友盟分享到微信的几点备忘(IOS)

    1.下载最新的友盟分享版本,参考友盟官方的demo 2.注册微信开放平台用户,不是公众平台,注册应用 3.参考文档和demo,加入sdk包和相应的lib 4.在plist加入URL types.URL ...

  7. iOS 友盟分享

    iOS 友盟分享 这个主要是提到怎样通过友盟去自己定义分享的步骤: 一.肯定要去友盟官网下载最新的SDK包,然后将SDK导入到你的project目录里面去. 二.注冊友盟账号.将你的APP加入到你的账 ...

  8. ios中调用友盟分享时qq可以分享但是微信失败,只显示文字,网页链接没有出现

    问题如下,最后在老大各种替换的情况下,找到了原因,是因为图片失效了,友盟分享微信时必须需要图片才可以,如果服务器图片失效,则会失败: 注意下面的图片是否能够获取???????????????????? ...

  9. iOS开发-友盟分享使用(2)

    1.友盟SDK提供功能:分享喜欢的东西到新浪微博.qq空间.为微信朋友圈等等等等社交圈. 2.友盟分享前期准备 (1)注册账号 去官网 (2)创建应用获取appkey 类似5556a53667e*** ...

随机推荐

  1. ubuntu 16.04下搜狗输入法不能输入中文解决

    之前一段时间正常使用的搜狗输入法突然无法输出中文(具体现象是,可以呼出搜狗输入法界面,但是候选词列表无显示),解决之后记录下来,希望能为同样遇到这个问题的人提供参考.同时附linux下常见软件崩溃问题 ...

  2. OpenStack Weekly Rank 2015.08.03

    Module Reviews Drafted Blueprints Completed Blueprints Filed Bugs Resolved Bugs Cinder 7 1 1 7 11 Sw ...

  3. 带你认识spark安装包的目录结构

    福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号:   大数据躺过的坑      Java从入门到架构师      人工智能躺过的坑         Java全栈大联盟   ...

  4. HashMap源码详解与对比

    前几天工作忙得焦头烂额时,同事问了一下关于Map的特性,刹那间懵了一下,紧接着就想起来了一些关于Map的一些知识,因为只要涉及到Collection集合类时,就会谈及Map类,因此理解好Map相关的知 ...

  5. c# 父类的引用指向子类的实例

    在C#中关于父类对子类的引用大概有这么几种: 父类是接口,普通类,抽象类 public interface A { void a(); } public class B { public void b ...

  6. 设置Tomcat的字符编码

    在 server.xml 中的 Connector 标签在加入 URIEncoding="UTF-8" 属性. <Connector port="8080" ...

  7. Flask-Script-Migrate

    Flask-Script 从字面意思上来看就是 Flask 的脚本 是的,熟悉Django的同学是否还记得Django的启动命令呢? python manager.py runserver 大概是这样 ...

  8. Visual Studio Code 入门教程

    Extensible and customizable.(可扩展的和可定制的,这是我喜欢它的原因) Want even more features? Install extensions to add ...

  9. 【起航计划 028】2015 起航计划 Android APIDemo的魔鬼步伐 27 App->Preferences->Launching preferences 其他activity获取Preference中的值

    前给例子介绍了如何使用PreferenceActivity 来显示修改应用偏好,用户对Preferences的修改自动存储在应用对应的Shared Preferences中. 本例介绍了如何从一个Ac ...

  10. react-native与原生界面相互跳转

    一.添加MyIntentModule类,并继承ReactContextBaseJavaModule实现其方法和构造函数.在该类中添加方法,注意:方法头要加@ReactMethod public cla ...