github链接地址(一个包含QQ,微信,新浪微博原生平台集成以及支付宝微信支付的Demo)
pod 'YYKit'
pod 'Masonry'
pod 'WechatOpenSDK'
pod 'Weibo_SDK', :git => 'https://github.com/sinaweibosdk/weibo_ios_sdk.git'
TencentOpenAPI.framework
:AlipaySDK.framework
libc++.tbd
libz.tbd
SystemConfiguration.framework
CoreTelephony.framework
QuartzCore.framework
CoreText.framework
CoreGraphics.framework
UIKit.framework
Foundation.framework
CFNetwork.framework
CoreMotion.framework
在项目中的info.plist
中加入应用白名单
LSApplicationQueriesSchemes
wechat
weixin
sinaweibohd
sinaweibo
sinaweibosso
weibosdk
weibosdk2.5
mqqapi
mqq
mqqOpensdkSSoLogin
mqqconnect
mqqopensdkdataline
mqqopensdkgrouptribeshare
mqqopensdkfriend
mqqopensdkapi
mqqopensdkapiV2
mqqopensdkapiV3
mqzoneopensdk
wtloginmqq
wtloginmqq2
mqqwpa
mqzone
mqzonev2
mqzoneshare
wtloginqzone
mqzonewx
mqzoneopensdkapiV2
mqzoneopensdkapi19
mqzoneopensdkapi
mqzoneopensdk
alipay
alipayshare
LSRequiresIPhoneOS
NSAppTransportSecurity
NSAllowsArbitraryLoads
tencent
+腾讯QQ互联应用appID
wb
+新浪微博Appkey
wx
+微信Appkey
#import
#import
#import
#import "WeiboSDK.h"
@interface WHAppDelegate : UIResponder
@property (strong, nonatomic) UIWindow *window;
@property (nonatomic, strong) TencentOAuth *tencentOAuth;
@property (nonatomic, strong) WeiboSDK *weibo;
@property (nonatomic, strong) NSString *wbtoken;
@end
#import "WHAppDelegate.h"
#import "WHAppDelegate+WHAppService.h" // 应用服务
#import "WHAppDelegate+WHThirdResponse.h" // 第三方回调, 包含支付、分享
@interface WHAppDelegate ()
@end
@implementation WHAppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
[self setUpAppService];
[self setUpWXShareService];
[self setUpQQService];
[self setUpSinaWeiBoService];
return YES;
}
@end
#import "WHAppDelegate.h"
#import "WXApi.h"
@interface WHAppDelegate (WHThirdResponse)
- (void)setUpWXShareService; // 微信
- (void)setUpQQService; // QQ
- (void)setUpSinaWeiBoService; // 新浪微博
@end
#import "WHAppDelegate+WHThirdResponse.h"
#import
@implementation WHAppDelegate (WHThirdResponse)
#pragma mark - —————— 注册第三方服务 ——————
- (void)setUpWXShareService { // 微信
[WXApi registerApp:kWXAppKey];
}
- (void)setUpQQService { // QQ
self.tencentOAuth = [[TencentOAuth alloc] initWithAppId:kQQAppID andDelegate:self];
}
- (void)setUpSinaWeiBoService { // 新浪微博
[WeiboSDK enableDebugMode:NO];
[WeiboSDK registerApp:kSinaAppKey];
}
#pragma mark - —————— WeiboSDKDelegate ——————
- (void)didReceiveWeiboRequest:(WBBaseRequest *)request {
}
- (void)didReceiveWeiboResponse:(WBBaseResponse *)response {
if ([response isKindOfClass:WBSendMessageToWeiboResponse.class]) {
WBSendMessageToWeiboResponse *sendMessageToWeiboResponse = (WBSendMessageToWeiboResponse *)response;
NSString *accessToken = [sendMessageToWeiboResponse.authResponse accessToken];
if (accessToken) {
self.wbtoken = accessToken;
}
if (response.statusCode == WeiboSDKResponseStatusCodeSuccess) {
// [WHView showAlertwithTitle:nil message:@"分享成功" okAction:nil cancelAction:nil];
} else if (response.statusCode == WeiboSDKResponseStatusCodeUserCancel) {
// [WHView showAlertwithTitle:nil message:@"取消分享" okAction:nil cancelAction:nil];
} else {
// [WHView showAlertwithTitle:nil message:@"分享失败" okAction:nil cancelAction:nil];
}
}
else if ([response isKindOfClass:WBAuthorizeResponse.class]) {
if (response.statusCode == 0) {
// 新浪微博授权成功
// [WHView showAlertwithTitle:nil message:@"授权成功" okAction:nil cancelAction:nil];
} else {
// 新浪微博授权失败
// [WHView showAlertwithTitle:nil message:@"授权失败" okAction:nil cancelAction:nil];
}
}
}
#pragma mark - —————— QQApiInterfaceDelegate | WXApiDelegate ——————
- (void)onReq:(QQBaseReq *)req {
DLog(@"——————req—————— %@", req);
}
- (void)onResp:(NSObject *)resp {
DLog(@"——————resp—————— %@", resp);
// SendMessageToQQResp应答帮助类
if ([resp.class isSubclassOfClass:[SendMessageToQQResp class]]) { //QQ分享回应
SendMessageToQQResp *msgToQQ = (SendMessageToQQResp *)resp;
NSLog(@"code %@ errorDescription %@ infoType %@", msgToQQ.result, msgToQQ.errorDescription, msgToQQ.extendInfo);
SendMessageToQQResp * tmpResp = (SendMessageToQQResp *)resp;
if (tmpResp.type == ESENDMESSAGETOQQRESPTYPE && tmpResp.result.integerValue == 0) { // 分享成功
// [WHView showAlertwithTitle:nil message:@"分享成功" okAction:nil cancelAction:nil];
} else if (tmpResp.type == ESENDMESSAGETOQQRESPTYPE && tmpResp.result.integerValue == -4) { // 取消分享
// [WHView showAlertwithTitle:nil message:@"取消分享" okAction:nil cancelAction:nil];
} else {
// [WHView showAlertwithTitle:nil message:@"分享失败" okAction:nil cancelAction:nil];
}
}
/** 微信 App 分享功能调整
* https://open.weixin.qq.com/cgi-bin/announce?spm=a311a.9588098.0.0&action=getannouncement&key=11534138374cE6li&version=
*/
// if ([resp isKindOfClass:[SendMessageToWXResp class]]) {
// SendMessageToWXResp *msgToWX = (SendMessageToWXResp *)resp;
// if (msgToWX.errCode == 0) {
// [WHView showAlertwithTitle:nil message:@"分享成功" okAction:nil cancelAction:nil];
// } else {
// [WHView showAlertwithTitle:nil message:@"分享失败" okAction:nil cancelAction:nil];
// }
// }
if ([resp isKindOfClass:[PayResp class]]) {
PayResp *payResp = (PayResp *)resp;
NSString *payResult = [NSString stringWithFormat:@"errcode: %d", payResp.errCode];
// 支付返回结果,实际支付结果需要去微信服务器端查询
switch (payResp.errCode) {
case 0:
payResult = @"支付成功";
break;
case -1:
payResult = @"支付结果:失败!";
break;
case -2:
payResult = @"用户已经退出支付!";
break;
default:
payResult = [NSString stringWithFormat:@"支付结果:失败!retcode = %d, retstr = %@", payResp.errCode, payResp.errStr];
}
// [WHView showAlertwithTitle:nil message:payResult okAction:nil cancelAction:nil];
}
}
- (void)isOnlineResponse:(NSDictionary *)response {
}
#pragma mark - —————— TencentSessionDelegate ——————
/** 登录成功 */
- (void)tencentDidLogin {
if (self.tencentOAuth.accessToken && 0 != [self.tencentOAuth.accessToken length]) {
// 记录登录用户的OpenID、Token以及过期时间
[self.tencentOAuth getUserInfo];
} else {
// 登录不成功 没有获取accesstoken
}
}
- (void)getUserInfoResponse:(APIResponse *)response {
DLog(@"response:%@", response.jsonResponse);
}
/** 非网络错误导致登录失败 */
- (void)tencentDidNotLogin:(BOOL)cancelled {
if (cancelled) { //用户取消登录
DLog(@"用户取消登录");
} else { // 登录失败
DLog(@"登录失败");
}
}
/** 网络错误导致登录失败 */
- (void)tencentDidNotNetWork {
// 无网络连接,请设置网络
}
#pragma mark - —————— Handle openURL ——————
- (void)gridResult:(NSDictionary *)resultDic {
NSNumber *resultStatus = resultDic[@"resultStatus"];
if (resultStatus.intValue == 9000) {
// [WHView showAlertwithTitle:nil message:@"支付成功" okAction:nil cancelAction:nil];
} else {
// [WHView showAlertwithTitle:nil message:@"支付失败" okAction:nil cancelAction:nil];
}
}
- (BOOL)handleOpenURL:(NSURL *)url {
if ([url.absoluteString hasPrefix:NSStringFormat(@"tencent%@", kQQAppID)]) {
[QQApiInterface handleOpenURL:url delegate:self];
return [TencentOAuth HandleOpenURL:url];
}
if ([url.absoluteString hasPrefix:NSStringFormat(@"wb%@", kSinaAppKey)]) {
return [WeiboSDK handleOpenURL:url delegate:self];
}
if ([url.host isEqualToString:@"platformId=wechat"] || [url.host isEqualToString:@"pay"] || [url.scheme isEqualToString:kWXAppKey]) {
return [WXApi handleOpenURL:url delegate:self];
}
if ([url.host isEqualToString:@"safepay"]) { // 处理支付宝支付结果
[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
DLog(@"result2 = %@", resultDic);
[self gridResult:resultDic];
}];
}
return YES;
}
// NOTE: 9.0以后使用新API接口
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary *)options {
return [self handleOpenURL:url];
}
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
return [self handleOpenURL:url];
}
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(nullable NSString *)sourceApplication annotation:(id)annotation {
return [self handleOpenURL:url];
}
@end
#import
typedef NS_ENUM(NSUInteger, WHQQShareType) {
WHQQShareTypeToQQ,
WHQQShareTypeToQZone,
};
@interface WHThirdShareTool : NSObject
#pragma mark —————— QQ分享 ——————
/** 纯文本分享 */
+ (void)QQMakeShareText:(NSString *)text;
/** 纯图片分享 */
+ (void)QQMakeShareTitle:(NSString *)title description:(NSString *)description image:(UIImage *)image;
/** 新闻分享 */
+ (void)QQMakeShareNewsUrlStr:(NSString *)urlStr title:(NSString *)title description:(NSString *)description previewImageUrl:(NSString *)previewImageUrl shareType:(WHQQShareType)shareType;
/** 音乐分享 */
+ (void)QQMakeShareAudioUrlStr:(NSString *)urlStr title:(NSString *)title description:(NSString *)description previewImageUrl:(NSString *)previewImageUrl shareType:(WHQQShareType)shareType;
/** 视频分享 */
+ (void)QQMakeShareVideoUrlStr:(NSString *)urlStr title:(NSString *)title description:(NSString *)description previewImageUrl:(NSString *)previewImageUrl flashURL:(NSString *)flashURL image:(UIImage *)image shareType:(WHQQShareType)shareType;
#pragma mark —————— 微信分享 ——————
+ (void)WXMakeShareTitle:(NSString *)title description:(NSString *)description webpageUrl:(NSString *)webpageUrl image:(UIImage *)image type:(int)type;
#pragma mark —————— 新浪微博分享 ——————
+ (void)SinaWeiBoMakeShareText:(NSString *)text image:(UIImage *)image objectID:(NSString *)objectID title:(NSString *)title description:(NSString *)description thumbImage:(UIImage *)thumbImage webpageUrl:(NSString *)webpageUrl;
@end
#import "WHThirdShareTool.h"
#import
#import
#import "WXApi.h"
#import "WeiboSDK.h"
#import "WHAppDelegate.h"
@implementation WHThirdShareTool
#pragma mark —————— QQ分享 ——————
+ (void)handleSendResult:(QQApiSendResultCode)sendResult {
NSString *errorMsg = @"";
switch (sendResult) {
case EQQAPISENDSUCESS:
errorMsg = @"成功";
break;
case EQQAPIAPPNOTREGISTED:
errorMsg = @"App未注册";
break;
case EQQAPIMESSAGECONTENTINVALID:
case EQQAPIMESSAGECONTENTNULL:
case EQQAPIMESSAGETYPEINVALID:
errorMsg = @"发送参数错误";
break;
case EQQAPIQQNOTINSTALLED:
errorMsg = @"未安装手Q";
break;
case EQQAPIQQNOTSUPPORTAPI:
errorMsg = @"API接口不支持";
break;
case EQQAPISENDFAILD:
errorMsg = @"发送失败";
break;
case EQQAPIVERSIONNEEDUPDATE:
errorMsg = @"当前QQ版本太低,需要更新";
break;
default:
errorMsg = @"未知错误!";
break;
}
DLog(@"errorMsg = %@", errorMsg);
}
+ (void)QQMakeShare:(QQBaseReq *)req shareType:(WHQQShareType)shareType {
if (shareType == WHQQShareTypeToQQ) { // 将内容分享到QQ
QQApiSendResultCode sent = [QQApiInterface sendReq:req];
[self handleSendResult:sent];
} else if (shareType == WHQQShareTypeToQZone) { // 将内容分享到qzone
QQApiSendResultCode sent = [QQApiInterface SendReqToQZone:req];
[self handleSendResult:sent];
}
}
/** 纯文本分享
* [WHThirdShareTool QQMakeShareText:@"文本分享测试"];
*/
+ (void)QQMakeShareText:(NSString *)text {
QQApiTextObject *txtObj = [QQApiTextObject objectWithText:text];
SendMessageToQQReq *req = [SendMessageToQQReq reqWithContent:txtObj];
[self QQMakeShare:req shareType:WHQQShareTypeToQQ];
}
/** 纯图片分享
* [WHThirdShareTool QQMakeShareTitle:@"测试标题" description:@"测试描述" image:IMAGE_NAMED(@"share_back_png")];
*/
+ (void)QQMakeShareTitle:(NSString *)title description:(NSString *)description image:(UIImage *)image {
NSData *imgData = UIImagePNGRepresentation(image);
QQApiImageObject *imgObj = [QQApiImageObject objectWithData:imgData
previewImageData:imgData
title:title
description:description];
SendMessageToQQReq *req = [SendMessageToQQReq reqWithContent:imgObj];
[self QQMakeShare:req shareType:WHQQShareTypeToQQ];
}
/** 新闻分享
* [WHThirdShareTool QQMakeShareNewsUrlStr:@"http://www.baidu.com" title:@"测试标题" description:@"测试描述" previewImageUrl:nil shareType:WHQQShareTypeToQQ];
*/
+ (void)QQMakeShareNewsUrlStr:(NSString *)urlStr title:(NSString *)title description:(NSString *)description previewImageUrl:(NSString *)previewImageUrl shareType:(WHQQShareType)shareType {
QQApiNewsObject *newsObj = [QQApiNewsObject
objectWithURL:[NSURL URLWithString:urlStr]
title:title
description:description
previewImageURL:[NSURL URLWithString:previewImageUrl]];
SendMessageToQQReq *req = [SendMessageToQQReq reqWithContent:newsObj];
[self QQMakeShare:req shareType:shareType];
}
/** 音乐分享 */
+ (void)QQMakeShareAudioUrlStr:(NSString *)urlStr title:(NSString *)title description:(NSString *)description previewImageUrl:(NSString *)previewImageUrl shareType:(WHQQShareType)shareType {
QQApiAudioObject *audioObj =
[QQApiAudioObject objectWithURL:[NSURL URLWithString:urlStr]
title:title
description:description
previewImageURL:[NSURL URLWithString:previewImageUrl]];
SendMessageToQQReq *req = [SendMessageToQQReq reqWithContent:audioObj];
[self QQMakeShare:req shareType:shareType];
}
/** 视频分享 */
+ (void)QQMakeShareVideoUrlStr:(NSString *)urlStr title:(NSString *)title description:(NSString *)description previewImageUrl:(NSString *)previewImageUrl flashURL:(NSString *)flashURL image:(UIImage *)image shareType:(WHQQShareType)shareType {
NSData *imgData = UIImagePNGRepresentation(image);
QQApiVideoObject *videoObj = [QQApiVideoObject objectWithURL:[NSURL URLWithString:urlStr]
title:title
description:description
previewImageData:imgData];
[videoObj setFlashURL:[NSURL URLWithString:flashURL]];
SendMessageToQQReq *req = [SendMessageToQQReq reqWithContent:videoObj];
[self QQMakeShare:req shareType:shareType];
}
#pragma mark —————— 微信分享 ——————
+ (void)WXMakeShareTitle:(NSString *)title description:(NSString *)description webpageUrl:(NSString *)webpageUrl image:(UIImage *)image type:(int)type {
if ([WXApi isWXAppInstalled]) {
SendMessageToWXReq *sendReq = [[SendMessageToWXReq alloc] init];
sendReq.bText = NO; //不使用文本信息
sendReq.scene = type; //0 = 好友列表 1 = 朋友圈 2 = 收藏
// 创建分享内容对象
WXMediaMessage *urlMessage = [WXMediaMessage message];
urlMessage.title = title; //分享标题
urlMessage.description = description; //分享描述
[urlMessage setThumbImage:image];
// 创建多媒体对象
WXWebpageObject *webObj = [WXWebpageObject object];
webObj.webpageUrl = webpageUrl; //分享链接
// 完成发送对象实例
urlMessage.mediaObject = webObj;
sendReq.message = urlMessage;
// 发送分享信息
[WXApi sendReq:sendReq];
} else {
// [WHView showMessage:@"未安装微信!" inView:nil];
}
}
#pragma mark —————— 新浪微博分享 ——————
+ (void)SinaWeiBoMakeShareText:(NSString *)text image:(UIImage *)image objectID:(NSString *)objectID title:(NSString *)title description:(NSString *)description thumbImage:(UIImage *)thumbImage webpageUrl:(NSString *)webpageUrl {
WHAppDelegate *myDelegate = (WHAppDelegate *)[[UIApplication sharedApplication] delegate];
WBAuthorizeRequest *authRequest = [WBAuthorizeRequest request];
authRequest.redirectURI = @"http://api.weibo.com/oauth2/default.html";
authRequest.scope = @"all";
WBMessageObject *message = [WBMessageObject message];
message.text = text;
if (image) {
WBImageObject *imageObject = [WBImageObject object];
imageObject.imageData = UIImagePNGRepresentation(image);
message.imageObject = imageObject;
} else {
WBWebpageObject *webpage = [WBWebpageObject object];
webpage.objectID = objectID;
webpage.title = title;
webpage.description = description;
UIGraphicsBeginImageContext(CGSizeMake(thumbImage.size.width*0.5, thumbImage.size.height*0.5));
[image drawInRect:CGRectMake(0, 0, thumbImage.size.width*0.5, thumbImage.size.height*0.5)];
UIImage *resultImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
NSData *resultThumbImageData = UIImageJPEGRepresentation(resultImage, 0.5);
long thumbImageSize = (long)(resultThumbImageData.length / 1024);
// DLog(@"resultThumbImageDataLength: %ld k", (long)(resultThumbImageData.length / 1024));
if (thumbImageSize < 32) {
webpage.thumbnailData = resultThumbImageData;
}
webpage.webpageUrl = webpageUrl;
message.mediaObject = webpage;
}
WBSendMessageToWeiboRequest *request = [WBSendMessageToWeiboRequest requestWithMessage:message authInfo:authRequest access_token:myDelegate.wbtoken];
[WeiboSDK sendRequest:request];
}
@end
#import "WHHomeController.h"
#import "WHSharePlatformView.h"
#import "WHThirdShareTool.h"
@interface WHHomeController ()
@end
@implementation WHHomeController
- (void)viewDidLoad {
[super viewDidLoad];
[self setUpUI];
}
- (void)setUpUI {
WHSharePlatformView *sharView = [[WHSharePlatformView alloc] initWithImageArray:@[@"share_WXChat_icon", @"share_WXpengyou_icon", @"share_QQ_icon", @"share_Sina_icon"]];
[self.view addSubview:sharView];
[sharView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.mas_equalTo(self.view.mas_bottom);
make.left.right.mas_equalTo(self.view);
make.height.mas_equalTo(kRealwidth(66));
}];
[self.view layoutIfNeeded];
[UIView animateWithDuration:.5f delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
[sharView mas_remakeConstraints:^(MASConstraintMaker *make) {
make.top.mas_equalTo(self.view.mas_bottom).offset(-kRealwidth(100));
make.left.right.mas_equalTo(self.view);
make.height.mas_equalTo(kRealwidth(66));
}];
[self.view layoutIfNeeded];
} completion:nil];
kWeakSelf(self);
sharView.clicked = ^(int index) {
[weakself makeShareby:index];
};
}
- (void)makeShareby:(int)index {
DLog(@"index == %d", index);
if (index == 2) { // QQ分享
[self makeShareToQQ];
}
if (index == 0) {
[self makeShareToWX:0];
}
if (index == 1) {
[self makeShareToWX:1];
}
if (index == 3) {
[self makeSinaShare];
}
}
#pragma mark - —————— QQ分享 ——————
- (void)makeShareToQQ {
[WHThirdShareTool QQMakeShareTitle:@"测试标题" description:@"测试描述" image:IMAGE_NAMED(@"share_back_png")];
}
#pragma mark —————— 微信分享 ——————
- (void)makeShareToWX:(int)type {
[WHThirdShareTool WXMakeShareTitle:@"测试标题" description:@"测试描述" webpageUrl:@"http://www.baidu.com" image:IMAGE_NAMED(@"share_back_png") type:type];
}
#pragma mark —————— 新浪微博分享 ——————
- (void)makeSinaShare {
[WHThirdShareTool SinaWeiBoMakeShareText:@"测试文本内容" image:nil objectID:@"hahahha" title:@"测试标题" description:@"测试描述" thumbImage:IMAGE_NAMED(@"share_back_png") webpageUrl:@"http://www.baidu.com"];
}
@end
github链接地址(一个包含QQ,微信,新浪微博原生平台集成以及支付宝微信支付的Demo)