友盟分享小结 - 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 <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的更多相关文章
- iOS开发-友盟分享(3)
iOS 友盟分享 这个主要是提到如何通过友盟去自定义分享的步骤: 一.肯定要去友盟官网下载最新的SDK包,然后将SDK导入到你的工程文件夹里面去: 二.注册友盟账号,将你的APP添加到你的账号里面然后 ...
- iOS开发-友盟分享(1)
1.集成友盟分享,需要先注册一个友盟账号,注册地址 友盟开发者平台官网 友盟集成文档 友盟sdk下载地址友盟sdk下载地址 2,成功下载sdk集成后,微信分享需要配置一下 新浪微博 之类到同样配置就 ...
- iOS开发——iOS10升级极光推送SDK、友盟分享SDK
前不久升级了Xcode8 ,同时iOS10系统也推送久. 由于公司需要适配iOS 10系统,同时第三方sdk建议升级. 包含替换升级新的SDK和相应的代码修改. 主要分享如何升级极光推送SDK,友盟分 ...
- iOS开发——友盟分享
==========2016-01-29 更新=====刘成利 email:liu_cheng_li@qq.com========== 自己成功集成到公司的项目前,也已做了测试好的友盟分享demo 目 ...
- iOS友盟分享的使用总结
现在几乎所有的APP都会集成分享,为了可以更好的推广自己的APP. 目前市面上常用的分享无非就三个: 1.友盟分享; 2.shareSDK(mob); 3.苹果原生. 由于苹果原生的分享使用起来不方便 ...
- 友盟分享到微信的几点备忘(IOS)
1.下载最新的友盟分享版本,参考友盟官方的demo 2.注册微信开放平台用户,不是公众平台,注册应用 3.参考文档和demo,加入sdk包和相应的lib 4.在plist加入URL types.URL ...
- iOS 友盟分享
iOS 友盟分享 这个主要是提到怎样通过友盟去自己定义分享的步骤: 一.肯定要去友盟官网下载最新的SDK包,然后将SDK导入到你的project目录里面去. 二.注冊友盟账号.将你的APP加入到你的账 ...
- ios中调用友盟分享时qq可以分享但是微信失败,只显示文字,网页链接没有出现
问题如下,最后在老大各种替换的情况下,找到了原因,是因为图片失效了,友盟分享微信时必须需要图片才可以,如果服务器图片失效,则会失败: 注意下面的图片是否能够获取???????????????????? ...
- iOS开发-友盟分享使用(2)
1.友盟SDK提供功能:分享喜欢的东西到新浪微博.qq空间.为微信朋友圈等等等等社交圈. 2.友盟分享前期准备 (1)注册账号 去官网 (2)创建应用获取appkey 类似5556a53667e*** ...
随机推荐
- ORACLE SQL 实现IRR的计算
一.IRR计算的原理: 内部收益率(Internal Rate of Return (IRR)),就是资金流入现值总额与资金流出现值总额相等.净现值等于零时的折现率. 用公式 标识:-200+[30/ ...
- (转)AIX 5.3安装SSH .
AIX 5.3安装SSH . 原文:http://blog.csdn.net/chunhua_love/article/details/12004845 环境:OS:AIX 5.3SSH: opens ...
- git分布式的理解----简单服务端搭建
Git是分布式的,并没有服务端跟客户端之分,所谓的服务端安装的其实也是git.Git支持四种协议,file,ssh,git,http.ssh是使用较多的,下面使用ssh搭建一个免密码登录的服务端. 1 ...
- mysql时间戳
select unix_timestamp('2013-01-01 10:10:10'); , '%Y-%m-%d %H:%i:%S' ) date_format(date,'%Y-%m-%d') - ...
- SQL DATEDIFF语法及时间函数 Sql 查询当天、本周、本月记录
SQL DATEDIFF语法及时间函数 Sql 查询当天.本周.本月记录 转:http://blog.csdn.net/Json1204/article/details/7863801?locatio ...
- iOS UIWebView 和 WKWebView 的 cookie 获取,设置,删除
Cookie简介说到Cookie,或许有些小伙伴会比较陌生,有些小伙伴会比较熟悉.如果项目中,所有页面都是纯原生来实现的话,一般Cookie这个东西或许我们永远也不会接触到.但是,这里还是要说一下Co ...
- Ubuntu 网速显示,ssh配置
安装: sudo apt-get install python3-psutil curl git gir1.2-appindicator3-0.1git clone https://github.co ...
- wamp的安装
1.下载wamp. 2.如果安装了apache,先卸载. 进入到你的apache的bin目录,输入指令 httpd.exe -k stop停止服务,再输入httpd.exe -k uninstall. ...
- pure-ftp 修改用户信息
1.修改用户test的密码 [root@localhost bin]# ./pure-pw passwd test #修改密码 Password: Enter it again: [root@loca ...
- 监控系统 - pnp4nagios
pnp4nagios是nagios的一个插件,用于将perfdata数据写入rrd,用于展示流量图,目前最高版本0.6.25. 我用官方下载的tar.gz打rpm包,官方提供的pnp4nagios.s ...