├── CCOpenService ├── CCOpenConfig.h ├── CCOpenConfig.m ├── CCOpenPayRequestEntity.h ├── CCOpenPayRequestEntity.m ├── CCOpenProtocol.h ├── CCOpenRequestEntity.h ├── CCOpenRequestEntity.m ├── CCOpenRespondEntity.h ├── CCOpenRespondEntity.m ├── CCOpenService.h ├── CCOpenService.m ├── CCOpenShareRequestEntity.h ├── CCOpenShareRequestEntity.m ├── CCOpenStrategy.h ├── CCOpenStrategy.m ├── CCOpenWXPayRequestEntity.h ├── CCOpenWXPayRequestEntity.m ├── CCQQOpenStrategy.h ├── CCQQOpenStrategy.m ├── CCShareCell.xib ├── CCShareFilterView.h ├── CCShareFilterView.m ├── CCShareFilterView.xib ├── CCWeiBoOpenStrategy.h ├── CCWeiBoOpenStrategy.m ├── CCWeiXinOpenStrategy.h ├── CCWeiXinOpenStrategy.m ├── QQ │ ├── TencentOpenAPI.framework │ │ ├── Headers │ │ │ ├── QQApiInterface.h │ │ │ ├── QQApiInterfaceObject.h │ │ │ ├── TencentApiInterface.h │ │ │ ├── TencentMessageObject.h │ │ │ ├── TencentOAuth.h │ │ │ ├── TencentOAuthObject.h │ │ │ └── sdkdef.h │ │ ├── Resources │ │ │ └── ios_open_sdk_3.1.0.3_iphone │ │ └── TencentOpenAPI │ └── TencentOpenApi_IOS_Bundle.bundle │ │ ├── error.png │ │ ├── local.html │ │ ├── qqicon.png │ │ └── success.png ├── Resource │ ├── CC_Link.png │ ├── CC_QQ.png │ ├── CC_QZone.png │ ├── CC_WeChat.png │ ├── CC_WeChatTL.png │ ├── CC_WeiBo.png │ └── Public_ShareTest.png ├── WeiBo │ └── 说明.txt └── WeiXin │ ├── README.txt │ ├── WXApi.h │ ├── WXApiObject.h │ ├── WechatAuthSDK.h │ ├── libWeChatSDK.a │ └── read_me.txt ├── LICENSE ├── Podfile ├── README.md └── images ├── CCOpenService_Tree.png └── WeiXin_URL_Scheme.jpg /CCOpenService/CCOpenConfig.h: -------------------------------------------------------------------------------- 1 | // 2 | // CCOpenConfig.h 3 | // 4 | // 5 | // Created by Cocos on 16/4/15. 6 | // Copyright © 2016年 Cocos. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface CCOpenConfig : NSObject 12 | //微信 配置 13 | + (void)setWeiXinAppID:(NSString *)AppID; 14 | + (NSString *)getWeiXinAppID; 15 | 16 | + (void)setWeiXinAppSecret:(NSString *)AppSecret; 17 | + (NSString *)getWeiXinAppSecret; 18 | 19 | //QQ 配置 20 | + (void)setQQAppID:(NSString *)AppID; 21 | + (NSString *)getQQAppID; 22 | 23 | + (void)setQQAppKey:(NSString *)AppKey; 24 | + (NSString *)getQQAppKey; 25 | 26 | //微博 配置 27 | + (void)setWeiBoAppKey:(NSString *)AppKey; 28 | + (NSString *)getWeiBoAppKey; 29 | 30 | + (void)setWeiBoAppSecret:(NSString *)AppSecret; 31 | + (NSString *)getWeiBoAppSecret; 32 | 33 | + (void)setWeiBoRedirectURI:(NSString *)URI; 34 | + (NSString *)getWeiBoRedirectURI; 35 | @end 36 | -------------------------------------------------------------------------------- /CCOpenService/CCOpenConfig.m: -------------------------------------------------------------------------------- 1 | // 2 | // CCOpenConfig.m 3 | // 4 | // 5 | // Created by Cocos on 16/4/15. 6 | // Copyright © 2016年 Cocos. All rights reserved. 7 | // 8 | 9 | #import "CCOpenConfig.h" 10 | 11 | @interface CCOpenConfig () 12 | 13 | @property (nonatomic,strong) NSString *wxAppID; 14 | @property (nonatomic,strong) NSString *wxAppSecret; 15 | 16 | @property (nonatomic,strong) NSString *qqAppID; 17 | @property (nonatomic,strong) NSString *qqAppKey; 18 | 19 | @property (nonatomic,strong) NSString *wbAppKey; 20 | @property (nonatomic,strong) NSString *wbAppSecret; 21 | @property (nonatomic,strong) NSString *wbRedirectURI; 22 | @end 23 | 24 | @implementation CCOpenConfig 25 | 26 | static CCOpenConfig *shared; 27 | 28 | + (instancetype)sharedConfig{ 29 | 30 | static dispatch_once_t onceToken; 31 | dispatch_once(&onceToken,^{ 32 | shared = [[CCOpenConfig alloc] init]; 33 | }); 34 | 35 | return shared; 36 | } 37 | 38 | #pragma mark - WeiXin 配置 39 | 40 | + (void)setWeiXinAppID:(NSString *)AppID { 41 | CCOpenConfig *config = [CCOpenConfig sharedConfig]; 42 | config.wxAppID = AppID; 43 | } 44 | 45 | + (void)setWeiXinAppSecret:(NSString *)AppSecret { 46 | CCOpenConfig *config = [CCOpenConfig sharedConfig]; 47 | config.wxAppSecret = AppSecret; 48 | } 49 | 50 | + (NSString *)getWeiXinAppID { 51 | CCOpenConfig *config = [CCOpenConfig sharedConfig]; 52 | if (!config.wxAppID) { 53 | @throw [NSException exceptionWithName:@"Get wxAppID error." reason:@"wxAppID is nil" userInfo:nil]; 54 | } 55 | return config.wxAppID; 56 | } 57 | 58 | + (NSString *)getWeiXinAppSecret { 59 | CCOpenConfig *config = [CCOpenConfig sharedConfig]; 60 | if (!config.wxAppSecret) { 61 | @throw [NSException exceptionWithName:@"Get wxAppSecret error." reason:@"wxAppSecret is nil" userInfo:nil]; 62 | } 63 | return config.wxAppSecret; 64 | } 65 | 66 | #pragma mark - QQ 配置 67 | 68 | + (void)setQQAppID:(NSString *)AppID { 69 | CCOpenConfig *config = [CCOpenConfig sharedConfig]; 70 | config.qqAppID = AppID; 71 | } 72 | 73 | + (NSString *)getQQAppID { 74 | CCOpenConfig *config = [CCOpenConfig sharedConfig]; 75 | if (!config.qqAppID) { 76 | @throw [NSException exceptionWithName:@"Get qqAppID error." reason:@"qqAppID is nil" userInfo:nil]; 77 | } 78 | return config.qqAppID; 79 | } 80 | 81 | + (void)setQQAppKey:(NSString *)AppKey { 82 | CCOpenConfig *config = [CCOpenConfig sharedConfig]; 83 | config.qqAppKey = AppKey; 84 | } 85 | 86 | + (NSString *)getQQAppKey { 87 | CCOpenConfig *config = [CCOpenConfig sharedConfig]; 88 | if (!config.qqAppKey) { 89 | @throw [NSException exceptionWithName:@"Get qqAppKey error." reason:@"qqAppKey is nil" userInfo:nil]; 90 | } 91 | return config.qqAppKey; 92 | } 93 | 94 | #pragma mark - 微博 配置 95 | + (void)setWeiBoAppKey:(NSString *)AppKey { 96 | CCOpenConfig *config = [CCOpenConfig sharedConfig]; 97 | config.wbAppKey = AppKey; 98 | } 99 | 100 | + (NSString *)getWeiBoAppKey { 101 | CCOpenConfig *config = [CCOpenConfig sharedConfig]; 102 | if (!config.wbAppKey) { 103 | @throw [NSException exceptionWithName:@"Get wbAppKey error." reason:@"wbAppKey is nil" userInfo:nil]; 104 | } 105 | return config.wbAppKey; 106 | } 107 | 108 | + (void)setWeiBoAppSecret:(NSString *)AppSecret { 109 | CCOpenConfig *config = [CCOpenConfig sharedConfig]; 110 | config.wbAppSecret = AppSecret; 111 | } 112 | 113 | + (NSString *)getWeiBoAppSecret { 114 | CCOpenConfig *config = [CCOpenConfig sharedConfig]; 115 | if (!config.wbAppSecret) { 116 | @throw [NSException exceptionWithName:@"Get wbAppSecret error." reason:@"wbAppSecret is nil" userInfo:nil]; 117 | } 118 | return config.wbAppSecret; 119 | } 120 | 121 | + (void)setWeiBoRedirectURI:(NSString *)URI { 122 | CCOpenConfig *config = [CCOpenConfig sharedConfig]; 123 | config.wbRedirectURI = URI; 124 | } 125 | 126 | + (NSString *)getWeiBoRedirectURI { 127 | CCOpenConfig *config = [CCOpenConfig sharedConfig]; 128 | if (!config.wbRedirectURI) { 129 | @throw [NSException exceptionWithName:@"Get wbRedirectURI error." reason:@"wbRedirectURI is nil" userInfo:nil]; 130 | } 131 | return config.wbRedirectURI; 132 | } 133 | 134 | @end 135 | -------------------------------------------------------------------------------- /CCOpenService/CCOpenPayRequestEntity.h: -------------------------------------------------------------------------------- 1 | // 2 | // CCOpenPayRequestEntity.h 3 | // 4 | // 5 | // Created by Cocos on 16/9/29. 6 | // Copyright © 2016年 Cocos. All rights reserved. 7 | // 8 | 9 | #import "CCOpenRequestEntity.h" 10 | 11 | @interface CCOpenPayRequestEntity : CCOpenRequestEntity 12 | 13 | @end 14 | 15 | @interface CCOpenWXPayRequestEntity : CCOpenPayRequestEntity 16 | 17 | @property (strong, nonatomic) NSString *wxAppID; 18 | @property (strong, nonatomic) NSString *partnerID; 19 | @property (strong, nonatomic) NSString *nonceStr; 20 | @property (strong, nonatomic) NSString *prepayID; 21 | @property (strong, nonatomic) NSString *package; 22 | @property (strong, nonatomic) NSString *timestamp; 23 | @property (strong, nonatomic) NSString *sign; 24 | 25 | @end 26 | 27 | 28 | -------------------------------------------------------------------------------- /CCOpenService/CCOpenPayRequestEntity.m: -------------------------------------------------------------------------------- 1 | // 2 | // CCOpenPayRequestEntity.m 3 | // 4 | // 5 | // Created by Cocos on 16/9/29. 6 | // Copyright © 2016年 Cocos. All rights reserved. 7 | // 8 | 9 | #import "CCOpenPayRequestEntity.h" 10 | 11 | @implementation CCOpenPayRequestEntity 12 | 13 | @end 14 | 15 | 16 | @implementation CCOpenWXPayRequestEntity 17 | 18 | @end 19 | -------------------------------------------------------------------------------- /CCOpenService/CCOpenProtocol.h: -------------------------------------------------------------------------------- 1 | // 2 | // CCOpenProtocol.h 3 | // 4 | // 5 | // Created by Cocos on 16/4/12. 6 | // Copyright © 2016年 Cocos. All rights reserved. 7 | // 8 | 9 | #ifndef CCOpenProtocol_h 10 | #define CCOpenProtocol_h 11 | 12 | @class CCOpenRespondEntity; 13 | @class CCOpenPayRequestEntity; 14 | @class CCOpenShareRequestEntity; 15 | 16 | @protocol CCOpenProtocol 17 | @required 18 | /** 19 | * 获取单例 20 | * 21 | * @return 单例对象 22 | */ 23 | + (instancetype)sharedOpenStrategy; 24 | 25 | - (void)respondHanderForAuthCode:(NSString *)authCode; 26 | 27 | - (void)respondHanderForUserInfo:(NSDictionary *)userInfo; 28 | 29 | /** 30 | * 获取用户登录账号信息 31 | * 32 | * @param respondHander 获取到信息后回调该块 33 | */ 34 | - (void)requestOpenAccount:(void(^)(CCOpenRespondEntity *respond))respondHander; 35 | 36 | /** 37 | * QQ and WeiBo will return an ACCESS_TOKEN. WeiXin will return a CODE. 38 | * 39 | * Note: This method can be used in some special cases when the server require higher security. 40 | * 41 | * @param respondHander respondHander's block. 42 | */ 43 | - (void)requestOpenAuthCode:(void(^)(CCOpenRespondEntity *))respondHander; 44 | 45 | /** 46 | * 操作其他程序调用当前程序 47 | * 48 | * @param url 其他程序传入的url 49 | * 50 | * @return 是否接收调用 51 | */ 52 | - (BOOL)handleOpenURL:(NSURL *)url; 53 | 54 | 55 | - (BOOL)isAppInstalled; 56 | 57 | - (void)logOutWithAuthCode:(NSString *)authCode; 58 | 59 | - (BOOL)openApp; 60 | 61 | /** 62 | * Pay 63 | * 64 | * @param payEntity 65 | */ 66 | - (void)requestPay:(CCOpenPayRequestEntity *)payEntity respondHander:(void(^)(CCOpenRespondEntity *respond))respondHander; 67 | 68 | - (void)updateAppConfig; 69 | 70 | /** 71 | * Share 72 | */ 73 | - (void)shareMessageWith:(CCOpenShareRequestEntity *)shareEntity respondHander:(void(^)(CCOpenRespondEntity *))respondHander; 74 | 75 | @end 76 | 77 | #endif /* CCOpenProtocol_h */ 78 | 79 | -------------------------------------------------------------------------------- /CCOpenService/CCOpenRequestEntity.h: -------------------------------------------------------------------------------- 1 | // 2 | // CCOpenRequestEntity.h 3 | // 4 | // 5 | // Created by Cocos on 2017/5/9. 6 | // Copyright © 2017年 YunFan. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface CCOpenRequestEntity : NSObject 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /CCOpenService/CCOpenRequestEntity.m: -------------------------------------------------------------------------------- 1 | // 2 | // CCOpenRequestEntity.m 3 | // 4 | // 5 | // Created by Cocos on 2017/5/9. 6 | // Copyright © 2017年 YunFan. All rights reserved. 7 | // 8 | 9 | #import "CCOpenRequestEntity.h" 10 | 11 | @implementation CCOpenRequestEntity 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /CCOpenService/CCOpenRespondEntity.h: -------------------------------------------------------------------------------- 1 | // 2 | // CCOpenRespondEntity.h 3 | // 4 | // 5 | // Created by Cocos on 16/4/12. 6 | // Copyright © 2016年 Cocos. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | typedef enum : NSInteger{ 12 | CCOpenEntityTypeWeiXin = 0, 13 | CCOpenEntityTypeWeiXinAuthCode, 14 | CCOpenEntityTypeQQ, 15 | CCOpenEntityTypeQQAuthCode, 16 | CCOpenEntityTypeWeiBo, 17 | CCOpenEntityTypeWeiBoAuthCode 18 | } CCOpenEntityType; 19 | 20 | @interface CCOpenRespondEntity : NSObject 21 | @property (nonatomic) CCOpenEntityType type; 22 | @property (nonatomic,strong) NSMutableDictionary *data; 23 | @end 24 | -------------------------------------------------------------------------------- /CCOpenService/CCOpenRespondEntity.m: -------------------------------------------------------------------------------- 1 | // 2 | // CCOpenRespondEntity.m 3 | // 4 | // 5 | // Created by Cocos on 16/4/12. 6 | // Copyright © 2016年 Cocos. All rights reserved. 7 | // 8 | 9 | #import "CCOpenRespondEntity.h" 10 | 11 | @implementation CCOpenRespondEntity 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /CCOpenService/CCOpenService.h: -------------------------------------------------------------------------------- 1 | // 2 | // CCOpenStrategy.h 3 | // 4 | // 5 | // Created by Cocos on 16/4/12. 6 | // Copyright © 2016年 Cocos. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "CCOpenStrategy.h" 11 | 12 | typedef enum : NSInteger{ 13 | CCOpenServiceNameWeiXin = 0, 14 | CCOpenServiceNameQQ, 15 | CCOpenServiceNameWeiBo 16 | } CCOpenServiceName; 17 | 18 | 19 | @interface CCOpenService : NSObject 20 | 21 | + (instancetype)getOpenServiceWithName:(CCOpenServiceName)name; 22 | - (BOOL)handleOpenURL:(NSURL *)url; 23 | - (void)requestOpenAccount:(void(^)(CCOpenRespondEntity *))respondHander; 24 | 25 | /** 26 | * QQ and WeiBo will return an ACCESS_TOKEN. WeiXin will return a CODE. 27 | * 28 | * Note: This method can be used in some special cases when the server require higher security. 29 | * 30 | * @param respondHander respondHander's block. 31 | */ 32 | - (void)requestOpenAuthCode:(void(^)(CCOpenRespondEntity *))respondHander; 33 | 34 | 35 | - (BOOL)isAppInstalled; 36 | 37 | - (void)logOutWithAuthCode:(NSString *)authCode; 38 | 39 | - (void)requestPay:(CCOpenPayRequestEntity *)payEntity respondHander:(void(^)(CCOpenRespondEntity *respond))respondHander; 40 | 41 | - (BOOL)openApp; 42 | 43 | - (void)updateAppConfig; 44 | 45 | - (void)shareMessageWith:(CCOpenShareRequestEntity *)shareEntity respondHander:(void(^)(CCOpenRespondEntity *))respondHander; 46 | 47 | @end 48 | -------------------------------------------------------------------------------- /CCOpenService/CCOpenService.m: -------------------------------------------------------------------------------- 1 | // 2 | // CCOpenService.m 3 | // 4 | // 5 | // Created by Cocos on 16/4/12. 6 | // Copyright © 2016年 Cocos. All rights reserved. 7 | // 8 | 9 | #import "CCOpenService.h" 10 | #import "CCWeiXinOpenStrategy.h" 11 | #import "CCQQOpenStrategy.h" 12 | #import "CCWeiBoOpenStrategy.h" 13 | 14 | @interface CCOpenService () 15 | 16 | @property (nonatomic,strong) id strategy; 17 | 18 | @end 19 | 20 | 21 | @implementation CCOpenService 22 | 23 | #pragma mark - 面向用户 24 | 25 | /** 26 | * 获取service实例 27 | * 28 | * @param strategyName 生成context实例时需要指定具体的策略对象名字 29 | * 30 | * @return service实例 31 | */ 32 | + (instancetype)getOpenServiceWithName:(CCOpenServiceName)name { 33 | CCOpenStrategy *strategy = nil; 34 | CCOpenService *service = [[CCOpenService alloc] init]; 35 | switch (name) { 36 | case CCOpenServiceNameWeiXin: 37 | strategy = [CCWeiXinOpenStrategy sharedOpenStrategy]; 38 | break; 39 | case CCOpenServiceNameQQ: 40 | strategy = [CCQQOpenStrategy sharedOpenStrategy]; 41 | break; 42 | case CCOpenServiceNameWeiBo: 43 | strategy = [CCWeiBoOpenStrategy sharedOpenStrategy]; 44 | break; 45 | default: 46 | break; 47 | } 48 | service.strategy = strategy; 49 | return service; 50 | } 51 | 52 | - (BOOL)handleOpenURL:(NSURL *)url { 53 | return [self.strategy handleOpenURL:url]; 54 | } 55 | 56 | - (void)requestOpenAccount:(void(^)(CCOpenRespondEntity *))respondHander { 57 | [self.strategy requestOpenAccount:^(CCOpenRespondEntity *respond) { 58 | respondHander(respond); 59 | }]; 60 | } 61 | 62 | - (void)requestOpenAuthCode:(void(^)(CCOpenRespondEntity *))respondHander { 63 | [self.strategy requestOpenAuthCode:^(CCOpenRespondEntity *respond) { 64 | respondHander(respond); 65 | }]; 66 | } 67 | 68 | - (BOOL)isAppInstalled { 69 | return [self.strategy isAppInstalled]; 70 | } 71 | 72 | - (BOOL)openApp { 73 | return [self.strategy openApp]; 74 | } 75 | 76 | - (void)logOutWithAuthCode:(NSString *)authCode { 77 | [self.strategy logOutWithAuthCode:authCode]; 78 | } 79 | 80 | - (void)updateAppConfig { 81 | [self.strategy updateAppConfig]; 82 | } 83 | 84 | - (void)requestPay:(CCOpenPayRequestEntity *)payEntity respondHander:(void(^)(CCOpenRespondEntity *respond))respondHander{ 85 | [self.strategy requestPay:payEntity respondHander:respondHander]; 86 | } 87 | 88 | - (void)shareMessageWith:(CCOpenShareRequestEntity *)shareEntity respondHander:(void (^)(CCOpenRespondEntity *))respondHander { 89 | [self.strategy shareMessageWith:shareEntity respondHander:respondHander]; 90 | } 91 | 92 | @end 93 | -------------------------------------------------------------------------------- /CCOpenService/CCOpenShareRequestEntity.h: -------------------------------------------------------------------------------- 1 | // 2 | // CCOpenShareRequestEntity.h 3 | // 4 | // 5 | // Created by Cocos on 2017/5/5. 6 | // Copyright © 2017年 Cocos. All rights reserved. 7 | // 8 | 9 | #import "CCOpenRequestEntity.h" 10 | 11 | typedef NS_ENUM(NSInteger, CCOpenShareTo) { 12 | CCOpenShareToDefault = 0, 13 | CCOpenShareToQZone, 14 | CCOpenShareToWeChatTL, 15 | }; 16 | 17 | @interface CCOpenShareRequestEntity : CCOpenRequestEntity 18 | @property (assign, nonatomic) CCOpenShareTo shareTo; 19 | @property(strong, nonatomic) NSString *title; 20 | @property(strong, nonatomic) NSString *desc; 21 | @property(strong, nonatomic) NSURL *thumbURL; 22 | @end 23 | 24 | 25 | @interface CCOpenURLShareRequestEntity : CCOpenShareRequestEntity 26 | @property(strong, nonatomic) NSString *urlString; 27 | @end 28 | -------------------------------------------------------------------------------- /CCOpenService/CCOpenShareRequestEntity.m: -------------------------------------------------------------------------------- 1 | // 2 | // CCOpenShareRequestEntity.m 3 | // 4 | // 5 | // Created by Cocos on 2017/5/5. 6 | // Copyright © 2017年 Cocos. All rights reserved. 7 | // 8 | 9 | #import "CCOpenShareRequestEntity.h" 10 | 11 | @implementation CCOpenShareRequestEntity 12 | @end 13 | 14 | @implementation CCOpenURLShareRequestEntity 15 | @end 16 | -------------------------------------------------------------------------------- /CCOpenService/CCOpenStrategy.h: -------------------------------------------------------------------------------- 1 | // 2 | // CCOpenStrategy.h 3 | // 用户描述抽象的登录接口,不做具体的实现 4 | // 5 | // Created by Cocos on 16/4/12. 6 | // Copyright © 2016年 Cocos. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "CCOpenProtocol.h" 11 | #import "CCOpenRespondEntity.h" 12 | 13 | #import "CCOpenPayRequestEntity.h" 14 | #import "CCOpenShareRequestEntity.h" 15 | 16 | 17 | #define kOPEN_PERMISSION_GET_AUTH_TOKEN @"kOPEN_PERMISSION_GET_AUTH_TOKEN" 18 | 19 | @interface CCOpenStrategy : NSObject 20 | @property (nonatomic,copy) void (^respondHander)(CCOpenRespondEntity *); 21 | @end 22 | -------------------------------------------------------------------------------- /CCOpenService/CCOpenStrategy.m: -------------------------------------------------------------------------------- 1 | // 2 | // CCOpenStrategy.m 3 | // 4 | // 5 | // Created by Cocos on 16/4/12. 6 | // Copyright © 2016年 Cocos. All rights reserved. 7 | // 8 | #import "CCOpenStrategy.h" 9 | 10 | @implementation CCOpenStrategy 11 | 12 | +(instancetype)sharedOpenStrategy{ 13 | //Do nothing. 14 | return nil; 15 | } 16 | 17 | - (void)respondHanderForAuthCode:(NSString *)authCode{ 18 | //Do nothing. 19 | } 20 | 21 | - (void)respondHanderForUserInfo:(NSDictionary *)userInfo{ 22 | //Do nothing. 23 | } 24 | 25 | -(void)requestOpenAccount:(void(^)(CCOpenRespondEntity *respond))respondHander { 26 | //Do nothing. 27 | } 28 | 29 | - (void)requestOpenAuthCode:(void (^)(CCOpenRespondEntity *))respondHander{ 30 | //Do nothing. 31 | } 32 | 33 | -(BOOL)handleOpenURL:(NSURL *)url{ 34 | //Do nothing. 35 | return NO; 36 | } 37 | 38 | - (BOOL)isAppInstalled{ 39 | //Do nothing. 40 | return NO; 41 | } 42 | 43 | - (BOOL)openApp { 44 | //Do nothing 45 | return NO; 46 | } 47 | 48 | - (void)logOutWithAuthCode:(NSString *)authCode{ 49 | //Do nothing. 50 | } 51 | 52 | - (void)updateAppConfig { 53 | //Do nothing. 54 | } 55 | 56 | - (void)requestPay:(CCOpenPayRequestEntity *)payEntity respondHander:(void(^)(CCOpenRespondEntity *respond))respondHander{ 57 | //Do nothing. 58 | } 59 | 60 | - (void)shareMessageWith:(CCOpenShareRequestEntity *)shareEntity respondHander:(void (^)(CCOpenRespondEntity *))respondHander { 61 | 62 | } 63 | 64 | @end 65 | -------------------------------------------------------------------------------- /CCOpenService/CCOpenWXPayRequestEntity.h: -------------------------------------------------------------------------------- 1 | // 2 | // CCOpenWXPayRequestEntity.h 3 | // 4 | // 5 | // Created by Cocos on 16/9/29. 6 | // Copyright © 2016年 Cocos. All rights reserved. 7 | // 8 | 9 | #import "CCOpenPayRequestEntity.h" 10 | 11 | @interface CCOpenWXPayRequestEntity : CCOpenPayRequestEntity 12 | 13 | @property (strong, nonatomic) NSString *wxAppID; 14 | @property (strong, nonatomic) NSString *partnerID; 15 | @property (strong, nonatomic) NSString *nonceStr; 16 | @property (strong, nonatomic) NSString *prepayID; 17 | @property (strong, nonatomic) NSString *package; 18 | @property (strong, nonatomic) NSString *timestamp; 19 | @property (strong, nonatomic) NSString *sign; 20 | 21 | @end 22 | -------------------------------------------------------------------------------- /CCOpenService/CCOpenWXPayRequestEntity.m: -------------------------------------------------------------------------------- 1 | // 2 | // CCOpenWXPayRequestEntity.m 3 | // 4 | // 5 | // Created by Cocos on 16/9/29. 6 | // Copyright © 2016年 Cocos. All rights reserved. 7 | // 8 | 9 | #import "CCOpenWXPayRequestEntity.h" 10 | @interface CCOpenWXPayRequestEntity () 11 | 12 | @end 13 | 14 | @implementation CCOpenWXPayRequestEntity 15 | 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /CCOpenService/CCQQOpenStrategy.h: -------------------------------------------------------------------------------- 1 | // 2 | // CCQQOpenStrategy.h 3 | // 4 | // 5 | // Created by Cocos on 16/4/18. 6 | // Copyright © 2016年 Cocos. All rights reserved. 7 | // 8 | 9 | #import "CCOpenStrategy.h" 10 | 11 | @interface CCQQOpenStrategy : CCOpenStrategy 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /CCOpenService/CCQQOpenStrategy.m: -------------------------------------------------------------------------------- 1 | // 2 | // CCQQOpenStrategy.m 3 | // 4 | // 5 | // Created by Cocos on 16/4/18. 6 | // Copyright © 2016年 Cocos. All rights reserved. 7 | // 8 | 9 | #import "CCQQOpenStrategy.h" 10 | #import "AFNetworking.h" 11 | #import 12 | //#import 13 | #import 14 | 15 | #import 16 | 17 | #import "CCOpenConfig.h" 18 | 19 | @interface CCQQOpenStrategy () 20 | @property (nonatomic,strong) TencentOAuth *tencentOAuth; 21 | @end 22 | 23 | @implementation CCQQOpenStrategy 24 | 25 | - (TencentOAuth *)tencentOAuth { 26 | if (!_tencentOAuth) { 27 | _tencentOAuth = [[TencentOAuth alloc] initWithAppId:[CCOpenConfig getQQAppID] andDelegate:self]; 28 | } 29 | return _tencentOAuth; 30 | } 31 | 32 | #pragma mark - 面向CCOpenService 33 | + (instancetype)sharedOpenStrategy { 34 | static CCQQOpenStrategy *strategy = nil; 35 | static dispatch_once_t onceToken; 36 | dispatch_once(&onceToken,^{ 37 | strategy = [[CCQQOpenStrategy alloc] init]; 38 | }); 39 | return strategy; 40 | } 41 | 42 | - (BOOL)handleOpenURL:(NSURL *)url{ 43 | return [TencentOAuth HandleOpenURL:url] || [QQApiInterface handleOpenURL:url delegate:self]; 44 | } 45 | 46 | /** 47 | * 获取用户信息 48 | * 49 | * @param respondHander 异步获取到用户数据后,respondHander将会在主线程中执行 50 | */ 51 | - (void)requestOpenAccount:(void (^)(CCOpenRespondEntity *))respondHander { 52 | //@"get_simple_userinfo" 53 | NSArray *permissions = [NSArray arrayWithObjects:kOPEN_PERMISSION_GET_USER_INFO, nil]; 54 | [self.tencentOAuth authorize:permissions inSafari:NO]; 55 | self.respondHander = respondHander; 56 | } 57 | 58 | - (void)requestOpenAuthCode:(void (^)(CCOpenRespondEntity *))respondHander { 59 | NSArray *permissions = [NSArray arrayWithObjects:kOPEN_PERMISSION_GET_USER_INFO,kOPEN_PERMISSION_GET_AUTH_TOKEN, nil]; 60 | [self.tencentOAuth authorize:permissions inSafari:NO]; 61 | self.respondHander = respondHander; 62 | } 63 | 64 | - (BOOL)isAppInstalled { 65 | return YES; 66 | } 67 | 68 | - (BOOL)openApp { 69 | return NO; 70 | } 71 | 72 | - (void)logOutWithAuthCode:(NSString *)authCode { 73 | NSLog(@"暂时没有实现......"); 74 | } 75 | 76 | - (void)updateAppConfig { 77 | 78 | } 79 | 80 | - (void)shareMessageWith:(CCOpenShareRequestEntity *)shareEntity respondHander:(void(^)(CCOpenRespondEntity *))respondHander { 81 | QQApiNewsObject *newsObj = [QQApiNewsObject objectWithURL:[NSURL URLWithString:[(CCOpenURLShareRequestEntity *)shareEntity urlString]] title:shareEntity.title description:shareEntity.desc previewImageURL:shareEntity.thumbURL]; 82 | 83 | SendMessageToQQReq *req = [SendMessageToQQReq reqWithContent:newsObj]; 84 | QQApiSendResultCode sent; 85 | //Resister...........Stupid QQ SDK 86 | [self tencentOAuth]; 87 | switch (shareEntity.shareTo) { 88 | case CCOpenShareToQZone: 89 | sent = [QQApiInterface SendReqToQZone:req]; 90 | break; 91 | default: 92 | sent = [QQApiInterface sendReq:req]; 93 | break; 94 | } 95 | if (sent != EQQAPIAPPSHAREASYNC) { 96 | NSMutableDictionary *resultDic = [[NSMutableDictionary alloc] init]; 97 | resultDic[@"result"] = @"CCErr"; 98 | CCOpenRespondEntity *entity = [[CCOpenRespondEntity alloc] init]; 99 | entity.type = CCOpenEntityTypeQQ; 100 | entity.data = resultDic; 101 | if (respondHander) { 102 | respondHander(entity); 103 | } 104 | 105 | NSLog(@"QQApiSendResultCode = %@", @(sent)); 106 | }else { 107 | self.respondHander = respondHander; 108 | } 109 | 110 | } 111 | 112 | #pragma mark - Private 113 | - (void)respondHanderForAuthCode:(NSString *)authCode { 114 | CCOpenRespondEntity *entity = [[CCOpenRespondEntity alloc] init]; 115 | entity.type = CCOpenEntityTypeQQAuthCode; 116 | entity.data = [[NSMutableDictionary alloc] initWithObjectsAndKeys:authCode, @"authCode", nil]; 117 | self.respondHander(entity); 118 | } 119 | 120 | - (void)respondHanderForUserInfo:(NSDictionary *)userInfo { 121 | CCOpenRespondEntity *entity = [[CCOpenRespondEntity alloc] init]; 122 | entity.type = CCOpenEntityTypeQQ; 123 | entity.data = (NSMutableDictionary *)userInfo; 124 | [entity.data setObject:self.tencentOAuth.openId forKey:@"openid"]; 125 | self.respondHander(entity); 126 | } 127 | 128 | 129 | #pragma mark - 实现TencentSessionDelegate 130 | - (void)tencentDidLogin { 131 | if (self.tencentOAuth.accessToken && 0 != [self.tencentOAuth.accessToken length]) { 132 | NSArray *permissions = [self.tencentOAuth valueForKey:@"_permissions"]; 133 | if ([permissions containsObject:kOPEN_PERMISSION_GET_AUTH_TOKEN]) { 134 | [self respondHanderForAuthCode:self.tencentOAuth.accessToken]; 135 | }else{ 136 | // 记录登录用户的OpenID、Token以及过期时间 137 | [self.tencentOAuth getUserInfo]; 138 | } 139 | }else{ 140 | NSLog(@"登录不成功 没有获取accesstoken"); 141 | } 142 | } 143 | 144 | - (void)tencentDidNotLogin:(BOOL)cancelled { 145 | if (cancelled){ 146 | NSLog(@"用户取消登录"); 147 | }else{ 148 | NSLog(@"登录失败"); 149 | } 150 | } 151 | 152 | - (void)tencentDidNotNetWork { 153 | NSLog(@"无网络连接,请设置网络"); 154 | } 155 | 156 | /** 157 | * 获取到用户信息了 158 | * 调用[self.tencentOAuth getUserInfo]后,回调这个方法 159 | * @param response 用户相关信息 160 | */ 161 | - (void)getUserInfoResponse:(APIResponse *)response { 162 | if (response.retCode != 0) { 163 | NSLog(@"Get user info Error! RetCode is:%d",response.retCode); 164 | return; 165 | } 166 | [self respondHanderForUserInfo:response.jsonResponse]; 167 | } 168 | 169 | #pragma mark - QQApiInterfaceDelegate 170 | 171 | - (void)onReq:(QQBaseReq *)req { 172 | 173 | } 174 | 175 | - (void)onResp:(QQBaseResp *)resp { 176 | NSMutableDictionary *resultDic = [[NSMutableDictionary alloc] init]; 177 | switch (resp.type) { 178 | case ESENDMESSAGETOQQRESPTYPE: 179 | { 180 | SendMessageToQQResp *sendResp = (SendMessageToQQResp*)resp; 181 | if ([sendResp.result isEqualToString:@"0"]) { 182 | resultDic[@"result"] = @"CCSuccess"; 183 | }else if ([sendResp.result isEqualToString:@"-4"]) { 184 | NSLog(@"User canceled"); 185 | return; 186 | } else { 187 | resultDic[@"result"] = @"CCErr"; 188 | } 189 | break; 190 | } 191 | default: 192 | { 193 | break; 194 | } 195 | } 196 | 197 | CCOpenRespondEntity *entity = [[CCOpenRespondEntity alloc] init]; 198 | entity.type = CCOpenEntityTypeQQ; 199 | entity.data = resultDic; 200 | if (self.respondHander) { 201 | self.respondHander(entity); 202 | } 203 | } 204 | 205 | - (void)isOnlineResponse:(NSDictionary *)response { 206 | 207 | } 208 | 209 | @end 210 | -------------------------------------------------------------------------------- /CCOpenService/CCShareCell.xib: -------------------------------------------------------------------------------- 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 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /CCOpenService/CCShareFilterView.h: -------------------------------------------------------------------------------- 1 | // 2 | // CCShareFilterView.h 3 | // 4 | // 5 | // Created by Cocos on 2017/5/3. 6 | // Copyright © 2017年 Cocos. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "CCOpenService.h" 11 | 12 | 13 | @interface CCShareFilterView : UIView 14 | 15 | @property (strong, nonatomic) CCOpenURLShareRequestEntity *shareEntity; 16 | 17 | - (void)showFilterViewWithOptions:(NSUInteger)options completeHander:(void(^)(NSString *msg))hander; 18 | 19 | - (void)hideFilterView:(BOOL)animated; 20 | 21 | @end 22 | -------------------------------------------------------------------------------- /CCOpenService/CCShareFilterView.m: -------------------------------------------------------------------------------- 1 | // 2 | // CCShareFilterView.m 3 | // 4 | // 5 | // Created by Cocos on 2017/5/3. 6 | // Copyright © 2017年 Cocos. All rights reserved. 7 | // 8 | 9 | #import "CCShareFilterView.h" 10 | 11 | #define CC_ACT_Link @"Link" 12 | #define CC_ACT_QQ @"QQ" 13 | #define CC_ACT_QZone @"QZone" 14 | #define CC_ACT_WeChat @"WeChat" 15 | #define CC_ACT_WeChatTL @"WeChatTL" 16 | #define CC_ACT_WeiBo @"WeiBo" 17 | 18 | @interface CCShareFilterView () 19 | 20 | @property (weak, nonatomic) IBOutlet UICollectionView *collectionView; 21 | 22 | @property (strong, nonatomic) NSArray *servList; 23 | 24 | @property (nonatomic,copy) void (^completeHander)(NSString *); 25 | 26 | 27 | @end 28 | 29 | @implementation CCShareFilterView 30 | static NSString * const reuseIdentifierCell = @"reuseIdentifierCell"; 31 | 32 | - (void)awakeFromNib { 33 | [super awakeFromNib]; 34 | [self loadData]; 35 | 36 | [self.collectionView registerNib:[UINib nibWithNibName:@"CCShareCell" bundle:nil] forCellWithReuseIdentifier:reuseIdentifierCell]; 37 | } 38 | 39 | - (void)loadData { 40 | self.servList = @[@{@"title": @"微信好友", @"imgName": @"CC_WeChat", @"act":CC_ACT_WeChat}, @{@"title": @"朋友圈", @"imgName": @"CC_WeChatTL", @"act":CC_ACT_WeChatTL}, @{@"title": @"QQ好友", @"imgName": @"CC_QQ", @"act":CC_ACT_QQ}, @{@"title": @"QQ空间", @"imgName": @"CC_QZone", @"act":CC_ACT_QZone}, @{@"title": @"新浪微博", @"imgName": @"CC_WeiBo", @"act":CC_ACT_WeiBo}, @{@"title": @"复制链接 ", @"imgName": @"CC_Link", @"act":CC_ACT_Link}]; 41 | } 42 | 43 | - (void)showFilterViewWithOptions:(NSUInteger)options completeHander:(void(^)(NSString *msg))hander { 44 | self.completeHander = hander; 45 | 46 | UIView *containerView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 47 | containerView.backgroundColor = [UIColor clearColor]; 48 | containerView.tag = 3345; 49 | [[UIApplication sharedApplication].keyWindow addSubview:containerView]; 50 | 51 | UIView *maskView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 52 | maskView.tag = 3335; 53 | maskView.alpha = 0; 54 | maskView.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.4]; 55 | [containerView addSubview:maskView]; 56 | 57 | UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(backgroundTapped:)]; 58 | tapGesture.delegate = self; 59 | [maskView addGestureRecognizer:tapGesture]; 60 | 61 | CGRect frame = self.frame; 62 | frame.size.width = maskView.frame.size.width; 63 | frame.origin.y = maskView.frame.size.height; 64 | self.frame = frame; 65 | 66 | [containerView addSubview:self]; 67 | 68 | [UIView animateWithDuration:0.5 delay:0 usingSpringWithDamping:0.5 initialSpringVelocity:2 options:0 animations:^{ 69 | maskView.alpha = 1; 70 | 71 | CGRect frame = self.frame; 72 | frame.origin.y = frame.origin.y - frame.size.height; 73 | self.frame = frame; 74 | } completion:nil]; 75 | 76 | } 77 | 78 | - (void)hideFilterView:(BOOL)animated { 79 | UIView *containerView = [[UIApplication sharedApplication].keyWindow viewWithTag:3345]; 80 | if (animated) { 81 | [UIView animateWithDuration:0.2 animations:^{ 82 | CGRect frame = self.frame; 83 | frame.origin.y += frame.size.height; 84 | self.frame = frame; 85 | 86 | UIView *maskView = [[UIApplication sharedApplication].keyWindow viewWithTag:3335]; 87 | maskView.alpha = 0; 88 | } completion:^(BOOL finished) { 89 | [containerView removeFromSuperview]; 90 | }]; 91 | }else { 92 | [containerView removeFromSuperview]; 93 | } 94 | } 95 | 96 | #pragma mark - UICollectionViewDataSource 97 | - (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView { 98 | return 1; 99 | } 100 | 101 | - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { 102 | return self.servList.count; 103 | } 104 | 105 | - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { 106 | UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:reuseIdentifierCell forIndexPath:indexPath]; 107 | NSDictionary *model = self.servList[indexPath.item]; 108 | UIImageView *imgView = [cell viewWithTag:1]; 109 | UILabel *label = [cell viewWithTag:2]; 110 | label.text = model[@"title"]; 111 | imgView.image = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:model[@"imgName"] ofType:@"png"]]; 112 | return cell; 113 | } 114 | 115 | #pragma mark - UICollectionViewDelegate 116 | - (BOOL)collectionView:(UICollectionView *)collectionView shouldHighlightItemAtIndexPath:(NSIndexPath *)indexPath { 117 | return YES; 118 | } 119 | 120 | - (void)collectionView:(UICollectionView *)collectionView didUnhighlightItemAtIndexPath:(NSIndexPath *)indexPath { 121 | [UIView animateWithDuration:0.3 animations:^{ 122 | UICollectionViewCell *cell = [collectionView cellForItemAtIndexPath:indexPath]; 123 | [cell setBackgroundColor:[UIColor whiteColor]]; 124 | }]; 125 | } 126 | 127 | - (void)collectionView:(UICollectionView *)collectionView didHighlightItemAtIndexPath:(NSIndexPath *)indexPath { 128 | UICollectionViewCell *cell = [collectionView cellForItemAtIndexPath:indexPath]; 129 | [cell setBackgroundColor:[CCSimpleTools stringToColor:@"#D9D9D9" opacity:1]]; 130 | } 131 | 132 | - (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath { 133 | [self hideFilterView:YES]; 134 | 135 | dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.05 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 136 | if (indexPath.item < self.servList.count) { 137 | NSDictionary *servDic = self.servList[indexPath.item]; 138 | if ([servDic[@"act"] isEqualToString:CC_ACT_Link]) { 139 | //Copy link 140 | UIPasteboard *pasteboard = [UIPasteboard generalPasteboard]; 141 | pasteboard.string = self.shareEntity.urlString; 142 | if (self.completeHander) { 143 | self.completeHander(@"复制成功"); 144 | } 145 | }else if ([servDic[@"act"] isEqualToString:CC_ACT_QQ] || [servDic[@"act"] isEqualToString:CC_ACT_QZone]) { 146 | CCOpenService *service = [CCOpenService getOpenServiceWithName:CCOpenServiceNameQQ]; 147 | if ([servDic[@"act"] isEqualToString:CC_ACT_QZone]) { 148 | self.shareEntity.shareTo = CCOpenShareToQZone; 149 | } 150 | [service shareMessageWith:self.shareEntity respondHander:^(CCOpenRespondEntity *respondEntity) { 151 | NSString *result = respondEntity.data[@"result"]; 152 | NSString *noticeTxt; 153 | if ([result isEqualToString:@"CCSuccess"]) { 154 | noticeTxt = @"分享成功"; 155 | }else { 156 | noticeTxt = @"分享失败"; 157 | } 158 | 159 | if (self.completeHander) { 160 | self.completeHander(noticeTxt); 161 | } 162 | }]; 163 | }else if ([servDic[@"act"] isEqualToString:CC_ACT_WeChat] || [servDic[@"act"] isEqualToString:CC_ACT_WeChatTL]) { 164 | CCOpenService *service = [CCOpenService getOpenServiceWithName:CCOpenServiceNameWeiXin]; 165 | if ([servDic[@"act"] isEqualToString:CC_ACT_WeChatTL]) { 166 | self.shareEntity.shareTo = CCOpenShareToWeChatTL; 167 | } 168 | [service shareMessageWith:self.shareEntity respondHander:^(CCOpenRespondEntity *respondEntity) { 169 | NSString *result = respondEntity.data[@"result"]; 170 | NSString *noticeTxt; 171 | if ([result isEqualToString:@"CCSuccess"]) { 172 | noticeTxt = @"分享成功"; 173 | }else { 174 | noticeTxt = @"分享失败"; 175 | } 176 | 177 | if (self.completeHander) { 178 | self.completeHander(noticeTxt); 179 | } 180 | }]; 181 | }else if ([servDic[@"act"] isEqualToString:CC_ACT_WeiBo]) { 182 | CCOpenService *service = [CCOpenService getOpenServiceWithName:CCOpenServiceNameWeiBo]; 183 | [service shareMessageWith:self.shareEntity respondHander:^(CCOpenRespondEntity *respondEntity) { 184 | NSString *result = respondEntity.data[@"result"]; 185 | NSString *noticeTxt; 186 | if ([result isEqualToString:@"CCSuccess"]) { 187 | noticeTxt = @"分享成功"; 188 | }else { 189 | noticeTxt = @"分享失败"; 190 | } 191 | 192 | if (self.completeHander) { 193 | self.completeHander(noticeTxt); 194 | } 195 | }]; 196 | } 197 | } 198 | }); 199 | 200 | } 201 | 202 | #pragma mark - UICollectionViewDelegateFlowLayout 203 | 204 | - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { 205 | CGFloat width = 65.f; 206 | return CGSizeMake(width, width * 1.15); 207 | } 208 | 209 | - (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:(NSInteger)section { 210 | return UIEdgeInsetsMake(8, 24, 8, 24); 211 | } 212 | 213 | - (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section { 214 | return 8.f; 215 | } 216 | 217 | - (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section { 218 | return 8.f; 219 | } 220 | 221 | 222 | #pragma mark - Event 223 | - (void)backgroundTapped:(UITapGestureRecognizer *)sender { 224 | CGPoint point = [sender locationInView:self]; 225 | //Touch in masView 226 | if (point.y < 0) { 227 | [self hideFilterView:YES]; 228 | } 229 | } 230 | 231 | - (IBAction)confirmAction:(id)sender { 232 | [self hideFilterView:YES]; 233 | } 234 | 235 | 236 | @end 237 | -------------------------------------------------------------------------------- /CCOpenService/CCShareFilterView.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 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 | -------------------------------------------------------------------------------- /CCOpenService/CCWeiBoOpenStrategy.h: -------------------------------------------------------------------------------- 1 | // 2 | // CCWeiBoOpenStrategy.h 3 | // 4 | // 5 | // Created by Cocos on 16/4/19. 6 | // Copyright © 2016年 Cocos. All rights reserved. 7 | // 8 | 9 | #import "CCOpenStrategy.h" 10 | 11 | @interface CCWeiBoOpenStrategy : CCOpenStrategy 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /CCOpenService/CCWeiBoOpenStrategy.m: -------------------------------------------------------------------------------- 1 | // 2 | // CCWeiBoOpenStrategy.m 3 | // 4 | // 5 | // Created by Cocos on 16/4/19. 6 | // Copyright © 2016年 Cocos. All rights reserved. 7 | // 8 | 9 | #import "CCWeiBoOpenStrategy.h" 10 | #import "CCOpenConfig.h" 11 | #import "WeiboSDK/WeiboSDK.h" 12 | #import "WeiboSDK/WeiboUser.h" 13 | @import ObjectiveC.runtime; 14 | 15 | @interface CCWeiBoOpenStrategy () 16 | 17 | @end 18 | 19 | @implementation CCWeiBoOpenStrategy 20 | 21 | + (NSMutableDictionary *)dictionaryFromeWeiboUser:(WeiboUser *)user{ 22 | unsigned int count = 0; 23 | objc_property_t *properties = class_copyPropertyList([user class], &count); 24 | NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithCapacity:count]; 25 | for (int i = 0; i < count; i++) { 26 | NSString *key = [NSString stringWithUTF8String:property_getName(properties[i])]; 27 | id value = [user valueForKey:key]; 28 | //Add it to dictionary if it is not nil 29 | if (key && value) { 30 | [dict setObject:value forKey:key]; 31 | } 32 | } 33 | return dict; 34 | } 35 | 36 | #pragma mark - 面向CCOpenService 37 | + (instancetype)sharedOpenStrategy { 38 | static CCWeiBoOpenStrategy *strategy = nil; 39 | static dispatch_once_t onceToken; 40 | dispatch_once(&onceToken,^{ 41 | strategy = [[CCWeiBoOpenStrategy alloc] init]; 42 | //向微博注册 43 | [WeiboSDK enableDebugMode:NO]; 44 | [WeiboSDK registerApp:[CCOpenConfig getWeiBoAppKey]]; 45 | 46 | }); 47 | return strategy; 48 | } 49 | 50 | - (BOOL)handleOpenURL:(NSURL *)url { 51 | return [WeiboSDK handleOpenURL:url delegate:self]; 52 | } 53 | 54 | /** 55 | * 获取用户信息 56 | * 57 | * @param respondHander 异步获取到用户数据后,respondHander将会在主线程中执行 58 | */ 59 | - (void)requestOpenAccount:(void (^)(CCOpenRespondEntity *))respondHander { 60 | WBAuthorizeRequest *request = [WBAuthorizeRequest request]; 61 | request.redirectURI = [CCOpenConfig getWeiBoRedirectURI]; 62 | request.scope = @"all"; 63 | //可以不填写.... 64 | request.userInfo = nil; 65 | [WeiboSDK sendRequest:request]; 66 | self.respondHander = respondHander; 67 | } 68 | 69 | - (void)requestOpenAuthCode:(void (^)(CCOpenRespondEntity *))respondHander { 70 | WBAuthorizeRequest *request = [WBAuthorizeRequest request]; 71 | request.redirectURI = [CCOpenConfig getWeiBoRedirectURI]; 72 | request.scope = @"all"; 73 | //可以不填写.... 74 | request.userInfo = @{@"type":kOPEN_PERMISSION_GET_AUTH_TOKEN}; 75 | [WeiboSDK sendRequest:request]; 76 | self.respondHander = respondHander; 77 | } 78 | 79 | - (BOOL)isAppInstalled{ 80 | return YES; 81 | } 82 | 83 | - (BOOL)openApp { 84 | return NO; 85 | } 86 | 87 | - (void)logOutWithAuthCode:(NSString *)authCode{ 88 | [WeiboSDK logOutWithToken:authCode delegate:nil withTag:@"251"]; 89 | } 90 | 91 | - (void)updateAppConfig { 92 | 93 | } 94 | 95 | - (void)shareMessageWith:(CCOpenShareRequestEntity *)shareEntity respondHander:(void(^)(CCOpenRespondEntity *))respondHander { 96 | WBMessageObject *message = [WBMessageObject message]; 97 | WBWebpageObject *webpage = [WBWebpageObject object]; 98 | webpage.objectID = @"identifier1"; 99 | webpage.title = shareEntity.title; 100 | webpage.description = shareEntity.desc; 101 | webpage.thumbnailData = [NSData dataWithContentsOfURL:shareEntity.thumbURL]; 102 | webpage.webpageUrl = [(CCOpenURLShareRequestEntity *)shareEntity urlString]; 103 | message.mediaObject = webpage; 104 | 105 | WBAuthorizeRequest *authRequest = [WBAuthorizeRequest request]; 106 | authRequest.redirectURI = [CCOpenConfig getWeiBoRedirectURI]; 107 | authRequest.scope = @"all"; 108 | WBSendMessageToWeiboRequest *request = [WBSendMessageToWeiboRequest requestWithMessage:message authInfo:authRequest access_token:nil]; 109 | [WeiboSDK sendRequest:request]; 110 | 111 | self.respondHander = respondHander; 112 | } 113 | 114 | #pragma mark - Private 115 | - (void)respondHanderForAuthCode:(NSString *)authCode{ 116 | CCOpenRespondEntity *entity = [[CCOpenRespondEntity alloc] init]; 117 | entity.type = CCOpenEntityTypeWeiBoAuthCode; 118 | entity.data = [[NSMutableDictionary alloc] initWithObjectsAndKeys:authCode, @"authCode", nil]; 119 | if (self.respondHander) { 120 | self.respondHander(entity); 121 | } 122 | } 123 | 124 | - (void)respondHanderForUserInfo:(NSDictionary *)userInfo{ 125 | CCOpenRespondEntity *entity = [[CCOpenRespondEntity alloc] init]; 126 | entity.type = CCOpenEntityTypeWeiBo; 127 | entity.data = (NSMutableDictionary *)userInfo; 128 | if (self.respondHander) { 129 | self.respondHander(entity); 130 | } 131 | } 132 | 133 | #pragma mark - 实现WeiboSDKDelegate 134 | - (void)didReceiveWeiboRequest:(WBBaseRequest *)request{ 135 | NSLog(@"Request is :%@",request); 136 | } 137 | 138 | - (void)didReceiveWeiboResponse:(WBBaseResponse *)response{ 139 | if (response.statusCode != WeiboSDKResponseStatusCodeSuccess) { 140 | NSLog(@"StatusCode is :%@",@(response.statusCode)); 141 | return; 142 | } 143 | 144 | if ([response isKindOfClass:[WBSendMessageToWeiboResponse class]]) { 145 | NSMutableDictionary *resultDic = [[NSMutableDictionary alloc] init]; 146 | if (response.statusCode == WeiboSDKResponseStatusCodeSuccess) { 147 | resultDic[@"result"] = @"CCSuccess"; 148 | }else { 149 | resultDic[@"result"] = @"CCErr"; 150 | } 151 | CCOpenRespondEntity *entity = [[CCOpenRespondEntity alloc] init]; 152 | entity.type = CCOpenEntityTypeWeiBo; 153 | entity.data = resultDic; 154 | if (self.respondHander) { 155 | self.respondHander(entity); 156 | } 157 | 158 | } else if ([response isKindOfClass:[WBAuthorizeResponse class]]) { 159 | WBAuthorizeResponse *autoResopnse = (WBAuthorizeResponse *)response; 160 | if ([response.requestUserInfo[@"type"] isEqualToString:kOPEN_PERMISSION_GET_AUTH_TOKEN]) { 161 | [self respondHanderForAuthCode:autoResopnse.accessToken]; 162 | }else{ 163 | [WBHttpRequest requestForUserProfile:autoResopnse.userID withAccessToken:autoResopnse.accessToken andOtherProperties:nil queue:nil withCompletionHandler:^(WBHttpRequest *httpRequest, id result, NSError *error) { 164 | [self respondHanderForUserInfo:[CCWeiBoOpenStrategy dictionaryFromeWeiboUser:(WeiboUser *)result]]; 165 | }]; 166 | } 167 | } 168 | 169 | } 170 | @end 171 | -------------------------------------------------------------------------------- /CCOpenService/CCWeiXinOpenStrategy.h: -------------------------------------------------------------------------------- 1 | // 2 | // CCWeiXinOpenStrategy.h 3 | // 4 | // 5 | // Created by Cocos on 16/4/12. 6 | // Copyright © 2016年 Cocos. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "CCOpenStrategy.h" 11 | 12 | @interface CCWeiXinOpenStrategy : CCOpenStrategy 13 | 14 | @end 15 | -------------------------------------------------------------------------------- /CCOpenService/CCWeiXinOpenStrategy.m: -------------------------------------------------------------------------------- 1 | // 2 | // CCWeiXinOpenStrategy.m 3 | // 4 | // 5 | // Created by Cocos on 16/4/12. 6 | // Copyright © 2016年 Cocos. All rights reserved. 7 | // 8 | 9 | #import "CCWeiXinOpenStrategy.h" 10 | #import "AFNetworking.h" 11 | #import "WXApi.h" 12 | #import "CCOpenConfig.h" 13 | 14 | @interface CCWeiXinOpenStrategy() 15 | 16 | @property (nonatomic,strong) NSString *openID; 17 | @property (nonatomic,strong) NSString *accessToken; 18 | @property (nonatomic,strong) NSString *refreshToken; 19 | //token过期时间 2小时 7200秒 20 | @property (nonatomic,strong) NSDate *expiresDate; 21 | 22 | @end 23 | 24 | @implementation CCWeiXinOpenStrategy 25 | 26 | #pragma mark - 面向CCOpenService 27 | //由于微信有一个步骤需要设置代理 [WXApi handleOpenURL:url delegate:self] 28 | //所以需要将weixin的strategy设置成单例 29 | + (instancetype)sharedOpenStrategy { 30 | static CCWeiXinOpenStrategy *shared = nil; 31 | static dispatch_once_t onceToken; 32 | dispatch_once(&onceToken,^{ 33 | shared = [[CCWeiXinOpenStrategy alloc] init]; 34 | //向微信注册 35 | [WXApi registerApp:[CCOpenConfig getWeiXinAppID]]; 36 | }); 37 | return shared; 38 | } 39 | 40 | /** 41 | * 获取用户信息 42 | * 43 | * @param respondHander 异步获取到用户数据后,respondHander将会在主线程中执行 44 | */ 45 | - (void)requestOpenAccount:(void (^)(CCOpenRespondEntity *))respondHander{ 46 | if ([WXApi isWXAppInstalled] == NO ) { 47 | //没安装微信直接返回nil 48 | respondHander(nil); 49 | return; 50 | } 51 | //构造SendAuthReq结构体 52 | SendAuthReq* req = [[SendAuthReq alloc ] init ]; 53 | req.scope = @"snsapi_userinfo" ; 54 | req.state = @"123" ; 55 | //第三方向微信终端发送一个SendAuthReq消息结构 56 | [WXApi sendReq:req]; 57 | self.respondHander = respondHander; 58 | } 59 | 60 | - (void)requestOpenAuthCode:(void (^)(CCOpenRespondEntity *))respondHander{ 61 | if ([WXApi isWXAppInstalled] == NO ) { 62 | //没安装微信直接返回nil 63 | respondHander(nil); 64 | return; 65 | } 66 | //构造SendAuthReq结构体 67 | SendAuthReq* req = [[SendAuthReq alloc ] init]; 68 | req.scope = @"snsapi_userinfo"; 69 | req.state = kOPEN_PERMISSION_GET_AUTH_TOKEN; 70 | //第三方向微信终端发送一个SendAuthReq消息结构 71 | [WXApi sendReq:req]; 72 | self.respondHander = respondHander; 73 | } 74 | 75 | - (BOOL)handleOpenURL:(NSURL *)url{ 76 | return [WXApi handleOpenURL:url delegate:self]; 77 | } 78 | 79 | - (BOOL)isAppInstalled{ 80 | return [WXApi isWXAppInstalled]; 81 | } 82 | 83 | - (BOOL)openApp { 84 | return [WXApi openWXApp]; 85 | } 86 | 87 | - (void)logOutWithAuthCode:(NSString *)authCode{ 88 | NSLog(@"暂时没有实现......"); 89 | } 90 | 91 | - (void)updateAppConfig { 92 | [WXApi registerApp:[CCOpenConfig getWeiXinAppID]]; 93 | } 94 | 95 | /** 96 | Weixin pay 97 | 98 | @param payEntity CCOpenWXPayRequestEntity * 99 | @param respondHander respond block 100 | */ 101 | - (void)requestPay:(CCOpenWXPayRequestEntity *)payEntity respondHander:(void(^)(CCOpenRespondEntity *respond))respondHander{ 102 | self.respondHander = respondHander; 103 | PayReq *request = [[PayReq alloc] init]; 104 | request.openID = payEntity.wxAppID; 105 | request.partnerId = payEntity.partnerID; 106 | request.prepayId = payEntity.prepayID; 107 | request.package = payEntity.package; 108 | request.nonceStr = payEntity.nonceStr; 109 | request.timeStamp = [payEntity.timestamp intValue]; 110 | request.sign = payEntity.sign; 111 | 112 | 113 | [WXApi sendReq:request]; 114 | 115 | } 116 | 117 | - (void)shareMessageWith:(CCOpenShareRequestEntity *)shareEntity respondHander:(void(^)(CCOpenRespondEntity *))respondHander { 118 | self.respondHander = respondHander; 119 | if ([shareEntity isKindOfClass:[CCOpenURLShareRequestEntity class]]) { 120 | WXMediaMessage *msg = [WXMediaMessage message]; 121 | msg.title = shareEntity.title; 122 | msg.description = shareEntity.desc; 123 | 124 | [msg setThumbImage:[[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:shareEntity.thumbURL]]]; 125 | WXWebpageObject *webpage = [WXWebpageObject object]; 126 | webpage.webpageUrl = [(CCOpenURLShareRequestEntity *)shareEntity urlString]; 127 | msg.mediaObject = webpage; 128 | 129 | SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init]; 130 | req.bText = NO; 131 | req.message = msg; 132 | if (shareEntity.shareTo == CCOpenShareToWeChatTL) { 133 | req.scene = WXSceneTimeline; 134 | }else { 135 | req.scene = WXSceneSession; 136 | } 137 | [WXApi sendReq:req]; 138 | } 139 | } 140 | 141 | #pragma mark - Private 142 | - (void)respondHanderForAuthCode:(NSString *)authCode{ 143 | CCOpenRespondEntity *entity = [[CCOpenRespondEntity alloc] init]; 144 | entity.type = CCOpenEntityTypeWeiXinAuthCode; 145 | entity.data = [[NSMutableDictionary alloc] initWithObjectsAndKeys:authCode, @"authCode", nil]; 146 | self.respondHander(entity); 147 | } 148 | 149 | - (void)respondHanderForUserInfo:(NSDictionary *)userInfo{ 150 | CCOpenRespondEntity *entity = [[CCOpenRespondEntity alloc] init]; 151 | entity.type = CCOpenEntityTypeWeiXin; 152 | entity.data = (NSMutableDictionary *)userInfo; 153 | self.respondHander(entity); 154 | } 155 | 156 | #pragma mark - 实现WXApiDelegate 157 | - (void)onResp:(BaseResp *)resp{ 158 | if ([resp isKindOfClass:[PayResp class]] || [resp isKindOfClass:[SendMessageToWXResp class]]) { 159 | NSMutableDictionary *resultDic = [[NSMutableDictionary alloc] init]; 160 | PayResp *response = (PayResp *)resp; 161 | switch(response.errCode){ 162 | case WXSuccess: 163 | resultDic[@"result"] = @"CCSuccess"; 164 | NSLog(@"wx success"); 165 | break; 166 | case WXErrCodeUserCancel: 167 | if ([resp isKindOfClass:[SendMessageToWXResp class]]) { 168 | NSLog(@"User canceled"); 169 | return; 170 | } 171 | resultDic[@"result"] = @"CCErrCodeUserCancel"; 172 | NSLog(@"wx cancel"); 173 | break; 174 | default: 175 | resultDic[@"result"] = @"CCErr"; 176 | NSLog(@"wx fail,retcode=%d",resp.errCode); 177 | break; 178 | } 179 | 180 | CCOpenRespondEntity *entity = [[CCOpenRespondEntity alloc] init]; 181 | entity.type = CCOpenEntityTypeWeiXin; 182 | entity.data = resultDic; 183 | self.respondHander(entity); 184 | }else if ([resp isKindOfClass:[SendAuthResp class]]){ 185 | 186 | [self requestUserInfoWithBaseResp:(SendAuthResp *)resp]; 187 | 188 | } 189 | } 190 | 191 | - (void)onReq:(BaseReq *)req { 192 | NSLog(@"onReq :%@",req); 193 | } 194 | 195 | #pragma mark - 授权流程 196 | 197 | - (void)requestUserInfoWithBaseResp:(SendAuthResp *)resp{ 198 | NSString *code = [resp code]; 199 | if ([resp.state isEqualToString:kOPEN_PERMISSION_GET_AUTH_TOKEN]) { 200 | [self respondHanderForAuthCode:code]; 201 | }else{ 202 | NSURL *getTokenURL = [[NSURL alloc] initWithString:[[NSString alloc] initWithFormat:@"https://api.weixin.qq.com/sns/oauth2/access_token?appid=%@&secret=%@&code=%@&grant_type=authorization_code",[CCOpenConfig getWeiXinAppID], [CCOpenConfig getWeiXinAppSecret], code]]; 203 | AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; 204 | manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/plain"]; 205 | // manager.responseSerializer默认就是期望JSON类型的response 206 | 207 | [manager GET:getTokenURL.absoluteString parameters:nil progress:nil success:^(NSURLSessionTask *task, id responseObject) { 208 | responseObject = (NSDictionary *)responseObject; 209 | if ([responseObject valueForKey:@"access_token"]) { 210 | self.accessToken = [responseObject valueForKey:@"access_token"]; 211 | self.openID = [responseObject valueForKey:@"openid"]; 212 | self.refreshToken = [responseObject valueForKey:@"refreshToken"]; 213 | 214 | //获取用户信息 215 | NSURL *getUserInfoURL = [[NSURL alloc] initWithString:[[NSString alloc] initWithFormat:@"https://api.weixin.qq.com/sns/userinfo?access_token=%@&openid=%@", self.accessToken, self.openID]]; 216 | 217 | [manager GET:getUserInfoURL.absoluteString parameters:nil progress:nil success:^(NSURLSessionDataTask * task, id responseObject) { 218 | responseObject = (NSDictionary *)responseObject; 219 | if ([responseObject valueForKey:@"openid"]) { 220 | //成功获取到用户数据,组成实体并且通知主线程的handerBlock 221 | [self respondHanderForUserInfo:responseObject]; 222 | }else{ 223 | NSLog(@"JSON: %@", responseObject); 224 | } 225 | } failure:^(NSURLSessionDataTask * task, NSError * error) { 226 | NSLog(@"Error: %@", error); 227 | }]; 228 | }else{ 229 | NSLog(@"JSON: %@", responseObject); 230 | } 231 | } failure:^(NSURLSessionTask *operation, NSError *error) { 232 | NSLog(@"Error: %@", error); 233 | }]; 234 | } 235 | } 236 | 237 | 238 | @end 239 | -------------------------------------------------------------------------------- /CCOpenService/QQ/TencentOpenAPI.framework/Headers/QQApiInterface.h: -------------------------------------------------------------------------------- 1 | /// 2 | /// \file QQApiInterface.h 3 | /// \brief QQApi接口简化封装 4 | /// 5 | /// Created by Tencent on 12-5-15. 6 | /// Copyright (c) 2012年 Tencent. All rights reserved. 7 | /// 8 | 9 | #import 10 | #import "QQApiInterfaceObject.h" 11 | 12 | /** 13 | \brief 处理来至QQ的请求及响应的回调协议 14 | */ 15 | @protocol QQApiInterfaceDelegate 16 | 17 | /** 18 | 处理来至QQ的请求 19 | */ 20 | - (void)onReq:(QQBaseReq *)req; 21 | 22 | /** 23 | 处理来至QQ的响应 24 | */ 25 | - (void)onResp:(QQBaseResp *)resp; 26 | 27 | /** 28 | 处理QQ在线状态的回调 29 | */ 30 | - (void)isOnlineResponse:(NSDictionary *)response; 31 | 32 | @end 33 | 34 | /** 35 | \brief 对QQApi的简单封装类 36 | */ 37 | @interface QQApiInterface : NSObject 38 | 39 | /** 40 | 处理由手Q唤起的跳转请求 41 | \param url 待处理的url跳转请求 42 | \param delegate 第三方应用用于处理来至QQ请求及响应的委托对象 43 | \return 跳转请求处理结果,YES表示成功处理,NO表示不支持的请求协议或处理失败 44 | */ 45 | + (BOOL)handleOpenURL:(NSURL *)url delegate:(id)delegate; 46 | 47 | /** 48 | 向手Q发起分享请求 49 | \param req 分享内容的请求 50 | \return 请求发送结果码 51 | */ 52 | + (QQApiSendResultCode)sendReq:(QQBaseReq *)req; 53 | 54 | /** 55 | 向手Q QZone结合版发起分享请求 56 | \note H5分享只支持单张网络图片的传递 57 | \param req 分享内容的请求 58 | \return 请求发送结果码 59 | */ 60 | + (QQApiSendResultCode)SendReqToQZone:(QQBaseReq *)req; 61 | 62 | /** 63 | 向手Q 群部落发起分享请求 64 | \note H5分享只支持单张网络图片的传递 65 | \param req 分享内容的请求 66 | \return 请求发送结果码 67 | */ 68 | + (QQApiSendResultCode)SendReqToQQGroupTribe:(QQBaseReq *)req; 69 | 70 | /** 71 | 向手Q发送应答消息 72 | \param resp 应答消息 73 | \return 应答发送结果码 74 | */ 75 | + (QQApiSendResultCode)sendResp:(QQBaseResp *)resp; 76 | 77 | /** 78 | 检测是否已安装QQ 79 | \return 如果QQ已安装则返回YES,否则返回NO 80 | */ 81 | + (BOOL)isQQInstalled; 82 | 83 | /** 84 | 批量检测QQ号码是否在线 85 | */ 86 | + (void)getQQUinOnlineStatues:(NSArray *)QQUins delegate:(id)delegate; 87 | 88 | /** 89 | 检测QQ是否支持API调用 90 | \return 如果当前安装QQ版本支持API调用则返回YES,否则返回NO 91 | */ 92 | + (BOOL)isQQSupportApi; 93 | 94 | /** 95 | 启动QQ 96 | \return 成功返回YES,否则返回NO 97 | */ 98 | + (BOOL)openQQ; 99 | 100 | /** 101 | 获取QQ下载地址 102 | 103 | 如果App通过QQApiInterface#isQQInstalledQQApiInterface#isQQSupportApi检测发现QQ没安装或当前版本QQ不支持API调用,可引导用户通过打开此链接下载最新版QQ。 104 | \return iPhoneQQ下载地址 105 | */ 106 | + (NSString *)getQQInstallUrl; 107 | 108 | @end 109 | -------------------------------------------------------------------------------- /CCOpenService/QQ/TencentOpenAPI.framework/Headers/QQApiInterfaceObject.h: -------------------------------------------------------------------------------- 1 | /// 2 | /// \file QQApiInterfaceObject.h 3 | /// \brief QQApiInterface所依赖的请求及应答消息对象封装帮助类 4 | /// 5 | /// Created by Tencent on 12-5-15. 6 | /// Copyright (c) 2012年 Tencent. All rights reserved. 7 | /// 8 | 9 | #ifndef QQApiInterface_QQAPIOBJECT_h 10 | #define QQApiInterface_QQAPIOBJECT_h 11 | 12 | #import 13 | 14 | 15 | typedef enum 16 | { 17 | EQQAPISENDSUCESS = 0, 18 | EQQAPIQQNOTINSTALLED = 1, 19 | EQQAPIQQNOTSUPPORTAPI = 2, 20 | EQQAPIMESSAGETYPEINVALID = 3, 21 | EQQAPIMESSAGECONTENTNULL = 4, 22 | EQQAPIMESSAGECONTENTINVALID = 5, 23 | EQQAPIAPPNOTREGISTED = 6, 24 | EQQAPIAPPSHAREASYNC = 7, 25 | EQQAPIQQNOTSUPPORTAPI_WITH_ERRORSHOW = 8, 26 | EQQAPISENDFAILD = -1, 27 | //qzone分享不支持text类型分享 28 | EQQAPIQZONENOTSUPPORTTEXT = 10000, 29 | //qzone分享不支持image类型分享 30 | EQQAPIQZONENOTSUPPORTIMAGE = 10001, 31 | //当前QQ版本太低,需要更新至新版本才可以支持 32 | EQQAPIVERSIONNEEDUPDATE = 10002, 33 | } QQApiSendResultCode; 34 | 35 | #pragma mark - QQApiObject(分享对象类型) 36 | 37 | // QQApiObject control flags 38 | enum 39 | { 40 | kQQAPICtrlFlagQZoneShareOnStart = 0x01, 41 | kQQAPICtrlFlagQZoneShareForbid = 0x02, 42 | kQQAPICtrlFlagQQShare = 0x04, 43 | kQQAPICtrlFlagQQShareFavorites = 0x08, //收藏 44 | kQQAPICtrlFlagQQShareDataline = 0x10, //数据线 45 | }; 46 | 47 | // QQApiObject 48 | /** \brief 所有在QQ及插件间发送的数据对象的根类。 49 | */ 50 | @interface QQApiObject : NSObject 51 | @property(nonatomic,retain) NSString* title; ///< 标题,最长128个字符 52 | @property(nonatomic,retain) NSString* description; ///<简要描述,最长512个字符 53 | 54 | @property (nonatomic, assign) uint64_t cflag; 55 | 56 | @end 57 | 58 | // QQApiResultObject 59 | /** \brief 用于请求回应的数据类型。 60 |

可能错误码及描述如下:

61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 |
errorerrorDescription注释
0nil成功
-1param error参数错误
-2group code is invalid该群不在自己的群列表里面
-3upload photo failed上传图片失败
-4user give up the current operation用户放弃当前操作
-5client internal error客户端内部处理错误
70 | */ 71 | @interface QQApiResultObject : QQApiObject 72 | @property(nonatomic,retain) NSString* error; ///<错误 73 | @property(nonatomic,retain) NSString* errorDescription; ///<错误描述 74 | @property(nonatomic,retain) NSString* extendInfo; ///<扩展信息 75 | @end 76 | 77 | // QQApiTextObject 78 | /** \brief 文本对象 79 | */ 80 | @interface QQApiTextObject : QQApiObject 81 | @property(nonatomic,retain)NSString* text; ///<文本内容,必填,最长1536个字符 82 | 83 | -(id)initWithText:(NSString*)text; ///<初始化方法 84 | +(id)objectWithText:(NSString*)text;///<工厂方法,获取一个QQApiTextObject对象. 85 | @end 86 | 87 | // QQApiURLObject 88 | typedef enum QQApiURLTargetType{ 89 | QQApiURLTargetTypeNotSpecified = 0x00, 90 | QQApiURLTargetTypeAudio = 0x01, 91 | QQApiURLTargetTypeVideo = 0x02, 92 | QQApiURLTargetTypeNews = 0x03 93 | }QQApiURLTargetType; 94 | 95 | /** @brief URL对象类型。 96 | 97 | 包括URL地址,URL地址所指向的目标类型及预览图像。 98 | */ 99 | @interface QQApiURLObject : QQApiObject 100 | /** 101 | URL地址所指向的目标类型. 102 | @note 参见QQApi.h 中的 QQApiURLTargetType 定义. 103 | */ 104 | @property(nonatomic)QQApiURLTargetType targetContentType; 105 | 106 | @property(nonatomic,retain)NSURL* url; ///QQApiExtendObject对象 150 | @param data 数据内容 151 | @param previewImageData 用于预览的图片 152 | @param title 标题 153 | @param description 此对象,分享的描述 154 | @return 155 | 一个自动释放的QQApiExtendObject实例 156 | */ 157 | + (id)objectWithData:(NSData*)data previewImageData:(NSData*)previewImageData title:(NSString*)title description:(NSString*)description; 158 | 159 | /** 160 | helper方法获取一个autorelease的QQApiExtendObject对象 161 | @param data 数据内容 162 | @param previewImageData 用于预览的图片 163 | @param title 标题 164 | @param description 此对象,分享的描述 165 | @param imageDataArray 发送的多张图片队列 166 | @return 167 | 一个自动释放的QQApiExtendObject实例 168 | */ 169 | + (id)objectWithData:(NSData*)data previewImageData:(NSData*)previewImageData title:(NSString*)title description:(NSString*)description imageDataArray:(NSArray*)imageDataArray; 170 | 171 | @end 172 | 173 | // QQApiImageObject 174 | /** @brief 图片对象 175 | 用于分享图片内容的对象,是一个指定为图片类型的QQApiExtendObject 176 | */ 177 | @interface QQApiImageObject : QQApiExtendObject 178 | @end 179 | 180 | // QQApiImageArrayForQZoneObject 181 | /** @brief 图片对象 182 | 用于分享图片到空间,走写说说路径,是一个指定为图片类型的,当图片数组为空时,默认走文本写说说QQApiObject 183 | */ 184 | @interface QQApiImageArrayForQZoneObject : QQApiObject 185 | 186 | @property(nonatomic,retain) NSArray* imageDataArray;///图片数组 187 | 188 | /** 189 | 初始化方法 190 | @param imageDataArray 图片数组 191 | @param title 写说说的内容,可以为空 192 | */ 193 | - (id)initWithImageArrayData:(NSArray*)imageDataArray title:(NSString*)title; 194 | 195 | /** 196 | helper方法获取一个autorelease的QQApiExtendObject对象 197 | @param title 写说说的内容,可以为空 198 | @param imageDataArray 发送的多张图片队列 199 | @return 200 | 一个自动释放的QQApiExtendObject实例 201 | */ 202 | + (id)objectWithimageDataArray:(NSArray*)imageDataArray title:(NSString*)title; 203 | 204 | @end 205 | 206 | // QQApiVideoForQZoneObject 207 | /** @brief 视频对象 208 | 用于分享视频到空间,走写说说路径QQApiObject 209 | assetURL可传ALAsset的ALAssetPropertyAssetURL,或者PHAsset的localIdentifier 210 | */ 211 | @interface QQApiVideoForQZoneObject : QQApiObject 212 | 213 | @property(nonatomic, retain) NSString *assetURL; 214 | 215 | - (id)initWithAssetURL:(NSString*)assetURL title:(NSString*)title; 216 | 217 | + (id)objectWithAssetURL:(NSString*)assetURL title:(NSString*)title; 218 | 219 | @end 220 | 221 | // QQApiWebImageObject 222 | /** @brief 图片对象 223 | 用于分享网络图片内容的对象,是一个指定网络图片url的: 该类型只在2.9.0的h5分享中才支持, 224 | 原有的手q分享是不支持该类型的。 225 | */ 226 | @interface QQApiWebImageObject : QQApiObject 227 | 228 | @property(nonatomic, retain) NSURL *previewImageURL; ///<预览图像URL 229 | 230 | /** 231 | 初始化方法 232 | @param previewImageURL 用于预览的图片 233 | @param title 标题 234 | @param description 此对象,分享的描述 235 | */ 236 | - (id)initWithPreviewImageURL:(NSURL*)previewImageURL title:(NSString*)title description:(NSString*)description; 237 | 238 | /** 239 | helper方法获取一个autorelease的QQApiWebImageObject对象 240 | @param previewImageURL 用于预览的图片 241 | @param title 标题 242 | @param description 此对象,分享的描述 243 | */ 244 | + (id)objectWithPreviewImageURL:(NSURL*)previewImageURL title:(NSString*)title description:(NSString*)description; 245 | 246 | @end 247 | 248 | // QQApiGroupTribeImageObject 249 | /** @brief 群部落图片对象 250 | 用于分享图片内容的对象,是一个指定为图片类型的 可以指定一些其他的附加数据QQApiExtendObject 251 | */ 252 | @interface QQApiGroupTribeImageObject : QQApiImageObject 253 | { 254 | NSString *_bid; 255 | NSString *_bname; 256 | } 257 | // 群部落id 258 | @property (nonatomic, retain)NSString* bid; 259 | 260 | // 群部落名称 261 | @property (nonatomic, retain)NSString* bname; 262 | 263 | @end 264 | 265 | 266 | //QQApiFileObject 267 | /** @brief 本地文件对象(暂只支持分享到手机QQ数据线功能) 268 | 用于分享文件内容的对象,是一个指定为文件类型的QQApiExtendObject 269 | */ 270 | @interface QQApiFileObject : QQApiExtendObject 271 | { 272 | NSString* _fileName; 273 | } 274 | @property(nonatomic, retain)NSString* fileName; 275 | @end 276 | 277 | // QQApiAudioObject 278 | /** @brief 音频URL对象 279 | 用于分享目标内容为音频的URL的对象 280 | */ 281 | @interface QQApiAudioObject : QQApiURLObject 282 | 283 | @property (nonatomic, retain) NSURL *flashURL; ///<音频URL地址,最长512个字符 284 | 285 | /** 286 | 获取一个autorelease的QQApiAudioObject 287 | @param url 音频内容的目标URL 288 | @param title 分享内容的标题 289 | @param description 分享内容的描述 290 | @param data 分享内容的预览图像 291 | @note 如果url为空,调用QQApi#sendMessage:时将返回FALSE 292 | */ 293 | +(id)objectWithURL:(NSURL*)url title:(NSString*)title description:(NSString*)description previewImageData:(NSData*)data; 294 | 295 | /** 296 | 获取一个autorelease的QQApiAudioObject 297 | @param url 音频内容的目标URL 298 | @param title 分享内容的标题 299 | @param description 分享内容的描述 300 | @param previewURL 分享内容的预览图像URL 301 | @note 如果url为空,调用QQApi#sendMessage:时将返回FALSE 302 | */ 303 | +(id)objectWithURL:(NSURL*)url title:(NSString*)title description:(NSString*)description previewImageURL:(NSURL*)previewURL; 304 | 305 | @end 306 | 307 | // QQApiVideoObject 308 | /** @brief 视频URL对象 309 | 用于分享目标内容为视频的URL的对象 310 | 311 | QQApiVideoObject类型的分享,目前在Android和PC QQ上接收消息时,展现有待完善,待手机QQ版本以后更新支持 312 | 目前如果要分享视频,推荐使用 QQApiNewsObject 类型 313 | */ 314 | @interface QQApiVideoObject : QQApiURLObject 315 | 316 | @property (nonatomic, retain) NSURL *flashURL; ///<视频URL地址,最长512个字符 317 | 318 | /** 319 | 获取一个autorelease的QQApiVideoObject 320 | @param url 视频内容的目标URL 321 | @param title 分享内容的标题 322 | @param description 分享内容的描述 323 | @param data 分享内容的预览图像 324 | @note 如果url为空,调用QQApi#sendMessage:时将返回FALSE 325 | */ 326 | +(id)objectWithURL:(NSURL*)url title:(NSString*)title description:(NSString*)description previewImageData:(NSData*)data; 327 | 328 | /** 329 | 获取一个autorelease的QQApiVideoObject 330 | @param url 视频内容的目标URL 331 | @param title 分享内容的标题 332 | @param description 分享内容的描述 333 | @param previewURL 分享内容的预览图像URL 334 | @note 如果url为空,调用QQApi#sendMessage:时将返回FALSE 335 | */ 336 | +(id)objectWithURL:(NSURL*)url title:(NSString*)title description:(NSString*)description previewImageURL:(NSURL*)previewURL; 337 | 338 | @end 339 | 340 | // QQApiNewsObject 341 | /** @brief 新闻URL对象 342 | 用于分享目标内容为新闻的URL的对象 343 | */ 344 | @interface QQApiNewsObject : QQApiURLObject 345 | /** 346 | 获取一个autorelease的QQApiNewsObject 347 | @param url 视频内容的目标URL 348 | @param title 分享内容的标题 349 | @param description 分享内容的描述 350 | @param data 分享内容的预览图像 351 | @note 如果url为空,调用QQApi#sendMessage:时将返回FALSE 352 | */ 353 | +(id)objectWithURL:(NSURL*)url title:(NSString*)title description:(NSString*)description previewImageData:(NSData*)data; 354 | 355 | /** 356 | 获取一个autorelease的QQApiNewsObject 357 | @param url 视频内容的目标URL 358 | @param title 分享内容的标题 359 | @param description 分享内容的描述 360 | @param previewURL 分享内容的预览图像URL 361 | @note 如果url为空,调用QQApi#sendMessage:时将返回FALSE 362 | */ 363 | +(id)objectWithURL:(NSURL*)url title:(NSString*)title description:(NSString*)description previewImageURL:(NSURL*)previewURL; 364 | 365 | @end 366 | 367 | // QQApiPayObject 368 | /** \brief 支付对象 369 | */ 370 | @interface QQApiPayObject : QQApiObject 371 | @property(nonatomic,retain)NSString* OrderNo; ///<支付订单号,必填 372 | @property(nonatomic,retain)NSString* AppInfo; ///<支付来源信息,必填 373 | 374 | -(id)initWithOrderNo:(NSString*)OrderNo AppInfo:(NSString*)AppInfo; ///<初始化方法 375 | +(id)objectWithOrderNo:(NSString*)OrderNo AppInfo:(NSString*)AppInfo;///<工厂方法,获取一个QQApiPayObject对象. 376 | @end 377 | 378 | // QQApiCommonContentObject; 379 | /** @brief 通用模板类型对象 380 | 用于分享一个固定显示模板的图文混排对象 381 | @note 图片列表和文本列表不能同时为空 382 | */ 383 | @interface QQApiCommonContentObject : QQApiObject 384 | /** 385 | 预定义的界面布局类型 386 | */ 387 | @property(nonatomic,assign) unsigned int layoutType; 388 | @property(nonatomic,assign) NSData* previewImageData;///<预览图 389 | @property(nonatomic,retain) NSArray* textArray;///<文本列表 390 | @property(nonatomic,retain) NSArray* pictureDataArray;///<图片列表 391 | +(id)objectWithLayoutType:(int)layoutType textArray:(NSArray*)textArray pictureArray:(NSArray*)pictureArray previewImageData:(NSData*)data; 392 | /** 393 | 将一个NSDictionary对象转化为QQApiCommomContentObject,如果无法转换,则返回空 394 | */ 395 | +(id)objectWithDictionary:(NSDictionary*)dic; 396 | -(NSDictionary*)toDictionary; 397 | @end 398 | 399 | //////////////////////////////////////////////////////////////////////////////////////////////////////////// 400 | // Ad item object definition 401 | //////////////////////////////////////////////////////////////////////////////////////////////////////////// 402 | /** @brief 广告数据对象 403 | */ 404 | @interface QQApiAdItem : NSObject 405 | @property(nonatomic,retain) NSString* title; ///<名称 406 | @property(nonatomic,retain) NSString* description;///<描述 407 | @property(nonatomic,retain) NSData* imageData;///<广告图片 408 | @property(nonatomic,retain) NSURL* target;///<广告目标链接 409 | @end 410 | 411 | // QQApiWPAObject 412 | /** \brief 发起WPA对象 413 | */ 414 | @interface QQApiWPAObject : QQApiObject 415 | @property(nonatomic,retain)NSString* uin; ///<想要对话的QQ号 416 | 417 | -(id)initWithUin:(NSString*)uin; ///<初始化方法 418 | +(id)objectWithUin:(NSString*)uin;///<工厂方法,获取一个QQApiWPAObject对象. 419 | @end 420 | 421 | // QQApiAddFriendObject 422 | /** \brief 添加好友 423 | */ 424 | @interface QQApiAddFriendObject : QQApiObject 425 | @property (nonatomic,retain)NSString* openID; 426 | @property (nonatomic,retain)NSString* subID; 427 | @property (nonatomic,retain)NSString* remark; 428 | 429 | -(id)initWithOpenID:(NSString*)openID; ///<初始化方法 430 | +(id)objecWithOpenID:(NSString*)openID; ///<工厂方法,获取一个QQApiAddFriendObject对象. 431 | 432 | @end 433 | 434 | // QQApiGameConsortiumBindingGroupObject 435 | /** \brief 游戏公会绑定群 436 | */ 437 | @interface QQApiGameConsortiumBindingGroupObject : QQApiObject 438 | @property (nonatomic,retain)NSString* signature; 439 | @property (nonatomic,retain)NSString* unionid; 440 | @property (nonatomic,retain)NSString* zoneID; 441 | @property (nonatomic,retain)NSString* appDisplayName; 442 | 443 | -(id)initWithGameConsortium:(NSString*)signature unionid:(NSString*)unionid zoneID:(NSString*)zoneID appDisplayName:(NSString*)appDisplayName; ///<初始化方法 444 | +(id)objectWithGameConsortium:(NSString*)signature unionid:(NSString*)unionid zoneID:(NSString*)zoneID appDisplayName:(NSString*)appDisplayName; ///<工厂方法,获取一个QQApiAddFriendObject对象. 445 | 446 | @end 447 | 448 | // QQApiGameConsortiumBindingGroupObject 449 | /** \brief 加入群 450 | */ 451 | @interface QQApiJoinGroupObject : QQApiObject 452 | @property (nonatomic,retain)NSString* groupUin; 453 | @property (nonatomic,retain)NSString* groupKey; 454 | 455 | - (id)initWithGroupInfo:(NSString*)groupUin key:(NSString*)groupKey; ///<初始化方法 456 | + (id)objectWithGroupInfo:(NSString*)groupUin key:(NSString*)groupKey; ///<同时提供群号和群KEY 工厂方法,获取一个QQApiAddFriendObject对象. 457 | + (id)objectWithGroupKey:(NSString*)groupKey; ///<只需要群的KEY 工厂方法,获取一个QQApiAddFriendObject对象. 458 | 459 | @end 460 | 461 | // QQApiGroupChatObject 462 | /** \brief 发起群会话对象 463 | */ 464 | @interface QQApiGroupChatObject : QQApiObject 465 | @property(nonatomic,retain)NSString* groupID; ///<想要对话的群号 466 | 467 | -(id)initWithGroup:(NSString*)groupID; ///<初始化方法 468 | +(id)objectWithGroup:(NSString*)groupID;///<工厂方法,获取一个QQApiGroupChatObject对象. 469 | @end 470 | 471 | #pragma mark - QQApi请求消息类型 472 | 473 | /** 474 | QQApi请求消息类型 475 | */ 476 | enum QQApiInterfaceReqType 477 | { 478 | EGETMESSAGEFROMQQREQTYPE = 0, ///< 手Q -> 第三方应用,请求第三方应用向手Q发送消息 479 | ESENDMESSAGETOQQREQTYPE = 1, ///< 第三方应用 -> 手Q,第三方应用向手Q分享消息 480 | ESHOWMESSAGEFROMQQREQTYPE = 2 ///< 手Q -> 第三方应用,请求第三方应用展现消息中的数据 481 | }; 482 | 483 | /** 484 | QQApi应答消息类型 485 | */ 486 | enum QQApiInterfaceRespType 487 | { 488 | ESHOWMESSAGEFROMQQRESPTYPE = 0, ///< 第三方应用 -> 手Q,第三方应用应答消息展现结果 489 | EGETMESSAGEFROMQQRESPTYPE = 1, ///< 第三方应用 -> 手Q,第三方应用回应发往手Q的消息 490 | ESENDMESSAGETOQQRESPTYPE = 2 ///< 手Q -> 第三方应用,手Q应答处理分享消息的结果 491 | }; 492 | 493 | /** 494 | QQApi请求消息基类 495 | */ 496 | @interface QQBaseReq : NSObject 497 | 498 | /** 请求消息类型,参见\ref QQApiInterfaceReqType */ 499 | @property (nonatomic, assign) int type; 500 | 501 | @end 502 | 503 | /** 504 | QQApi应答消息基类 505 | */ 506 | @interface QQBaseResp : NSObject 507 | 508 | /** 请求处理结果 */ 509 | @property (nonatomic, copy) NSString* result; 510 | 511 | /** 具体错误描述信息 */ 512 | @property (nonatomic, copy) NSString* errorDescription; 513 | 514 | /** 应答消息类型,参见\ref QQApiInterfaceRespType */ 515 | @property (nonatomic, assign) int type; 516 | 517 | /** 扩展信息 */ 518 | @property (nonatomic, assign) NSString* extendInfo; 519 | 520 | @end 521 | 522 | /** 523 | GetMessageFromQQReq请求帮助类 524 | */ 525 | @interface GetMessageFromQQReq : QQBaseReq 526 | 527 | /** 528 | 创建一个GetMessageFromQQReq请求实例 529 | */ 530 | + (GetMessageFromQQReq *)req; 531 | 532 | @end 533 | 534 | /** 535 | GetMessageFromQQResp应答帮助类 536 | */ 537 | @interface GetMessageFromQQResp : QQBaseResp 538 | 539 | /** 540 | 创建一个GetMessageFromQQResp应答实例 541 | \param message 具体分享消息实例 542 | \return 新创建的GetMessageFromQQResp应答实例 543 | */ 544 | + (GetMessageFromQQResp *)respWithContent:(QQApiObject *)message; 545 | 546 | /** 具体分享消息 */ 547 | @property (nonatomic, retain) QQApiObject *message; 548 | 549 | @end 550 | 551 | /** 552 | SendMessageToQQReq请求帮助类 553 | */ 554 | @interface SendMessageToQQReq : QQBaseReq 555 | 556 | /** 557 | 创建一个SendMessageToQQReq请求实例 558 | \param message 具体分享消息实例 559 | \return 新创建的SendMessageToQQReq请求实例 560 | */ 561 | + (SendMessageToQQReq *)reqWithContent:(QQApiObject *)message; 562 | 563 | /** 具体分享消息 */ 564 | @property (nonatomic, retain) QQApiObject *message; 565 | 566 | @end 567 | 568 | /** 569 | SendMessageToQQResp应答帮助类 570 | */ 571 | @interface SendMessageToQQResp : QQBaseResp 572 | 573 | /** 574 | 创建一个SendMessageToQQResp应答实例 575 | \param result 请求处理结果 576 | \param errDesp 具体错误描述信息 577 | \param extendInfo 扩展信息 578 | \return 新创建的SendMessageToQQResp应答实例 579 | */ 580 | + (SendMessageToQQResp *)respWithResult:(NSString *)result errorDescription:(NSString *)errDesp extendInfo:(NSString*)extendInfo; 581 | 582 | @end 583 | 584 | /** 585 | ShowMessageFromQQReq请求帮助类 586 | */ 587 | @interface ShowMessageFromQQReq : QQBaseReq 588 | 589 | /** 590 | 创建一个ShowMessageFromQQReq请求实例 591 | \param message 具体待展现消息实例 592 | \return 新创建的ShowMessageFromQQReq请求实例 593 | */ 594 | + (ShowMessageFromQQReq *)reqWithContent:(QQApiObject *)message; 595 | 596 | /** 具体待展现消息 */ 597 | @property (nonatomic, retain) QQApiObject *message; 598 | 599 | @end 600 | 601 | /** 602 | ShowMessageFromQQResp应答帮助类 603 | */ 604 | @interface ShowMessageFromQQResp : QQBaseResp 605 | 606 | /** 607 | 创建一个ShowMessageFromQQResp应答实例 608 | \param result 展现消息结果 609 | \param errDesp 具体错误描述信息 610 | \return 新创建的ShowMessageFromQQResp应答实例 611 | */ 612 | + (ShowMessageFromQQResp *)respWithResult:(NSString *)result errorDescription:(NSString *)errDesp; 613 | 614 | @end 615 | 616 | #endif 617 | -------------------------------------------------------------------------------- /CCOpenService/QQ/TencentOpenAPI.framework/Headers/TencentApiInterface.h: -------------------------------------------------------------------------------- 1 | // 2 | // TencentMessage.h 3 | // TencentOpenApi_IOS 4 | // 5 | // Created by qqconnect on 13-5-29. 6 | // Copyright (c) 2013年 Tencent. All rights reserved. 7 | // 8 | 9 | #ifndef QQ_OPEN_SDK_LITE 10 | 11 | #import 12 | #import "TencentMessageObject.h" 13 | 14 | typedef enum 15 | { 16 | kIphoneQQ, 17 | kIphoneQZONE, 18 | kThirdApp, 19 | } 20 | TecnentPlatformType; 21 | 22 | typedef enum 23 | { 24 | kTencentApiSuccess, 25 | kTencentApiPlatformUninstall, 26 | kTencentApiPlatformNotSupport, 27 | kTencentApiParamsError, 28 | kTencentApiFail, 29 | } 30 | TencentApiRetCode; 31 | 32 | @class TencentApiReq; 33 | @class TencentApiResp; 34 | 35 | /** 36 | * \brief TencentApiInterface的回调 37 | * 38 | * TencentApiInterface的回调接口 39 | * \note v1.0版本只支持腾讯业务拉起第三方请求内容 40 | */ 41 | @protocol TencentApiInterfaceDelegate 42 | 43 | @optional 44 | /** 45 | * 请求获得内容 当前版本只支持第三方相应腾讯业务请求 46 | */ 47 | - (BOOL)onTencentReq:(TencentApiReq *)req; 48 | 49 | /** 50 | * 响应请求答复 当前版本只支持腾讯业务相应第三方的请求答复 51 | */ 52 | - (BOOL)onTencentResp:(TencentApiResp *)resp; 53 | 54 | @end 55 | 56 | /** 57 | * \brief TencentApiInterface的回调 58 | * 59 | * TencentApiInterface的调用接口 60 | * \note v1.0版本只支持第三方答复内容 61 | */ 62 | @interface TencentApiInterface : NSObject 63 | 64 | /** 65 | * 发送答复返回腾讯业务 66 | * \param resp 答复内容 67 | * \return 返回码 68 | */ 69 | + (TencentApiRetCode)sendRespMessageToTencentApp:(TencentApiResp *)resp; 70 | 71 | /** 72 | * 是否可以处理拉起协议 73 | * \param url 74 | * \param delegate 指定的回调 75 | * \return 是否是腾讯API认识的消息类型 76 | */ 77 | + (BOOL)canOpenURL:(NSURL *)url delegate:(id)delegate; 78 | 79 | /** 80 | * 处理应用拉起协议 81 | * \param url 82 | * \param delegate 指定的回调 83 | * \return 是否是腾讯API认识的消息类型 84 | */ 85 | + (BOOL)handleOpenURL:(NSURL *)url delegate:(id)delegate; 86 | 87 | /** 88 | * 用户设备是否安装腾讯APP 89 | * \param platform 指定的腾讯业务 90 | * \return YES:安装 NO:未安装 91 | */ 92 | + (BOOL)isTencentAppInstall:(TecnentPlatformType)platform; 93 | 94 | /** 95 | * 用户设备是否支持调用SDK 96 | * \param platform 指定的腾讯业务 97 | * \return YES:支持 NO:不支持 98 | */ 99 | + (BOOL)isTencentAppSupportTencentApi:(TecnentPlatformType)platform; 100 | 101 | @end 102 | 103 | #endif 104 | -------------------------------------------------------------------------------- /CCOpenService/QQ/TencentOpenAPI.framework/Headers/TencentMessageObject.h: -------------------------------------------------------------------------------- 1 | // 2 | // TencentMessageObject.h 3 | // TencentOpenApi_IOS 4 | // 5 | // Created by qqconnect on 13-5-27. 6 | // Copyright (c) 2013年 Tencent. All rights reserved. 7 | // 8 | 9 | #ifndef QQ_OPEN_SDK_LITE 10 | 11 | #import 12 | #import 13 | #import "sdkdef.h" 14 | 15 | #define kTextLimit (1024 * 1024) 16 | #define kDataLimit (1024 * 1024 * 10) 17 | #define kPreviewDataLimit (1024 * 1024) 18 | 19 | @class TencentApiReq; 20 | @class TencentApiResp; 21 | 22 | /** 23 | * 必填的NSArray型参数 24 | */ 25 | typedef NSArray *TCRequiredArray; 26 | 27 | /** 28 | * 必填的NSDictionary型参数 29 | */ 30 | typedef NSDictionary *TCRequiredDictionary; 31 | 32 | /** 33 | * 必填的TencentApiReq型参数 34 | */ 35 | typedef TencentApiReq *TCRequiredReq; 36 | 37 | /** 38 | * 可选的UIImage类型参数 39 | */ 40 | typedef NSData *TCOptionalData; 41 | 42 | 43 | /** 44 | * 可选的NSArray型参数 45 | */ 46 | typedef NSArray *TCOptionalArray; 47 | 48 | /** 49 | * 可选的TencentApiReq型参数 50 | */ 51 | typedef TencentApiReq *TCOptionalReq; 52 | 53 | /** 54 | * TencentReqMessageType 请求类型枚举参数 55 | */ 56 | typedef enum 57 | { 58 | /** TX APP请求内容填充(需要第三方开发者填充完成内容后需要主动调用sendRespMessageToTencentApp)*/ 59 | ReqFromTencentAppQueryContent, 60 | /** TX APP请求展现内容 (不用调用答复) */ 61 | ReqFromTencentAppShowContent, 62 | /** 第三方 APP 请求内容 */ 63 | ReqFromThirdAppQueryContent, 64 | /** 第三方 APP 请求展现内容(类似分享)*/ 65 | ReqFromThirdAppShowContent, 66 | } 67 | TencentReqMessageType; 68 | 69 | typedef enum 70 | { 71 | RespFromTencentAppQueryContent, 72 | RespFromTencentAppShowContent, 73 | RespFromThirdAppQueryContent, 74 | RespFromThirdAppShowContent, 75 | } 76 | TencentRespMessageType; 77 | 78 | /** 79 | * TencentObjVersion 腾讯API消息类型枚举 80 | */ 81 | typedef enum 82 | { 83 | /** 文本类型 */ 84 | TencentTextObj, 85 | /** 图片类型 */ 86 | TencentImageObj, 87 | /** 音频类型 */ 88 | TencentAudioObj, 89 | /** 视频类型 */ 90 | TencentVideoObj, 91 | /** 图片视频类 */ 92 | TencentImageAndVideoObj, 93 | } 94 | TencentObjVersion; 95 | 96 | /** 97 | * \brief 请求包 98 | * 99 | * TencentApiReq用来向其他业务发送请求包 100 | */ 101 | @interface TencentApiReq : NSObject 102 | 103 | /** 104 | * 根据序列号生成一个请求包 105 | * \param apiSeq 请求序列号 106 | * \param type 请求类型 107 | * \return tencentApiReq实例 108 | */ 109 | + (TencentApiReq *)reqFromSeq:(NSInteger)apiSeq type:(TencentReqMessageType)type; 110 | 111 | /** 请求类型 */ 112 | @property (readonly, assign, nonatomic)TCRequiredInt nMessageType; 113 | 114 | /** 请求平台 */ 115 | @property (readonly, assign, nonatomic)NSInteger nPlatform; 116 | 117 | /** 请求的SDK版本号 */ 118 | @property (readonly, assign, nonatomic)NSInteger nSdkVersion; 119 | 120 | /** 请求序列号 */ 121 | @property (readonly, assign, nonatomic)TCRequiredInt nSeq; 122 | 123 | /** 第三方的APPID */ 124 | @property (nonatomic, retain)TCRequiredStr sAppID; 125 | 126 | /** 请求内容 TencentBaseMessageObj对象数组 */ 127 | @property (nonatomic, retain)TCOptionalArray arrMessage; 128 | 129 | /** 请求的描述 可以用于告诉对方这个请求的特定场景 */ 130 | @property (nonatomic, retain)TCOptionalStr sDescription; 131 | 132 | @end 133 | 134 | /** 135 | * \brief 答复包 136 | * 137 | * TencentApiResp用来向其他业务发送答复包 138 | */ 139 | @interface TencentApiResp : NSObject 140 | 141 | /** 142 | * 根据序列号生成一个答复包 143 | * \param req 答复对应的请求包(如果req不是TencentApiReq或者他的子类,会抛出异常) 144 | * \return 答复包体 145 | */ 146 | + (TencentApiResp *)respFromReq:(TencentApiReq *)req; 147 | 148 | /** 返回码 */ 149 | @property (nonatomic, assign)TCOptionalInt nRetCode; 150 | 151 | /** 返回消息 */ 152 | @property (nonatomic, retain)TCOptionalStr sRetMsg; 153 | 154 | /** 答复对应的请求包 */ 155 | @property (nonatomic, retain)TCOptionalReq objReq; 156 | 157 | @end 158 | 159 | /** 160 | * \brief 消息体 161 | * 162 | * TencentBaseMessageObj 应用之间传递消息体 163 | */ 164 | @interface TencentBaseMessageObj : NSObject 165 | 166 | /** 消息类型 */ 167 | @property (nonatomic, assign)NSInteger nVersion; 168 | 169 | /** 消息描述 */ 170 | @property (nonatomic, retain)NSString *sName; 171 | 172 | /** 消息的扩展信息 主要是可以用来进行一些请求消息体的描述 譬如图片要求的width height 文字的关键字什么的, 也可以不用填写*/ 173 | @property (nonatomic, retain)NSDictionary *dictExpandInfo; 174 | 175 | /** 176 | * 消息是否有效 177 | */ 178 | - (BOOL)isVaild; 179 | 180 | @end 181 | 182 | #pragma mark TencentTextMessage 183 | /** 184 | * \brief 文本的消息体 185 | * 186 | * TencentTextMessageObjV1 应用之间传递的文本消息体 187 | */ 188 | @interface TencentTextMessageObjV1 : TencentBaseMessageObj 189 | 190 | /** 191 | * 文本 192 | * \note 文本长度不能超过4096个字 193 | */ 194 | @property (nonatomic, retain) NSString *sText; 195 | 196 | 197 | /** 198 | * 初始化文本消息 199 | * \param text 文本 200 | * \return 初始化返回的文本消息 201 | */ 202 | - (id)initWithText:(NSString *)text; 203 | 204 | @end 205 | 206 | 207 | #pragma mark TecentImageMessage 208 | 209 | /** 210 | * TencentApiImageSourceType 图片数据类型(请求方对数据类型可能会有限制) 211 | */ 212 | typedef enum 213 | { 214 | /** 图片数据是url或二进制数据 */ 215 | AllImage, 216 | /** 图片数据是url */ 217 | UrlImage, 218 | /** 图片数据是二进制数据 */ 219 | DataImage, 220 | }TencentApiImageSourceType; 221 | 222 | /** 223 | * \brief 图片的消息体 224 | * 225 | * TencentImageMessageObjV1 应用之间传递的图片消息体 226 | */ 227 | @interface TencentImageMessageObjV1 : TencentBaseMessageObj 228 | 229 | /** 230 | * 图片数据 231 | * \note 图片不能大于10M 232 | */ 233 | @property (nonatomic, retain) NSData *dataImage; 234 | 235 | /** 236 | * 缩略图的数据 237 | * \note 图片不能大于1M 238 | */ 239 | @property (nonatomic, retain) NSData *dataThumbImage; 240 | 241 | /** 图片URL */ 242 | @property (nonatomic, retain) NSString *sUrl; 243 | 244 | /** 图片的描述 */ 245 | @property (nonatomic, retain) NSString *sDescription; 246 | 247 | /** 图片的size */ 248 | @property (nonatomic, assign) CGSize szImage; 249 | 250 | /** 251 | * 图片来源 252 | * \note TencentApiImageSourceType对应的类型 253 | */ 254 | @property (readonly, assign) NSInteger nType; 255 | 256 | /** 257 | * 初始化图片消息 258 | * \param dataImage 图片类型 259 | * \return 初始化返回的图片消息 260 | */ 261 | - (id)initWithImageData:(NSData *)dataImage; 262 | 263 | /** 264 | * 初始化图片消息 265 | * \param url 图片url 266 | * \return 初始化返回的图片消息 267 | */ 268 | - (id)initWithImageUrl:(NSString *)url; 269 | 270 | /** 271 | * 初始化图片消息 272 | * \param type 图片类型 273 | * \return 初始化返回的图片消息 274 | */ 275 | - (id)initWithType:(TencentApiImageSourceType)type; 276 | @end 277 | 278 | 279 | #pragma mark TencentAudioMessage 280 | /** 281 | * \brief 音频的消息体 282 | * 283 | * TencentAudioMessageObjV1 应用之间传递的音频消息体 284 | */ 285 | @interface TencentAudioMessageObjV1 : TencentBaseMessageObj 286 | 287 | /** 音频URL */ 288 | @property (nonatomic, retain) NSString *sUrl; 289 | 290 | /** 291 | * 音频的预览图 292 | * \note图片不能大于1M 293 | */ 294 | @property (nonatomic, retain) NSData *dataImagePreview; 295 | 296 | /** 音频的预览图URL */ 297 | @property (nonatomic, retain) NSString *sImagePreviewUrl; 298 | 299 | /** 音频的描述 */ 300 | @property (nonatomic, retain) NSString *sDescription; 301 | 302 | /** 303 | * 初始化图片消息 304 | * \param url 音频URL 305 | * \return 初始化返回的音频消息 306 | */ 307 | - (id)initWithAudioUrl:(NSString *)url; 308 | 309 | @end 310 | 311 | 312 | #pragma mark TencentVideoMessage 313 | 314 | /** 315 | * TencentApiVideoSourceType 视频数据类型(请求方对数据类型可能会有限制) 316 | */ 317 | 318 | typedef enum 319 | { 320 | /** 视频来源于本地或网络 */ 321 | AllVideo, 322 | /** 视频来源于本地 */ 323 | LocalVideo, 324 | /** 视频来源于网络 */ 325 | NetVideo, 326 | }TencentApiVideoSourceType; 327 | 328 | /** 329 | * \brief 视频的消息体 330 | * 331 | * TencentVideoMessageV1 应用之间传递的视频消息体 332 | */ 333 | @interface TencentVideoMessageV1 : TencentBaseMessageObj 334 | 335 | /** 336 | * 视频URL 337 | * \note 不能超过1024 338 | */ 339 | @property (nonatomic, retain) NSString *sUrl; 340 | 341 | /** 342 | * 视频来源 主要是用来让发起方指定视频的来源 343 | * \note TencentApiVideoSourceType 对应的类型 只读参数 344 | */ 345 | @property (readonly, assign, nonatomic) NSInteger nType; 346 | 347 | /** 348 | * 视频的预览图 349 | * \note 图片不能大于1M 350 | */ 351 | @property (nonatomic, retain) NSData *dataImagePreview; 352 | 353 | /** 视频的预览图URL */ 354 | @property (nonatomic, retain) NSString *sImagePreviewUrl; 355 | 356 | /** 视频的描述 */ 357 | @property (nonatomic, retain) NSString *sDescription; 358 | 359 | /** 360 | * 初始化视频消息 361 | * \param url 视频URL 362 | * \param type 视频来源类型 363 | * \return 初始化返回的视频消息 364 | */ 365 | - (id)initWithVideoUrl:(NSString *)url type:(TencentApiVideoSourceType)type; 366 | 367 | 368 | /** 369 | * 初始化视频消息 370 | * \param type 视频来源类型 371 | * \return 初始化返回的视频消息 372 | */ 373 | - (id)initWithType:(TencentApiVideoSourceType)type; 374 | @end 375 | 376 | #pragma mark TencentImageMessageObj 377 | /** 378 | * \brief 视频图片消息体 379 | * 380 | * TencentVideoMessageV1 这是一个扩展的类 是一个图片视频类 381 | * \note 图片视频可以任选一个内容填充 但是注意只能填一个 当有一种类型被填充后 另外一个种类型就无法填充了 382 | */ 383 | @interface TencentImageAndVideoMessageObjV1 : TencentBaseMessageObj 384 | 385 | /** 图片消息 */ 386 | @property (nonatomic, retain) TencentImageMessageObjV1 *objImageMessage; 387 | 388 | /** 视频消息 */ 389 | @property (nonatomic, retain) TencentVideoMessageV1 *objVideoMessage; 390 | 391 | /** 392 | * 初始化图片消息 393 | * \param dataImage 图片数据 394 | * \param url 视频url 395 | * \return 初始化返回的图片视频消息 396 | */ 397 | - (id)initWithMessage:(NSData *)dataImage videoUrl:(NSString *)url; 398 | 399 | /** 400 | * 设置图片 401 | * \param dataImage 图片数据 402 | */ 403 | - (void)setDataImage:(NSData *)dataImage; 404 | 405 | /** 406 | * 设置视频 407 | * \param videoUrl 视频URL 408 | */ 409 | - (void)setVideoUrl:(NSString *)videoUrl; 410 | @end 411 | 412 | #endif 413 | -------------------------------------------------------------------------------- /CCOpenService/QQ/TencentOpenAPI.framework/Headers/TencentOAuth.h: -------------------------------------------------------------------------------- 1 | /// 2 | /// \file TencentOAuth.h 3 | /// \brief QQ互联开放平台授权登录及相关开放接口实现类 4 | /// 5 | /// Created by Tencent on 12-12-21. 6 | /// Copyright (c) 2012年 Tencent. All rights reserved. 7 | /// 8 | 9 | #import 10 | #import "sdkdef.h" 11 | #import "TencentOAuthObject.h" 12 | 13 | @protocol TencentSessionDelegate; 14 | @protocol TencentLoginDelegate; 15 | @protocol TencentApiInterfaceDelegate; 16 | @protocol TencentWebViewDelegate; 17 | 18 | @class TencentApiReq; 19 | @class TencentApiResp; 20 | 21 | typedef enum 22 | { 23 | kTencentNotAuthorizeState, 24 | kTencentSSOAuthorizeState, 25 | kTencentWebviewAuthorzieState, 26 | } TencentAuthorizeState; 27 | 28 | typedef enum 29 | { 30 | kAuthModeClientSideToken, 31 | kAuthModeServerSideCode, 32 | } TencentAuthMode; 33 | 34 | #pragma mark - TencentOAuth(授权登录及相关开放接口调用) 35 | 36 | /** 37 | * \brief TencentOpenAPI授权登录及相关开放接口调用 38 | * 39 | * TencentOAuth实现授权登录逻辑以及相关开放接口的请求调用 40 | */ 41 | @interface TencentOAuth : NSObject 42 | { 43 | NSMutableDictionary* _apiRequests; 44 | NSString* _accessToken; 45 | NSDate* _expirationDate; 46 | id _sessionDelegate; 47 | NSString* _localAppId; 48 | NSString* _openId; 49 | NSString* _redirectURI; 50 | NSArray* _permissions; 51 | } 52 | 53 | /** Access Token凭证,用于后续访问各开放接口 */ 54 | @property(nonatomic, copy) NSString* accessToken; 55 | 56 | /** Access Token的失效期 */ 57 | @property(nonatomic, copy) NSDate* expirationDate; 58 | 59 | /** 已实现的开放接口的回调委托对象 */ 60 | @property(nonatomic, assign) id sessionDelegate; 61 | 62 | /** 第三方应用在开发过程中设置的URLSchema,用于浏览器登录后后跳到第三方应用 */ 63 | @property(nonatomic, copy) NSString* localAppId; 64 | 65 | /** 用户授权登录后对该用户的唯一标识 */ 66 | @property(nonatomic, copy) NSString* openId; 67 | 68 | /** 用户登录成功过后的跳转页面地址 */ 69 | @property(nonatomic, copy) NSString* redirectURI; 70 | 71 | /** 第三方应用在互联开放平台申请的appID */ 72 | @property(nonatomic, retain) NSString* appId; 73 | 74 | /** 主要是互娱的游戏设置uin */ 75 | @property(nonatomic, retain) NSString* uin; 76 | 77 | /** 主要是互娱的游戏设置鉴定票据 */ 78 | @property(nonatomic, retain) NSString* skey; 79 | 80 | /** 登陆透传的数据 */ 81 | @property(nonatomic, copy) NSDictionary* passData; 82 | 83 | /** 授权方式(Client Side Token或者Server Side Code) */ 84 | @property(nonatomic, assign) TencentAuthMode authMode; 85 | 86 | /** 87 | * 用来获得当前sdk的版本号 88 | * \return 返回sdk版本号 89 | **/ 90 | 91 | + (NSString*)sdkVersion; 92 | 93 | /** 94 | * 用来获得当前sdk的小版本号 95 | * \return 返回sdk小版本号 96 | **/ 97 | 98 | + (NSString*)sdkSubVersion; 99 | 100 | /** 101 | * 用来获得当前sdk的是否精简版 102 | * \return 返回YES表示精简版 103 | **/ 104 | 105 | + (BOOL)isLiteSDK; 106 | 107 | /** 108 | * 主要是用来帮助判断是否有登陆被发起,但是还没有过返回结果 109 | * \return 110 | * kTencentNotAuthorizeState:无授权 111 | * kTencentSSOAuthorizeState:有人发起了sso授权但无返回 112 | * kTencentWebviewAuthorzieState:有人发起了webview授权还未返回 113 | **/ 114 | 115 | + (TencentAuthorizeState *)authorizeState; 116 | 117 | /** 118 | * 用来获得当前手机qq的版本号 119 | * \return 返回手机qq版本号 120 | **/ 121 | + (QQVersion)iphoneQQVersion; 122 | 123 | /** 124 | * 初始化TencentOAuth对象 125 | * \param appId 第三方应用在互联开放平台申请的唯一标识 126 | * \param delegate 第三方应用用于接收请求返回结果的委托对象 127 | * \return 初始化后的授权登录对象 128 | */ 129 | - (id)initWithAppId:(NSString *)appId 130 | andDelegate:(id)delegate; 131 | 132 | 133 | /** 134 | * 判断用户手机上是否安装手机QQ 135 | * \return YES:安装 NO:没安装 136 | */ 137 | + (BOOL)iphoneQQInstalled; 138 | 139 | /** 140 | * 判断用户手机上的手机QQ是否支持SSO登录 141 | * \return YES:支持 NO:不支持 142 | */ 143 | + (BOOL)iphoneQQSupportSSOLogin; 144 | 145 | /** 146 | * 判断用户手机上是否安装手机QZone 147 | * \return YES:安装 NO:没安装 148 | */ 149 | + (BOOL)iphoneQZoneInstalled; 150 | 151 | /** 152 | * 判断用户手机上的手机QZone是否支持SSO登录 153 | * \return YES:支持 NO:不支持 154 | */ 155 | + (BOOL)iphoneQZoneSupportSSOLogin; 156 | 157 | /** 158 | * 登录授权 159 | * 160 | * \param permissions 授权信息列 161 | */ 162 | - (BOOL)authorize:(NSArray *)permissions; 163 | 164 | /** 165 | * 登录授权 166 | * \param permissions 授权信息列表 167 | * \param bInSafari 是否使用safari进行登录.IOS SDK 1.3版本开始此参数废除 168 | */ 169 | - (BOOL)authorize:(NSArray *)permissions 170 | inSafari:(BOOL)bInSafari; 171 | 172 | /** 173 | * 登录授权 174 | * \param permissions 授权信息列表 175 | * \param localAppId 应用APPID 176 | * \param bInSafari 是否使用safari进行登录.IOS SDK 1.3版本开始此参数废除 177 | */ 178 | - (BOOL)authorize:(NSArray *)permissions 179 | localAppId:(NSString *)localAppId 180 | inSafari:(BOOL)bInSafari; 181 | 182 | /** 183 | * 增量授权,因用户没有授予相应接口调用的权限,需要用户确认是否授权 184 | * \param permissions 需增量授权的信息列表 185 | * \return 增量授权调用是否成功 186 | */ 187 | - (BOOL)incrAuthWithPermissions:(NSArray *)permissions; 188 | 189 | /** 190 | * 重新授权,因token废除或失效导致接口调用失败,需用户重新授权 191 | * \param permissions 授权信息列表,同登录授权 192 | * \return 授权调用是否成功 193 | */ 194 | - (BOOL)reauthorizeWithPermissions:(NSArray *)permissions; 195 | 196 | /** 197 | * (静态方法)处理应用拉起协议 198 | * \param url 处理被其他应用呼起时的逻辑 199 | * \return 处理结果,YES表示成功,NO表示失败 200 | */ 201 | + (BOOL)HandleOpenURL:(NSURL *)url; 202 | 203 | /** 204 | * (静态方法)sdk是否可以处理应用拉起协议 205 | * \param url 处理被其他应用呼起时的逻辑 206 | * \return 处理结果,YES表示可以 NO表示不行 207 | */ 208 | + (BOOL)CanHandleOpenURL:(NSURL *)url; 209 | 210 | /** 211 | * (静态方法)获取TencentOAuth调用的上一次错误信息 212 | */ 213 | + (NSString *)getLastErrorMsg; 214 | 215 | /** 216 | * 以Server Side Code模式授权登录时,通过此接口获取返回的code值; 217 | * 以Client Side Token模式授权登录时,忽略此接口。 218 | */ 219 | - (NSString *)getServerSideCode; 220 | 221 | /** 222 | * 退出登录(退出登录后,TecentOAuth失效,需要重新初始化) 223 | * \param delegate 第三方应用用于接收请求返回结果的委托对象 224 | */ 225 | - (void)logout:(id)delegate; 226 | 227 | /** 228 | * 判断登录态是否有效 229 | * \return 处理结果,YES表示有效,NO表示无效,请用户重新登录授权 230 | */ 231 | - (BOOL)isSessionValid; 232 | 233 | /** 234 | * 获取用户个人信息 235 | * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 236 | */ 237 | - (BOOL)getUserInfo; 238 | 239 | /** 240 | * SDK内置webview实现定向分享时,第三方应用可以根据应用是否在白名单里来开启该配置开关,默认为关闭; 241 | * 在白名单里的应用调用该接口后,即打开sdk内置webview的二级白名单开关(相对与sdk后台的白名单), 242 | * 那么在sdk后台白名单校验请求失败的情况下,会继续先尝试采用内置webview进行分享。 243 | */ 244 | - (void)openSDKWebViewQQShareEnable; 245 | 246 | 247 | /** 248 | * 获取用户QZone相册列表 249 | * \attention 需\ref apply_perm 250 | * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 251 | */ 252 | - (BOOL)getListAlbum; 253 | 254 | /** 255 | * 获取用户QZone相片列表 256 | * \attention 需\ref apply_perm 257 | * \param params 参数字典,字典的关键字参见TencentOAuthObject.h中的\ref TCListPhotoDic 258 | * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 259 | */ 260 | - (BOOL)getListPhotoWithParams:(NSMutableDictionary *)params; 261 | 262 | 263 | /** 264 | * 分享到QZone 265 | * \param params 参数字典,字典的关键字参见TencentOAuthObject.h中的\ref TCAddShareDic 266 | * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 267 | */ 268 | - (BOOL)addShareWithParams:(NSMutableDictionary *)params; 269 | 270 | 271 | /** 272 | * 上传照片到QZone指定相册 273 | * \attention 需\ref apply_perm 274 | * \param params 参数字典,字典的关键字参见TencentOAuthObject.h中的\ref TCUploadPicDic 275 | * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 276 | */ 277 | - (BOOL)uploadPicWithParams:(NSMutableDictionary *)params; 278 | 279 | /** 280 | * 在QZone相册中创建一个新的相册 281 | * \attention 需\ref apply_perm 282 | * \param params 参数字典,字典的关键字参见TencentOAuthObject.h中的\ref TCAddAlbumDic 283 | * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 284 | */ 285 | - (BOOL)addAlbumWithParams:(NSMutableDictionary *)params; 286 | 287 | /** 288 | * 检查是否是QZone某个用户的粉丝 289 | * \param params 参数字典,字典的关键字参见TencentOAuthObject.h中的\ref TCCheckPageFansDic 290 | * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 291 | */ 292 | - (BOOL)checkPageFansWithParams:(NSMutableDictionary *)params; 293 | 294 | /** 295 | * 在QZone中发表一篇日志 296 | * \attention 需\ref apply_perm 297 | * \param params 参数字典,字典的关键字参见TencentOAuthObject.h中的\ref TCAddOneBlogDic 298 | * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 299 | */ 300 | - (BOOL)addOneBlogWithParams:(NSMutableDictionary *)params; 301 | 302 | /** 303 | * 在QZone中发表一条说说 304 | * \attention 需\ref apply_perm 305 | * \param params 参数字典,字典的关键字参见TencentOAuthObject.h中的\ref TCAddTopicDic 306 | * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 307 | */ 308 | - (BOOL)addTopicWithParams:(NSMutableDictionary *)params; 309 | 310 | /** 311 | * 设置QQ头像 使用默认的效果处理设置头像的界面 312 | * \attention 需\ref apply_perm 313 | * \param params 参数字典,字典的关键字参见TencentOAuthObject.h中的\ref TCSetUserHeadpic 314 | * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 315 | */ 316 | - (BOOL)setUserHeadpic:(NSMutableDictionary *)params; 317 | 318 | 319 | /** 320 | * 设置QQ头像 会返回设置头像由第三方自己处理界面的弹出方式 321 | * \attention 需\ref apply_perm 322 | * \param params 参数字典,字典的关键字参见TencentOAuthObject.h中的\ref TCSetUserHeadpic 323 | * \param viewController 设置头像的界面 324 | * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 325 | */ 326 | - (BOOL)setUserHeadpic:(NSMutableDictionary *)params andViewController:(UIViewController **)viewController; 327 | 328 | /** 329 | * 获取QQ会员信息(仅包括是否为QQ会员,是否为年费QQ会员) 330 | * \attention 需\ref apply_perm 331 | * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 332 | */ 333 | - (BOOL)getVipInfo; 334 | 335 | /** 336 | * 获取QQ会员详细信息 337 | * \attention 需\ref apply_perm 338 | * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 339 | */ 340 | - (BOOL)getVipRichInfo; 341 | 342 | /** 343 | * QZone定向分享,可以@到具体好友,完成后将触发responseDidReceived:forMessage:回调,message:“SendStory” 344 | * \param params 参数字典 345 | * \param fopenIdArray 第三方应用预传人好友列表,好友以openid标识 346 | * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 347 | */ 348 | - (BOOL)sendStory:(NSMutableDictionary *)params friendList:(NSArray *)fopenIdArray; 349 | 350 | /** 351 | * 发送应用邀请,完成后将触发responseDidReceived:forMessage:回调,message:“AppInvitation” 352 | * \param desc 应用的描述文字,不超过35字符,如果为nil或@“”则显示默认描述 353 | * \param imageUrl 应用的图标,如果为nil或者@“”则显示默认图标 354 | * \param source 透传参数,由开发者自定义该参数内容 355 | * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 356 | */ 357 | - (BOOL)sendAppInvitationWithDescription:(NSString *)desc imageURL:(NSString *)imageUrl source:(NSString *)source; 358 | 359 | /** 360 | * 发起PK或者发送炫耀,完成后将触发responseDidReceived:forMessage:回调,message:“AppChallenge” 361 | * \param receiver 必须指定一位进行PK或者炫耀的好友,填写其OpenID,填写多个OpenID将截取第一个 362 | * \param type 类型,"pk"或者“brag” 363 | * \param imageUrl 炫耀/挑战场景图的URL 364 | * \param message 炫耀/挑战中的内容描述,不超过50个字符,超过限制则自动截断 365 | * \param source 透传参数,由开发者自定义该参数内容 366 | * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 367 | */ 368 | - (BOOL)sendChallenge:(NSString *)receiver type:(NSString *)type imageURL:(NSString *)imageUrl message:(NSString *)message source:(NSString *)source; 369 | 370 | /** 371 | * 赠送或者请求礼物,完成后将触发responseDidReceived:forMessage:回调,message:“AppGiftRequest” 372 | * \param receiver 赠送或者请求礼物的好友的OpenID,支持填写多个,OpenID之用","分隔,为nil时将由用户通过好友选择器选择好友 373 | * \param exclude 用户通过好友选择器选择好友场景下,希望排除的好友(不显示在好友选择器) 374 | * \param specified 用户通过好友选择器选择好友场景下,希望出现的指定好友 375 | * \param only 是否只显示specified指定的好友 376 | * \param type 类型,"request"或者“freegift” 377 | * \param title 免费礼物或请求名称,不超过6个字符 378 | * \param message 礼物或请求的默认赠言,控制在35个汉字以内,超过限制自动截断 379 | * \param imageUrl 请求或礼物配图的URL,如果不传,则默认在弹框中显示应用的icon 380 | * \param source 透传参数,由开发者自定义该参数内容 381 | * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 382 | */ 383 | - (BOOL)sendGiftRequest:(NSString *)receiver exclude:(NSString *)exclude specified:(NSString *)specified only:(BOOL)only type:(NSString *)type title:(NSString *)title message:(NSString *)message imageURL:(NSString *)imageUrl source:(NSString *)source; 384 | 385 | 386 | /** 387 | * 退出指定API调用 388 | * \param userData 用户调用某条API的时候传入的保留参数 389 | * \return 处理结果,YES表示成功 NO表示失败 390 | */ 391 | - (BOOL)cancel:(id)userData; 392 | 393 | /** 394 | * CGI类任务创建接口 395 | * \param apiURL CGI请求的URL地址 396 | * \param method CGI请求方式:"GET","POST" 397 | * \param params CGI请求参数字典 398 | * \param callback CGI请求结果的回调接口对象 399 | * \return CGI请求任务实例,用于取消任务,返回nil代表任务创建失败 400 | */ 401 | - (TCAPIRequest *)cgiRequestWithURL:(NSURL *)apiURL method:(NSString *)method params:(NSDictionary *)params callback:(id)callback; 402 | 403 | /** 404 | * TencentOpenApi发送任务统一接口 405 | * \param request 请求发送的任务 406 | * \param callback 任务发送后的回调地址 407 | */ 408 | - (BOOL)sendAPIRequest:(TCAPIRequest *)request callback:(id)callback; 409 | 410 | - (NSString *)getUserOpenID; 411 | 412 | @end 413 | 414 | #pragma mark - TencentLoginDelegate(授权登录回调协议) 415 | 416 | /** 417 | * \brief TencentLoginDelegate iOS Open SDK 1.3 API回调协议 418 | * 419 | * 第三方应用实现登录的回调协议 420 | */ 421 | @protocol TencentLoginDelegate 422 | 423 | @required 424 | 425 | /** 426 | * 登录成功后的回调 427 | */ 428 | - (void)tencentDidLogin; 429 | 430 | /** 431 | * 登录失败后的回调 432 | * \param cancelled 代表用户是否主动退出登录 433 | */ 434 | - (void)tencentDidNotLogin:(BOOL)cancelled; 435 | 436 | /** 437 | * 登录时网络有问题的回调 438 | */ 439 | - (void)tencentDidNotNetWork; 440 | 441 | @optional 442 | /** 443 | * 登录时权限信息的获得 444 | */ 445 | - (NSArray *)getAuthorizedPermissions:(NSArray *)permissions withExtraParams:(NSDictionary *)extraParams; 446 | 447 | @end 448 | 449 | #pragma mark - TencentSessionDelegate(开放接口回调协议) 450 | 451 | /** 452 | * \brief TencentSessionDelegate iOS Open SDK 1.3 API回调协议 453 | * 454 | * 第三方应用需要实现每条需要调用的API的回调协议 455 | */ 456 | @protocol TencentSessionDelegate 459 | 460 | @optional 461 | 462 | /** 463 | * 退出登录的回调 464 | */ 465 | - (void)tencentDidLogout; 466 | 467 | /** 468 | * 因用户未授予相应权限而需要执行增量授权。在用户调用某个api接口时,如果服务器返回操作未被授权,则触发该回调协议接口,由第三方决定是否跳转到增量授权页面,让用户重新授权。 469 | * \param tencentOAuth 登录授权对象。 470 | * \param permissions 需增量授权的权限列表。 471 | * \return 是否仍然回调返回原始的api请求结果。 472 | * \note 不实现该协议接口则默认为不开启增量授权流程。若需要增量授权请调用\ref TencentOAuth#incrAuthWithPermissions: \n注意:增量授权时用户可能会修改登录的帐号 473 | */ 474 | - (BOOL)tencentNeedPerformIncrAuth:(TencentOAuth *)tencentOAuth withPermissions:(NSArray *)permissions; 475 | 476 | /** 477 | * [该逻辑未实现]因token失效而需要执行重新登录授权。在用户调用某个api接口时,如果服务器返回token失效,则触发该回调协议接口,由第三方决定是否跳转到登录授权页面,让用户重新授权。 478 | * \param tencentOAuth 登录授权对象。 479 | * \return 是否仍然回调返回原始的api请求结果。 480 | * \note 不实现该协议接口则默认为不开启重新登录授权流程。若需要重新登录授权请调用\ref TencentOAuth#reauthorizeWithPermissions: \n注意:重新登录授权时用户可能会修改登录的帐号 481 | */ 482 | - (BOOL)tencentNeedPerformReAuth:(TencentOAuth *)tencentOAuth; 483 | 484 | /** 485 | * 用户通过增量授权流程重新授权登录,token及有效期限等信息已被更新。 486 | * \param tencentOAuth token及有效期限等信息更新后的授权实例对象 487 | * \note 第三方应用需更新已保存的token及有效期限等信息。 488 | */ 489 | - (void)tencentDidUpdate:(TencentOAuth *)tencentOAuth; 490 | 491 | /** 492 | * 用户增量授权过程中因取消或网络问题导致授权失败 493 | * \param reason 授权失败原因,具体失败原因参见sdkdef.h文件中\ref UpdateFailType 494 | */ 495 | - (void)tencentFailedUpdate:(UpdateFailType)reason; 496 | 497 | /** 498 | * 获取用户个人信息回调 499 | * \param response API返回结果,具体定义参见sdkdef.h文件中\ref APIResponse 500 | * \remarks 正确返回示例: \snippet example/getUserInfoResponse.exp success 501 | * 错误返回示例: \snippet example/getUserInfoResponse.exp fail 502 | */ 503 | - (void)getUserInfoResponse:(APIResponse*) response; 504 | 505 | 506 | /** 507 | * 获取用户QZone相册列表回调 508 | * \param response API返回结果,具体定义参见sdkdef.h文件中\ref APIResponse 509 | * \remarks 正确返回示例: \snippet example/getListAlbumResponse.exp success 510 | * 错误返回示例: \snippet example/getListAlbumResponse.exp fail 511 | */ 512 | - (void)getListAlbumResponse:(APIResponse*) response; 513 | 514 | /** 515 | * 获取用户QZone相片列表 516 | * \param response API返回结果,具体定义参见sdkdef.h文件中\ref APIResponse 517 | * \remarks 正确返回示例: \snippet example/getListPhotoResponse.exp success 518 | * 错误返回示例: \snippet example/getListPhotoResponse.exp fail 519 | */ 520 | - (void)getListPhotoResponse:(APIResponse*) response; 521 | 522 | /** 523 | * 检查是否是QZone某个用户的粉丝回调 524 | * \param response API返回结果,具体定义参见sdkdef.h文件中\ref APIResponse 525 | * \remarks 正确返回示例: \snippet example/checkPageFansResponse.exp success 526 | * 错误返回示例: \snippet example/checkPageFansResponse.exp fail 527 | */ 528 | - (void)checkPageFansResponse:(APIResponse*) response; 529 | 530 | /** 531 | * 分享到QZone回调 532 | * \param response API返回结果,具体定义参见sdkdef.h文件中\ref APIResponse 533 | * \remarks 正确返回示例: \snippet example/addShareResponse.exp success 534 | * 错误返回示例: \snippet example/addShareResponse.exp fail 535 | */ 536 | - (void)addShareResponse:(APIResponse*) response; 537 | 538 | /** 539 | * 在QZone相册中创建一个新的相册回调 540 | * \param response API返回结果,具体定义参见sdkdef.h文件中\ref APIResponse 541 | * \remarks 正确返回示例: \snippet example/addAlbumResponse.exp success 542 | * 错误返回示例: \snippet example/addAlbumResponse.exp fail 543 | */ 544 | - (void)addAlbumResponse:(APIResponse*) response; 545 | 546 | /** 547 | * 上传照片到QZone指定相册回调 548 | * \param response API返回结果,具体定义参见sdkdef.h文件中\ref APIResponse 549 | * \remarks 正确返回示例: \snippet example/uploadPicResponse.exp success 550 | * 错误返回示例: \snippet example/uploadPicResponse.exp fail 551 | */ 552 | - (void)uploadPicResponse:(APIResponse*) response; 553 | 554 | 555 | /** 556 | * 在QZone中发表一篇日志回调 557 | * \param response API返回结果,具体定义参见sdkdef.h文件中\ref APIResponse 558 | * \remarks 正确返回示例: \snippet example/addOneBlogResponse.exp success 559 | * 错误返回示例: \snippet example/addOneBlogResponse.exp fail 560 | */ 561 | - (void)addOneBlogResponse:(APIResponse*) response; 562 | 563 | /** 564 | * 在QZone中发表一条说说回调 565 | * \param response API返回结果,具体定义参见sdkdef.h文件中\ref APIResponse 566 | * \remarks 正确返回示例: \snippet example/addTopicResponse.exp success 567 | * 错误返回示例: \snippet example/addTopicResponse.exp fail 568 | */ 569 | - (void)addTopicResponse:(APIResponse*) response; 570 | 571 | /** 572 | * 设置QQ头像回调 573 | * \param response API返回结果,具体定义参见sdkdef.h文件中\ref APIResponse 574 | * \remarks 正确返回示例: \snippet example/setUserHeadpicResponse.exp success 575 | * 错误返回示例: \snippet example/setUserHeadpicResponse.exp fail 576 | */ 577 | - (void)setUserHeadpicResponse:(APIResponse*) response; 578 | 579 | /** 580 | * 获取QQ会员信息回调 581 | * \param response API返回结果,具体定义参见sdkdef.h文件中\ref APIResponse 582 | * \remarks 正确返回示例: \snippet example/getVipInfoResponse.exp success 583 | * 错误返回示例: \snippet example/getVipInfoResponse.exp fail 584 | */ 585 | - (void)getVipInfoResponse:(APIResponse*) response; 586 | 587 | /** 588 | * 获取QQ会员详细信息回调 589 | * \param response API返回结果,具体定义参见sdkdef.h文件中\ref APIResponse 590 | */ 591 | - (void)getVipRichInfoResponse:(APIResponse*) response; 592 | 593 | /** 594 | * sendStory分享的回调(已废弃,使用responseDidReceived:forMessage:) 595 | * \param response API返回结果,具体定义参见sdkdef.h文件中\ref APIResponse 596 | */ 597 | - (void)sendStoryResponse:(APIResponse*) response; 598 | 599 | 600 | /** 601 | * 社交API统一回调接口 602 | * \param response API返回结果,具体定义参见sdkdef.h文件中\ref APIResponse 603 | * \param message 响应的消息,目前支持‘SendStory’,‘AppInvitation’,‘AppChallenge’,‘AppGiftRequest’ 604 | */ 605 | - (void)responseDidReceived:(APIResponse*)response forMessage:(NSString *)message; 606 | 607 | /** 608 | * post请求的上传进度 609 | * \param tencentOAuth 返回回调的tencentOAuth对象 610 | * \param bytesWritten 本次回调上传的数据字节数 611 | * \param totalBytesWritten 总共已经上传的字节数 612 | * \param totalBytesExpectedToWrite 总共需要上传的字节数 613 | * \param userData 用户自定义数据 614 | */ 615 | - (void)tencentOAuth:(TencentOAuth *)tencentOAuth didSendBodyData:(NSInteger)bytesWritten totalBytesWritten:(NSInteger)totalBytesWritten totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite userData:(id)userData; 616 | 617 | 618 | /** 619 | * 通知第三方界面需要被关闭 620 | * \param tencentOAuth 返回回调的tencentOAuth对象 621 | * \param viewController 需要关闭的viewController 622 | */ 623 | - (void)tencentOAuth:(TencentOAuth *)tencentOAuth doCloseViewController:(UIViewController *)viewController; 624 | 625 | @end 626 | 627 | #pragma mark - TencentWebViewDelegate(H5登录webview旋转方向回调) 628 | 629 | /** 630 | * \brief TencentWebViewDelegate: H5登录webview旋转方向回调协议 631 | * 632 | * 第三方应用可以根据自己APP的旋转方向限制,通过此协议设置 633 | */ 634 | @protocol TencentWebViewDelegate 635 | @optional 636 | - (BOOL) tencentWebViewShouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation; 637 | - (NSUInteger) tencentWebViewSupportedInterfaceOrientationsWithWebkit; 638 | - (BOOL) tencentWebViewShouldAutorotateWithWebkit; 639 | @end 640 | -------------------------------------------------------------------------------- /CCOpenService/QQ/TencentOpenAPI.framework/Headers/TencentOAuthObject.h: -------------------------------------------------------------------------------- 1 | /// 2 | /// \file TencentOAuthObject.h 3 | /// 对开放接口的调用提供参数字典封装的辅助类 4 | /// 5 | /// Created by Tencent on 12-12-28. 6 | /// Copyright (c) 2012年 Tencent. All rights reserved. 7 | /// 8 | 9 | #import 10 | #import 11 | #import "sdkdef.h" 12 | 13 | 14 | #pragma mark - 15 | #pragma mark TCAddTopicDic 16 | 17 | /** 18 | * \brief 发表说说的参数字典定义 19 | * 20 | * 可以直接填写相应参数后将对象当作参数传入API中 21 | */ 22 | @interface TCAddTopicDic : TCAPIRequest 23 | 24 | /** 25 | * 返回一个对象用来进行API参数的填充 26 | * \note 不用释放,返回的对象是自动释放的 27 | */ 28 | + (TCAddTopicDic *) dictionary; 29 | 30 | /** 31 | * 发布心情时引用的信息的类型。 32 | * \note 1表示图片; 2表示网页; 3表示视频 33 | */ 34 | @property (nonatomic, retain) TCOptionalStr paramRichtype; 35 | 36 | /** 37 | * 发布心情时引用的信息的值。有richtype时必须有richval 38 | * 39 | * \note 40 | * -# 当richtype为图片(即richtype为1,应用场景为发布心情时引用某张图片)时,\n 41 | * richval需要传入该图片的相关参数。引用的图片来源分为两种:一种为网站图片,\n 42 | * 一种为QQ空间相册中的某张图片。 43 | * - 当引用的图片来自网站,richval包含下列参数的值:\n 44 | * | 参数名称 | 是否必须 | 类型 | 描述 | 45 | * | ------ | ------- | ------ | ----------------- | 46 | * | url | 必须 | string | 网站图片的URL | 47 | * | height | 必须 | string | 图片高度,单位: px | 48 | * | width | 必须 | string | 图片宽度,单位: px | 49 | * \n 50 | * 输入时每个值中间用“&”分隔,如下所示:\n 51 | * “url=http://qq.com/logo.png&width=25&height=21” 52 | * 53 | * - 当引用的图片来自QQ空间相册,richval包含下列参数的值。\n 54 | * 这些值都需要通过调用相册OpenAPI来获得。参数意义如下:\n 55 | * | 参数名称 | 是否必须 | 类型 | 描述 | 56 | * | --------- | ------ | ------ | ---------------------------------- | 57 | * | albumid | 必须 | string | 图片所属空间相册的ID | 58 | * | pictureid | 必须 | string | 图片ID | 59 | * | sloc | 必须 | string | 小图ID | 60 | * | pictype | | string | 图片类型(JPG = 1;GIF = 2;PNG = 3) | 61 | * | picheight | | string | 图片高度,单位: px | 62 | * | picwidth | | string | 图片宽度,单位: px | 63 | * 输入时每个值中间用逗号分隔,如下所示 :\n 64 | * “albumid,pictureid,sloc,pictype,picheight,picwidth” 65 | * -# 当richtype为网页(即richtype为2,应用场景为针对某网页发表评论)时,\n 66 | * richval需要传入该网页的URL,发表为feeds时,后台会自动将该URL转换为短URL。 67 | * -# 当richtype为视频(即richtype为3,应用场景为针对某视频发表评论)时,\n 68 | * richval需要传入该视频的URL,发表为feeds时,后台会对该URL进行解析,\n 69 | * 在feeds上显示播放器,视频源及缩略图。 70 | */ 71 | @property (nonatomic, retain) TCOptionalStr paramRichval; 72 | 73 | /** 74 | * 发布的心情的内容。 75 | */ 76 | @property (nonatomic, retain) TCRequiredStr paramCon; 77 | 78 | /** 79 | * 地址文。例如:广东省深圳市南山区高新科技园腾讯大厦。lbs_nm,lbs_x,lbs_y通常一起使用,来明确标识一个地址。 80 | */ 81 | @property (nonatomic, retain) TCOptionalStr paramLbs_nm; 82 | 83 | /** 84 | * 经度。-180.0到+180.0,+表示东经。lbs_nm,lbs_x,lbs_y通常一起使用,来明确标识一个地址。 85 | */ 86 | @property (nonatomic, retain) TCOptionalStr paramLbs_x; 87 | 88 | /** 89 | * 纬度。-90.0到+90.0,+表示北纬。lbs_nm,lbs_x,lbs_y通常一起使用,来明确标识一个地址。 90 | */ 91 | @property (nonatomic, retain) TCOptionalStr paramLbs_y; 92 | 93 | /** 94 | * 第三方应用的平台类型。 95 | * \note 1表示QQ空间; 2表示腾讯朋友; 3表示腾讯微博平台; 4表示腾讯Q+平台。 96 | */ 97 | @property (nonatomic, retain) TCOptionalStr paramThirdSource; 98 | @end 99 | 100 | 101 | #pragma mark - 102 | #pragma mark TCAddOneBlogDic 103 | /** 104 | * \brief 发表日志的参数字典定义 105 | * 106 | * 可以直接填写相应参数后将对象当作参数传入API中 107 | */ 108 | @interface TCAddOneBlogDic : TCAPIRequest 109 | 110 | /** 111 | * 返回一个对象用来进行API参数的填充 112 | * \note 不用释放,返回的对象是自动释放的 113 | */ 114 | + (TCAddOneBlogDic *) dictionary; 115 | 116 | /** 117 | * 日志标题(纯文本,最大长度128个字节,utf-8编码)。 118 | */ 119 | @property (nonatomic, retain) TCRequiredStr paramTitle; 120 | 121 | /** 122 | * content 文章内容(html数据,最大长度100*1024个字节,utf-8编码) 123 | */ 124 | @property (nonatomic, retain) TCRequiredStr paramContent; 125 | @end 126 | 127 | #pragma mark - 128 | #pragma mark TCAddAlbumDic 129 | /** 130 | * \brief 创建空间相册的参数字典定义 131 | * 132 | * 可以直接填写相应参数后将对象当作参数传入API中 133 | */ 134 | @interface TCAddAlbumDic : TCAPIRequest 135 | 136 | /** 137 | * 返回一个对象用来进行API参数的填充 138 | * 139 | * \note 不用释放,返回的对象是自动释放的 140 | */ 141 | + (TCAddAlbumDic *) dictionary; 142 | 143 | /** 144 | * albumname 必须 string 相册名 不能超过30个字符。 145 | */ 146 | @property (nonatomic, retain) TCRequiredStr paramAlbumname; 147 | 148 | 149 | /** 150 | * albumdesc string 相册描述,不能超过200个字符。 151 | */ 152 | @property (nonatomic, retain) TCOptionalStr paramAlbumdesc; 153 | 154 | /** 155 | * priv string 相册权限 156 | * 157 | * \note 其取值含义为: 1=公开;3=只主人可见; 4=QQ好友可见; 5=问答加密。\n 158 | * 不传则相册默认为公开权限。\n 159 | * 如果priv取值为5,即相册是问答加密的,则必须包含问题和答案两个参数:\n 160 | * - question: 问题,不能超过30个字符。 161 | * - answer: 答案,不能超过30个字符。 162 | */ 163 | @property (nonatomic, retain) TCOptionalStr paramPriv; 164 | 165 | /** 166 | * question 问题,不能超过30个字符。 167 | * \note 如果priv取值为5,必须包含这个参数: 168 | **/ 169 | @property (nonatomic, retain) TCOptionalStr paramQuestion; 170 | 171 | /** 172 | * answer 答案,不能超过30个字符。 173 | * \note 如果priv取值为5,必须包含这个参数: 174 | **/ 175 | @property (nonatomic, retain) TCOptionalStr paramAnswer; 176 | 177 | @end 178 | 179 | #pragma mark - 180 | #pragma mark TCUploadPicDic 181 | /** 182 | * \brief 上传一张照片到QQ空间相册的参数字典定义 183 | * 184 | * 可以直接填写相应参数后将对象当作参数传入API中 185 | */ 186 | @interface TCUploadPicDic : TCAPIRequest 187 | 188 | /** 189 | * 返回一个对象用来进行API参数的填充 190 | * \note 不用释放,返回的对象是自动释放的 191 | */ 192 | + (TCUploadPicDic *) dictionary; 193 | 194 | /** 195 | * photodesc string 照片描述,注意照片描述不能超过200个字符。 196 | */ 197 | @property (nonatomic, retain) TCOptionalStr paramPhotodesc; 198 | /** 199 | * string 照片的命名,必须以.jpg, .gif, .png, .jpeg, .bmp此类后缀结尾。 200 | */ 201 | @property (nonatomic, retain) TCOptionalStr paramTitle; 202 | 203 | /** 204 | * string 相册id。可不填,不填时则根据“mobile”标识选择默认上传的相册。 205 | */ 206 | @property (nonatomic, retain) TCOptionalStr paramAlbumid; 207 | 208 | /** 209 | * 标志位 210 | * 211 | * \note 0表示PC,1表示手机。用于当不传相册id时(即albumid为空时)控制是否传到手机相册。\n 212 | * -# 如果传1,则当albumid为空时,图片会上传到手机相册; 213 | * -# 如果不传或传0,则当albumid为空时,图片会上传到贴图相册; 214 | */ 215 | @property (nonatomic, assign) TCOptionalStr paramMobile; 216 | 217 | /** 218 | * x string 照片拍摄时的地理位置的经度。请使用原始数据(纯经纬度,0-360)。 219 | */ 220 | @property (nonatomic, retain) TCOptionalStr paramX; 221 | 222 | /** 223 | * y string 照片拍摄时的地理位置的纬度。请使用原始数据(纯经纬度,0-360)。 224 | */ 225 | @property (nonatomic, retain) TCOptionalStr paramY; 226 | 227 | /** 228 | * picture 必须 string 上传照片的文件名以及图片的内容(在发送请求时,图片内容以二进制数据流的形式发送,见下面的请求示例),注意照片名称不能超过30个字符。 229 | */ 230 | @property (nonatomic, retain) TCRequiredImage paramPicture; 231 | 232 | /** 233 | * needfeed int 标识上传照片时是否要发feed 234 | * \note(0:不发feed; 1:发feed)。如果不填则默认为发feed。 235 | */ 236 | @property (nonatomic, assign)TCOptionalStr paramNeedfeed; 237 | 238 | /** 239 | * successnum int 批量上传照片时,已成功上传的张数,指明上传完成情况。 240 | * \note 单张上传时可以不填,不填则默认为0。 241 | */ 242 | @property (nonatomic, assign)TCOptionalStr paramSuccessnum; 243 | 244 | /** 245 | * picnum int 批量上传照片的总张数,如果不填则默认为1。 246 | * \note 247 | * - 如果picnum=1,为单张上传,发送单张上传feed; 248 | * - 如果picnum>1,为批量上传,发送批量上传feed。 249 | * 批量上传方式:picnum为一次上传照片的张数,successnum初始值为0,每调用一次照片上传接口后递增其值。 250 | * 信息中心中的feed表现形式:批量上传时最新的7张在feed中展示。其中最新上传的一张图片展示为大图,剩下的 251 | * 六张按从新到旧的顺序展示为小图,其他图片不在feed中展示。 252 | */ 253 | @property (nonatomic, assign)TCOptionalStr paramPicnum; 254 | 255 | @end 256 | 257 | #pragma mark - 258 | #pragma mark TCAddShareDic 259 | /** 260 | * \brief 同步分享到QQ空间,腾讯微博的参数字典定义 261 | * 262 | * 可以直接填写相应参数后将对象当作参数传入API中 263 | */ 264 | @interface TCAddShareDic : TCAPIRequest 265 | 266 | /** 267 | * 返回一个对象用来进行API参数的填充 268 | * 269 | * \note 不用释放,返回的对象是自动释放的 270 | */ 271 | + (TCAddShareDic *) dictionary; 272 | 273 | /** 274 | * title 必须 string feeds的标题 最长36个中文字,超出部分会被截断。 275 | */ 276 | @property (nonatomic, retain) TCRequiredStr paramTitle; 277 | 278 | 279 | /** 280 | * url 必须 string 分享所在网页资源的链接,点击后跳转至第三方网页,对应上文接口说明中2的超链接。请以http://开头。 281 | */ 282 | @property (nonatomic, retain) TCRequiredStr paramUrl; 283 | 284 | 285 | /** 286 | * comment string 用户评论内容,也叫发表分享时的分享理由 禁止使用系统生产的语句进行代替。 287 | * 最长40个中文字,超出部分会被截断。 288 | */ 289 | @property (nonatomic, retain) TCOptionalStr paramComment; 290 | 291 | 292 | /** 293 | * summary string 所分享的网页资源的摘要内容,或者是网页的概要描述 最长80个中文字,超出部分会被截断。 294 | */ 295 | @property (nonatomic, retain) TCOptionalStr paramSummary; 296 | 297 | /** 298 | * images string 所分享的网页资源的代表性图片链接",请以http://开头,长度限制255字符。多张图片以竖线(|)分隔,目前只有第一张图片有效,图片规格100*100为佳。 299 | */ 300 | @property (nonatomic, retain) TCOptionalStr paramImages; 301 | 302 | /** 303 | * type string 分享内容的类型。 304 | * 305 | * \note 4表示网页;5表示视频(type=5时,必须传入playurl) 306 | */ 307 | @property (nonatomic, retain) TCOptionalStr paramType; 308 | 309 | /** 310 | * playurl string 长度限制为256字节。仅在type=5的时候有效,表示视频的swf播放地址。 311 | */ 312 | @property (nonatomic, retain) TCOptionalStr paramPlayurl; 313 | 314 | /** 315 | * site 必须 string 分享的来源网站名称,请填写网站申请接入时注册的网站名称 316 | */ 317 | @property (nonatomic, retain) TCRequiredStr paramSite; 318 | 319 | /** 320 | * fromurl 必须 string 分享的来源网站对应的网站地址url 请以http://开头。 321 | */ 322 | @property (nonatomic, retain) TCRequiredStr paramFromurl; 323 | 324 | /** 325 | * nswb string 值为1时,表示分享不默认同步到微博,其他值或者不传此参数表示默认同步到微博。 326 | */ 327 | @property (nonatomic, retain) TCOptionalStr paramNswb; 328 | 329 | @end 330 | 331 | #pragma mark - 332 | #pragma mark TCCheckPageFansDic 333 | /** 334 | * \brief 验证是否认证空间粉丝tttyttyyyu的参数字典定义 335 | * 336 | * 可以直接填写相应参数后将对象当作参数传入API中 337 | */ 338 | @interface TCCheckPageFansDic : TCAPIRequest 339 | 340 | /** 341 | * 返回一个对象用来进行API参数的填充 342 | * 343 | * \note 不用释放,返回的对象是自动释放的 344 | */ 345 | + (TCCheckPageFansDic *) dictionary; 346 | 347 | /** 348 | * 表示认证空间的QQ号码 349 | */ 350 | @property (nonatomic, retain) TCRequiredStr paramPage_id; 351 | @end 352 | 353 | #pragma mark - 354 | #pragma mark TCSetUserHeadpic 355 | /** 356 | * \brief 设置用户头像 357 | * 358 | * 可以直接填写相应参数后将对象当作参数传入API中 359 | */ 360 | @interface TCSetUserHeadpic : TCAPIRequest 361 | 362 | /** 363 | * 返回一个对象用来进行API参数的填充 364 | * \note 不用释放,返回的对象是自动释放的 365 | */ 366 | + (TCSetUserHeadpic *) dictionary; 367 | 368 | /** 369 | * 设置用户头像的图片 370 | */ 371 | @property (nonatomic, retain) TCRequiredImage paramImage; 372 | 373 | /** 374 | * 图片的文件名 375 | */ 376 | @property (nonatomic, retain) TCOptionalStr paramFileName; 377 | @end 378 | 379 | #pragma mark - 380 | #pragma mark TCListPhotoDic 381 | 382 | /** 383 | * \brief 获取用户QQ空间相册中的照片列表 384 | * 385 | * 可以直接填写相应参数后将对象当作参数传入API中 386 | */ 387 | @interface TCListPhotoDic : TCAPIRequest 388 | 389 | /** 390 | * 返回一个对象用来进行API参数的填充 391 | * 392 | * \note 不用释放,返回的对象是自动释放的 393 | */ 394 | + (TCListPhotoDic *) dictionary; 395 | 396 | /** 397 | * 表示要获取的照片列表所在的相册ID 398 | */ 399 | @property (nonatomic, retain) TCRequiredStr paramAlbumid; 400 | 401 | @end 402 | 403 | #pragma mark - 404 | #pragma mark TCSendStoryDic 405 | /** 406 | * \brief QQ空间定向分享的参数字典定义 407 | * 408 | * 该分享支持@到指定好友,最多支持10个好友。 409 | * 其中第三方应用可预传最多5个指定好友的openid,其余好友由用户自行选择。 410 | * 该分享形式仅提供跳QZone分享和本地Html5分享两种形式。 411 | * sendStroy不支持userData参数 412 | */ 413 | @interface TCSendStoryDic : TCAPIRequest 414 | 415 | /** 416 | * 返回一个对象用来进行API参数的填充 417 | * 418 | * \note 不用释放,返回的对象是自动释放的 419 | */ 420 | + (TCSendStoryDic *) dictionary; 421 | 422 | /** 423 | * 分享的标题 424 | */ 425 | @property (nonatomic, retain) TCRequiredStr paramTitle; 426 | 427 | /** 428 | * 故事摘要,最多不超过50个汉字,可以为空 429 | */ 430 | @property (nonatomic, retain) TCOptionalStr paramSummary; 431 | 432 | /** 433 | * 默认展示在输入框里的分享理由,最多120个汉字,可以为空 434 | */ 435 | @property (nonatomic, retain) TCOptionalStr paramDescription; 436 | 437 | /** 438 | * 图片url 439 | */ 440 | @property (nonatomic, retain) TCOptionalStr paramPics; 441 | 442 | /** 443 | * 如果不填,则默认为"进入应用" 444 | */ 445 | @property (nonatomic, retain) TCRequiredStr paramAct; 446 | 447 | /** 448 | * 点击分享的Url 449 | */ 450 | @property (nonatomic, retain) TCOptionalStr paramShareUrl; 451 | 452 | @end 453 | -------------------------------------------------------------------------------- /CCOpenService/QQ/TencentOpenAPI.framework/Headers/sdkdef.h: -------------------------------------------------------------------------------- 1 | /// 2 | /// \file sdkdef.h 3 | /// \brief SDK中相关常量定义 4 | /// 5 | /// Created by Tencent on 12-12-25. 6 | /// Copyright (c) 2012年 Tencent. All rights reserved. 7 | /// 8 | 9 | #import 10 | #import 11 | 12 | /** 13 | * \brief 设置sdk的log等级 14 | */ 15 | typedef enum { 16 | TCOLogLevel_Disabled = -1, // 关闭所有log 17 | TCOLogLevel_Error = 0, 18 | TCOLogLevel_Warning, 19 | TCOLogLevel_Info, 20 | TCOLogLevel_Debug, 21 | } TCOLogLevel; 22 | 23 | /** 24 | * \brief 手机qq的当前版本 25 | */ 26 | typedef enum QQVersion 27 | { 28 | kQQUninstall, 29 | kQQVersion3_0, 30 | kQQVersion4_0, //支持sso登陆 31 | kQQVersion4_2_1, //ios7兼容 32 | kQQVersion4_5, //4.5版本,wpa会话 33 | kQQVersion4_6, //4.6版本,sso登陆信令通道切换 34 | kQQVersion4_7, //4.7版本 不确定新支持了什么样的属性 35 | } QQVersion; 36 | 37 | /** 38 | * \brief APIResponse.retCode可能的枚举常量 39 | */ 40 | typedef enum 41 | { 42 | URLREQUEST_SUCCEED = 0, /**< 网络请求成功发送至服务器,并且服务器返回数据格式正确 43 | * \note 这里包括所请求业务操作失败的情况,例如没有授权等原因导致 44 | */ 45 | 46 | URLREQUEST_FAILED = 1, /**< 网络异常,或服务器返回的数据格式不正确导致无法解析 */ 47 | } REPONSE_RESULT; 48 | 49 | /** 50 | * \brief 增量授权失败原因 51 | * 52 | * \note 增量授权失败不影响原token的有效性(原token已失效的情况除外) 53 | */ 54 | typedef enum 55 | { 56 | kUpdateFailUnknown = 1, ///< 未知原因 57 | kUpdateFailUserCancel, ///< 用户取消 58 | kUpdateFailNetwork, ///< 网络问题 59 | } UpdateFailType; 60 | 61 | /** 62 | * \brief 封装服务器返回的结果 63 | * 64 | * APIResponse用于封装所有请求的返回结果,包括错误码、错误信息、原始返回数据以及返回数据的json格式字典 65 | */ 66 | @interface APIResponse : NSObject { 67 | int _detailRetCode; 68 | int _retCode; 69 | int _seq; 70 | NSString *_errorMsg; 71 | NSDictionary *_jsonResponse; 72 | NSString *_message; 73 | id _userData; 74 | } 75 | 76 | /** 77 | * 新增的详细错误码\n 78 | * detailRetCode主要用于区分不同的错误情况,参见\ref OpenSDKError 79 | */ 80 | @property (nonatomic, assign) int detailRetCode; 81 | 82 | /** 83 | * 网络请求是否成功送达服务器,以及服务器返回的数据格式是否正确\n 84 | * retCode具体取值可参考\ref REPONSE_RESULT 85 | */ 86 | @property (nonatomic, assign) int retCode; 87 | 88 | /** 89 | * 网络请求对应的递增序列号,方便内部管理 90 | */ 91 | @property (nonatomic, assign) int seq; 92 | 93 | /** 94 | * 错误提示语 95 | */ 96 | @property (nonatomic, retain) NSString *errorMsg; 97 | 98 | /** 99 | * 服务器返回数据的json格式字典\n 100 | * 字典内具体参数的命名和含义请参考\ref api_spec 101 | */ 102 | @property (nonatomic, retain) NSDictionary *jsonResponse; 103 | 104 | /** 105 | * 服务器返回的原始数据字符串 106 | */ 107 | @property (nonatomic, retain) NSString *message; 108 | 109 | /** 110 | * 用户保留数据 111 | */ 112 | @property (nonatomic, retain) id userData; 113 | 114 | @end 115 | 116 | 117 | /** 118 | * 用户自定义的保留字段 119 | */ 120 | FOUNDATION_EXTERN NSString * const PARAM_USER_DATA; 121 | 122 | /** 123 | * \name 应用邀请参数字段定义 124 | */ 125 | ///@{ 126 | 127 | /** 应用邀请展示图片url的key */ 128 | FOUNDATION_EXTERN NSString * const PARAM_APP_ICON; 129 | 130 | /** 应用邀请描述文本的key */ 131 | FOUNDATION_EXTERN NSString * const PARAM_APP_DESC; 132 | 133 | /** 应用邀请好友列表的key */ 134 | FOUNDATION_EXTERN NSString * const PARAM_APP_INVITED_OPENIDS; 135 | 136 | ///@} 137 | 138 | /** 139 | * \name sendStory新分享参数字段定义 140 | */ 141 | ///@{ 142 | 143 | /** 预填入接受人列表的key */ 144 | FOUNDATION_EXTERN NSString * const PARAM_SENDSTORY_RECEIVER; 145 | 146 | /** 分享feeds标题的key */ 147 | FOUNDATION_EXTERN NSString * const PARAM_SENDSTORY_TITLE; 148 | 149 | /** 分享feeds评论内容的key */ 150 | FOUNDATION_EXTERN NSString * const PARAM_SENDSTORY_COMMENT; 151 | 152 | /** 分享feeds摘要的key */ 153 | FOUNDATION_EXTERN NSString * const PARAM_SENDSTORY_SUMMARY; 154 | 155 | /** 分享feeds展示图片url的key */ 156 | FOUNDATION_EXTERN NSString * const PARAM_SENDSTORY_IMAGE; 157 | 158 | /** 分享feeds跳转链接url的key */ 159 | FOUNDATION_EXTERN NSString * const PARAM_SENDSTORY_URL; 160 | 161 | /** 分享feeds点击操作默认行为的key */ 162 | FOUNDATION_EXTERN NSString * const PARAM_SENDSTORY_ACT; 163 | 164 | ///@} 165 | 166 | /** 167 | * \name 设置头像参数字段定义 168 | */ 169 | ///@{ 170 | 171 | /** 头像图片数据的key */ 172 | FOUNDATION_EXTERN NSString * const PARAM_SETUSERHEAD_PIC; 173 | 174 | /** 头像图片文件名的key */ 175 | FOUNDATION_EXTERN NSString * const PARAM_SETUSERHEAD_FILENAME; 176 | 177 | ///@} 178 | 179 | /** 180 | * \name 服务器返回数据的参数字段定义 181 | */ 182 | ///@{ 183 | 184 | /** 服务器返回码的key */ 185 | FOUNDATION_EXTERN NSString * const PARAM_RETCODE; 186 | 187 | /** 服务器返回错误信息的key */ 188 | FOUNDATION_EXTERN NSString * const PARAM_MESSAGE; 189 | 190 | /** 服务器返回额外数据的key */ 191 | FOUNDATION_EXTERN NSString * const PARAM_DATA; 192 | 193 | ///@} 194 | 195 | /** 196 | * \name 错误信息相关常量定义 197 | */ 198 | ///@{ 199 | 200 | /** 详细错误信息字典中额外信息的key */ 201 | FOUNDATION_EXTERN NSString * const TCOpenSDKErrorKeyExtraInfo; 202 | 203 | /** 详细错误信息字典中返回码的key */ 204 | FOUNDATION_EXTERN NSString * const TCOpenSDKErrorKeyRetCode; 205 | 206 | /** 详细错误信息字典中错误语句的key */ 207 | FOUNDATION_EXTERN NSString * const TCOpenSDKErrorKeyMsg; 208 | 209 | /** 不支持的接口 */ 210 | FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgUnsupportedAPI; 211 | 212 | /** 操作成功 */ 213 | FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgSuccess; 214 | 215 | /** 未知错误 */ 216 | FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgUnknown; 217 | 218 | /** 用户取消 */ 219 | FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgUserCancel; 220 | 221 | /** 请重新登录 */ 222 | FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgReLogin; 223 | 224 | /** 应用没有操作权限 */ 225 | FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgOperationDeny; 226 | 227 | /** 网络异常或没有网络 */ 228 | FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgNetwork; 229 | 230 | /** URL格式或协议错误 */ 231 | FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgURL; 232 | 233 | /** 解析数据出错 */ 234 | FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgDataParse; 235 | 236 | /** 传入参数有误 */ 237 | FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgParam; 238 | 239 | /** 连接超时 */ 240 | FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgTimeout; 241 | 242 | /** 安全问题 */ 243 | FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgSecurity; 244 | 245 | /** 文件读写错误 */ 246 | FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgIO; 247 | 248 | /** 服务器端错误 */ 249 | FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgServer; 250 | 251 | /** 页面错误 */ 252 | FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgWebPage; 253 | 254 | /** 设置头像图片过大 */ 255 | FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgUserHeadPicLarge; 256 | 257 | ///@} 258 | 259 | /** 260 | * \brief SDK新增详细错误常量 261 | */ 262 | typedef enum 263 | { 264 | kOpenSDKInvalid = -1, ///< 无效的错误码 265 | kOpenSDKErrorUnsupportedAPI = -2, ///< 不支持的接口 266 | 267 | /** 268 | * \name CommonErrorCode 269 | * 公共错误码 270 | */ 271 | ///@{ 272 | kOpenSDKErrorSuccess = 0, ///< 成功 273 | kOpenSDKErrorUnknown, ///< 未知错误 274 | kOpenSDKErrorUserCancel, ///< 用户取消 275 | kOpenSDKErrorReLogin, ///< token无效或用户未授权相应权限需要重新登录 276 | kOpenSDKErrorOperationDeny, ///< 第三方应用没有该api操作的权限 277 | ///@} 278 | 279 | /** 280 | * \name NetworkRelatedErrorCode 281 | * 网络相关错误码 282 | */ 283 | ///@{ 284 | kOpenSDKErrorNetwork, ///< 网络错误,网络不通或连接不到服务器 285 | kOpenSDKErrorURL, ///< URL格式或协议错误 286 | kOpenSDKErrorDataParse, ///< 数据解析错误,服务器返回的数据解析出错 287 | kOpenSDKErrorParam, ///< 传入参数错误 288 | kOpenSDKErrorConnTimeout, ///< http连接超时 289 | kOpenSDKErrorSecurity, ///< 安全问题 290 | kOpenSDKErrorIO, ///< 下载和文件IO错误 291 | kOpenSDKErrorServer, ///< 服务器端错误 292 | ///@} 293 | 294 | /** 295 | * \name WebViewRelatedError 296 | * webview特有错误 297 | */ 298 | ///@{ 299 | kOpenSDKErrorWebPage, ///< 页面错误 300 | ///@} 301 | 302 | /** 303 | * \name SetUserHeadRelatedErrorCode 304 | * 设置头像自定义错误码段 305 | */ 306 | ///@{ 307 | kOpenSDKErrorUserHeadPicLarge = 0x010000, ///< 图片过大 设置头像自定义错误码 308 | ///@} 309 | } OpenSDKError; 310 | 311 | /** 312 | * \name SDK版本(v1.3)支持的授权列表常量 313 | */ 314 | ///@{ 315 | 316 | /** 发表一条说说到QQ空间(需要申请权限) */ 317 | FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_ADD_TOPIC; 318 | 319 | /** 发表一篇日志到QQ空间(需要申请权限) */ 320 | FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_ADD_ONE_BLOG; 321 | 322 | /** 创建一个QQ空间相册(需要申请权限) */ 323 | FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_ADD_ALBUM; 324 | 325 | /** 上传一张照片到QQ空间相册(需要申请权限) */ 326 | FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_UPLOAD_PIC; 327 | 328 | /** 获取用户QQ空间相册列表(需要申请权限) */ 329 | FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_LIST_ALBUM; 330 | 331 | /** 同步分享到QQ空间、腾讯微博 */ 332 | FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_ADD_SHARE; 333 | 334 | /** 验证是否认证空间粉丝 */ 335 | FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_CHECK_PAGE_FANS; 336 | 337 | /** 获取登录用户自己的详细信息 */ 338 | FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_INFO; 339 | 340 | /** 获取其他用户的详细信息 */ 341 | FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_OTHER_INFO; 342 | 343 | /** 获取会员用户基本信息 */ 344 | FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_VIP_INFO; 345 | 346 | /** 获取会员用户详细信息 */ 347 | FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_VIP_RICH_INFO; 348 | 349 | /** 获取用户信息 */ 350 | FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_USER_INFO; 351 | 352 | /** 移动端获取用户信息 */ 353 | FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_SIMPLE_USER_INFO; 354 | ///@} 355 | 356 | 357 | /** 358 | * \name CGI接口相关参数类型定义 359 | */ 360 | ///@{ 361 | 362 | /** 必填的字符串类型参数 */ 363 | typedef NSString *TCRequiredStr; 364 | 365 | /** 必填的UIImage类型参数 */ 366 | typedef UIImage *TCRequiredImage; 367 | 368 | /** 必填的整型参数 */ 369 | typedef NSInteger TCRequiredInt; 370 | 371 | /** 必填的数字类型 */ 372 | typedef NSNumber *TCRequiredNumber; 373 | 374 | /** 必填的NSData参数 */ 375 | typedef NSData *TCRequiredData; 376 | 377 | /** 可选的字符串类型参数 */ 378 | typedef NSString *TCOptionalStr; 379 | 380 | /** 可选的UIImage类型参数 */ 381 | typedef UIImage *TCOptionalImage; 382 | 383 | /** 可选的整型参数 */ 384 | typedef NSInteger TCOptionalInt; 385 | 386 | /** 可选的数字类型 */ 387 | typedef NSNumber *TCOptionalNumber; 388 | 389 | /** 可选的不定类型参数 */ 390 | typedef id TCRequiredId; 391 | ///@} 392 | 393 | 394 | /** 395 | * \brief CGI请求的参数字典封装辅助基类 396 | * 397 | * 将相应属性的值以key-value的形式保存到参数字典中 398 | */ 399 | @interface TCAPIRequest : NSMutableDictionary 400 | 401 | /** CGI请求的URL地址 */ 402 | @property (nonatomic, readonly) NSURL *apiURL; 403 | 404 | /** CGI请求方式:"GET","POST" */ 405 | @property (nonatomic, readonly) NSString *method; 406 | 407 | /** 408 | * API参数中的保留字段,可以塞入任意字典支持的类型,再调用完成后会带回给调用方 409 | */ 410 | @property (nonatomic, retain) TCRequiredId paramUserData; 411 | 412 | /** 413 | * APIResponse,API的返回结果 414 | */ 415 | @property (nonatomic, readonly) APIResponse *response; 416 | 417 | /** 取消相应的CGI请求任务 */ 418 | - (void)cancel; 419 | 420 | @end 421 | 422 | @protocol TCAPIRequestDelegate 423 | @optional 424 | - (void)cgiRequest:(TCAPIRequest *)request didResponse:(APIResponse *)response; 425 | 426 | @end 427 | 428 | -------------------------------------------------------------------------------- /CCOpenService/QQ/TencentOpenAPI.framework/Resources/ios_open_sdk_3.1.0.3_iphone: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocos543/CCOpenServiceLite/eda79bc8144eb814246e4055f7119903c5cafd16/CCOpenService/QQ/TencentOpenAPI.framework/Resources/ios_open_sdk_3.1.0.3_iphone -------------------------------------------------------------------------------- /CCOpenService/QQ/TencentOpenAPI.framework/TencentOpenAPI: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocos543/CCOpenServiceLite/eda79bc8144eb814246e4055f7119903c5cafd16/CCOpenService/QQ/TencentOpenAPI.framework/TencentOpenAPI -------------------------------------------------------------------------------- /CCOpenService/QQ/TencentOpenApi_IOS_Bundle.bundle/error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocos543/CCOpenServiceLite/eda79bc8144eb814246e4055f7119903c5cafd16/CCOpenService/QQ/TencentOpenApi_IOS_Bundle.bundle/error.png -------------------------------------------------------------------------------- /CCOpenService/QQ/TencentOpenApi_IOS_Bundle.bundle/local.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 社交渠道 7 | 8 | 9 | 10 | 17 | 18 | 19 |
20 |
21 |

22 | 返回 23 | 24 |
25 |
26 |
27 | 72 | 73 | 74 | -------------------------------------------------------------------------------- /CCOpenService/QQ/TencentOpenApi_IOS_Bundle.bundle/qqicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocos543/CCOpenServiceLite/eda79bc8144eb814246e4055f7119903c5cafd16/CCOpenService/QQ/TencentOpenApi_IOS_Bundle.bundle/qqicon.png -------------------------------------------------------------------------------- /CCOpenService/QQ/TencentOpenApi_IOS_Bundle.bundle/success.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocos543/CCOpenServiceLite/eda79bc8144eb814246e4055f7119903c5cafd16/CCOpenService/QQ/TencentOpenApi_IOS_Bundle.bundle/success.png -------------------------------------------------------------------------------- /CCOpenService/Resource/CC_Link.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocos543/CCOpenServiceLite/eda79bc8144eb814246e4055f7119903c5cafd16/CCOpenService/Resource/CC_Link.png -------------------------------------------------------------------------------- /CCOpenService/Resource/CC_QQ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocos543/CCOpenServiceLite/eda79bc8144eb814246e4055f7119903c5cafd16/CCOpenService/Resource/CC_QQ.png -------------------------------------------------------------------------------- /CCOpenService/Resource/CC_QZone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocos543/CCOpenServiceLite/eda79bc8144eb814246e4055f7119903c5cafd16/CCOpenService/Resource/CC_QZone.png -------------------------------------------------------------------------------- /CCOpenService/Resource/CC_WeChat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocos543/CCOpenServiceLite/eda79bc8144eb814246e4055f7119903c5cafd16/CCOpenService/Resource/CC_WeChat.png -------------------------------------------------------------------------------- /CCOpenService/Resource/CC_WeChatTL.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocos543/CCOpenServiceLite/eda79bc8144eb814246e4055f7119903c5cafd16/CCOpenService/Resource/CC_WeChatTL.png -------------------------------------------------------------------------------- /CCOpenService/Resource/CC_WeiBo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocos543/CCOpenServiceLite/eda79bc8144eb814246e4055f7119903c5cafd16/CCOpenService/Resource/CC_WeiBo.png -------------------------------------------------------------------------------- /CCOpenService/Resource/Public_ShareTest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocos543/CCOpenServiceLite/eda79bc8144eb814246e4055f7119903c5cafd16/CCOpenService/Resource/Public_ShareTest.png -------------------------------------------------------------------------------- /CCOpenService/WeiBo/说明.txt: -------------------------------------------------------------------------------- 1 | 1. 新浪微博已经提供pod服务,这里不提供SDK,请自行去操作pod 2 | 3 | pod "WeiboSDK", :git => "https://github.com/sinaweibosdk/weibo_ios_sdk.git" -------------------------------------------------------------------------------- /CCOpenService/WeiXin/README.txt: -------------------------------------------------------------------------------- 1 | 重要! 2 | 3 | SDK1.7.3 4 | 1. 增强稳定性,适配iOS10 5 | 2. 修复小于32K的jpg格式缩略图设置失败的问题 6 | 7 | SDK1.7.2 8 | 1. 修复因CTTeleponyNetworkInfo引起的崩溃问题 9 | 10 | SDK1.7.1 11 | 1. 支持兼容ipv6(提升稳定性) 12 | 2. xCode Version 7.3.1 (7D1014) 编译 13 | 14 | SDK1.7 15 | 1. 支持兼容ipv6 16 | 2. 修复若干问题增强稳定性 17 | 18 | SDK1.6.3 19 | 1. xCode7.2 构建的sdk包。 20 | 2. 请使用xCode7.2进行编译。 21 | 3. 需要在Build Phases中Link Security.framework 22 | 4. 修复若干小问题。 23 | 24 | SDK1.6.2 25 | 1、xCode7.1 构建的sdk包 26 | 2、请使用xCode7.1进行编译 27 | 28 | SDK1.6.1 29 | 1、修复armv7s下,bitcode可能编译不过 30 | 2、解决warning 31 | 32 | SDK1.6 33 | 1、iOS 9系统策略更新,限制了http协议的访问,此外应用需要在“Info.plist”中将要使用的URL Schemes列为白名单,才可正常检查其他应用是否安装。 34 | 受此影响,当你的应用在iOS 9中需要使用微信SDK的相关能力(分享、收藏、支付、登录等)时,需要在“Info.plist”里增加如下代码: 35 | LSApplicationQueriesSchemes 36 | 37 | weixin 38 | 39 | NSAppTransportSecurity 40 | 41 | NSAllowsArbitraryLoads 42 | 43 | 44 | 2、开发者需要在工程中链接上 CoreTelephony.framework 45 | 3、解决bitcode编译不过问题 46 | 47 | SDK1.5 48 | 1、废弃safeSendReq:接口,使用sendReq:即可。 49 | 2、新增+(BOOL) sendAuthReq:(SendAuthReq*) req viewController : (UIViewController*) viewController delegate:(id) delegate; 50 | 支持未安装微信情况下Auth,具体见WXApi.h接口描述 51 | 3、微信开放平台新增了微信模块用户统计功能,便于开发者统计微信功能模块的用户使用和活跃情况。开发者需要在工程中链接上:SystemConfiguration.framework,libz.dylib,libsqlite3.0.dylib。 -------------------------------------------------------------------------------- /CCOpenService/WeiXin/WXApi.h: -------------------------------------------------------------------------------- 1 | // 2 | // WXApi.h 3 | // 所有Api接口 4 | // 5 | // Created by Wechat on 12-2-28. 6 | // Copyright (c) 2012年 Tencent. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "WXApiObject.h" 11 | 12 | 13 | #pragma mark - WXApiDelegate 14 | /*! @brief 接收并处理来自微信终端程序的事件消息 15 | * 16 | * 接收并处理来自微信终端程序的事件消息,期间微信界面会切换到第三方应用程序。 17 | * WXApiDelegate 会在handleOpenURL:delegate:中使用并触发。 18 | */ 19 | @protocol WXApiDelegate 20 | @optional 21 | 22 | /*! @brief 收到一个来自微信的请求,第三方应用程序处理完后调用sendResp向微信发送结果 23 | * 24 | * 收到一个来自微信的请求,异步处理完成后必须调用sendResp发送处理结果给微信。 25 | * 可能收到的请求有GetMessageFromWXReq、ShowMessageFromWXReq等。 26 | * @param req 具体请求内容,是自动释放的 27 | */ 28 | -(void) onReq:(BaseReq*)req; 29 | 30 | 31 | 32 | /*! @brief 发送一个sendReq后,收到微信的回应 33 | * 34 | * 收到一个来自微信的处理结果。调用一次sendReq后会收到onResp。 35 | * 可能收到的处理结果有SendMessageToWXResp、SendAuthResp等。 36 | * @param resp具体的回应内容,是自动释放的 37 | */ 38 | -(void) onResp:(BaseResp*)resp; 39 | 40 | @end 41 | 42 | 43 | 44 | #pragma mark - WXApi 45 | 46 | /*! @brief 微信Api接口函数类 47 | * 48 | * 该类封装了微信终端SDK的所有接口 49 | */ 50 | @interface WXApi : NSObject 51 | 52 | /*! @brief WXApi的成员函数,向微信终端程序注册第三方应用。 53 | * 54 | * 需要在每次启动第三方应用程序时调用。第一次调用后,会在微信的可用应用列表中出现。 55 | * iOS7及以上系统需要调起一次微信才会出现在微信的可用应用列表中。 56 | * @attention 请保证在主线程中调用此函数 57 | * @param appid 微信开发者ID 58 | * @param typeFlag 应用支持打开的文件类型 59 | * @return 成功返回YES,失败返回NO。 60 | */ 61 | +(BOOL) registerApp:(NSString *)appid; 62 | 63 | 64 | /*! @brief WXApi的成员函数,向微信终端程序注册第三方应用。 65 | * 66 | * 需要在每次启动第三方应用程序时调用。第一次调用后,会在微信的可用应用列表中出现。 67 | * @see registerApp 68 | * @param appid 微信开发者ID 69 | * @param appdesc 应用附加信息,长度不超过1024字节 70 | * @return 成功返回YES,失败返回NO。 71 | */ 72 | +(BOOL) registerApp:(NSString *)appid withDescription:(NSString *)appdesc; 73 | 74 | 75 | /*! @brief WXApi的成员函数,向微信终端程序注册应用支持打开的文件类型。 76 | * 77 | * 需要在每次启动第三方应用程序时调用。调用后并第一次成功分享数据到微信后,会在微信的可用应用列表中出现。 78 | * @see registerApp 79 | * @param typeFlag 应用支持打开的数据类型, enAppSupportContentFlag枚举类型 “|” 操作后结果 80 | */ 81 | +(void) registerAppSupportContentFlag:(UInt64)typeFlag; 82 | 83 | 84 | 85 | /*! @brief 处理微信通过URL启动App时传递的数据 86 | * 87 | * 需要在 application:openURL:sourceApplication:annotation:或者application:handleOpenURL中调用。 88 | * @param url 微信启动第三方应用时传递过来的URL 89 | * @param delegate WXApiDelegate对象,用来接收微信触发的消息。 90 | * @return 成功返回YES,失败返回NO。 91 | */ 92 | +(BOOL) handleOpenURL:(NSURL *) url delegate:(id) delegate; 93 | 94 | 95 | 96 | /*! @brief 检查微信是否已被用户安装 97 | * 98 | * @return 微信已安装返回YES,未安装返回NO。 99 | */ 100 | +(BOOL) isWXAppInstalled; 101 | 102 | 103 | 104 | /*! @brief 判断当前微信的版本是否支持OpenApi 105 | * 106 | * @return 支持返回YES,不支持返回NO。 107 | */ 108 | +(BOOL) isWXAppSupportApi; 109 | 110 | 111 | 112 | /*! @brief 获取微信的itunes安装地址 113 | * 114 | * @return 微信的安装地址字符串。 115 | */ 116 | +(NSString *) getWXAppInstallUrl; 117 | 118 | 119 | 120 | /*! @brief 获取当前微信SDK的版本号 121 | * 122 | * @return 返回当前微信SDK的版本号 123 | */ 124 | +(NSString *) getApiVersion; 125 | 126 | 127 | 128 | /*! @brief 打开微信 129 | * 130 | * @return 成功返回YES,失败返回NO。 131 | */ 132 | +(BOOL) openWXApp; 133 | 134 | 135 | 136 | /*! @brief 发送请求到微信,等待微信返回onResp 137 | * 138 | * 函数调用后,会切换到微信的界面。第三方应用程序等待微信返回onResp。微信在异步处理完成后一定会调用onResp。支持以下类型 139 | * SendAuthReq、SendMessageToWXReq、PayReq等。 140 | * @param req 具体的发送请求,在调用函数后,请自己释放。 141 | * @return 成功返回YES,失败返回NO。 142 | */ 143 | +(BOOL) sendReq:(BaseReq*)req; 144 | 145 | /*! @brief 发送Auth请求到微信,支持用户没安装微信,等待微信返回onResp 146 | * 147 | * 函数调用后,会切换到微信的界面。第三方应用程序等待微信返回onResp。微信在异步处理完成后一定会调用onResp。支持SendAuthReq类型。 148 | * @param req 具体的发送请求,在调用函数后,请自己释放。 149 | * @param viewController 当前界面对象。 150 | * @param delegate WXApiDelegate对象,用来接收微信触发的消息。 151 | * @return 成功返回YES,失败返回NO。 152 | */ 153 | +(BOOL) sendAuthReq:(SendAuthReq*)req viewController:(UIViewController*)viewController delegate:(id)delegate; 154 | 155 | 156 | /*! @brief 收到微信onReq的请求,发送对应的应答给微信,并切换到微信界面 157 | * 158 | * 函数调用后,会切换到微信的界面。第三方应用程序收到微信onReq的请求,异步处理该请求,完成后必须调用该函数。可能发送的相应有 159 | * GetMessageFromWXResp、ShowMessageFromWXResp等。 160 | * @param resp 具体的应答内容,调用函数后,请自己释放 161 | * @return 成功返回YES,失败返回NO。 162 | */ 163 | +(BOOL) sendResp:(BaseResp*)resp; 164 | 165 | 166 | @end 167 | -------------------------------------------------------------------------------- /CCOpenService/WeiXin/WXApiObject.h: -------------------------------------------------------------------------------- 1 | // 2 | // MMApiObject.h 3 | // Api对象,包含所有接口和对象数据定义 4 | // 5 | // Created by Wechat on 12-2-28. 6 | // Copyright (c) 2012年 Tencent. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | /*! @brief 错误码 12 | * 13 | */ 14 | enum WXErrCode { 15 | WXSuccess = 0, /**< 成功 */ 16 | WXErrCodeCommon = -1, /**< 普通错误类型 */ 17 | WXErrCodeUserCancel = -2, /**< 用户点击取消并返回 */ 18 | WXErrCodeSentFail = -3, /**< 发送失败 */ 19 | WXErrCodeAuthDeny = -4, /**< 授权失败 */ 20 | WXErrCodeUnsupport = -5, /**< 微信不支持 */ 21 | }; 22 | 23 | 24 | 25 | /*! @brief 请求发送场景 26 | * 27 | */ 28 | enum WXScene { 29 | WXSceneSession = 0, /**< 聊天界面 */ 30 | WXSceneTimeline = 1, /**< 朋友圈 */ 31 | WXSceneFavorite = 2, /**< 收藏 */ 32 | }; 33 | 34 | 35 | 36 | enum WXAPISupport { 37 | WXAPISupportSession = 0, 38 | }; 39 | 40 | 41 | 42 | /*! @brief 跳转profile类型 43 | * 44 | */ 45 | enum WXBizProfileType{ 46 | WXBizProfileType_Normal = 0, //**< 普通公众号 */ 47 | WXBizProfileType_Device = 1, //**< 硬件公众号 */ 48 | }; 49 | 50 | 51 | 52 | /*! @brief 跳转mp网页类型 53 | * 54 | */ 55 | enum WXMPWebviewType { 56 | WXMPWebviewType_Ad = 0, /**< 广告网页 **/ 57 | }; 58 | 59 | 60 | /*! @brief 应用支持接收微信的文件类型 61 | * 62 | */ 63 | typedef NS_ENUM(UInt64, enAppSupportContentFlag) 64 | { 65 | MMAPP_SUPPORT_NOCONTENT = 0x0, 66 | MMAPP_SUPPORT_TEXT = 0x1, 67 | MMAPP_SUPPORT_PICTURE = 0x2, 68 | MMAPP_SUPPORT_LOCATION = 0x4, 69 | MMAPP_SUPPORT_VIDEO = 0x8, 70 | MMAPP_SUPPORT_AUDIO = 0x10, 71 | MMAPP_SUPPORT_WEBPAGE = 0x20, 72 | 73 | // Suport File Type 74 | MMAPP_SUPPORT_DOC = 0x40, // doc 75 | MMAPP_SUPPORT_DOCX = 0x80, // docx 76 | MMAPP_SUPPORT_PPT = 0x100, // ppt 77 | MMAPP_SUPPORT_PPTX = 0x200, // pptx 78 | MMAPP_SUPPORT_XLS = 0x400, // xls 79 | MMAPP_SUPPORT_XLSX = 0x800, // xlsx 80 | MMAPP_SUPPORT_PDF = 0x1000, // pdf 81 | }; 82 | 83 | #pragma mark - BaseReq 84 | /*! @brief 该类为微信终端SDK所有请求类的基类 85 | * 86 | */ 87 | @interface BaseReq : NSObject 88 | 89 | /** 请求类型 */ 90 | @property (nonatomic, assign) int type; 91 | /** 由用户微信号和AppID组成的唯一标识,发送请求时第三方程序必须填写,用于校验微信用户是否换号登录*/ 92 | @property (nonatomic, retain) NSString* openID; 93 | 94 | @end 95 | 96 | 97 | 98 | #pragma mark - BaseResp 99 | /*! @brief 该类为微信终端SDK所有响应类的基类 100 | * 101 | */ 102 | @interface BaseResp : NSObject 103 | /** 错误码 */ 104 | @property (nonatomic, assign) int errCode; 105 | /** 错误提示字符串 */ 106 | @property (nonatomic, retain) NSString *errStr; 107 | /** 响应类型 */ 108 | @property (nonatomic, assign) int type; 109 | 110 | @end 111 | 112 | 113 | 114 | #pragma mark - WXMediaMessage 115 | @class WXMediaMessage; 116 | 117 | /*! @brief 第三方向微信终端发起支付的消息结构体 118 | * 119 | * 第三方向微信终端发起支付的消息结构体,微信终端处理后会向第三方返回处理结果 120 | * @see PayResp 121 | */ 122 | @interface PayReq : BaseReq 123 | 124 | /** 商家向财付通申请的商家id */ 125 | @property (nonatomic, retain) NSString *partnerId; 126 | /** 预支付订单 */ 127 | @property (nonatomic, retain) NSString *prepayId; 128 | /** 随机串,防重发 */ 129 | @property (nonatomic, retain) NSString *nonceStr; 130 | /** 时间戳,防重发 */ 131 | @property (nonatomic, assign) UInt32 timeStamp; 132 | /** 商家根据财付通文档填写的数据和签名 */ 133 | @property (nonatomic, retain) NSString *package; 134 | /** 商家根据微信开放平台文档对数据做的签名 */ 135 | @property (nonatomic, retain) NSString *sign; 136 | 137 | @end 138 | 139 | 140 | 141 | #pragma mark - PayResp 142 | /*! @brief 微信终端返回给第三方的关于支付结果的结构体 143 | * 144 | * 微信终端返回给第三方的关于支付结果的结构体 145 | */ 146 | @interface PayResp : BaseResp 147 | 148 | /** 财付通返回给商家的信息 */ 149 | @property (nonatomic, retain) NSString *returnKey; 150 | 151 | @end 152 | 153 | 154 | 155 | /*! @brief 第三方向微信终端发起拆企业红包的消息结构体 156 | * 157 | * 第三方向微信终端发起拆企业红包的消息结构体,微信终端处理后会向第三方返回处理结果 158 | * @see HBReq 159 | */ 160 | @interface HBReq : BaseReq 161 | 162 | /** 随机串,防重发 */ 163 | @property (nonatomic, retain) NSString *nonceStr; 164 | /** 时间戳,防重发 */ 165 | @property (nonatomic, assign) UInt32 timeStamp; 166 | /** 商家根据微信企业红包开发文档填写的数据和签名 */ 167 | @property (nonatomic, retain) NSString *package; 168 | /** 商家根据微信企业红包开发文档对数据做的签名 */ 169 | @property (nonatomic, retain) NSString *sign; 170 | 171 | @end 172 | 173 | 174 | 175 | #pragma mark - HBResp 176 | /*! @brief 微信终端返回给第三方的关于拆企业红包结果的结构体 177 | * 178 | * 微信终端返回给第三方的关于拆企业红包结果的结构体 179 | */ 180 | @interface HBResp : BaseResp 181 | 182 | @end 183 | 184 | 185 | 186 | 187 | #pragma mark - SendAuthReq 188 | /*! @brief 第三方程序向微信终端请求认证的消息结构 189 | * 190 | * 第三方程序要向微信申请认证,并请求某些权限,需要调用WXApi的sendReq成员函数, 191 | * 向微信终端发送一个SendAuthReq消息结构。微信终端处理完后会向第三方程序发送一个处理结果。 192 | * @see SendAuthResp 193 | */ 194 | @interface SendAuthReq : BaseReq 195 | /** 第三方程序要向微信申请认证,并请求某些权限,需要调用WXApi的sendReq成员函数,向微信终端发送一个SendAuthReq消息结构。微信终端处理完后会向第三方程序发送一个处理结果。 196 | * @see SendAuthResp 197 | * @note scope字符串长度不能超过1K 198 | */ 199 | @property (nonatomic, retain) NSString* scope; 200 | /** 第三方程序本身用来标识其请求的唯一性,最后跳转回第三方程序时,由微信终端回传。 201 | * @note state字符串长度不能超过1K 202 | */ 203 | @property (nonatomic, retain) NSString* state; 204 | @end 205 | 206 | 207 | 208 | #pragma mark - SendAuthResp 209 | /*! @brief 微信处理完第三方程序的认证和权限申请后向第三方程序回送的处理结果。 210 | * 211 | * 第三方程序要向微信申请认证,并请求某些权限,需要调用WXApi的sendReq成员函数,向微信终端发送一个SendAuthReq消息结构。 212 | * 微信终端处理完后会向第三方程序发送一个SendAuthResp。 213 | * @see onResp 214 | */ 215 | @interface SendAuthResp : BaseResp 216 | @property (nonatomic, retain) NSString* code; 217 | /** 第三方程序发送时用来标识其请求的唯一性的标志,由第三方程序调用sendReq时传入,由微信终端回传 218 | * @note state字符串长度不能超过1K 219 | */ 220 | @property (nonatomic, retain) NSString* state; 221 | @property (nonatomic, retain) NSString* lang; 222 | @property (nonatomic, retain) NSString* country; 223 | @end 224 | 225 | 226 | 227 | #pragma mark - SendMessageToWXReq 228 | /*! @brief 第三方程序发送消息至微信终端程序的消息结构体 229 | * 230 | * 第三方程序向微信发送信息需要传入SendMessageToWXReq结构体,信息类型包括文本消息和多媒体消息, 231 | * 分别对应于text和message成员。调用该方法后,微信处理完信息会向第三方程序发送一个处理结果。 232 | * @see SendMessageToWXResp 233 | */ 234 | @interface SendMessageToWXReq : BaseReq 235 | /** 发送消息的文本内容 236 | * @note 文本长度必须大于0且小于10K 237 | */ 238 | @property (nonatomic, retain) NSString* text; 239 | /** 发送消息的多媒体内容 240 | * @see WXMediaMessage 241 | */ 242 | @property (nonatomic, retain) WXMediaMessage* message; 243 | /** 发送消息的类型,包括文本消息和多媒体消息两种,两者只能选择其一,不能同时发送文本和多媒体消息 */ 244 | @property (nonatomic, assign) BOOL bText; 245 | /** 发送的目标场景,可以选择发送到会话(WXSceneSession)或者朋友圈(WXSceneTimeline)。 默认发送到会话。 246 | * @see WXScene 247 | */ 248 | @property (nonatomic, assign) int scene; 249 | 250 | @end 251 | 252 | 253 | 254 | #pragma mark - SendMessageToWXResp 255 | /*! @brief 微信终端向第三方程序返回的SendMessageToWXReq处理结果。 256 | * 257 | * 第三方程序向微信终端发送SendMessageToWXReq后,微信发送回来的处理结果,该结果用SendMessageToWXResp表示。 258 | */ 259 | @interface SendMessageToWXResp : BaseResp 260 | @property(nonatomic, retain) NSString* lang; 261 | @property(nonatomic, retain) NSString* country; 262 | @end 263 | 264 | 265 | 266 | #pragma mark - GetMessageFromWXReq 267 | /*! @brief 微信终端向第三方程序请求提供内容的消息结构体。 268 | * 269 | * 微信终端向第三方程序请求提供内容,微信终端会向第三方程序发送GetMessageFromWXReq消息结构体, 270 | * 需要第三方程序调用sendResp返回一个GetMessageFromWXResp消息结构体。 271 | */ 272 | @interface GetMessageFromWXReq : BaseReq 273 | @property (nonatomic, retain) NSString* lang; 274 | @property (nonatomic, retain) NSString* country; 275 | @end 276 | 277 | 278 | 279 | #pragma mark - GetMessageFromWXResp 280 | /*! @brief 微信终端向第三方程序请求提供内容,第三方程序向微信终端返回的消息结构体。 281 | * 282 | * 微信终端向第三方程序请求提供内容,第三方程序调用sendResp向微信终端返回一个GetMessageFromWXResp消息结构体。 283 | */ 284 | @interface GetMessageFromWXResp : BaseResp 285 | /** 向微信终端提供的文本内容 286 | @note 文本长度必须大于0且小于10K 287 | */ 288 | @property (nonatomic, retain) NSString* text; 289 | /** 向微信终端提供的多媒体内容。 290 | * @see WXMediaMessage 291 | */ 292 | @property (nonatomic, retain) WXMediaMessage* message; 293 | /** 向微信终端提供内容的消息类型,包括文本消息和多媒体消息两种,两者只能选择其一,不能同时发送文本和多媒体消息 */ 294 | @property (nonatomic, assign) BOOL bText; 295 | @end 296 | 297 | 298 | 299 | #pragma mark - ShowMessageFromWXReq 300 | /*! @brief 微信通知第三方程序,要求第三方程序显示的消息结构体。 301 | * 302 | * 微信需要通知第三方程序显示或处理某些内容时,会向第三方程序发送ShowMessageFromWXReq消息结构体。 303 | * 第三方程序处理完内容后调用sendResp向微信终端发送ShowMessageFromWXResp。 304 | */ 305 | @interface ShowMessageFromWXReq : BaseReq 306 | /** 微信终端向第三方程序发送的要求第三方程序处理的多媒体内容 307 | * @see WXMediaMessage 308 | */ 309 | @property (nonatomic, retain) WXMediaMessage* message; 310 | @property (nonatomic, retain) NSString* lang; 311 | @property (nonatomic, retain) NSString* country; 312 | @end 313 | 314 | 315 | 316 | #pragma mark - ShowMessageFromWXResp 317 | /*! @brief 微信通知第三方程序,要求第三方程序显示或处理某些消息,第三方程序处理完后向微信终端发送的处理结果。 318 | * 319 | * 微信需要通知第三方程序显示或处理某些内容时,会向第三方程序发送ShowMessageFromWXReq消息结构体。 320 | * 第三方程序处理完内容后调用sendResp向微信终端发送ShowMessageFromWXResp。 321 | */ 322 | @interface ShowMessageFromWXResp : BaseResp 323 | @end 324 | 325 | 326 | 327 | #pragma mark - LaunchFromWXReq 328 | /*! @brief 微信终端打开第三方程序携带的消息结构体 329 | * 330 | * 微信向第三方发送的结构体,第三方不需要返回 331 | */ 332 | @interface LaunchFromWXReq : BaseReq 333 | @property (nonatomic, retain) WXMediaMessage* message; 334 | @property (nonatomic, retain) NSString* lang; 335 | @property (nonatomic, retain) NSString* country; 336 | @end 337 | 338 | #pragma mark - OpenTempSessionReq 339 | /* ! @brief 第三方通知微信,打开临时会话 340 | * 341 | * 第三方通知微信,打开临时会话 342 | */ 343 | @interface OpenTempSessionReq : BaseReq 344 | /** 需要打开的用户名 345 | * @attention 长度不能超过512字节 346 | */ 347 | @property (nonatomic, retain) NSString* username; 348 | /** 开发者自定义参数,拉起临时会话后会发给开发者后台,可以用于识别场景 349 | * @attention 长度不能超过32位 350 | */ 351 | @property (nonatomic, retain) NSString* sessionFrom; 352 | @end 353 | 354 | #pragma mark - OpenWebviewReq 355 | /* ! @brief 第三方通知微信启动内部浏览器,打开指定网页 356 | * 357 | * 第三方通知微信启动内部浏览器,打开指定Url对应的网页 358 | */ 359 | @interface OpenWebviewReq : BaseReq 360 | /** 需要打开的网页对应的Url 361 | * @attention 长度不能超过1024 362 | */ 363 | @property(nonatomic,retain)NSString* url; 364 | 365 | @end 366 | 367 | #pragma mark - OpenWebviewResp 368 | /*! @brief 微信终端向第三方程序返回的OpenWebviewReq处理结果 369 | * 370 | * 第三方程序向微信终端发送OpenWebviewReq后,微信发送回来的处理结果,该结果用OpenWebviewResp表示 371 | */ 372 | @interface OpenWebviewResp : BaseResp 373 | 374 | @end 375 | 376 | 377 | #pragma mark - OpenTempSessionResp 378 | /*! @brief 微信终端向第三方程序返回的OpenTempSessionReq处理结果。 379 | * 380 | * 第三方程序向微信终端发送OpenTempSessionReq后,微信发送回来的处理结果,该结果用OpenTempSessionResp表示。 381 | */ 382 | @interface OpenTempSessionResp : BaseResp 383 | 384 | @end 385 | 386 | #pragma mark - OpenRankListReq 387 | /* ! @brief 第三方通知微信,打开硬件排行榜 388 | * 389 | * 第三方通知微信,打开硬件排行榜 390 | */ 391 | @interface OpenRankListReq : BaseReq 392 | 393 | @end 394 | 395 | #pragma mark - OpenRanklistResp 396 | /*! @brief 微信终端向第三方程序返回的OpenRankListReq处理结果。 397 | * 398 | * 第三方程序向微信终端发送OpenRankListReq后,微信发送回来的处理结果,该结果用OpenRankListResp表示。 399 | */ 400 | @interface OpenRankListResp : BaseResp 401 | 402 | @end 403 | 404 | #pragma mark - JumpToBizProfileReq 405 | /* ! @brief 第三方通知微信,打开指定微信号profile页面 406 | * 407 | * 第三方通知微信,打开指定微信号profile页面 408 | */ 409 | @interface JumpToBizProfileReq : BaseReq 410 | /** 跳转到该公众号的profile 411 | * @attention 长度不能超过512字节 412 | */ 413 | @property (nonatomic, retain) NSString* username; 414 | /** 如果用户加了该公众号为好友,extMsg会上传到服务器 415 | * @attention 长度不能超过1024字节 416 | */ 417 | @property (nonatomic, retain) NSString* extMsg; 418 | /** 419 | * 跳转的公众号类型 420 | * @see WXBizProfileType 421 | */ 422 | @property (nonatomic, assign) int profileType; 423 | @end 424 | 425 | 426 | 427 | #pragma mark - JumpToBizWebviewReq 428 | /* ! @brief 第三方通知微信,打开指定usrname的profile网页版 429 | * 430 | */ 431 | @interface JumpToBizWebviewReq : BaseReq 432 | /** 跳转的网页类型,目前只支持广告页 433 | * @see WXMPWebviewType 434 | */ 435 | @property(nonatomic, assign) int webType; 436 | /** 跳转到该公众号的profile网页版 437 | * @attention 长度不能超过512字节 438 | */ 439 | @property(nonatomic, retain) NSString* tousrname; 440 | /** 如果用户加了该公众号为好友,extMsg会上传到服务器 441 | * @attention 长度不能超过1024字节 442 | */ 443 | @property(nonatomic, retain) NSString* extMsg; 444 | 445 | @end 446 | 447 | #pragma mark - WXCardItem 448 | 449 | @interface WXCardItem : NSObject 450 | /** 卡id 451 | * @attention 长度不能超过1024字节 452 | */ 453 | @property (nonatomic,retain) NSString* cardId; 454 | /** ext信息 455 | * @attention 长度不能超过2024字节 456 | */ 457 | @property (nonatomic,retain) NSString* extMsg; 458 | /** 459 | * @attention 卡的状态,req不需要填。resp:0为未添加,1为已添加。 460 | */ 461 | @property (nonatomic,assign) UInt32 cardState; 462 | /** 463 | * @attention req不需要填,chooseCard返回的。 464 | */ 465 | @property (nonatomic,retain) NSString* encryptCode; 466 | /** 467 | * @attention req不需要填,chooseCard返回的。 468 | */ 469 | @property (nonatomic,retain) NSString* appID; 470 | @end; 471 | 472 | #pragma mark - AddCardToWXCardPackageReq 473 | /* ! @brief 请求添加卡券至微信卡包 474 | * 475 | */ 476 | 477 | @interface AddCardToWXCardPackageReq : BaseReq 478 | /** 卡列表 479 | * @attention 个数不能超过40个 类型WXCardItem 480 | */ 481 | @property (nonatomic,retain) NSArray* cardAry; 482 | 483 | @end 484 | 485 | 486 | #pragma mark - AddCardToWXCardPackageResp 487 | /** ! @brief 微信返回第三方添加卡券结果 488 | * 489 | */ 490 | 491 | @interface AddCardToWXCardPackageResp : BaseResp 492 | /** 卡列表 493 | * @attention 个数不能超过40个 类型WXCardItem 494 | */ 495 | @property (nonatomic,retain) NSArray* cardAry; 496 | @end 497 | 498 | #pragma mark - WXChooseCardReq 499 | /* ! @brief 请求从微信选取卡券 500 | * 501 | */ 502 | 503 | @interface WXChooseCardReq : BaseReq 504 | @property(nonatomic, strong) NSString *appID; 505 | @property(nonatomic, assign) UInt32 shopID; 506 | @property(nonatomic, assign) UInt32 canMultiSelect; 507 | @property(nonatomic, strong) NSString *cardType; 508 | @property(nonatomic, strong) NSString *cardTpID; 509 | @property(nonatomic, strong) NSString *signType; 510 | @property(nonatomic, strong) NSString *cardSign; 511 | @property(nonatomic, assign) UInt32 timeStamp; 512 | @property(nonatomic, strong) NSString *nonceStr; 513 | @end 514 | 515 | 516 | #pragma mark - WXChooseCardResp 517 | /** ! @brief 微信返回第三方请求选择卡券结果 518 | * 519 | */ 520 | 521 | @interface WXChooseCardResp : BaseResp 522 | @property (nonatomic,retain) NSArray* cardAry; 523 | @end 524 | 525 | #pragma mark - WXMediaMessage 526 | 527 | /*! @brief 多媒体消息结构体 528 | * 529 | * 用于微信终端和第三方程序之间传递消息的多媒体消息内容 530 | */ 531 | @interface WXMediaMessage : NSObject 532 | 533 | +(WXMediaMessage *) message; 534 | 535 | /** 标题 536 | * @note 长度不能超过512字节 537 | */ 538 | @property (nonatomic, retain) NSString *title; 539 | /** 描述内容 540 | * @note 长度不能超过1K 541 | */ 542 | @property (nonatomic, retain) NSString *description; 543 | /** 缩略图数据 544 | * @note 大小不能超过32K 545 | */ 546 | @property (nonatomic, retain) NSData *thumbData; 547 | /** 548 | * @note 长度不能超过64字节 549 | */ 550 | @property (nonatomic, retain) NSString *mediaTagName; 551 | /** 552 | * 553 | */ 554 | @property (nonatomic, retain) NSString *messageExt; 555 | @property (nonatomic, retain) NSString *messageAction; 556 | /** 557 | * 多媒体数据对象,可以为WXImageObject,WXMusicObject,WXVideoObject,WXWebpageObject等。 558 | */ 559 | @property (nonatomic, retain) id mediaObject; 560 | 561 | /*! @brief 设置消息缩略图的方法 562 | * 563 | * @param image 缩略图 564 | * @note 大小不能超过32K 565 | */ 566 | - (void) setThumbImage:(UIImage *)image; 567 | 568 | @end 569 | 570 | 571 | 572 | #pragma mark - WXImageObject 573 | /*! @brief 多媒体消息中包含的图片数据对象 574 | * 575 | * 微信终端和第三方程序之间传递消息中包含的图片数据对象。 576 | * @note imageData成员不能为空 577 | * @see WXMediaMessage 578 | */ 579 | @interface WXImageObject : NSObject 580 | /*! @brief 返回一个WXImageObject对象 581 | * 582 | * @note 返回的WXImageObject对象是自动释放的 583 | */ 584 | +(WXImageObject *) object; 585 | 586 | /** 图片真实数据内容 587 | * @note 大小不能超过10M 588 | */ 589 | @property (nonatomic, retain) NSData *imageData; 590 | 591 | @end 592 | 593 | 594 | #pragma mark - WXMusicObject 595 | /*! @brief 多媒体消息中包含的音乐数据对象 596 | * 597 | * 微信终端和第三方程序之间传递消息中包含的音乐数据对象。 598 | * @note musicUrl和musicLowBandUrl成员不能同时为空。 599 | * @see WXMediaMessage 600 | */ 601 | @interface WXMusicObject : NSObject 602 | /*! @brief 返回一个WXMusicObject对象 603 | * 604 | * @note 返回的WXMusicObject对象是自动释放的 605 | */ 606 | +(WXMusicObject *) object; 607 | 608 | /** 音乐网页的url地址 609 | * @note 长度不能超过10K 610 | */ 611 | @property (nonatomic, retain) NSString *musicUrl; 612 | /** 音乐lowband网页的url地址 613 | * @note 长度不能超过10K 614 | */ 615 | @property (nonatomic, retain) NSString *musicLowBandUrl; 616 | /** 音乐数据url地址 617 | * @note 长度不能超过10K 618 | */ 619 | @property (nonatomic, retain) NSString *musicDataUrl; 620 | 621 | /**音乐lowband数据url地址 622 | * @note 长度不能超过10K 623 | */ 624 | @property (nonatomic, retain) NSString *musicLowBandDataUrl; 625 | 626 | @end 627 | 628 | 629 | 630 | #pragma mark - WXVideoObject 631 | /*! @brief 多媒体消息中包含的视频数据对象 632 | * 633 | * 微信终端和第三方程序之间传递消息中包含的视频数据对象。 634 | * @note videoUrl和videoLowBandUrl不能同时为空。 635 | * @see WXMediaMessage 636 | */ 637 | @interface WXVideoObject : NSObject 638 | /*! @brief 返回一个WXVideoObject对象 639 | * 640 | * @note 返回的WXVideoObject对象是自动释放的 641 | */ 642 | +(WXVideoObject *) object; 643 | 644 | /** 视频网页的url地址 645 | * @note 长度不能超过10K 646 | */ 647 | @property (nonatomic, retain) NSString *videoUrl; 648 | /** 视频lowband网页的url地址 649 | * @note 长度不能超过10K 650 | */ 651 | @property (nonatomic, retain) NSString *videoLowBandUrl; 652 | 653 | @end 654 | 655 | 656 | 657 | #pragma mark - WXWebpageObject 658 | /*! @brief 多媒体消息中包含的网页数据对象 659 | * 660 | * 微信终端和第三方程序之间传递消息中包含的网页数据对象。 661 | * @see WXMediaMessage 662 | */ 663 | @interface WXWebpageObject : NSObject 664 | /*! @brief 返回一个WXWebpageObject对象 665 | * 666 | * @note 返回的WXWebpageObject对象是自动释放的 667 | */ 668 | +(WXWebpageObject *) object; 669 | 670 | /** 网页的url地址 671 | * @note 不能为空且长度不能超过10K 672 | */ 673 | @property (nonatomic, retain) NSString *webpageUrl; 674 | 675 | @end 676 | 677 | 678 | 679 | #pragma mark - WXAppExtendObject 680 | /*! @brief 多媒体消息中包含的App扩展数据对象 681 | * 682 | * 第三方程序向微信终端发送包含WXAppExtendObject的多媒体消息, 683 | * 微信需要处理该消息时,会调用该第三方程序来处理多媒体消息内容。 684 | * @note url,extInfo和fileData不能同时为空 685 | * @see WXMediaMessage 686 | */ 687 | @interface WXAppExtendObject : NSObject 688 | /*! @brief 返回一个WXAppExtendObject对象 689 | * 690 | * @note 返回的WXAppExtendObject对象是自动释放的 691 | */ 692 | +(WXAppExtendObject *) object; 693 | 694 | /** 若第三方程序不存在,微信终端会打开该url所指的App下载地址 695 | * @note 长度不能超过10K 696 | */ 697 | @property (nonatomic, retain) NSString *url; 698 | /** 第三方程序自定义简单数据,微信终端会回传给第三方程序处理 699 | * @note 长度不能超过2K 700 | */ 701 | @property (nonatomic, retain) NSString *extInfo; 702 | /** App文件数据,该数据发送给微信好友,微信好友需要点击后下载数据,微信终端会回传给第三方程序处理 703 | * @note 大小不能超过10M 704 | */ 705 | @property (nonatomic, retain) NSData *fileData; 706 | 707 | @end 708 | 709 | 710 | 711 | #pragma mark - WXEmoticonObject 712 | /*! @brief 多媒体消息中包含的表情数据对象 713 | * 714 | * 微信终端和第三方程序之间传递消息中包含的表情数据对象。 715 | * @see WXMediaMessage 716 | */ 717 | @interface WXEmoticonObject : NSObject 718 | 719 | /*! @brief 返回一个WXEmoticonObject对象 720 | * 721 | * @note 返回的WXEmoticonObject对象是自动释放的 722 | */ 723 | +(WXEmoticonObject *) object; 724 | 725 | /** 表情真实数据内容 726 | * @note 大小不能超过10M 727 | */ 728 | @property (nonatomic, retain) NSData *emoticonData; 729 | 730 | @end 731 | 732 | 733 | 734 | #pragma mark - WXFileObject 735 | /*! @brief 多媒体消息中包含的文件数据对象 736 | * 737 | * @see WXMediaMessage 738 | */ 739 | @interface WXFileObject : NSObject 740 | 741 | /*! @brief 返回一个WXFileObject对象 742 | * 743 | * @note 返回的WXFileObject对象是自动释放的 744 | */ 745 | +(WXFileObject *) object; 746 | 747 | /** 文件后缀名 748 | * @note 长度不超过64字节 749 | */ 750 | @property (nonatomic, retain) NSString *fileExtension; 751 | 752 | /** 文件真实数据内容 753 | * @note 大小不能超过10M 754 | */ 755 | @property (nonatomic, retain) NSData *fileData; 756 | 757 | @end 758 | 759 | 760 | #pragma mark - WXLocationObject 761 | /*! @brief 多媒体消息中包含的地理位置数据对象 762 | * 763 | * 微信终端和第三方程序之间传递消息中包含的地理位置数据对象。 764 | * @see WXMediaMessage 765 | */ 766 | @interface WXLocationObject : NSObject 767 | 768 | /*! @brief 返回一个WXLocationObject对象 769 | * 770 | * @note 返回的WXLocationObject对象是自动释放的 771 | */ 772 | +(WXLocationObject *) object; 773 | 774 | /** 地理位置信息 775 | * @note 经纬度 776 | */ 777 | @property (nonatomic, assign) double lng; //经度 778 | @property (nonatomic, assign) double lat; //纬度 779 | 780 | @end 781 | 782 | 783 | #pragma mark - WXTextObject 784 | /*! @brief 多媒体消息中包含的文本数据对象 785 | * 786 | * 微信终端和第三方程序之间传递消息中包含的文本数据对象。 787 | * @see WXMediaMessage 788 | */ 789 | @interface WXTextObject : NSObject 790 | 791 | /*! @brief 返回一个WXTextObject对象 792 | * 793 | * @note 返回的WXTextObject对象是自动释放的 794 | */ 795 | +(WXTextObject *) object; 796 | 797 | /** 地理位置信息 798 | * @note 文本内容 799 | */ 800 | @property (nonatomic, retain) NSString *contentText; 801 | 802 | @end 803 | 804 | -------------------------------------------------------------------------------- /CCOpenService/WeiXin/WechatAuthSDK.h: -------------------------------------------------------------------------------- 1 | // 2 | // WechatAuthSDK.h 3 | // WechatAuthSDK 4 | // 5 | // Created by 李凯 on 13-11-29. 6 | // Copyright (c) 2013年 Tencent. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | enum AuthErrCode { 13 | WechatAuth_Err_Ok = 0, //Auth成功 14 | WechatAuth_Err_NormalErr = -1, //普通错误 15 | WechatAuth_Err_NetworkErr = -2, //网络错误 16 | WechatAuth_Err_GetQrcodeFailed = -3, //获取二维码失败 17 | WechatAuth_Err_Cancel = -4, //用户取消授权 18 | WechatAuth_Err_Timeout = -5, //超时 19 | }; 20 | 21 | @protocol WechatAuthAPIDelegate 22 | @optional 23 | 24 | - (void)onAuthGotQrcode:(UIImage *)image; //得到二维码 25 | - (void)onQrcodeScanned; //二维码被扫描 26 | - (void)onAuthFinish:(int)errCode AuthCode:(NSString *)authCode; //成功登录 27 | 28 | @end 29 | 30 | @interface WechatAuthSDK : NSObject{ 31 | NSString *_sdkVersion; 32 | __weak id _delegate; 33 | } 34 | 35 | @property(nonatomic, weak) id delegate; 36 | @property(nonatomic, readonly) NSString *sdkVersion; //authSDK版本号 37 | 38 | /*! @brief 发送登录请求,等待WechatAuthAPIDelegate回调 39 | * 40 | * @param appId 微信开发者ID 41 | * @param nonceStr 一个随机的尽量不重复的字符串,用来使得每次的signature不同 42 | * @param timeStamp 时间戳 43 | * @param scope 应用授权作用域,拥有多个作用域用逗号(,)分隔 44 | * @param signature 签名 45 | * @param schemeData 会在扫码后拼在scheme后 46 | * @return 成功返回YES,失败返回NO 47 | 注:该实现只保证同时只有一个Auth在运行,Auth未完成或未Stop再次调用Auth接口时会返回NO。 48 | */ 49 | 50 | - (BOOL)Auth:(NSString *)appId 51 | nonceStr:(NSString *)nonceStr 52 | timeStamp:(NSString*)timeStamp 53 | scope:(NSString *)scope 54 | signature:(NSString *)signature 55 | schemeData:(NSString *)schemeData; 56 | 57 | 58 | /*! @brief 暂停登录请求 59 | * 60 | * @return 成功返回YES,失败返回NO。 61 | */ 62 | - (BOOL)StopAuth; 63 | 64 | @end 65 | -------------------------------------------------------------------------------- /CCOpenService/WeiXin/libWeChatSDK.a: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocos543/CCOpenServiceLite/eda79bc8144eb814246e4055f7119903c5cafd16/CCOpenService/WeiXin/libWeChatSDK.a -------------------------------------------------------------------------------- /CCOpenService/WeiXin/read_me.txt: -------------------------------------------------------------------------------- 1 | 重要! 2 | SDK1.6.2 3 | 1、xCode7.1 构建的sdk包 4 | 2、请使用xCode7.1进行编译 5 | 6 | SDK1.6.1 7 | 1、修复armv7s下,bitcode可能编译不过 8 | 2、解决warning 9 | 10 | SDK1.6 11 | 1、iOS 9系统策略更新,限制了http协议的访问,此外应用需要在“Info.plist”中将要使用的URL Schemes列为白名单,才可正常检查其他应用是否安装。 12 | 受此影响,当你的应用在iOS 9中需要使用微信SDK的相关能力(分享、收藏、支付、登录等)时,需要在“Info.plist”里增加如下代码: 13 | LSApplicationQueriesSchemes 14 | 15 | weixin 16 | 17 | NSAppTransportSecurity 18 | 19 | NSAllowsArbitraryLoads 20 | 21 | 22 | 2、开发者需要在工程中链接上 CoreTelephony.framework 23 | 3、解决bitcode编译不过问题 24 | 25 | SDK1.5 26 | 1、废弃safeSendReq:接口,使用sendReq:即可。 27 | 2、新增+(BOOL) sendAuthReq:(SendAuthReq*) req viewController : (UIViewController*) viewController delegate:(id) delegate; 28 | 支持未安装微信情况下Auth,具体见WXApi.h接口描述 29 | 3、微信开放平台新增了微信模块用户统计功能,便于开发者统计微信功能模块的用户使用和活跃情况。开发者需要在工程中链接上:SystemConfiguration.framework,libz.dylib,libsqlite3.0.dylib。 -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Podfile: -------------------------------------------------------------------------------- 1 | platform :ios, '8.0' 2 | use_frameworks! 3 | 4 | target 'LetsShow' do 5 | pod "WeiboSDK", :git => "https://github.com/sinaweibosdk/weibo_ios_sdk.git" 6 | end 7 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # CC轻量级开放平台服务 2 | 3 | ## 更新说明 4 |   2017年05月09日 **1.新增微信,QQ,微博分享接口;2.新增链接分享UI** 5 |   2016年10月26日 **1.新增支付接口;** 6 |   2016年09月12日 **1.新增获取authCode接口;** 7 | 8 | ## 前言 9 |   提供第三方开放平台的集成服务,壹句代码实现壹种功能~喜欢的朋友可以前来点个小星星.(目前主要用于练习) 10 | ## 特色 11 |   目前市面上提供的第三方SDK,相当繁琐臃肿,还需要去他们的集成平台上注册各种key之类的,相当麻烦.**CC轻量级开放平台服务**提供壹行代码请求数据服务,底层集成了各平台SDK,用户无需关心具体平台的实现,省事省心. 12 | 13 | ## 主要功能 14 | 1. 集成微信,QQ,微博的开放平台SDK. 15 | 2. 提供统壹的请求入口,壹句代码即可完成任务,简单高效. 16 | 3. 目前支持开放平台登录,支付功能接入,链接分享;其他功能(收藏,评论等)后期有时间会更新上. 17 | 4. 支持单独获取OAuth 2.0中的access_token(微信为code),提升安全性. 18 | 19 | ## 使用方法 20 | 1 直接将整个目录拖到妳的项目中.(注意用group形式,目录会显示成黄色).本库用到AFNetworking,需要自己集成. 21 | 22 | ![image](images/CCOpenService_Tree.png) 23 | 24 | 2 在AppDelegate.m文件顶部引入头文件CCOpenService.h,CCOpenConfig.h,并且写入下面的配置信息(注意,类似WeiXinAppID这样的,填写自己的微信appID) 25 | 26 | ``` objectivec 27 | //AppDelegate.m 28 | // 注意,如果不需要使用到Secret,则Secret直接填写为@"test"即可 29 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 30 | //微信配置 31 | [CCOpenConfig setWeiXinAppID:WeiXinAppID]; 32 | [CCOpenConfig setWeiXinAppSecret:WeiXinAppSecret]; 33 | 34 | //QQ配置 35 | [CCOpenConfig setQQAppID:QQAppID]; 36 | [CCOpenConfig setQQAppKey:QQAppKey]; 37 | 38 | //微博配置 39 | [CCOpenConfig setWeiBoAppKey:WeiBoAppKey]; 40 | [CCOpenConfig setWeiBoAppSecret:WeiBoAppSecret]; 41 | [CCOpenConfig setWeiBoRedirectURI:WeiBoRedirectURI]; 42 | 43 | return YES; 44 | } 45 | 46 | -(BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url{ 47 | //配置微信,QQ,新浪 48 | CCOpenService *wxService = [CCOpenService getOpenServiceWithName:CCOpenServiceNameWeiXin]; 49 | CCOpenService *qqService = [CCOpenService getOpenServiceWithName:CCOpenServiceNameQQ]; 50 | CCOpenService *wbService = [CCOpenService getOpenServiceWithName:CCOpenServiceNameWeiBo]; 51 | return [wxService handleOpenURL:url] || [qqService handleOpenURL:url] || [wbService handleOpenURL:url]; 52 | } 53 | 54 | -(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{ 55 | //配置微信,QQ,新浪 56 | CCOpenService *wxService = [CCOpenService getOpenServiceWithName:CCOpenServiceNameWeiXin]; 57 | CCOpenService *qqService = [CCOpenService getOpenServiceWithName:CCOpenServiceNameQQ]; 58 | CCOpenService *wbService = [CCOpenService getOpenServiceWithName:CCOpenServiceNameWeiBo]; 59 | return [wxService handleOpenURL:url] || [qqService handleOpenURL:url] || [wbService handleOpenURL:url]; 60 | } 61 | ``` 62 | 63 | 3 参考各个平台关于URL scheme的配置指南.例如微信: 64 | ![image](images/WeiXin_URL_Scheme.jpg) 65 | 66 | 4 iOS9 设备需要添加白名单,参考[iOS9白名单](https://github.com/ChenYilong/iOS9AdaptationTips) 67 | 68 | ## 接口使用说明 69 |   服务类型目前支持CCOpenServiceNameWeiXin,CCOpenServiceNameQQ,CCOpenServiceNameWeiBo 70 | 71 | ### 第三方登录接口 72 | 73 | ``` objective 74 | //微信登录 75 | CCOpenService *wxService = [CCOpenService getOpenServiceWithName:CCOpenServiceNameWeiXin]; 76 | [wxService requestOpenAccount:^(CCOpenRespondEntity *respond) { 77 | if (respond == nil) { 78 | UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"温馨提示" message:@"^_^亲,您木有安装微信哟~ " delegate:nil cancelButtonTitle:@"知道啦" otherButtonTitles:nil]; 79 | [alert show]; 80 | return; 81 | } 82 | NSLog(@"Respond data is %@",respond.data); 83 | }]; 84 | ``` 85 | 86 | ### 获取第三方AuthCode接口 87 | ``` objective 88 | // 如果需求里对第三方登录功能有着更为严格的安全要求时,可以只获取到access_token(微信为code),此接口只需要平台的申请到的帐号id(或者key)而不需要密钥(或者secret)即可实现,获取到authcode之后发给服务端,由服务端处理获取用户个人openid和其他信息部分的业务逻辑即可~ 89 | CCOpenService *wxService = [CCOpenService getOpenServiceWithName:CCOpenServiceNameWeiXin]; 90 | [wxService requestOpenAuthCode:^(CCOpenRespondEntity *respond) { 91 | if (respond == nil) { 92 | UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"温馨提示" message:@"^_^亲,您木有安装微信哟~ " delegate:nil cancelButtonTitle:@"知道啦" otherButtonTitles:nil]; 93 | [alert show]; 94 | return; 95 | } 96 | NSLog(@"Respond data is %@",respond.data); 97 | }]; 98 | ``` 99 | 100 | ### 支付功能 101 |   工作项目关系,目前只支持微信支付. 102 |   **注意,微信支付务必将全局统壹下单步骤安排到服务端完成,再由服务端返回唤起微信客户端所需要的相关参数,用以唤起微信客户端并完成支付** 103 | 104 | ``` objective 105 | CCOpenWXPayRequestEntity *wxEntity = [[CCOpenWXPayRequestEntity alloc] init]; 106 | wxEntity.wxAppID = <#appid#>; 107 | wxEntity.partnerID = <#partnerid#>; 108 | wxEntity.prepayID = <#prepayid#>; 109 | wxEntity.nonceStr = <#noncestr#>; 110 | wxEntity.timestamp = <#timestamp#>; 111 | wxEntity.package = @"Sign=WXPay"; 112 | wxEntity.sign = <#sign#>; 113 | 114 | CCOpenService *wxService = [CCOpenService getOpenServiceWithName:CCOpenServiceNameWeiXin]; 115 | [wxService requestPay:wxEntity respondHander:^(CCOpenRespondEntity *respond) { 116 | NSString *payResult = respond.data[@"result"]; 117 | if ([payResult isEqualToString:@"WXSuccess"]) { 118 | // Query the result of payment from service.. 119 | //Do something 120 | }else if([payResult isEqualToString:@"WXErrCodeUserCancel"]) { 121 | //User cancel 122 | }else { 123 | //Error~ 124 | } 125 | NSLog(@"%@",respond.data); 126 | }]; 127 | ``` 128 | 129 | ### 分享功能 130 |   目前只支持链接分享. 131 |   **注意:具体的分享接口已经在CCShareFilterView中实现,CCShareFilterView为默认的UI,可直接使用;建议用户自行设计UI.** 132 | 133 | ``` objective 134 | //如果直接使用默认的UI,则只需要引入头文件CCShareFilterView.h即可,不需要引入CCOpenService.h. 135 | CCShareFilterView *sView = [[[NSBundle mainBundle] loadNibNamed:@"CCShareFilterView" owner:nil options:nil] firstObject]; 136 | 137 | //设置需要分享的实体 138 | CCOpenURLShareRequestEntity *shareEntity = [[CCOpenURLShareRequestEntity alloc] init]; 139 | shareEntity.urlString = @"https://www.baidu.com"; 140 | shareEntity.thumbURL = [[NSBundle mainBundle] URLForResource:@"Public_ShareTest" withExtension:@"png"]; 141 | shareEntity.title = @"标题"; 142 | shareEntity.desc = @"描述"; 143 | sView.shareEntity = shareEntity; 144 | 145 | [sView showFilterViewWithOptions:0 completeHander:^(NSString *msg) { 146 | NSLog(@"%@", msg); 147 | }]; 148 | ``` 149 | 150 | ## 其他说明 151 |   所有SDK均为当前最新版,WeiXin,QQ,WeiBo目录下的SDK需要手动导入,另外第三方平台的SDK可能需要手动导入壹些类库,具体的先参考具体平台的官方说明,有空更新上. 152 |   本人工作忙,所以很多功能还没时间写上.目前已经写好了整体框架,有兴趣的同学可当作自己学习锻炼机会,参考我的源码设计模式,将新增的功能Pull Request给我,谢谢. 153 | -------------------------------------------------------------------------------- /images/CCOpenService_Tree.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocos543/CCOpenServiceLite/eda79bc8144eb814246e4055f7119903c5cafd16/images/CCOpenService_Tree.png -------------------------------------------------------------------------------- /images/WeiXin_URL_Scheme.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocos543/CCOpenServiceLite/eda79bc8144eb814246e4055f7119903c5cafd16/images/WeiXin_URL_Scheme.jpg --------------------------------------------------------------------------------