友盟分享 U-Share 的集成与使用

在 iOS 开发中,社交分享或者第三方授权登录已经是一个常见的功能了,当我们需要快速集成多个平台的分享或者登录的时候,如果把一个个的第三方 SDK 导入工程项目里,费时费力还容易出错,这个时候我们使用 ShareSDK、友盟等第三方的分享平台可以快速在项目中集成多个社交平台的分享或者授权登录

下面就介绍一下如何在 iOS 项目中集成和使用友盟,本文使用的是最新版的友盟 U-Share SDK v6.4.3,SDK 的集成文档十分详细,本文只是做一个简单的整理和归纳

U-Share SDK 集成与配置

通过 Cocoapods 集成

友盟支持手动集成和通过 Cocoapods 两种方式集成,手动集成需要手动倒入 SDK、配置参数以及添加各种依赖库,操作起来比较麻烦,本文只介绍通过 Cocoapods 集成,手动集成可以参考官方文档

Cocoapods 的安装本文不做介绍,网上有很多资料了

首先从终端 cd 到项目根目录,执行下面的命令

1
$ pod init

接着项目根目录下吗面就添加好了一个 Podfile 文件,用 vim 打开这个文件

1
$ vim Podfile

Cocoapods 集成 U-Share SDK 可灵活配置平台,可选添加以下平台代码到 Podfile 文件中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'
target 'UMengDemo' do
# Uncomment the next line if you're using Swift or would like to use dynamic frameworks
# use_frameworks!
# U-Share SDK UI模块(分享面板,建议添加)
pod ‘UMengUShare/UI’
# 集成微信(精简版0.2M)
pod ‘UMengUShare/Social/ReducedWeChat'
# 集成微信(完整版14.4M)
pod ‘UMengUShare/Social/WeChat'
# 集成QQ(精简版0.5M)
pod ‘UMengUShare/Social/ReducedQQ'
# 集成QQ(完整版7.6M)
pod ‘UMengUShare/Social/QQ'
# 集成新浪微博(精简版1M)
pod ‘UMengUShare/Social/ReducedSina'
# 集成新浪微博(完整版25.3M)
pod ‘UMengUShare/Social/Sina'
# 集成Facebook/Messenger
pod ‘UMengUShare/Social/Facebook'
# 集成Twitter
pod ‘UMengUShare/Social/Twitter'
# 集成支付宝
pod ‘UMengUShare/Social/AlipayShare'
# 集成钉钉
pod ‘UMengUShare/Social/DingDing'
# 集成豆瓣
pod ‘UMengUShare/Social/Douban'
# 集成人人
pod ‘UMengUShare/Social/Renren'
# 集成腾讯微博
pod ‘UMengUShare/Social/TencentWeibo'
# 集成来往(点点虫)
pod ‘UMengUShare/Social/LaiWang'
# 集成易信
pod ‘UMengUShare/Social/YiXin'
# 集成领英
pod ‘UMengUShare/Social/Linkedin'
# 集成Flickr
pod ‘UMengUShare/Social/Flickr'
# 集成Kakao
pod ‘UMengUShare/Social/Kakao'
# 集成Tumblr
pod ‘UMengUShare/Social/Tumblr'
# 集成Pinterest
pod ‘UMengUShare/Social/Pinterest'
# 集成Instagram
pod ‘UMengUShare/Social/Instagram'
# 集成Line
pod ‘UMengUShare/Social/Line'
# 集成WhatsApp
pod ‘UMengUShare/Social/WhatsApp'
# 集成有道云笔记
pod ‘UMengUShare/Social/YouDao'
# 集成印象笔记
pod ‘UMengUShare/Social/EverNote'
# 集成Google+
pod ‘UMengUShare/Social/GooglePlus'
# 集成Pocket
pod ‘UMengUShare/Social/Pocket'
# 集成DropBox
pod ‘UMengUShare/Social/DropBox'
# 集成VKontakte
pod ‘UMengUShare/Social/VKontakte'
# 集成邮件
pod ‘UMengUShare/Social/Email'
# 集成短信
pod ‘UMengUShare/Social/SMS'
# 加入IDFA获取
pod ‘UMengUShare/Plugin/IDFA'
end

友盟集成了国内外很多个社交平台,我们只需根据自己项目的情况,集成需要的的平台即可

接着在项目根目录更新 U-Share SDK

1
$ pod update

我们还可以使用 pod search 命令检查 U-Share SDK及其最新版本

1
$ pod search UMengUShare

Cocoapods 集成遇到问题请参考 更新Cocoapods常见问题

配置SSO白名单

如果你的应用使用了如 SSO 授权登录或跳转到第三方分享功能,在iOS9/10 下就需要增加一个可跳转的白名单,即LSApplicationQueriesSchemes,否则将在 SDK 判断是否跳转时用到的canOpenURL 时返回 NO,进而只进行webview授权或授权/分享失败。 在项目中的 info.plist 中加入应用白名单,右键info.plist 选择 source code 打开(plist 具体设置在Build Setting -> Packaging -> Info.plist File 可获取plist 路径) 请根据选择的平台进行配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
<key>LSApplicationQueriesSchemes</key>
<array>
<!-- 微信 URL Scheme 白名单-->
<string>wechat</string>
<string>weixin</string>
<!-- 新浪微博 URL Scheme 白名单-->
<string>sinaweibohd</string>
<string>sinaweibo</string>
<string>sinaweibosso</string>
<string>weibosdk</string>
<string>weibosdk2.5</string>
<!-- QQ、Qzone URL Scheme 白名单-->
<string>mqqapi</string>
<string>mqq</string>
<string>mqqOpensdkSSoLogin</string>
<string>mqqconnect</string>
<string>mqqopensdkdataline</string>
<string>mqqopensdkgrouptribeshare</string>
<string>mqqopensdkfriend</string>
<string>mqqopensdkapi</string>
<string>mqqopensdkapiV2</string>
<string>mqqopensdkapiV3</string>
<string>mqqopensdkapiV4</string>
<string>mqzoneopensdk</string>
<string>wtloginmqq</string>
<string>wtloginmqq2</string>
<string>mqqwpa</string>
<string>mqzone</string>
<string>mqzonev2</string>
<string>mqzoneshare</string>
<string>wtloginqzone</string>
<string>mqzonewx</string>
<string>mqzoneopensdkapiV2</string>
<string>mqzoneopensdkapi19</string>
<string>mqzoneopensdkapi</string>
<string>mqqbrowser</string>
<string>mttbrowser</string>
<!-- 支付宝 URL Scheme 白名单-->
<string>alipay</string>
<string>alipayshare</string>
<!-- 钉钉 URL Scheme 白名单-->
<string>dingtalk</string>
<string>dingtalk-open</string>
<!--Linkedin URL Scheme 白名单-->
<string>linkedin</string>
<string>linkedin-sdk2</string>
<string>linkedin-sdk</string>
<!-- 点点虫 URL Scheme 白名单-->
<string>laiwangsso</string>
<!-- 易信 URL Scheme 白名单-->
<string>yixin</string>
<string>yixinopenapi</string>
<!-- instagram URL Scheme 白名单-->
<string>instagram</string>
<!-- whatsapp URL Scheme 白名单-->
<string>whatsapp</string>
<!-- line URL Scheme 白名单-->
<string>line</string>
<!-- Facebook URL Scheme 白名单-->
<string>fbapi</string>
<string>fb-messenger-api</string>
<string>fbauth2</string>
<string>fbshareextension</string>
<!-- Kakao URL Scheme 白名单-->
<!-- 注:以下第一个参数需替换为自己的kakao appkey-->
<!-- 格式为 kakao + "kakao appkey"-->
<string>kakaofa63a0b2356e923f3edd6512d531f546</string>
<string>kakaokompassauth</string>
<string>storykompassauth</string>
<string>kakaolink</string>
<string>kakaotalk-4.5.0</string>
<string>kakaostory-2.9.0</string>
<!-- pinterest URL Scheme 白名单-->
<string>pinterestsdk.v1</string>
<!-- Tumblr URL Scheme 白名单-->
<string>tumblr</string>
<!-- 印象笔记 -->
<string>evernote</string>
<string>en</string>
<string>enx</string>
<string>evernotecid</string>
<string>evernotemsg</string>
<!-- 有道云笔记-->
<string>youdaonote</string>
<string>ynotedictfav</string>
<string>com.youdao.note.todayViewNote</string>
<string>ynotesharesdk</string>
<!-- Google+-->
<string>gplus</string>
<!-- Pocket-->
<string>pocket</string>
<string>readitlater</string>
<string>pocket-oauth-v1</string>
<string>fb131450656879143</string>
<string>en-readitlater-5776</string>
<string>com.ideashower.ReadItLaterPro3</string>
<string>com.ideashower.ReadItLaterPro</string>
<string>com.ideashower.ReadItLaterProAlpha</string>
<string>com.ideashower.ReadItLaterProEnterprise</string>
<!-- VKontakte-->
<string>vk</string>
<string>vk-share</string>
<string>vkauthorize</string>
</array>

配置 URL Scheme

URL Scheme 是通过系统找到并跳转对应 App 的一类设置,通过向项目中的 info.plist 文件中加入 URL types 可使用第三方平台所注册的 appkey 信息向系统注册你的 App,当跳转到第三方应用授权或分享后,可直接跳转回你的 App

添加 URL Types 可在工程设置面板设置,如下:

配置第三方平台 URL Scheme,未列出则不需设置

平台 格式 举例 备注
微信 微信appKey wxdc1e388c3822c80b
QQ/Qzone 需要添加两项URL Scheme:
1、”tencent”+腾讯QQ互联应用appID
2、”QQ”+腾讯QQ互联应用appID转换成十六进制(不足8位前面补0)
如appID:100424468
1、tencent100424468
2、QQ05fc5b14
QQ05fc5b14为100424468转十六进制而来,因不足8位向前补0,然后加”QQ”前缀
新浪微博 “wb”+新浪appKey wb3921700954
支付宝 “ap”+appID ap2015111700822536 URL Type中的identifier填”alipayShare”
钉钉 钉钉appkey dingoalmlnohc0wggfedpk identifier的参数都使用dingtalk
易信 易信appkey yx35664bdff4db42c2b7b
e1e29390c1a06
点点虫 点点虫appID 8112117817424282305 URL Type中的identifier填”Laiwang”
领英 “li”+appID li4768945
Facebook “fb”+FacebookID fb506027402887373
VKontakte “vk”+ VKontakteID vk5786123  

新浪微博事儿比较多,如果发现使用微博分享发现有问题,请参考新浪微博集成说明

官方文档还有部分平台集成的 特别说明

初始化设置

通过前面几步之后,SDK 和 配置都就绪后,就开始进行U-Share和第三方平台的初始化工作

获取友盟 AppKey

首先需要注册并登录友盟账号之后,在我的产品中,找到 U-Share,然后选择立即使用

选择添加应用

填写应用基本信息,然后提交并获取 AppKey

然后就获得了这个应用对应的 AppKey

之后再去你需要集成的各大第三方平台注册自己帐号并且添加自己的应用,各大平台也都大同小异的会给你一个对应这个应用的 AppKey 和 AppSecret,这些 AppKey 和 AppSecret 会在友盟初始化平台的时候使用到

初始化U-Share及第三方平台

上面说了一大堆,终于开始进入正题,开始写代码了,首先在 AppDelegate.m 中设置如下代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#import <UMSocialCore/UMSocialCore.h>
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
/* 打开调试日志 */
[[UMSocialManager defaultManager] openLog:YES];
/* 设置友盟appkey */
[[UMSocialManager defaultManager] setUmSocialAppkey:USHARE_DEMO_APPKEY];
/* 初始化需要的第三方平台*/
[self configUSharePlatforms];
/* 初始化分享的其他一些设置*/
[self confitUShareSettings];
// Custom code
return YES;
}
- (void)confitUShareSettings{
/* 打开图片水印 */
//[UMSocialGlobal shareInstance].isUsingWaterMark = YES;
/*
* 关闭强制验证https,可允许http图片分享,但需要在info.plist设置安全域名
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
*/
//[UMSocialGlobal shareInstance].isUsingHttpsWhenShareContent = NO;
}
- (void)configUSharePlatforms{
/* 设置微信的appKey和appSecret */
[[UMSocialManager defaultManager] setPlaform:UMSocialPlatformType_WechatSession appKey:@"wxdc1e388c3822c80b" appSecret:@"3baf1193c85774b3fd9d18447d76cab0" redirectURL:@"http://mobile.umeng.com/social"];
/*
* 移除相应平台的分享,如微信收藏
*/
//[[UMSocialManager defaultManager] removePlatformProviderWithPlatformTypes:@[@(UMSocialPlatformType_WechatFavorite)]];
/* 设置分享到QQ互联的appID
* U-Share SDK为了兼容大部分平台命名,统一用appKey和appSecret进行参数设置,而QQ平台仅需将appID作为U-Share的appKey参数传进即可。
*/
[[UMSocialManager defaultManager] setPlaform:UMSocialPlatformType_QQ appKey:@"1105821097"/*设置QQ平台的appID*/ appSecret:nil redirectURL:@"http://mobile.umeng.com/social"];
/* 设置新浪的appKey和appSecret */
[[UMSocialManager defaultManager] setPlaform:UMSocialPlatformType_Sina appKey:@"3921700954" appSecret:@"04b48b094faeb16683c32669824ebdad" redirectURL:@"https://sns.whalecloud.com/sina2/callback"];
/* 设置Facebook的appKey和UrlString */
[[UMSocialManager defaultManager] setPlaform:UMSocialPlatformType_Facebook appKey:@"506027402887373" appSecret:nil redirectURL:@"http://www.umeng.com/social"];
}

添加系统回调方法

添加系统回调方法一共有三个,下面这个方法支持全部 iOS 系统

1
2
3
4
5
6
7
8
9
10
// 支持所有iOS系统
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
//6.3的新的API调用,是为了兼容国外平台(例如:新版facebookSDK,VK等)的调用[如果用6.2的api调用会没有回调],对国内平台没有影响
BOOL result = [[UMSocialManager defaultManager] handleOpenURL:url sourceApplication:sourceApplication annotation:annotation];
if (!result) {
// 其他如支付等SDK的回调
}
return result;
}

注:以上方法为建议使用的系统openURL回调方法,且 新浪 平台仅支持以上方法的回调

还有以下两种回调方法

1
2
3
4
5
6
7
8
- (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;
}

注:上面的回调方法仅支持 iOS9 以上系统,iOS8及以下系统不会回调

1
2
3
4
5
6
7
8
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
BOOL result = [[UMSocialManager defaultManager] handleOpenURL:url];
if (!result) {
// 其他如支付等SDK的回调
}
return result;
}

注:这个回调方法支持全部iOS系统,但是 iOS9 之后就废弃了

分享到第三方平台

友盟分享目前支持的类型有:

  • 网页类型(网页链接)
  • 图片
  • 文本
  • 表情(GIF图片,即Emotion类型,只有微信支持)
  • 图文(包含一张图片和一段文本)
  • 视频(只支持视频URL、缩略图及描述)
  • 音乐(只支持音乐URL、缩略图及描述)

分享文本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
- (void)shareTextToPlatformType:(UMSocialPlatformType)platformType
{
//创建分享消息对象
UMSocialMessageObject *messageObject = [UMSocialMessageObject messageObject];
//设置文本
messageObject.text = @"社会化组件UShare将各大社交平台接入您的应用,快速武装App。";
//调用分享接口
[[UMSocialManager defaultManager] shareToPlatform:platformType messageObject:messageObject currentViewController:self completion:^(id data, NSError *error) {
if (error) {
NSLog(@"************Share fail with error %@*********",error);
}else{
NSLog(@"response data is %@",data);
}
}];
}

调用友盟的分享接口的时候需要传入一个 UMSocialPlatformType,表示分享的内容需要分享到那个平台,这是一个枚举类型,里面对应了分享平台的类型,下面列举部分:

1
2
3
4
5
6
7
8
9
typedef NS_ENUM(NSInteger,UMSocialPlatformType)
{
UMSocialPlatformType_Sina = 0, //新浪
UMSocialPlatformType_WechatSession = 1, //微信聊天
UMSocialPlatformType_WechatTimeLine = 2,//微信朋友圈
UMSocialPlatformType_WechatFavorite = 3,//微信收藏
UMSocialPlatformType_QQ = 4,//QQ聊天页面
UMSocialPlatformType_Qzone = 5,//qq空间
};

分享图片

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
- (void)shareImageToPlatformType:(UMSocialPlatformType)platformType{
//创建分享消息对象
UMSocialMessageObject *messageObject = [UMSocialMessageObject messageObject];
//创建图片内容对象
UMShareImageObject *shareObject = [[UMShareImageObject alloc] init];
//如果有缩略图,则设置缩略图
shareObject.thumbImage = [UIImage imageNamed:@"icon"];
[shareObject setShareImage:@"http://upload-images.jianshu.io/upload_images/7114-3ccd44494b31077a.jpg"];
//分享消息对象设置分享内容对象
messageObject.shareObject = shareObject;
//调用分享接口
[[UMSocialManager defaultManager] shareToPlatform:platformType messageObject:messageObject currentViewController:self completion:^(id data, NSError *error) {
if (error) {
NSLog(@"************Share fail with error %@*********",error);
}else{
NSLog(@"response data is %@",data);
}
}];
}

分享图文(新浪支持,微信/QQ仅支持图或文本分享)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
- (void)shareImageAndTextToPlatformType:(UMSocialPlatformType)platformType{
//创建分享消息对象
UMSocialMessageObject *messageObject = [UMSocialMessageObject messageObject];
//设置文本
messageObject.text = @"社会化组件UShare将各大社交平台接入您的应用,快速武装App。";
//创建图片内容对象
UMShareImageObject *shareObject = [[UMShareImageObject alloc] init];
//如果有缩略图,则设置缩略图
shareObject.thumbImage = [UIImage imageNamed:@"icon"];
[shareObject setShareImage:@"https://www.umeng.com/img/index/demo/1104.4b2f7dfe614bea70eea4c6071c72d7f5.jpg"];
//分享消息对象设置分享内容对象
messageObject.shareObject = shareObject;
//调用分享接口
[[UMSocialManager defaultManager] shareToPlatform:platformType messageObject:messageObject currentViewController:self completion:^(id data, NSError *error) {
if (error) {
NSLog(@"************Share fail with error %@*********",error);
}else{
NSLog(@"response data is %@",data);
}
}];
}

分享网页

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
- (void)shareWebPageToPlatformType:(UMSocialPlatformType)platformType
{
//创建分享消息对象
UMSocialMessageObject *messageObject = [UMSocialMessageObject messageObject];
//创建网页内容对象
UMShareWebpageObject *shareObject = [UMShareWebpageObject shareObjectWithTitle:@"分享标题" descr:@"分享内容描述" thumImage:[UIImage imageNamed:@"icon"]];
//设置网页地址
shareObject.webpageUrl =@"http://www.xiaovv.me/";
//分享消息对象设置分享内容对象
messageObject.shareObject = shareObject;
//调用分享接口
[[UMSocialManager defaultManager] shareToPlatform:platformType messageObject:messageObject currentViewController:self completion:^(id data, NSError *error) {
if (error) {
NSLog(@"************Share fail with error %@*********",error);
}else{
NSLog(@"response data is %@",data);
}
}];
}

分享音乐

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
- (void)shareMusicToPlatformType:(UMSocialPlatformType)platformType{
//创建分享消息对象
UMSocialMessageObject *messageObject = [UMSocialMessageObject messageObject];
//创建音乐内容对象
UMShareMusicObject *shareObject = [UMShareMusicObject shareObjectWithTitle:@"分享标题" descr:@"分享内容描述" thumImage:[UIImage imageNamed:@"icon"]];
//设置音乐网页播放地址
shareObject.musicUrl = @"http://c.y.qq.com/v8/playsong.html?songid=108782194&source=yqq#wechat_redirect";
// shareObject.musicDataUrl = @"这里设置音乐数据流地址(如果有的话,而且也要看所分享的平台支不支持)";
//分享消息对象设置分享内容对象
messageObject.shareObject = shareObject;
//调用分享接口
[[UMSocialManager defaultManager] shareToPlatform:platformType messageObject:messageObject currentViewController:self completion:^(id data, NSError *error) {
if (error) {
NSLog(@"************Share fail with error %@*********",error);
}else{
NSLog(@"response data is %@",data);
}
}];
}

分享视频

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
- (void)shareVedioToPlatformType:(UMSocialPlatformType)platformType{
//创建分享消息对象
UMSocialMessageObject *messageObject = [UMSocialMessageObject messageObject];
//创建视频内容对象
UMShareVideoObject *shareObject = [UMShareVideoObject shareObjectWithTitle:@"分享标题" descr:@"分享内容描述" thumImage:[UIImage imageNamed:@"icon"]];
//设置视频网页播放地址
shareObject.videoUrl = @"http://www.eyepetizer.net/detail.html?utm_source=wechat-moments&utm_campaign=routine&udid=ea2ca1eda657617ef73589c0083ea8028ff8352d&vid=19533&vc=2751&deviceModel=iPhone%206s&utm_medium=share&vn=3.5.1";
// shareObject.videoStreamUrl = @"这里设置视频数据流地址(如果有的话,而且也要看所分享的平台支不支持)";
//分享消息对象设置分享内容对象
messageObject.shareObject = shareObject;
//调用分享接口
[[UMSocialManager defaultManager] shareToPlatform:platformType messageObject:messageObject currentViewController:self completion:^(id data, NSError *error) {
if (error) {
NSLog(@"************Share fail with error %@*********",error);
}else{
NSLog(@"response data is %@",data);
}
}];
}

分享微信小程序

我目前没法测试分享微信小程序,所以无法验证开发文档中的代码的效果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
- (void)shareMiniProgramToPlatformType:(UMSocialPlatformType)platformType{
//创建分享消息对象
UMSocialMessageObject *messageObject = [UMSocialMessageObject messageObject];
UMShareMiniProgramObject *shareObject = [UMShareMiniProgramObject shareObjectWithTitle:@"小程序标题" descr:@"小程序内容描述" thumImage:[UIImage imageNamed:@"icon"]];
shareObject.webpageUrl = @"兼容微信低版本网页地址";
shareObject.userName = @"小程序username,如 gh_3ac2059ac66f";
shareObject.path = @"小程序页面路径,如 pages/page10007/page10007";
messageObject.shareObject = shareObject;
//调用分享接口
[[UMSocialManager defaultManager] shareToPlatform:platformType messageObject:messageObject currentViewController:self completion:^(id data, NSError *error){
if (error) {
UMSocialLogInfo(@"************Share fail with error %@*********",error);
}else{
if ([data isKindOfClass:[UMSocialShareResponse class]]) {
UMSocialShareResponse *resp = data;
//分享结果消息
UMSocialLogInfo(@"response message is %@",resp.message);
//第三方原始返回的数据
UMSocialLogInfo(@"response originalResponse data is %@",resp.originalResponse);
}else{
UMSocialLogInfo(@"response data is %@",data);
}
}
[self alertWithError:error];
}];
}

友盟分享注意事项

1.分享的图片地址如果是 HTTP 而不是 HTTPS SDK 会报错

1
2
2017-05-07 01:07:27 UShare(Error):[UMSocialWechatHandler:1052](iOS.6.4.3): UMeng提示助手编号[wechat_share_error_5]:<下载UMShareImageObject的shareImage失败,请检查图片参数是否正确。(本地图片,请检查是否赋值,网络图片请检查是否为https,防止下载失败)。>
2017-05-07 01:07:27.025951+0800 UMengDemo[5588:1612809] (null)---Error Domain=UMSocialPlatformErrorDomain Code=2014 "(null)" UserInfo={message=you must using https url, for support the new strategy of AppStore.}

需要在 AppDelegate.m 里设置

1
[UMSocialGlobal shareInstance].isUsingHttpsWhenShareContent = NO;

2.未安装新浪微博客户端使用微博分享是会出现微博登录界面一闪而过或者直接报错无法调起微博登录授权界面,这是由于新浪微博 SDK 还未更新 ATS 的支持,故目前需要对其进行配置,把新浪微博的 HTTP 地址添加进 ATS 的白名单, 右键 info.plist 选择用 Source Code 打开,然后添加如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<!-- 集成新浪微博对应的HTTP白名单-->
<key>sina.com.cn</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
<false/>
</dict>
<key>sinaimg.cn</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
<false/>
</dict>
<key>sinajs.cn</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
<false/>
</dict>
<key>sina.cn</key>
<dict>
<!-- 适配iOS10 -->
<key>NSExceptionMinimumTLSVersion</key>
<string>TLSv1.0</string>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
<false/>
</dict>
<key>weibo.cn</key>
<dict>
<!-- 适配iOS10 -->
<key>NSExceptionMinimumTLSVersion</key>
<string>TLSv1.0</string>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
<false/>
</dict>
<key>weibo.com</key>
<dict>
<!-- 适配iOS10 -->
<key>NSExceptionMinimumTLSVersion</key>
<string>TLSv1.0</string>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
<false/>
</dict>
<!-- 新浪微博-->
</dict>
</dict>

或者你也可以更加暴力的完全禁止 ATS

1
2
3
4
5
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>

但是不建议这种方式,毕竟现在苹果现在对App的审核要求是全部使用HTTPS,为了避免审核出现被拒的情况,建议 APP 所以的请求都采用 HTTPS,如果一些涉及到第三方还在采用 HTTP 的时候就按照上面微博的情况添加到白名单

关于 ATS 的问题可以参看喵神的博文 关于iOS 10 中 ATS 的问题

3.App 引入第三方分享或授权登录的时候必须检测该平台是否已经安装并且支持分享,App时候只显示已经安装的平台,否则苹果审核可能会被拒,UMSocialManager提供了检测平台是否已经安装和是否支持分享的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
* 平台是否安装
* @param platformType 平台类型 @see UMSocialPlatformType
* @return YES 代表安装,NO 代表未安装
* @note 调用前请检查是否配置好平台相关白名单: http://dev.umeng.com/social/ios/quick-integration#1_3
* 在判断QQ空间的App的时候,QQApi判断会出问题
*/
-(BOOL) isInstall:(UMSocialPlatformType)platformType;
/**
* 当前平台是否支持分享
* @param platformType 平台类型 @see UMSocialPlatformType
* @return YES代表支持,NO代表不支持
*/
-(BOOL) isSupport:(UMSocialPlatformType)platformType;

友盟分享面板UI

分享面板的使用

友盟提供了自己的分享面板UI,如果项目中没有要求可以使用友盟自带的分享面板,使用起来非常简单

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#import <UShareUI/UShareUI.h>
// 定制自己的分享面板预定义平台
NSMutableArray *platforms = [NSMutableArray array];
if ([[UMSocialManager defaultManager] isInstall:UMSocialPlatformType_WechatSession] && [[UMSocialManager defaultManager] isSupport:UMSocialPlatformType_WechatSession]) {
[platforms addObject:@(UMSocialPlatformType_WechatSession)];
}
if ([[UMSocialManager defaultManager] isInstall:UMSocialPlatformType_Sina] && [[UMSocialManager defaultManager] isSupport:UMSocialPlatformType_Sina]) {
[platforms addObject:@(UMSocialPlatformType_Sina)];
}
if ([[UMSocialManager defaultManager] isInstall:UMSocialPlatformType_Facebook] && [[UMSocialManager defaultManager] isSupport:UMSocialPlatformType_Facebook]) {
[platforms addObject:@(UMSocialPlatformType_Facebook)];
}
[UMSocialUIManager setPreDefinePlatforms:@[@(UMSocialPlatformType_Sina),@(UMSocialPlatformType_QQ),@(UMSocialPlatformType_WechatSession)]];
//调用分享面板
[UMSocialUIManager showShareMenuViewInWindowWithPlatformSelectionBlock:^(UMSocialPlatformType platformType, NSDictionary *userInfo) {
// 根据获取的platformType确定所选平台进行下一步操作
[self shareWebPageToPlatformType:platformType];
}];

注: setPreDefinePlatforms 传入的平台必须是合法并且是core模块已经检测到的已经存在的平台,不然会被过滤掉(此条款是上线AppStore审核的条件)

分享面板 UI 的定制

友盟的分享面板由四个主体控件组成,可以根据自己的需求来自定义这四个控件;

  • UMSocialShareTitleView title控件,对应的配置类 –> UMSocialShareTitleViewConfig
  • UMSocialSharePageScrollView 分页控件,对应的配置类 –> UMSocialSharePageScrollViewConfig
  • UMSocialSharePageControl PageControl控件,对应的配置类 –> UMSocialSharePageControlConfig
  • UMSocialShareCancelControl CancelControl控件,对应的配置类 –> UMSocialShareCancelControlConfig

用户通过修改每个对应的控件对应相应的配置类的参数来控制控件的外观

UMSocialShareTitleViewConfig 的参数如下:

1
2
3
4
5
6
7
BOOL isShow;//是否显示
NSString* shareTitleViewTitleString;//标题的文字
UIFont* shareTitleViewFont;//字体
UIColor* shareTitleViewTitleColor;//文字颜色
UIColor* shareTitleViewBackgroundColor;//背景颜色
CGFloat shareTitleViewPaddingTop;//title的内边距top
CGFloat shareTitleViewPaddingBottom;//title的内边距Bottom

UMSocialSharePageScrollViewConfig 的参数如下:

1
2
3
4
5
6
CGFloat shareScrollViewPageMaxItemWidth; //每页Items的最大宽度
CGFloat shareScrollViewPageMaxItemHeight; //每页Items的最大高度
UMSocialPlatformItemViewBackgroudType shareScrollViewPageItemStyleType;//每个Item的背景类型
CGFloat shareScrollViewPageMaxRowCountForPortraitAndBottom; //每页显示最大的行(在底部显示手机处于肖像模式)
CGFloat shareScrollViewPageMaxColumnCountForPortraitAndBottom; //每页显示最大的列(在底部显示手机处于肖像模式)
....

UMSocialSharePageControlConfig 的参数如下:

1
2
3
4
5
BOOL isShow;//是否显示
UIColor* sharePageControlPageIndicatorTintColor;//指示器颜色
UIColor* sharePageControlCurrentPageIndicatorTintColor;//当前的页的颜色
BOOL sharePageControlHidesForSinglePage;//为一页是会隐藏
UIColor* sharePageControlBackgroundColor;//背景色

UMSocialShareCancelControlConfig 的参数如下:

1
2
3
4
5
BOOL isShow;//是否显示
NSString* shareCancelControlText;//相对父view的左边距
UIColor* shareCancelControlTextColor;//文字颜色
UIFont* shareCancelControlTextFont;//文字字体
UIColor* shareCancelControlBackgroundColor;//背景颜色;

假如要修改当前分享面板为:无titleview,面板显示再中间,肖像模式下的2行3列,风景模式2行6列,没有取消控件,在调用显示分享面板的时候添加如下代码即可:

1
2
3
4
5
6
7
[UMSocialShareUIConfig shareInstance].shareTitleViewConfig.isShow = NO;
[UMSocialShareUIConfig shareInstance].sharePageGroupViewConfig.sharePageGroupViewPostionType = UMSocialSharePageGroupViewPositionType_Middle;
[UMSocialShareUIConfig shareInstance].sharePageScrollViewConfig.shareScrollViewPageMaxRowCountForPortraitAndMid = 2;
[UMSocialShareUIConfig shareInstance].sharePageScrollViewConfig.shareScrollViewPageMaxColumnCountForPortraitAndMid = 3;
[UMSocialShareUIConfig shareInstance].sharePageScrollViewConfig.shareScrollViewPageMaxRowCountForLandscapeAndMid = 2;
[UMSocialShareUIConfig shareInstance].sharePageScrollViewConfig.shareScrollViewPageMaxColumnCountForLandscapeAndMid = 6;
[UMSocialShareUIConfig shareInstance].shareCancelControlConfig.isShow = NO;

分享面板的其他功能使用可以参考官方文档:分享面板UI

第三方登录集成

第三方登录主要用于简化用户登录流程,通过用户拥有的微博、QQ、微信等第三方账号进行登录,最终通过调用登录接口,获取用户在第三方平台的用户ID、头像等资料完成自己App账号体系的构建

支持的平台:

  • 国内平台 微信、QQ、新浪、腾讯微博、人人网、豆瓣
  • 国外平台 Facebook、Twitter、linkedIn、Kakao

在需要进行获取登录信息的控制器中加入如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#import <UMSocialCore/UMSocialCore.h>
[[UMSocialManager defaultManager] getUserInfoWithPlatform:UMSocialPlatformType_Sina currentViewController:self completion:^(id result, NSError *error) {
if (error) {
}else{
UMSocialUserInfoResponse *userInfo = result;
// 第三方登录数据(为空表示平台未提供)
// 授权数据
NSLog(@" uid: %@", userInfo.uid);
NSLog(@" openid: %@", userInfo.openid);
NSLog(@" accessToken: %@", userInfo.accessToken);
NSLog(@" refreshToken: %@", userInfo.refreshToken);
NSLog(@" expiration: %@", userInfo.expiration);
// 用户数据
NSLog(@" name: %@", userInfo.name);
NSLog(@" iconurl: %@", userInfo.iconurl);
NSLog(@" gender: %@", userInfo.gender);
// 第三方平台SDK原始数据
NSLog(@" originaluserInfoonse: %@", userInfo.originalResponse);
}
}];

授权登录成功后,第三方平台会将用户资料传回,由于各个平台对于用户资料的标识不同,因此为了便于开发者使用,友盟将一些常用的字段做了统一封装,开发者可以直接获取,不再需要对不同平台的不同字段名做转换,这里列出封装的字段及含义:

UShare封装后字段名 QQ原始字段名 微信原始字段名 新浪原始字段名 字段含义 备注
uid openid unionid id 用户唯一标识uid如果要实现 Android 与 iOS 平台打通,必须确保为统一APPID
name screen_name screen_name screen_name 用户昵称
gender gender gender gender 用户性别 该字段会直接返回男女
iconurl profile_image_url profile_image_ur profile_image_url 用户头像  

以上就是友盟分享 U-Share 的集成与使用,基本都是来自官方文档,官方文档写的很详细,集成过程中遇到问题和错误在文档中基本可以找得到解决的办法

本人刚开始写博客,主要是为了给自己的知识点做一个笔记,方便自己以后查阅,如果能让别人有所启发也是荣幸之至!如有错误,欢迎指正!