在iOS开发中,当我们需要集成多个平台分享时,多数情况下我们会通过友盟,ShareSDK等第三方的分享平台来加快开发进度,关于友盟分享的集成方法在其官网上以及有详细指导,这里简单介绍下流程,文章后面分享一些在集成友盟分享时遇到的问题和解决方法。
导入框架
-
使用CocoaPods集成
pod 'UMengSocialCOM', '~> 5.2.1'
pod install -
手动下载时,将下面文件夹导入到工程路径下。附:官方sdk下载页面
UMSocial_Sdk_x.x.x 文件夹
UMSocial_Sdk_Extra_Frameworks 文件夹
添加系统需要的framework
-
target->Bulid Phases->Linked Binary and Libraries中增加以下框架:
Security.framework
libiconv.tbd
SystemConfiguration.framework
CoreGraphics.Framework
libsqlite3.tbd
CoreTelephony.framework
libstdc++.tbd
libz.tbd
ImageIO.framework -
在Bulid Settings---other linker flags增加
-ObjC
设置友盟appkey
在友盟官网上注册账号后,在首页上选择“友盟分享”后,进入友盟分享的管理页,为自己的应用注册一个appkey。
得到appkey后,在AppDelegate中的-didFinishLaunchingWithOptions使用:
#import "UMSocial.h"
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
[UMSocialData setAppKey:@"上图中得到的appkey"];
}
配置第三方APPID
在需要分享的平台的开发者官网上为自己的应用注册信息,并拿到相应的使用秘钥
QQ申请地址: http://open.qq.com
微信申请地址:https://open.weixin.qq.com
新浪申请地址:http://open.weibo.com
将下面的方法同样写在AppDelegate的-didFinishLaunchingWithOptions方法中
//设置微信AppId、appSecret,分享url
[UMSocialWechatHandler setWXAppId:@"wxd930ea5d5a258f4f" appSecret:@"db426a9829e4b49a0dcac7b4162da6b6" url:@"http://www.umeng.com/social"];
//设置手机QQ 的AppId,Appkey,和分享URL,需要#import "UMSocialQQHandler.h"
[UMSocialQQHandler setQQWithAppId:@"100424468" appKey:@"c7394704798a158208a74ab60104f0ba" url:@"http://www.umeng.com/social"];
//打开新浪微博的SSO开关,设置新浪微博回调地址,这里必须要和你在新浪微博后台设置的回调地址一致。需要 #import "UMSocialSinaSSOHandler.h"
[UMSocialSinaSSOHandler openNewSinaSSOWithAppKey:@"3921700954" secret:@"04b48b094faeb16683c32669824ebdad" RedirectURL:@"http://sns.whalecloud.com/sina2/callback"];
配置系统回调
在APPdelegate.m中增加下面的系统回调配置,注意如果同时使用微信支付、支付宝等其他需要改写回调代理的SDK,请在if分支下做区分,否则会影响 分享、登录的回调
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{
BOOL result = [UMSocialSnsService handleOpenURL:url];
if (result == FALSE) {
//调用其他SDK,例如支付宝SDK等
}
return result;
}
配置URL scheme
target->Info->URL Types 中添加 URL Schemes,根据分享需要选择性添加,格式如下:
|平台|url scheme设置格式|例子
|---|--|
|新浪|"wb"+"新浪appkey"|例如:wb126663232|
|微信|"微信应用appId"|例如:wxd9a39c7122aa6516|
|QQ、QQ空间|1. “QQ”+十六进制appId(不足8位前面补0)|例如:QQ05FC5B14|
||2. “tencent“+appId,|:例如tencent100424468
调用默认风格进行分享
如果想快速集成的话,可以直接使用友盟内置分享UI界面
[UMSocialData defaultData].extConfig.title = @"分享的title";
[UMSocialData defaultData].extConfig.qqData.url = @"http://baidu.com";
[UMSocialSnsService presentSnsIconSheetView:self
appKey:@"507fcab25270157b37000010"
shareText:@"友盟社会化分享让您快速实现分享等社会化功能,http://umeng.com/social"
shareImage:[UIImage imageNamed:@"icon"]
shareToSnsNames:@[UMShareToWechatSession,UMShareToWechatTimeline,UM ShareToSina,UMShareToQQ,UMShareToQzone]
delegate:self];
分享后回调方法:
-(void)didFinishGetUMSocialDataInViewController:(UMSocialResponseEntity *)response
{
//根据`responseCode`得到发送结果,如果分享成功
if(response.responseCode == UMSResponseCodeSuccess)
{
//得到分享到的平台名
NSLog(@"share to sns name is %@",[[response.data allKeys] objectAtIndex:0]);
}
}
问题及解决方法
-
解决控制台"This app is not allowed to query for scheme xxxx"问题
1 . info.plist -> NSApp Transport Security下新增(NS前缀可以省略)
NSAllowsArbitraryLoads : YES
2 . Info.plist -> LSApplicationQueriesSchemes (没有就创建,Array类型),将所有的xxxx增加到数组中:
-
控制台"The resource could not be loaded because the App Transport Security policy requires the use of a secure connection."错误
以iOS9 SDK编译的工程会默认以SSL安全协议进行网络传输,即HTTPS,如果依然使用HTTP协议请求网络会报系统异常并中断请求。
比较简单的方法是在info.plist->NSAppTransportSecurity下增加
NSAllowsArbitraryLoads : YES
指定所有HTTP连接都可正常请求
-
解决AppStore上架问题
Additionally, we found that your app requires the installation of another app before it can be used, which is not in compliance with the App Store Review Guidelines. Apps should be able to run on launch, without requiring additional applications to be installed.
Specifically, we were required to install WeChat/QQ before we could use the sharing features in your app.
Please revise your app so that a user can use it upon launch. If your app requires authentication before use, please use a method that can authenticate users from within your app.
使用微信分享、登录必须安装微信客户端,QQ登录、QQ空间分享过程中必须安装手机QQ客户端,在未安装客户端的设备上测试会提示下载,这是不符合苹果审核规则的。所以在调用前我们先调用微信SDK或QQ互联SDK的方法检测是否安装微信/QQ客户端
判断方法在下面两个头文件内:
#import "WXApi.h"
#import <TencentOpenAPI/QQApiInterface.h>
创建一个可变数组存放可分享的平台
//弹出前先检测平台是否安装
NSMutableArray *platformArray = [[NSMutableArray alloc] init];
if ([WXApi isWXAppInstalled]) {
[platformArray addObject:UMShareToWechatTimeline];
[platformArray addObject:UMShareToWechatSession];
}
if ([QQApiInterface isQQInstalled]) {
[platformArray addObject:UMShareToQzone];
[platformArray addObject:UMShareToQQ];
}
//弹出分享平台选择界面
[UMSocialSnsService presentSnsIconSheetView:self
appKey:@"507fcab25270157b37000010"
shareText:@"友盟社会化分享让您快速实现分享等社会化功能,http://umeng.com/social"
shareImage:[UIImage imageNamed:@"icon"]
shareToSnsNames:platformArray//使用上面的变量
delegate:self];
-
模拟器中运行报错Undefined symbols for architecture i386
由于最新版本的QQ sdk_v_3.1.0中去除了i386架构的支持因此,后续凡使用了新版友盟的,都只要在真机运行通过即可
网友评论
集成友盟后。点击项目中的分享按钮,我的提示这个,求楼主告之怎么回事,如解答必重谢
"l_OBJC_PROTOCOL_$_TencentApiInterfaceDelegate", referenced from:
l_OBJC_$_PROTOCOL_REFS_TencentSessionDelegate in IMALoginViewController.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)