Initial commit

This commit is contained in:
ifish
2017-08-15 16:59:01 +08:00
commit bdc83e07ef
5766 changed files with 423223 additions and 0 deletions
@@ -0,0 +1,17 @@
//
// UMSBaeViewController.h
// UMSocialSDK
//
// Created by wyq.Cloudayc on 11/22/16.
// Copyright © 2016 UMeng. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface UMSBaeViewController : UIViewController
@property (nonatomic, strong) NSString *titleString;
- (CGFloat)viewOffsetY;
@end
@@ -0,0 +1,52 @@
//
// UMSocialCore.h
// UMSocialCore
//
// Created by 张军华 on 16/8/24.
// Copyright © 2016年 张军华. All rights reserved.
//
#import <UIKit/UIKit.h>
//! Project version number for UMSocialCore.
FOUNDATION_EXPORT double UMSocialCoreVersionNumber;
//! Project version string for UMSocialCore.
FOUNDATION_EXPORT const unsigned char UMSocialCoreVersionString[];
// In this header, you should import all the public headers of your framework using statements like #import <UMSocialCore/PublicHeader.h>
//base handle
#import <UMSocialCore/UMSocialHandler.h>
//UI
//#import <UMSocialCore/UMSocialShareEditViewController.h>
//#import <UMSocialCore/UMSocialSOAuthViewController.h>
//save socialData
#import <UMSocialCore/UMSocialDataManager.h>
//ImageUtil
#import <UMSocialCore/UMSocialImageUtil.h>
//shareMessageObject
#import <UMSocialCore/UMSocialMessageObject.h>
#import <UMSocialCore/UMSocialResponse.h>
//core Social
#import <UMSocialCore/UMSocialGlobal.h>
#import <UMSocialCore/UMSocialManager.h>
#import <UMSocialCore/UMSocialPlatformConfig.h>
#import <UMSocialCore/UMSocialPlatformProvider.h>
//img ImageUtils
#import <UMSocialCore/UMSocialCoreImageUtils.h>
//UMSocial log
#import <UMSocialCore/UMSociallogMacros.h>
//watermark
#import <UMSocialCore/UMSocialWarterMarkConfig.h>
@@ -0,0 +1,25 @@
//
// UMSocialCoreImageUtils.h
// UMSocialCore
//
// Created by 张军华 on 16/9/18.
// Copyright © 2016年 UMeng. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@interface UMSocialCoreImageUtils : NSObject
+ (UIImage *)fixOrientation:(UIImage *)sourceImage;
+ (UIImage *)imageWithColor:(UIColor *)color;
+ (UIImage *)imageByScalingImage:(UIImage*)image proportionallyToSize:(CGSize)targetSize;
+ (NSData *)imageDataByCompressImage:(UIImage*)image toLength:(CGFloat)targetLength;
+ (UIImage *)imageByCompressImage:(UIImage*)image toLength:(CGFloat)targetLength;
@end
@@ -0,0 +1,33 @@
//
// UMSocialDataManager.h
// UMSocialSDK
//
// Created by umeng on 16/8/9.
// Copyright © 2016年 dongjianxiong. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "UMSocialPlatformConfig.h"
extern NSString *const kUMSocialAuthUID;
extern NSString *const kUMSocialAuthAccessToken;
extern NSString *const kUMSocialAuthExpireDate;
extern NSString *const kUMSocialAuthRefreshToken;
extern NSString *const kUMSocialAuthOpenID;
@interface UMSocialDataManager : NSObject
+ (UMSocialDataManager *)defaultManager;
@property (nonatomic, strong, readonly) NSMutableDictionary *allAuthorUserInfo;
- (void)setAuthorUserInfo:(NSDictionary *)userInfo platform:(UMSocialPlatformType)platformType;
- (NSDictionary *)getAuthorUserInfoWithPlatform:(UMSocialPlatformType)platformType;
- (void)deleteAuthorUserInfoWithPlatform:(UMSocialPlatformType)platformType;
- (BOOL)isAuth:(UMSocialPlatformType)platformType;
- (void)clearAllAuthorUserInfo;
@end
@@ -0,0 +1,103 @@
//
// UMSocialGlobal.h
// UMSocialSDK
//
// Created by 张军华 on 16/8/16.
// Copyright © 2016年 dongjianxiong. All rights reserved.
//
#import <Foundation/Foundation.h>
/**
* UMSocial的全局配置文件
*/
@class UMSocialWarterMarkConfig;
/**
* 用来设置UMSocial的全局设置变量
*/
@interface UMSocialGlobal: NSObject
+ (UMSocialGlobal *)shareInstance;
/**
* 是否用cocos2dx,0-没有使用 1-使用cocos2dx 默认为0
*/
@property(atomic,readwrite, assign)NSInteger use_coco2dx;
/**
* 统计的主题,默认为:UMSocialDefault
*/
@property(atomic,readwrite,copy)NSString* dc;
/**
* 是否请求的回流统计请求,默认为不请求
*/
@property(atomic,readwrite,assign)BOOL isUrlRequest;
/**
* type字符串
* @discuss type是新加入的字段,目前默认值为@"native"
*/
@property(atomic,readwrite, copy)NSString* type;
/**
* UMSocial的版本号
*
* @return 返回当前的版本号
*/
+(NSString*)umSocialSDKVersion;
/**
* thumblr平台需要作为标示的字段 tag
* @discuss 默认的tag是UMSocial_ThumblrTag,用户可以自己设置自己的tag
*/
@property(atomic,readwrite,copy)NSString* thumblr_Tag;
/**
* 对平台的分享文本的时候,做规定的截断,默认开启
* @discuss 针对特定平台(比如:微信,qq,sina等)对当前的分享信息中的文本截断到合理的位置从而能成功分享
*/
@property(atomic,readwrite,assign)BOOL isTruncateShareText;
/**
* 当前网络请求是否用https
* @discuss 针对ios9系统以后强制使用https的网络请求,针对分享的网络图片都必须是https的网络图片(此为苹果官方要求)
* @discuss 该函数默认开启https请求
* @discuss 如果开启ios9的请求后,自动会过滤ios的http的请求,并返回错误。
*
*/
@property(atomic,readwrite,assign)BOOL isUsingHttpsWhenShareContent;
/**
* 是否清除缓存在获得用户资料的时候
* 默认设置为YES,代表请求用户的时候需要请求缓存
* NO,代表不清楚缓存,用缓存的数据请求用户数据
*/
@property(atomic,readwrite,assign)BOOL isClearCacheWhenGetUserInfo;
/**
* 添加水印功能
* @note 此功能为6.2版本以后的功能
* @discuss 此函数默认关闭 NO - 关闭水印 YES - 打开水印
* @discuss 设置此函数为YES后,必须要设置warterMarkConfig,来配置图片水印和字符串水印,如果不配置,就会用默认的[UMSocialWarterMarkConfig defaultWarterMarkConfig]来显示水印
*/
@property(atomic,readwrite,assign)BOOL isUsingWaterMark;
/**
* 添加水印的配置类
* @note 此功能为6.2版本以后的功能
* @discuss 设置isUsingWaterMark此函数为YES后,必须要设置warterMarkConfig,来配置图片水印和字符串水印
*/
@property(nonatomic,readwrite,strong)UMSocialWarterMarkConfig* warterMarkConfig;
@end
@@ -0,0 +1,435 @@
//
// UMSShareDataTypeTableViewController.h
// SocialSDK
//
// Created by umeng on 16/4/14.
// Copyright © 2016年 dongjianxiong. All rights reserved.
//
#import <UIKit/UIKit.h>
#import "UMSocialPlatformConfig.h"
#import "UMSocialPlatformProvider.h"
extern NSString *const UMSocialErrorDomain;
extern NSString *const UMSocialShareDataTypeIllegalMessage;
@class UMSocialHandlerConfig;
/**
* 实现所有平台的基类
* @discuss
* 前提条件:需要在主工程配置 other link flag -ObjC
* 所有实现UMSocialHandler对应平台类型子类,需要重写如下方法:
* 1.+(NSArray*) socialPlatformTypes; 返回对应平台的类型的数组,此处用数组是为了在微信和qq的平台是可以有不同的平台类型(微信,朋友圈等)与统一handler公用
* 2.重写load函数:
*
* 代码示例:
* +(void)load
* {
* [super load];//必须调用
* }
*
* 重载后保证调用基类的[UMSocialHandler load]
* 3.重写defaultManager单例类方法,保证运行时能找到defaultManager来获得当前的单例方法,保证其唯一性。
*/
@interface UMSocialHandler : NSObject<UMSocialPlatformProvider>
#pragma mark - 子类需要重载的类
+(void)load;
+(NSArray*) socialPlatformTypes;
+ (instancetype)defaultManager;
#pragma mark -
@property (nonatomic, copy) NSString *appID;
@property (nonatomic, copy) NSString *appSecret;
@property (nonatomic, copy) NSString *redirectURL;
/**
* 当前ViewController(用于一些特定平台弹出相应的页面,默认使用当前ViewController
* since 6.3把currentViewController修改为弱引用,防止用户传入后强引用用户传入的UIViewController,导致内存不释放,
* 注意:如果传入currentViewController的时候,一定要保证在(执行对应的分享,授权,获得用户信息的接口需要传入此接口的时候)存在,否则导致弱引用为nil,没有弹出界面的效果。
*/
@property (nonatomic, weak) UIViewController *currentViewController;
@property (nonatomic, copy) UMSocialRequestCompletionHandler shareCompletionBlock;
@property (nonatomic, copy) UMSocialRequestCompletionHandler authCompletionBlock;
@property (nonatomic, copy) UMSocialRequestCompletionHandler userinfoCompletionBlock;
-(BOOL)searchForURLSchemeWithPrefix:(NSString *)prefix;
-(void)setAppId:(NSString *)appID appSecret:(NSString *)secret url:(NSString *)url;
-(void)saveuid:(NSString *)uid openid:(NSString *)openid accesstoken:(NSString *)token refreshtoken:(NSString *)retoken expiration:(id )expiration;
#pragma mark - 6.0.3新加入的平台配置类
@property(nonatomic,readonly,strong)UMSocialHandlerConfig* handlerConfig;
@end
/**
* 针对平台限制的类别
*/
@interface UMSocialHandler (UMSocialLimit)
/**
* 检查对应平台的数据数据是否超过限制
*
* @param text 源文本
* @param textLimit 限制文本的大小
*
* @return YES 代表没有限制,NO 代表超过限制
*/
-(BOOL) checkText:(NSString*)text withTextLimit:(NSUInteger)textLimit;
/**
* 检查对应平台的数据数据是否超过限制
*
* @param data 源文本
* @param dataLimit 限制文本的大小
*
* @return YES 代表没有限制,NO 代表超过限制
*/
-(BOOL) checkData:(NSData*)data withDataLimit:(NSUInteger)dataLimit;
/**
* 对应平台超过限制,就截断文本
*
* @param text 源文本
* @param textLimit 限制文本的大小
*
* @return 返回的截断的文本
*/
-(NSString*)truncationText:(NSString*)text withTextLimit:(NSUInteger)textLimit;
/**
* 压缩对应平台的图片数据到限制发送的大小
*
* @param imageData 对应的图片数据
* @param imageLimit 限制图片的大小
*
* @return 新的压缩的数据
* @dicuss 当前图片小于对应平台的限制大小就返回本身,反之就压缩到指定大小以下发送
*/
-(NSData*)compressImageData:(NSData*)imageData withImageLimit:(NSUInteger)imageLimit;
@end
#pragma mark - 6.0.3新增的配置类,用于限制分享类型和分享的内容
/**
* UMeng 分享类型配置信息的基类
*/
@interface UMSocialShareObjectConfig : NSObject
/**
* 标题
* @note 标题的长度依各个平台的要求而定
*/
@property (nonatomic, readwrite,assign) NSUInteger titleLimit;
/**
* 描述
* @note 描述内容的长度依各个平台的要求而定
*/
@property (nonatomic, readwrite,assign) NSUInteger descrLimit;
/**
* 缩略图数据的大小
*/
@property (nonatomic, readwrite,assign) NSUInteger thumbImageDataLimit;
/**
* 缩略图URL的大小
*/
@property (nonatomic, readwrite,assign) NSUInteger thumbImageUrlLimit;
/**
* 点击多媒体内容之后呼起第三方应用特定页面的scheme
* @warning 长度小于255
* //sina平台有此字段限制
* @discuss 此字段目前不用
*/
//@property (nonatomic, strong) NSString *schemeLimit;
/**
* @note 长度不能超过64字节
* //微信平台有此字段
* @discuss 此字段目前不用
*/
//@property (nonatomic, retain) NSString *mediaTagName;
@end
/**
* 分享文本类型的配置
*
*/
@interface UMSocialShareTextObjectConfig : UMSocialShareObjectConfig
/**
* 文本内容的限制
*/
@property(nonatomic,readwrite,assign)NSUInteger textLimit;
@end
/**
* 分享图片的类型配置
*/
@interface UMSocialShareImageObjectConfig : UMSocialShareObjectConfig
/**
* 缩略图数据的大小
*/
@property (nonatomic, readwrite,assign) NSUInteger shareImageDataLimit;
/**
* 缩略图数据的URL大小
*/
@property (nonatomic, readwrite,assign) NSUInteger shareImageURLLimit;
@end
/**
* 分享音乐的类型配置
*/
@interface UMSocialShareMusicObjectConfig : UMSocialShareObjectConfig
/**
* 音乐网页的url地址
*/
@property (nonatomic, readwrite,assign)NSUInteger musicUrlLimit;
/**
* 音乐lowband网页的url地址
*/
@property (nonatomic, readwrite,assign)NSUInteger musicLowBandUrlLimit;
/**
* 音乐数据url地址
*/
@property (nonatomic, readwrite,assign)NSUInteger musicDataUrlLimit;
/**
* 音乐lowband数据url地址
*/
@property (nonatomic, readwrite,assign)NSUInteger musicLowBandDataUrlLimit;
@end
/**
* 分享视频的类型配置
*/
@interface UMSocialShareVideoObjectConfig : UMSocialShareObjectConfig
/**
* 视频网页的url
*/
@property (nonatomic, readwrite,assign) NSUInteger videoUrlLimit;
/**
* 视频lowband网页的url
*/
@property (nonatomic, readwrite,assign) NSUInteger videoLowBandUrlLimit;
/**
* 视频数据流url
*/
@property (nonatomic, readwrite,assign) NSUInteger videoStreamUrlLimit;
/**
* 视频lowband数据流url
*/
@property (nonatomic, readwrite,assign) NSUInteger videoLowBandStreamUrlLimit;
@end
/**
* 分享webURL
*/
@interface UMSocialShareWebpageObjectConfig : UMSocialShareObjectConfig
/**
* 网页的url地址
*/
@property (nonatomic, readwrite,assign) NSUInteger webpageUrlLimit;
@end
/**
* 分享Email的类型配置
*/
@interface UMSocialShareEmailObjectConfig : UMSocialShareObjectConfig
/**
* 接收人
*/
@property (nonatomic, readwrite,assign) NSUInteger toRecipientLimit;
/**
* 抄送人
*/
@property (nonatomic, readwrite,assign) NSUInteger ccRecipientLimit;
/**
* 密送人
*/
@property (nonatomic, readwrite,assign) NSUInteger bccRecipientLimit;
/**
* 文本内容
*/
@property (nonatomic, readwrite,assign) NSUInteger emailContentLimit;
/**
* 图片大小
*/
@property (nonatomic, readwrite,assign) NSUInteger emailImageDataLimit;
/**
* 图片URL大小
*/
@property (nonatomic, readwrite,assign) NSUInteger emailImageUrlLimit;
/**
* 文件(NSData
*/
@property (nonatomic, readwrite,assign) NSUInteger emailSendDataLimit;
/**
* 允许的文件格式
*/
@property (nonatomic, readwrite,strong) NSArray *fileType;
/**
* 文件名,(例如图片 imageName.png, 文件名后要跟文件后缀名,否则没法识别,导致类似图片不显示的问题)
*/
@property (nonatomic, readwrite,assign) NSUInteger fileNameLimit;
@end
/**
* 分享Email的类型配置
*/
@interface UMSocialShareSmsObjectConfig : UMSocialShareObjectConfig
/**
* 接收人
*/
@property (nonatomic, readwrite,assign) NSUInteger recipientLimit;
/**
* 文本内容
*/
@property (nonatomic, readwrite,assign) NSUInteger smsContentLimit;
/**
* 图片
*/
@property (nonatomic, readwrite,assign) NSUInteger smsImageDataLimit;
@property (nonatomic, readwrite,assign) NSUInteger smsImageUrlLimit;
/**
* 文件数据(NSData
* 必填
*/
@property (nonatomic, readwrite,assign) NSUInteger smsSendDataLimit;
/**
* 文件格式
* 必填,必须指定数据格式,如png图片格式应传入@"png"
*/
@property (nonatomic, readwrite,strong) NSArray *fileType;
/**
* 文件名,(例如图片 imageName.png, 文件名后要跟文件后缀名,否则没法识别,导致类似图片不显示的问题)
*/
@property (nonatomic, readwrite,assign) NSUInteger fileNameLimit;
/**
* 文件地址url
*/
@property (nonatomic, readwrite,assign) NSUInteger fileUrlLimit;
@end
/**
* 此配置项是特定平台才有的,比如微信,
*/
@interface UMSocialShareEmotionObjectConfig : UMSocialShareObjectConfig
//表情的字节大小限制
@property(nonatomic,readwrite,assign)NSUInteger emotionDataLimit;
@end
/**
* 此配置项是特定平台才有的,比如微信,
*/
@interface UMSocialShareFileObjectConfig : UMSocialShareObjectConfig
@property (nonatomic, readwrite,assign) NSUInteger fileExtensionLimit;
@property (nonatomic, readwrite,assign) NSUInteger fileDataLimit;
@end
/**
* 此配置项是特定平台才有的,比如微信
*/
@interface UMSocialShareExtendObjectConfig : UMSocialShareObjectConfig
@property (nonatomic, readwrite,assign) NSUInteger urlLimit;
@property (nonatomic, readwrite,assign) NSUInteger extInfoLimit;
@property (nonatomic, readwrite,assign) NSUInteger fileDataLimit;
@end
/**
* 每个平台的配置信息
* 包括如下:
* 1.对分享内容的限制。
*
*/
@interface UMSocialHandlerConfig : NSObject
@property(nonatomic,readwrite,strong)UMSocialShareTextObjectConfig* shareTextObjectConfig;
@property(nonatomic,readwrite,strong)UMSocialShareImageObjectConfig* shareImageObjectConfig;
@property(nonatomic,readwrite,strong)UMSocialShareMusicObjectConfig* shareMusicObjectConfig;
@property(nonatomic,readwrite,strong)UMSocialShareVideoObjectConfig* shareVideoObjectConfig;
@property(nonatomic,readwrite,strong)UMSocialShareWebpageObjectConfig* shareWebpageObjectConfig;
@property(nonatomic,readwrite,strong)UMSocialShareEmailObjectConfig* shareEmailObjectConfig;
@property(nonatomic,readwrite,strong)UMSocialShareSmsObjectConfig* shareSmsObjectConfig;
@property(nonatomic,readwrite,strong)UMSocialShareEmotionObjectConfig* shareEmotionObjectConfig;
@property(nonatomic,readwrite,strong)UMSocialShareFileObjectConfig* shareFileObjectConfig;
@property(nonatomic,readwrite,strong)UMSocialShareExtendObjectConfig* shareExtendObjectConfig;
//检查输入的text是否符合对应平台的输入
+(BOOL) checkText:(NSString*)text withTextLimit:(NSUInteger)textLimit;
+(BOOL) checkData:(NSData*)data withDataLimit:(NSUInteger)dataLimit;
+(NSString*) truncationText:(NSString*)text withTextLimit:(NSUInteger)textLimit;
//压缩图片
+ (NSData *)compressImageData:(NSData*)imageData toLength:(CGFloat)imageLimit;
+ (NSData *)compressImage:(UIImage*)image toLength:(CGFloat)imageLimit;
@end
@@ -0,0 +1,13 @@
//
// UMSocialImageUtil.h
// UMSocialSDK
//
// Created by wangfei on 16/8/12.
// Copyright © 2016年 dongjianxiong. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@interface UMSocialImageUtil : NSObject
+(UIImage*)scaleImage:(UIImage *) image ToSize:(CGSize)size;
@end
@@ -0,0 +1,191 @@
//
// UMComPlatformProviderManager.h
// UMSocialSDK
//
// Created by 张军华 on 16/8/5.
// Copyright © 2016年 dongjianxiong. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "UMSocialPlatformProvider.h"
#import "UMSocialGlobal.h"
@class UMSocialMessageObject;
@interface UMSocialManager : NSObject
+(instancetype)defaultManager;
/**
友盟appkey
*/
@property(nonatomic,strong)NSString* umSocialAppkey;
@property(nonatomic,strong)NSString* umSocialAppSecret;
/**
返回当前有效(安装并是可用的)平台列表
*/
@property(nonatomic,readonly,strong) NSArray * platformTypeArray;
/**
* 打开日志
*
* @param isOpen YES代表打开,No代表关闭
*/
-(void) openLog:(BOOL)isOpen;
/**
* 设置平台的appkey
*
* @param platformType 平台类型 @see UMSocialPlatformType
* @param appKey 第三方平台的appKeyQQ平台为appID
* @param appSecret 第三方平台的appSecretQQ平台为appKey
* @param redirectURL redirectURL
*/
- (BOOL)setPlaform:(UMSocialPlatformType)platformType
appKey:(NSString *)appKey
appSecret:(NSString *)appSecret
redirectURL:(NSString *)redirectURL;
/**
* 设置分享平台
*
* @param platformType 平台类型 @see UMSocialPlatformType
* @param messageObject 分享的content @see UMSocialMessageObject
* @param currentViewController 用于弹出类似邮件分享、短信分享等这样的系统页面
* @param completion 回调
* @discuss currentViewController 只正对sms,email等平台需要传入viewcontroller的平台,其他不需要的平台可以传入nil
*/
- (void)shareToPlatform:(UMSocialPlatformType)platformType
messageObject:(UMSocialMessageObject *)messageObject
currentViewController:(id)currentViewController
completion:(UMSocialRequestCompletionHandler)completion;
/**
* 取消授权
*
* @param platformType 平台类型 @see UMSocialPlatformType
* @param completion 回调
*/
- (void)cancelAuthWithPlatform:(UMSocialPlatformType)platformType
completion:(UMSocialRequestCompletionHandler)completion;
/**
* 授权并获取用户信息
* @param platformType 平台类型 @see UMSocialPlatformType
* @param currentViewController 用于弹出类似邮件分享、短信分享等这样的系统页面
* @param completion 回调
*/
- (void)getUserInfoWithPlatform:(UMSocialPlatformType)platformType
currentViewController:(id)currentViewController
completion:(UMSocialRequestCompletionHandler)completion;
/**
* 获得从sso或者web端回调到本app的回调
*
* @param url 第三方sdk的打开本app的回调的url
*
* @return 是否处理 YES代表处理成功,NO代表不处理
*/
-(BOOL)handleOpenURL:(NSURL *)url;
/**
* 获得从sso或者web端回调到本app的回调
*
* @param url 第三方sdk的打开本app的回调的url
* @param sourceApplication 回调的源程序
* @param annotation annotation
*
* @return 是否处理 YES代表处理成功,NO代表不处理
*
* @note 此函数在6.3版本加入
*/
-(BOOL)handleOpenURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation;
/**
* 获得从sso或者web端回调到本app的回调
*
* @param url 第三方sdk的打开本app的回调的url
* @param options 回调的参数
*
* @return 是否处理 YES代表处理成功,NO代表不处理
*
* @note 此函数在6.3版本加入
*/
-(BOOL)handleOpenURL:(NSURL *)url options:(NSDictionary*)options;
/**
* 动态的增加用户自定义的PlatformProvider
*
* @param userDefinePlatformProvider 用户自定义的userDefinePlatformProvider必须实现UMSocialPlatformProvider
* @param platformType 平台类型 @see platformType platformType的有效范围在 UMSocialPlatformType_UserDefine_Begin,UMSocialPlatformType_UserDefine_End)之间
*
* @return YES代表返回成功,NO代表失败
* @disuss 在调用此函数前,必须先设置对应的平台的配置信息 @see - (BOOL)setPlaform:(UMSocialPlatformType)platformType appKey:(NSString *)appKey appSecret:(NSString *)appSecret redirectURL:(NSString *)redirectURL;
*/
-(BOOL)addAddUserDefinePlatformProvider:(id<UMSocialPlatformProvider>)userDefinePlatformProvider
withUserDefinePlatformType:(UMSocialPlatformType)platformType;
/**
* 获得对应的平台类型platformType的PlatformProvider
*
* @param platformType 平台类型 @see platformType
*
* @return 返回继承UMSocialPlatformProvider的handle
*/
-(id<UMSocialPlatformProvider>)platformProviderWithPlatformType:(UMSocialPlatformType)platformType;
/**
* 动态的删除不想显示的平台,不管是预定义还是用户自定义的
*
* @param platformTypeArray 平台类型数组
*/
-(void) removePlatformProviderWithPlatformTypes:(NSArray *)platformTypeArray;
/**
* 动态的删除PlatformProvider,不管是预定义还是用户自定义的
*
* @param platformType 平台类型 @see UMSocialPlatformType
*/
-(void) removePlatformProviderWithPlatformType:(UMSocialPlatformType)platformType;
/**
* 平台是否安装
*
* @param platformType 平台类型 @see UMSocialPlatformType
*
* @return YES 代表安装,NO 代表未安装
* @note 在判断QQ空间的App的时候,QQApi判断会出问题
*/
-(BOOL) isInstall:(UMSocialPlatformType)platformType;
/**
* 当前平台是否支持分享
*
* @param platformType 平台类型 @see UMSocialPlatformType
*
* @return YES代表支持,NO代表不支持
*/
-(BOOL) isSupport:(UMSocialPlatformType)platformType;
#pragma mark - NOT COMMON METHOD
/**
* 授权平台 (此方法仅获取授权token,不包含获取用户信息。推荐使用上面的 getUserInfoWithPlatform... 接口获取授权及用户信息)
*
* @param platformType 平台类型 @see UMSocialPlatformType
* @param currentViewController 用于弹出类似邮件分享、短信分享等这样的系统页面
* @discuss currentViewController 只对sms,email等平台需要传入viewcontroller的平台,其他不需要的平台可以传入nil
* @param completion 回调
*/
- (void)authWithPlatform:(UMSocialPlatformType)platformType
currentViewController:(UIViewController *)currentViewController
completion:(UMSocialRequestCompletionHandler)completion;
@end
@@ -0,0 +1,425 @@
//
// UMSocialMessageObject.h
// SocialSDK
//
// Created by umeng on 16/4/22.
// Copyright © 2016年 dongjianxiong. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface UMSocialMessageObject : NSObject
/**
* 文本标题
* @disucss v6.0.3版本后增加的一个字段,
* @disucss 该字段目前只有Tumblr平台会使用到。
* @discuss 该字段以后会在需要文本title字段中扩展,具体请参看官方文档。
*/
@property (nonatomic,copy)NSString* title;
/**
* text 文本内容
* @note 非纯文本分享文本
*/
@property (nonatomic, copy) NSString *text;
/**
* 分享的所媒体内容对象
*/
@property (nonatomic, strong) id shareObject;
/**
* 其他相关参数,见相应平台说明
*/
@property (nonatomic, strong) NSDictionary *moreInfo;
+ (UMSocialMessageObject *)messageObject;
+ (UMSocialMessageObject *)messageObjectWithMediaObject:(id)mediaObject;
@end
@interface UMShareObject : NSObject
/**
* 标题
* @note 标题的长度依各个平台的要求而定
*/
@property (nonatomic, copy) NSString *title;
/**
* 描述
* @note 描述内容的长度依各个平台的要求而定
*/
@property (nonatomic, copy) NSString *descr;
/**
* 缩略图 UIImage或者NSData类型或者NSString类型(图片url
*/
@property (nonatomic, strong) id thumbImage;
/**
* @param title 标题
* @param descr 描述
* @param thumImage 缩略图(UIImage或者NSData类型,或者image_url
*
*/
+ (id)shareObjectWithTitle:(NSString *)title
descr:(NSString *)descr
thumImage:(id)thumImage;
+ (void)um_imageDataWithImage:(id)image completion:(void (^)(NSData *image))completion;
#pragma mark - 6.0.3新版本的函数
+ (void)um_imageDataWithImage:(id)image withCompletion:(void (^)(NSData *imageData,NSError* error))completion;
@end
@interface UMShareImageObject : UMShareObject
/** 图片内容 (可以是UIImage类对象,也可以是NSdata类对象,也可以是图片链接imageUrl NSString类对象)
* @note 图片大小根据各个平台限制而定
*/
@property (nonatomic, retain) id shareImage;
/**
* @param title 标题
* @param descr 描述
* @param thumImage 缩略图(UIImage或者NSData类型,或者image_url
*
*/
+ (UMShareImageObject *)shareObjectWithTitle:(NSString *)title
descr:(NSString *)descr
thumImage:(id)thumImage;
@end
@interface UMShareMusicObject : UMShareObject
/** 音乐网页的url地址
* @note 长度不能超过10K
*/
@property (nonatomic, retain) NSString *musicUrl;
/** 音乐lowband网页的url地址
* @note 长度不能超过10K
*/
@property (nonatomic, retain) NSString *musicLowBandUrl;
/** 音乐数据url地址
* @note 长度不能超过10K
*/
@property (nonatomic, retain) NSString *musicDataUrl;
/**音乐lowband数据url地址
* @note 长度不能超过10K
*/
@property (nonatomic, retain) NSString *musicLowBandDataUrl;
/**
* @param title 标题
* @param descr 描述
* @param thumImage 缩略图(UIImage或者NSData类型,或者image_url
*
*/
+ (UMShareMusicObject *)shareObjectWithTitle:(NSString *)title
descr:(NSString *)descr
thumImage:(id)thumImage;
@end
@interface UMShareVideoObject : UMShareObject
/**
视频网页的url
@warning 不能为空且长度不能超过255
*/
@property (nonatomic, strong) NSString *videoUrl;
/**
视频lowband网页的url
@warning 长度不能超过255
*/
@property (nonatomic, strong) NSString *videoLowBandUrl;
/**
视频数据流url
@warning 长度不能超过255
*/
@property (nonatomic, strong) NSString *videoStreamUrl;
/**
视频lowband数据流url
@warning 长度不能超过255
*/
@property (nonatomic, strong) NSString *videoLowBandStreamUrl;
/**
* @param title 标题
* @param descr 描述
* @param thumImage 缩略图(UIImage或者NSData类型,或者image_url
*
*/
+ (UMShareVideoObject *)shareObjectWithTitle:(NSString *)title
descr:(NSString *)descr
thumImage:(id)thumImage;
@end
@interface UMShareWebpageObject : UMShareObject
/** 网页的url地址
* @note 不能为空且长度不能超过10K
*/
@property (nonatomic, retain) NSString *webpageUrl;
/**
* @param title 标题
* @param descr 描述
* @param thumImage 缩略图(UIImage或者NSData类型,或者image_url
*
*/
+ (UMShareWebpageObject *)shareObjectWithTitle:(NSString *)title
descr:(NSString *)descr
thumImage:(id)thumImage;
@end
/*! @brief 分享消息中的邮件分享对象
*
* @see UMSocialMessageObject
*/
@interface UMShareEmailObject : UMShareObject
/**
* 主题
*/
@property (nonatomic, strong) NSString *subject;
/**
* 接收人
*/
@property (nonatomic, strong) NSArray *toRecipients;
/**
* 抄送人
*/
@property (nonatomic, strong) NSArray *ccRecipients;
/**
* 密送人
*/
@property (nonatomic, strong) NSArray *bccRecipients;
/**
* 文本内容
*/
@property (nonatomic, copy) NSString *emailContent;
/**
* 图片,最好是本地图片(UIImage,或者NSdata
*/
@property (nonatomic, strong) id emailImage;
/**
* 发送图片的类型 @see MIME
* 默认 "image/ *"
*/
@property (nonatomic, copy) NSString* emailImageType;
/**
* 发送图片的名字
* 默认 "um_share_image.png"
*/
@property (nonatomic, copy) NSString* emailImageName;
/**
* 文件(NSData
*/
@property (nonatomic, strong) NSData *emailSendData;
/**
* 文件格式
* @see MIME
* 默认 "text/ *"
*/
@property (nonatomic, copy) NSString *fileType;
/**
* 文件名,(例如图片 imageName.png, 文件名后要跟文件后缀名,否则没法识别,导致类似图片不显示的问题)
* 默认 "um_share_file.txt"
*/
@property (nonatomic, copy) NSString *fileName;
@end
/*! @brief 分享消息中的短信分享对象
*
* @see UMSocialMessageObject
* @discuss UMShareSmsObject只能发送的附件是图片!!!!
* 如果发送其他的文件的话,虽然能在短信界面显示发送的文件,但是会发送不成功
*/
@interface UMShareSmsObject : UMShareObject
/**
* 接收人
*/
@property (nonatomic, strong) NSArray *recipients;
/**
* 主题
*/
@property (nonatomic, strong) NSString *subject;
/**
* 文本内容
*/
@property (nonatomic, copy) NSString *smsContent;
/**
* 图片
*/
@property (nonatomic, strong) id smsImage;//UIImage对象必填
@property (nonatomic, copy) NSString *imageType;//图片格式必填,必须指定数据格式,如png图片格式应传入@"png"
@property (nonatomic, copy) NSString *imageName;//图片 例如 imageName.png, 文件名后要跟文件后缀名,否则没法识别,导致类似图片不显示的问题)
#pragma mark - 以下字段为非图片的属性
/**
* 文件数据(NSData
* 必填
*/
@property (nonatomic, strong) NSData *smsSendData;
/**
* 文件格式
* 必填,必须指定数据格式,如png图片格式应传入@"txt"
*/
@property (nonatomic, copy) NSString *fileType;
/**
* 文件名,(例如图片 fileName.txt, 文件名后要跟文件后缀名,否则没法识别,导致类似图片不显示的问题)
*/
@property (nonatomic, copy) NSString *fileName;
/**
* 文件地址url(http:// or file:// ...../fileName.txt)
*/
@property (nonatomic, copy) NSString *fileUrl;
@end
/**
* 表情的类
* 表请的缩略图数据请存放在UMShareEmotionObject中
* 注意:emotionData和emotionURL成员不能同时为空,若同时出现则取emotionURL
*/
@interface UMShareEmotionObject : UMShareObject
/**
* 表情数据,如GIF等
* @note 微信的话大小不能超过10M
*/
@property (nonatomic, strong) NSData *emotionData;
/**
* @param title 标题
* @param descr 描述
* @param thumImage 缩略图(UIImage或者NSData类型,或者image_url
*
*/
+ (UMShareEmotionObject *)shareObjectWithTitle:(NSString *)title
descr:(NSString *)descr
thumImage:(id)thumImage;
@end
#pragma mark - UMSAppExtendObject
/*! @brief 多媒体消息中包含的App扩展数据对象
*
* 第三方程序向微信终端发送包含UMShareExtendObject的多媒体消息,
* 微信需要处理该消息时,会调用该第三方程序来处理多媒体消息内容。
* @note urlextInfo和fileData不能同时为空
* @see UMShareObject
*/
@interface UMShareExtendObject : UMShareObject
/** 若第三方程序不存在,微信终端会打开该url所指的App下载地址
* @note 长度不能超过10K
*/
@property (nonatomic, retain) NSString *url;
/** 第三方程序自定义简单数据,微信终端会回传给第三方程序处理
* @note 长度不能超过2K
*/
@property (nonatomic, retain) NSString *extInfo;
/** App文件数据,该数据发送给微信好友,微信好友需要点击后下载数据,微信终端会回传给第三方程序处理
* @note 大小不能超过10M
*/
@property (nonatomic, retain) NSData *fileData;
@end
#pragma mark - UMFileObject
/*! @brief 多媒体消息中包含的文件数据对象
*
* @see UMShareObject
*/
@interface UMShareFileObject : UMShareObject
/** 文件后缀名
* @note 长度不超过64字节
*/
@property (nonatomic, retain) NSString *fileExtension;
/** 文件真实数据内容
* @note 大小不能超过10M
*/
@property (nonatomic, retain) NSData *fileData;
@end
#pragma mark - UMMiniProgramObject
/*! @brief 多媒体消息中包含 分享微信小程序的数据对象
*
* @see UMShareObject
*/
@interface UMShareMiniProgramObject : UMShareObject
/**
低版本微信网页链接
*/
@property (nonatomic, strong) NSString *webpageUrl;
/**
小程序username
*/
@property (nonatomic, strong) NSString *userName;
/**
小程序页面的路径
*/
@property (nonatomic, strong) NSString *path;
@end
@@ -0,0 +1,432 @@
//
// UMSocialPlatformConfig.h
// UMSocialSDK
//
// Created by 张军华 on 16/8/5.
// Copyright © 2016年 dongjianxiong. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
/**
新浪微博
*/
extern NSString *const UMSPlatformNameSina;
/**
腾讯微博
*/
extern NSString *const UMSPlatformNameTencentWb;
/**
钉钉
*/
extern NSString *const UMSPlatformNameDingDing;
/**
人人网
*/
extern NSString *const UMSPlatformNameRenren;
/**
豆瓣
*/
extern NSString *const UMSPlatformNameDouban;
/**
QQ空间
*/
extern NSString *const UMSPlatformNameQzone;
/**
邮箱
*/
extern NSString *const UMSPlatformNameEmail;
/**
短信
*/
extern NSString *const UMSPlatformNameSms;
/**
微信好友
*/
extern NSString *const UMSPlatformNameWechatSession;
/**
微信朋友圈
*/
extern NSString *const UMSPlatformNameWechatTimeline;
/**
微信收藏
*/
extern NSString *const UMSPlatformNameWechatFavorite;
/**
支付宝好友
*/
extern NSString *const UMSPlatformNameAlipaySession;
/**
手机QQ
*/
extern NSString *const UMSPlatformNameQQ;
/**
Facebook
*/
extern NSString *const UMSPlatformNameFacebook;
/**
Twitter
*/
extern NSString *const UMSPlatformNameTwitter;
/**
易信好友
*/
extern NSString *const UMSPlatformNameYXSession;
/**
易信朋友圈
*/
extern NSString *const UMSPlatformNameYXTimeline;
/**
来往好友
*/
extern NSString *const UMSPlatformNameLWSession;
/**
来往朋友圈
*/
extern NSString *const UMSPlatformNameLWTimeline;
/**
分享到Instragram
*/
extern NSString *const UMSPlatformNameInstagram;
/**
分享到Whatsapp
*/
extern NSString *const UMSPlatformNameWhatsapp;
/**
分享到Line
*/
extern NSString *const UMSPlatformNameLine;
/**
分享到Tumblr
*/
extern NSString *const UMSPlatformNameTumblr;
/**
领英
*/
extern NSString *const UMSPlatformNameLinkedin;
/**
分享到Pinterest
*/
extern NSString *const UMSPlatformNamePinterest;
/**
分享到KakaoTalk
*/
extern NSString *const UMSPlatformNameKakaoTalk;
/**
分享到Flickr
*/
extern NSString *const UMSPlatformNameFlickr;
/**
* 有道云笔记
*/
extern NSString *const UMSPlatformNameYouDaoNote;
/**
* 印象笔记
*/
extern NSString *const UMSPlatformNameEverNote;
/**
* google+
*/
extern NSString *const UMSPlatformNameGooglePlus;
/**
* Pocket
*/
extern NSString *const UMSPlatformNamePocket;
/**
* dropbox
*/
extern NSString *const UMSPlatformNameDropBox;
/**
* vkontakte
*/
extern NSString *const UMSPlatformNameVKontakte;
/**
* FaceBookMessenger
*/
extern NSString *const UMSPlatformNameFaceBookMessenger;
/**
* 授权,分享,UserProfile等操作的回调
*
* @param result 表示回调的结果
* @param error 表示回调的错误码
*/
typedef void (^UMSocialRequestCompletionHandler)(id result,NSError *error);
/**
* 授权,分享,UserProfile等操作的回调
*
* @param shareResponse 表示回调的结果
* @param error 表示回调的错误码
*/
typedef void (^UMSocialShareCompletionHandler)(id shareResponse,NSError *error);
/**
* 授权,分享,UserProfile等操作的回调
*
* @param authResponse 表示回调的结果
* @param error 表示回调的错误码
*/
typedef void (^UMSocialAuthCompletionHandler)(id authResponse,NSError *error);
/**
* 授权,分享,UserProfile等操作的回调
*
* @param userInfoResponse 表示回调的结果
* @param error 表示回调的错误码
*/
typedef void (^UMSocialGetUserInfoCompletionHandler)(id userInfoResponse,NSError *error);
/////////////////////////////////////////////////////////////////////////////
//平台的失败错误码--start
/////////////////////////////////////////////////////////////////////////////
/**
* U-Share返回错误类型
*/
typedef NS_ENUM(NSInteger, UMSocialPlatformErrorType) {
UMSocialPlatformErrorType_Unknow = 2000, // 未知错误
UMSocialPlatformErrorType_NotSupport = 2001, // 不支持(url scheme 没配置,或者没有配置-ObjC, 或则SDK版本不支持或则客户端版本不支持)
UMSocialPlatformErrorType_AuthorizeFailed = 2002, // 授权失败
UMSocialPlatformErrorType_ShareFailed = 2003, // 分享失败
UMSocialPlatformErrorType_RequestForUserProfileFailed = 2004, // 请求用户信息失败
UMSocialPlatformErrorType_ShareDataNil = 2005, // 分享内容为空
UMSocialPlatformErrorType_ShareDataTypeIllegal = 2006, // 分享内容不支持
UMSocialPlatformErrorType_CheckUrlSchemaFail = 2007, // schemaurl fail
UMSocialPlatformErrorType_NotInstall = 2008, // 应用未安装
UMSocialPlatformErrorType_Cancel = 2009, // 取消操作
UMSocialPlatformErrorType_NotNetWork = 2010, // 网络异常
UMSocialPlatformErrorType_SourceError = 2011, // 第三方错误
UMSocialPlatformErrorType_ProtocolNotOverride = 2013, // 对应的 UMSocialPlatformProvider的方法没有实现
UMSocialPlatformErrorType_NotUsingHttps = 2014, // 没有用https的请求,@see UMSocialGlobal isUsingHttpsWhenShareContent
};
/** The domain name used for the UMSocialPlatformErrorType */
extern NSString* const UMSocialPlatformErrorDomain;
/////////////////////////////////////////////////////////////////////////////
//平台的失败错误码--end
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
//平台的特性--begin
/////////////////////////////////////////////////////////////////////////////
/**
* 平台的特性枚举变量
*/
typedef NS_OPTIONS(NSUInteger, UMSocialPlatformFeature)
{
UMSocialPlatformFeature_None = 0,
//App
UMSocialPlatformFeature_IsAppInstalled = 1 << 0,
UMSocialPlatformFeature_IsCanOpenApp = 1 << 1,
UMSocialPlatformFeature_IsAppApiSupport = 1 << 2,
//Authorize
UMSocialPlatformFeature_IsCanAuthorize = 1 << 10,
UMSocialPlatformFeature_IsCanWebViewAuthorize = 1 << 11,
//SSOShare
UMSocialPlatformFeature_IsCanShare_Text = 1 << 22,
UMSocialPlatformFeature_IsCanShare_Image = 1 << 23,
UMSocialPlatformFeature_IsCanShare_Media = 1 << 24,
UMSocialPlatformFeature_IsCanShare_TextAndImage = 1 << 25,
UMSocialPlatformFeature_IsCanShare_TextAndMedia = 1 << 26,
//mask
UMSocialPlatformFeature_Mask = 0xFFFFFFFF,
};
/////////////////////////////////////////////////////////////////////////////
//平台的特性--end
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
//平台的类型--start
/////////////////////////////////////////////////////////////////////////////
typedef NS_ENUM(NSInteger,UMSocialPlatformType)
{
UMSocialPlatformType_UnKnown = -2,
//预定义的平台
UMSocialPlatformType_Predefine_Begin = -1,
UMSocialPlatformType_Sina = 0, //新浪
UMSocialPlatformType_WechatSession = 1, //微信聊天
UMSocialPlatformType_WechatTimeLine = 2,//微信朋友圈
UMSocialPlatformType_WechatFavorite = 3,//微信收藏
UMSocialPlatformType_QQ = 4,//QQ聊天页面
UMSocialPlatformType_Qzone = 5,//qq空间
UMSocialPlatformType_TencentWb = 6,//腾讯微博
UMSocialPlatformType_AlipaySession = 7,//支付宝聊天页面
UMSocialPlatformType_YixinSession = 8,//易信聊天页面
UMSocialPlatformType_YixinTimeLine = 9,//易信朋友圈
UMSocialPlatformType_YixinFavorite = 10,//易信收藏
UMSocialPlatformType_LaiWangSession = 11,//点点虫(原来往)聊天页面
UMSocialPlatformType_LaiWangTimeLine = 12,//点点虫动态
UMSocialPlatformType_Sms = 13,//短信
UMSocialPlatformType_Email = 14,//邮件
UMSocialPlatformType_Renren = 15,//人人
UMSocialPlatformType_Facebook = 16,//Facebook
UMSocialPlatformType_Twitter = 17,//Twitter
UMSocialPlatformType_Douban = 18,//豆瓣
UMSocialPlatformType_KakaoTalk = 19,//KakaoTalk
UMSocialPlatformType_Pinterest = 20,//Pinteres
UMSocialPlatformType_Line = 21,//Line
UMSocialPlatformType_Linkedin = 22,//领英
UMSocialPlatformType_Flickr = 23,//Flickr
UMSocialPlatformType_Tumblr = 24,//Tumblr
UMSocialPlatformType_Instagram = 25,//Instagram
UMSocialPlatformType_Whatsapp = 26,//Whatsapp
UMSocialPlatformType_DingDing = 27,//钉钉
UMSocialPlatformType_YouDaoNote = 28,//有道云笔记
UMSocialPlatformType_EverNote = 29,//印象笔记
UMSocialPlatformType_GooglePlus = 30,//Google+
UMSocialPlatformType_Pocket = 31,//Pocket
UMSocialPlatformType_DropBox = 32,//dropbox
UMSocialPlatformType_VKontakte = 33,//vkontakte
UMSocialPlatformType_FaceBookMessenger = 34,//FaceBookMessenger
UMSocialPlatformType_Predefine_end = 999,
//用户自定义的平台
UMSocialPlatformType_UserDefine_Begin = 1000,
UMSocialPlatformType_UserDefine_End = 2000,
};
/////////////////////////////////////////////////////////////////////////////
//平台的类型--end
/////////////////////////////////////////////////////////////////////////////
//通过图片名称读取UMSocialSDKResources.bundle里的平台icon
#define UMSocialPlatformIconWithName(name) [NSString stringWithFormat:@"UMSocialSDKResources.bundle/SnsPlatform/%@",name]
////通过图片名称读取UMSocialSDKResources.bundle/Buttons/中的图片
#define UMSocialButtonImageWithName(name) [NSString stringWithFormat:@"UMSocialSDKResources.bundle/Buttons/%@",name]
//
/** 本地化 */
#define UMLocalizedString(key,defaultValue) NSLocalizedStringWithDefaultValue(key,@"UMSocialLocalizable", [NSBundle mainBundle], defaultValue, nil)
/**
* 平台配置类
*/
@interface UMSocialPlatformConfig : NSObject
@property(nonatomic,strong)NSString* appKey;
@property(nonatomic,strong)NSString* appSecret;
@property(nonatomic,strong)NSString* redirectURL;
/**
* 根据平台类型获得平台名称
*
* @param platformType 平台类型
* @see UMSocialPlatformType
*
* @return 返回对应的平台名称
*/
+ (NSString *)platformNameWithPlatformType:(UMSocialPlatformType)platformType;
/**
* 根据平台的类型返回对应平台的对象
*
* @param platformType 平台类型
*
* @return 返回对应的平台对象
*/
+ (id)platformHandlerWithPlatformType:(UMSocialPlatformType)platformType;
/**
* 创建错误类型
*
* @param errorType 平台类型
* @param userInfo 用户的自定义信息userInfo
*
* @return 返回错误对象
*/
+ (NSError *)errorWithSocialErrorType:(UMSocialPlatformErrorType)errorType userInfo:(id)userInfo;
@end
/**
* 云端授权/分享编辑页面配置类
* 云端授权/分享页面目前适用于腾讯微博、豆瓣、人人的授权和分享编辑页面的自定义配置
*/
@interface UMSocialCloudViewConfig : NSObject
/**
授权页面
*/
@property (nonatomic, strong) NSString *authViewTitle;
@property (nonatomic, strong) UIColor *authViewTitleColor;
@property( nonatomic, strong) UIColor *authViewNavBarColor;
// button仅需改动title或image即可,touch事件内部触发
@property (nonatomic, strong) UIButton *authViewCloseButton;
@property (nonatomic, strong) NSString *editViewTitle;
@property (nonatomic, strong) UIColor *editViewTitleColor;
@property( nonatomic, strong) UIColor *editViewNavBarColor;
// button仅需改动title或image即可,touch事件内部触发
@property (nonatomic, strong) UIButton *editViewCloseButton;
@property (nonatomic, strong) UIButton *editViewShareButton;
+ (instancetype)sharedInstance;
@end
@@ -0,0 +1,156 @@
//
// UMSocialPlatformProvider.h
// UMSocialSDK
//
// Created by 张军华 on 16/8/4.
// Copyright © 2016年 dongjianxiong. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import "UMSocialPlatformConfig.h"
@class UMSocialMessageObject;
/**
* 每个平台的必须实现的协议
*/
@protocol UMSocialPlatformProvider <NSObject>
@optional
/**
* 当前UMSocialPlatformProvider对应操作的UMSocialPlatformType
* @discuss 当前很多平台对应多个平台类型,出现一对多的关系
* 例如:QQ提供UMSocialPlatformType_Qzone 和 UMSocialPlatformType_QQ,用户点击分享或者认证的时候,需要区分用户分享或者认证的对应的哪个平台
*/
@property(nonatomic,assign)UMSocialPlatformType socialPlatformType;
/**
* 初始化平台
*
* @param appKey 对应的appkey
* @param appSecret 对应的appSecret
* @param redirectURL 对应的重定向url
* @discuss appSecret和redirectURL如果平台必须要的话就传入,不需要就传入nil
*/
-(void)umSocial_setAppKey:(NSString *)appKey
withAppSecret:(NSString *)appSecret
withRedirectURL:(NSString *)redirectURL;
/**
* 授权
*
* @param userInfo 用户的授权的自定义数据
* @param completionHandler 授权后的回调
* @discuss userInfo在有些平台可以带入,如果没有就传入nil.
*/
-(void)umSocial_AuthorizeWithUserInfo:(NSDictionary *)userInfo
withCompletionHandler:(UMSocialRequestCompletionHandler)completionHandler;
/**
* 授权
*
* @param userInfo 用户的授权的自定义数据
* @param completionHandler 授权后的回调
* @parm viewController 分享需要的viewController
* @discuss userInfo在有些平台可以带入,如果没有就传入nil.
* 这个函数用于sms,email等需要传入viewController的平台
*/
-(void)umSocial_AuthorizeWithUserInfo:(NSDictionary *)userInfo
withViewController:(UIViewController*)viewController
withCompletionHandler:(UMSocialRequestCompletionHandler)completionHandler;
/**
* 分享
*
* @param object 分享的对象数据模型
* @param completionHandler 分享后的回调
*/
-(void)umSocial_ShareWithObject:(UMSocialMessageObject *)object
withCompletionHandler:(UMSocialRequestCompletionHandler)completionHandler;
/**
* 分享
*
* @param object 分享的对象数据模型
* @param completionHandler 分享后的回调
* @parm viewController 分享需要的viewController
* @dicuss 这个函数用于sms,email等需要传入viewController的平台
*/
-(void)umSocial_ShareWithObject:(UMSocialMessageObject *)object
withViewController:(UIViewController*)viewController
withCompletionHandler:(UMSocialRequestCompletionHandler)completionHandler;
/**
* 取消授权
*
* @param completionHandler 授权后的回调
* @discuss userInfo在有些平台可以带入,如果没有就传入nil.
*/
-(void)umSocial_cancelAuthWithCompletionHandler:(UMSocialRequestCompletionHandler)completionHandler;
/**
* 授权成功后获得用户的信息
*
* @param completionHandler 请求的回调
*/
-(void)umSocial_RequestForUserProfileWithCompletionHandler:(UMSocialRequestCompletionHandler)completionHandler;
/**
* 获取用户信息
* @param currentViewController 用于弹出类似邮件分享、短信分享等这样的系统页面
* @param completion 回调
*/
- (void)umSocial_RequestForUserProfileWithViewController:(id)currentViewController
completion:(UMSocialRequestCompletionHandler)completion;
/**
* 清除平台的数据F
*/
-(void)umSocial_clearCacheData;
/**
* 获得从sso或者web端回调到本app的回调
*
* @param url 第三方sdk的打开本app的回调的url
*
* @return 是否处理 YES代表处理成功,NO代表不处理
*/
-(BOOL)umSocial_handleOpenURL:(NSURL *)url;
-(BOOL)umSocial_handleOpenURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation;
-(BOOL)umSocial_handleOpenURL:(NSURL *)url options:(NSDictionary*)options;
#pragma mark - 平台的特性
/**
* 平台的特性
*
* @return 返回平台特性
*
*/
-(UMSocialPlatformFeature)umSocial_SupportedFeatures;
/**
* 平台的版本
*
* @return 当前平台sdk的version
*/
-(NSString *)umSocial_PlatformSDKVersion;
/**
* 检查urlschema
*
*/
-(BOOL)checkUrlSchema;
-(BOOL)umSocial_isInstall;
-(BOOL)umSocial_isSupport;
@end
@@ -0,0 +1,61 @@
//
// UMSocialResponse.h
// UMSocialSDK
//
// Created by wangfei on 16/8/12.
// Copyright © 2016年 dongjianxiong. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "UMSocialPlatformConfig.h"
@interface UMSocialResponse : NSObject
@property (nonatomic, copy) NSString *uid;
@property (nonatomic, copy) NSString *openid;
@property (nonatomic, copy) NSString *refreshToken;
@property (nonatomic, copy) NSDate *expiration;
@property (nonatomic, copy) NSString *accessToken;
@property (nonatomic, assign) UMSocialPlatformType platformType;
/**
* 第三方原始数据
*/
@property (nonatomic, strong) id originalResponse;
@end
@interface UMSocialShareResponse : UMSocialResponse
@property (nonatomic, copy) NSString *message;
+ (UMSocialShareResponse *)shareResponseWithMessage:(NSString *)message;
@end
@interface UMSocialAuthResponse : UMSocialResponse
@end
@interface UMSocialUserInfoResponse : UMSocialResponse
/**
第三方平台昵称
*/
@property (nonatomic, copy) NSString *name;
/**
第三方平台头像地址
*/
@property (nonatomic, copy) NSString *iconurl;
/**
通用平台性别属性
QQ、微信、微博返回 "男", "女"
Facebook返回 "male", "female"
*/
@property (nonatomic, copy) NSString *unionGender;
@property (nonatomic, copy) NSString *gender;
@end
@@ -0,0 +1,24 @@
//
// UMSocialSOAuthViewController.h
// UMSocialSDK
//
// Created by wangfei on 16/8/15.
// Copyright © 2016年 dongjianxiong. All rights reserved.
//
#import <UIKit/UIKit.h>
#import "UMSBaeViewController.h"
#import "UMSocialPlatformConfig.h"
@interface UMSocialSOAuthViewController : UMSBaeViewController<UIWebViewDelegate,UIAlertViewDelegate>
@property (nonatomic,strong) UIWebView *webView;
@property(nonatomic,assign) UMSocialPlatformType platformType;
@property (nonatomic, copy) UMSocialRequestCompletionHandler authCompletionBlock;
@property (nonatomic,strong) NSString* waitUrl;
@end
@@ -0,0 +1,31 @@
//
// UMSocialShareEditViewController.h
// UMSocialSDK
//
// Created by wangfei on 16/8/16.
// Copyright © 2016年 dongjianxiong. All rights reserved.
//
#import <UIKit/UIKit.h>
#import "UMSocialPlatformConfig.h"
#import "UMSBaeViewController.h"
@class UMSocialMessageObject;
@interface UMSocialShareEditViewController : UMSBaeViewController
@property (nonatomic,strong) UIImageView* editBar;
@property (nonatomic,strong) UILabel* numLabel;
@property (nonatomic,strong) UIImageView* imageView;
@property (nonatomic,strong) UIButton* delBtn;
@property (nonatomic,strong) UITextView* editView;
@property (nonatomic,strong) UIView* editViewBack;
@property (nonatomic,strong) UILabel* titleLabel;
@property (nonatomic,strong) UILabel* desLabel;
@property (nonatomic,strong) UMSocialMessageObject *shareContent;
@property (nonatomic, copy) UMSocialRequestCompletionHandler shareCompletionBlock;
@property (nonatomic,strong) NSString* usid;
@property (nonatomic,assign) UMSocialPlatformType platformType;
@end
@@ -0,0 +1,222 @@
//
// UMSocialWarterMarkConfig.h
// testWatermarkImage
//
// Created by 张军华 on 16/12/23.
// Copyright © 2016年 张军华. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import <CoreGraphics/CoreGraphics.h>
@class UMSocialStringWarterMarkConfig;
@class UMSocialImageWarterMarkConfig;
typedef NS_ENUM(NSInteger, UMSocialWarterMarkPositon) {
UMSocialWarterMarkPositonNone = 0,
/************************************************************************
水印字符串的位置,目前并没有用--start
*************************************************************************/
UMSocialStringWarterMarkTopLeft = (1 << 0),
UMSocialStringWarterMarkTopRight = (1 << 1),
UMSocialStringWarterMarkBottomLeft = (1 << 2),
UMSocialStringWarterMarkBottomRight = (1 << 3),
/************************************************************************
水印字符串的位置,目前并没有用--end
*************************************************************************/
//水印图片的位置
UMSocialImageWarterMarkTopLeft = (1 << 4),
UMSocialImageWarterMarkTopRight = (1 << 5),
UMSocialImageWarterMarkBottomLeft = (1 << 6),
UMSocialImageWarterMarkBottomRight = (1 << 7),
/************************************************************************
水印字符串和水印图片的相对位置,目前并没有用(如果图片和字符串都在同一个位置,就需要设置相对位置)--start
*************************************************************************/
UMSocialImageWarterMarkForwardStringWarterMark = (1 << 8), //图片在字符串前面
UMSocialStringWarterMarkForwardImageWarterMark = (1 << 9),//字符串在图片前面
UMSocialImageWarterMarkAboveStringWarterMark = (1 << 10),//图片在字符串上面
UMSocialStringWarterMarkAboveImageWarterMark = (1 << 11),//字符串在图片上面
/************************************************************************
水印字符串和水印图片的相对位置,目前并没有用(如果图片和字符串都在同一个位置,就需要设置相对位置)--end
*************************************************************************/
};
typedef NS_OPTIONS(NSInteger, UMSocialStringAndImageWarterMarkPositon) {
UMSocialStringAndImageWarterMarkPositonNone = 0,
UMSocialOnlyImageWarterMarkTopLeft = UMSocialImageWarterMarkTopLeft,//水印图片左上
UMSocialOnlyImageWarterMarkTopRight = UMSocialImageWarterMarkTopRight,//水印图片右上
UMSocialOnlyImageWarterMarkBottomLeft = UMSocialImageWarterMarkBottomLeft,//水印图片左下
UMSocialOnlyImageWarterMarkBottomRight = UMSocialImageWarterMarkBottomRight,//水印图片右下
/************************************************************************
以下的枚举变量,目前并没有用--start
*************************************************************************/
UMSocialStringWarterMarkTopLeftAndImageWarterMarkTopLeft = (UMSocialStringWarterMarkTopLeft | UMSocialImageWarterMarkTopLeft),//水印字符串左上,水印图片左上
UMSocialStringWarterMarkTopLeftAndImageWarterMarkTopRight = (UMSocialStringWarterMarkTopLeft | UMSocialImageWarterMarkTopRight),//水印字符串左上,水印图片右上
UMSocialStringWarterMarkTopLeftAndImageWarterMarkBottomLeft = (UMSocialStringWarterMarkTopLeft | UMSocialImageWarterMarkBottomLeft),//水印字符串左上,水印图片左下
UMSocialStringWarterMarkTopLeftAndImageWarterMarkBottomRight = (UMSocialStringWarterMarkTopLeft | UMSocialImageWarterMarkBottomRight),//水印字符串左上,水印图片右下
UMSocialStringWarterMarkTopRightAndImageWarterMarkTopLeft = (UMSocialStringWarterMarkTopRight | UMSocialImageWarterMarkTopLeft),//水印字符串右上,水印图片左上
UMSocialStringWarterMarkTopRightAndImageWarterMarkTopRight = (UMSocialStringWarterMarkTopRight | UMSocialImageWarterMarkTopRight),//水印字符串右上,水印图片右上
UMSocialStringWarterMarkTopRightAndImageWarterMarkBottomLeft = (UMSocialStringWarterMarkTopRight | UMSocialImageWarterMarkBottomLeft),//水印字符串右上,水印图片左下
UMSocialStringWarterMarkTopRightAndImageWarterMarkBottomRight = (UMSocialStringWarterMarkTopRight | UMSocialImageWarterMarkBottomRight),//水印字符串右上,水印图片右下
UMSocialStringWarterMarkBottomLeftAndImageWarterMarkTopLeft = (UMSocialStringWarterMarkBottomLeft | UMSocialImageWarterMarkTopLeft),//水印字符串左下,水印图片左上
UMSocialStringWarterMarkBottomLeftAndImageWarterMarkTopRight = (UMSocialStringWarterMarkBottomLeft | UMSocialImageWarterMarkTopRight),//水印字符串左下,水印图片右上
UMSocialStringWarterMarkBottomLeftAndImageWarterMarkBottomLeft = (UMSocialStringWarterMarkBottomLeft | UMSocialImageWarterMarkBottomLeft),//水印字符串左下,水印图片左下
UMSocialStringWarterMarkBottomLeftAndImageWarterMarkBottomRight = (UMSocialStringWarterMarkBottomLeft | UMSocialImageWarterMarkBottomRight),//水印字符串左下,水印图片右下
UMSocialStringWarterMarkBottomRightAndImageWarterMarkTopLeft = (UMSocialStringWarterMarkBottomRight | UMSocialImageWarterMarkTopLeft),//水印字符串右下,水印图片左上
UMSocialStringWarterMarkBottomRightAndImageWarterMarkTopRight = (UMSocialStringWarterMarkBottomRight | UMSocialImageWarterMarkTopRight),//水印字符串右下,水印图片右上
UMSocialStringWarterMarkBottomRightAndImageWarterMarkBottomLeft = (UMSocialStringWarterMarkBottomRight | UMSocialImageWarterMarkBottomLeft),//水印字符串右下,水印图片左下
UMSocialStringWarterMarkBottomRightAndImageWarterMarkBottomRight = (UMSocialStringWarterMarkBottomRight | UMSocialImageWarterMarkBottomRight),//水印字符串右下,水印图片右下
/************************************************************************
以下的枚举变量,目前并没有用---end
*************************************************************************/
};
extern UMSocialWarterMarkPositon getStringWarterMarkPostion(UMSocialStringAndImageWarterMarkPositon stringAndImageWarterMarkPositon);
extern UMSocialWarterMarkPositon getImageWarterMarkPostion(UMSocialStringAndImageWarterMarkPositon stringAndImageWarterMarkPositon);
extern UMSocialWarterMarkPositon getRelatedWarterMarkPostion(UMSocialStringAndImageWarterMarkPositon stringAndImageWarterMarkPositon);
/**
* 水印配置类
* 用户可以设置水印的配置类,目前只是提供图片水印
*
* method1:
* 用户可以通过默认的配置类来配置水印
* 代码如下:
UMSocialWarterMarkConfig* warterMarkConfig = [UMSocialWarterMarkConfig defaultWarterMarkConfig];
*
* method2:
* 用户可以通过创建自己的配置类来配置水印
* 代码如下:
//创建UMSocialImageWarterMarkConfig
UMSocialImageWarterMarkConfig* imageWarterMarkConfig = [[UMSocialImageWarterMarkConfig alloc] init];
//配置imageWarterMarkConfig的参数
//...TODO
//创建UMSocialWarterMarkConfig
UMSocialWarterMarkConfig* warterMarkConfig = [[UMSocialWarterMarkConfig alloc] init];
//配置warterMarkConfig的参数
//...TODO
//设置配置类
[warterMarkConfig setUserDefinedImageWarterMarkConfig:imageWarterMarkConfig];
*
*
*/
@interface UMSocialWarterMarkConfig : NSObject<NSCopying>
/**
* 默认配置类
*
* @return 默认配置类
*/
+(UMSocialWarterMarkConfig*)defaultWarterMarkConfig;
@property(nonatomic,readonly,strong)UMSocialStringWarterMarkConfig* stringWarterMarkConfig;//字符串配置类对象
@property(nonatomic,readonly,strong)UMSocialImageWarterMarkConfig* imageWarterMarkConfig;//图片配置类对象
/**
* 字符串和图片的位置
* 默认是defaultWarterMarkConfig的配置为文字和图片右下角,图片在前文字在后
*/
@property(nonatomic,readwrite,assign)UMSocialStringAndImageWarterMarkPositon stringAndImageWarterMarkPositon;//字符串和图片的位置
@property(nonatomic,readwrite,assign)CGFloat spaceBetweenStringWarterMarkAndImageWarterMark;//字符水印和图片水印的间距
/**
* 设置用户自定义的配置类
*
* @param imageWarterMarkConfig 图片配置类对象
*/
-(void)setUserDefinedImageWarterMarkConfig:(UMSocialImageWarterMarkConfig*)imageWarterMarkConfig;
@end
/**
* 字符水印配置类
* 目前此配置类没有使用
*/
@interface UMSocialStringWarterMarkConfig : NSObject<NSCopying>
/**
* 默认配置类
*
* @return 默认配置类
*/
+(UMSocialStringWarterMarkConfig*)defaultStringWarterMarkConfig;
//检查参数是否有效
-(BOOL)checkValid;
@property(nonatomic,readwrite,strong)NSAttributedString* warterMarkAttributedString;//水印字符串
@property(nonatomic,readwrite,assign)NSUInteger warterMarkStringLimit;//水印字符串的字数限制
@property(nonatomic,readwrite,strong)UIColor* warterMarkStringColor;//水印字符串的颜色(要想保证色值半透明,可以创建半透明的颜色对象)
@property(nonatomic,readwrite,strong)UIFont* warterMarkStringFont;//水印字符串的字体
/**
* 靠近水平边的边距
* 与UMSocialWarterMarkPositon的停靠位置有关,
如:为UMSocialStringWarterMarkBottomRight时,paddingToHorizontalParentBorder代表与父窗口的右边间隙.
如:UMSocialStringWarterMarkTopLeft时,paddingToHorizontalParentBorder代表与父窗口的左边间隙.
*/
@property(nonatomic,readwrite,assign)CGFloat paddingToHorizontalParentBorder;//靠近水平边的边距
/**
* 靠近垂直边的边距
* 与UMSocialWarterMarkPositon的停靠位置有关,
如:为UMSocialStringWarterMarkBottomRight时,paddingToHorizontalParentBorder代表与父窗口的下边的间隙.
如:UMSocialStringWarterMarkTopLeft时,paddingToHorizontalParentBorder代表与父窗口的上边间隙.
*/
@property(nonatomic,readwrite,assign)CGFloat paddingToVerticalParentBorder;//靠近垂直边的边距
@property(nonatomic,readonly,assign)CGAffineTransform warterMarkStringTransform;//水印字符串的矩阵
@end
/**
* 图片配置类
*/
@interface UMSocialImageWarterMarkConfig : NSObject<NSCopying>
/**
* 默认配置类
*
* @return 默认配置类
*/
+(UMSocialImageWarterMarkConfig*)defaultImageWarterMarkConfig;
//检查参数是否有效
-(BOOL)checkValid;
@property(nonatomic,readwrite,strong)UIImage* warterMarkImage;//水印图片
@property(nonatomic,readwrite,assign)CGFloat warterMarkImageScale;//水印图片相对父图片的缩放因素(0-1之间)
@property(nonatomic,readwrite,assign)CGFloat warterMarkImageAlpha;//水印图片的Alpha混合值
/**
* 靠近水平边的边距
* 与UMSocialWarterMarkPositon的停靠位置有关,
如:为UMSocialImageWarterMarkBottomRight时,paddingToHorizontalParentBorder代表与父窗口的右边间隙.
如:UMSocialImageWarterMarkTopLeft时,paddingToHorizontalParentBorder代表与父窗口的左边间隙.
*/
@property(nonatomic,readwrite,assign)CGFloat paddingToHorizontalParentBorder;//靠近水平边的边距
/**
* 靠近垂直边的边距
* 与UMSocialWarterMarkPositon的停靠位置有关,
如:为UMSocialImageWarterMarkBottomRight时,paddingToHorizontalParentBorder代表与父窗口的下边间隙.
如:UMSocialImageWarterMarkTopLeft时,paddingToHorizontalParentBorder代表与父窗口的上边间隙.
*/
@property(nonatomic,readwrite,assign)CGFloat paddingToVerticalParentBorder;//靠近垂直边的边距
@property(nonatomic,readonly,assign)CGAffineTransform warterMarkImageTransform;//水印图片的矩阵
@end
@@ -0,0 +1,61 @@
//
// UMSociallogMacros.h
// UMSocialCore
//
// Created by 张军华 on 16/9/7.
// Copyright © 2016年 张军华. All rights reserved.
//
#import <Foundation/Foundation.h>
/**
* 设置全局的日志等级
*
* @param levelString 日志分级字符串 @see UMSocialLogClosedString,UMSocialLogErrorString,UMSocialLogWarnString,UMSocialLogInfoString,UMSocialLogDebugString,UMSocialLogVerboseString
* @discuss 普通用户可以设置UMSocialLogClosedStringUMSocialLogErrorStringUMSocialLogWarnStringUMSocialLogInfoStringUMSocialLogDebugString的字符串,如果设置UMSocialLogVerboseString的时候,如果不是本库的开发者,是降低其等级到UMSocialLogDebugString
*/
FOUNDATION_EXPORT void setGlobalLogLevelString(NSString* levelString);
FOUNDATION_EXPORT NSString* getGlobalLogLevelString();
FOUNDATION_EXPORT NSString* const UMSocialLogClosedLevelString;
FOUNDATION_EXPORT NSString* const UMSocialLogErrorLevelString;
FOUNDATION_EXPORT NSString* const UMSocialLogWarnLevelString;
FOUNDATION_EXPORT NSString* const UMSocialLogInfoLevelString;
FOUNDATION_EXPORT NSString* const UMSocialLogDebugLevelString;
FOUNDATION_EXPORT NSString* const UMSocialLogVerboseLevelString;
/**
* 根据等级打印日志
*
* @param flagString 控制打印分级的标志字符串
* @see below UMSocialLogClosedFlagString...and so on
* @param file 打印日志的文件
* @param function 打印日志的函数
* @param line 打印的日志的行数
* @param format 需要打印的日志格式内容
* @param ... 可变参数
* @dicuss 本库不需要直接调用,可以用简易函数宏 @see UMSocialLogError,UMSocialLogWarn,UMSocialLogInfo,UMSocialLogDebug
*/
FOUNDATION_EXPORT void UMSocialLog(NSString* flagString,const char* file,const char* function,NSUInteger line,NSString *format, ...) NS_FORMAT_FUNCTION(5,6);
FOUNDATION_EXPORT NSString* const UMSocialLogErrorFlagString;
FOUNDATION_EXPORT NSString* const UMSocialLogWarnFlagString;
FOUNDATION_EXPORT NSString* const UMSocialLogInfoFlagString;
FOUNDATION_EXPORT NSString* const UMSocialLogDebugFlagString;
FOUNDATION_EXPORT NSString* const UMSocialLogVerboseFlagString;
//简易函数类似于系统的NSLog函数,线程安全
#define UMSocialLogError(format, ...) UMSocialLog(UMSocialLogErrorFlagString,__FILE__,__PRETTY_FUNCTION__,__LINE__,format,##__VA_ARGS__)
#define UMSocialLogWarn(format, ...) UMSocialLog(UMSocialLogWarnFlagString,__FILE__,__PRETTY_FUNCTION__,__LINE__,format,##__VA_ARGS__)
#define UMSocialLogInfo(format, ...) UMSocialLog(UMSocialLogInfoFlagString,__FILE__,__PRETTY_FUNCTION__,__LINE__,format,##__VA_ARGS__)
#define UMSocialLogDebug(format, ...) UMSocialLog(UMSocialLogDebugFlagString,__FILE__,__PRETTY_FUNCTION__,__LINE__,format,##__VA_ARGS__)
#define UMSocialLogVerbose(format, ...) UMSocialLog(UMSocialLogVerboseFlagString,__FILE__,__PRETTY_FUNCTION__,__LINE__,format,##__VA_ARGS__)
//日志国际化的相关的函数和宏
FOUNDATION_EXPORT NSString* UMSocialLogWithLocalizedKey(NSString* key);
#define UMSocialLogLocalizedString(key) UMSocialLogWithLocalizedKey(key)
@@ -0,0 +1,26 @@
#import <Foundation/Foundation.h>
#import "UMSocialTaskConfig.h"
@interface UMSocialHttpFactory : NSObject
/**
* 创建一个NSMutableURLRequest的对象
*
* @param method @see UMSocialHttpMethodType
* @param path base path 如: http://www.umeng.com
* @param pathParameters 加入到path后面的键值对
* @param bodyParameters 加入到body的键值对
* @param headers 加入的http的header的键值对
*
* @return @see NSMutableURLRequest
*/
+ (NSMutableURLRequest *)makeRequestWithMethod:(UMSocialHttpMethodType)method
path:(NSString *)path
pathParameters:(NSDictionary *)pathParameters
bodyParameters:(NSDictionary *)bodyParameters
headers:(NSDictionary *)headers;
@end
@@ -0,0 +1,23 @@
//
// UMSocialNetwork.h
// UMSocialNetwork
//
// Created by 张军华 on 16/8/29.
// Copyright © 2016年 张军华. All rights reserved.
//
#import <UIKit/UIKit.h>
//! Project version number for UMSocialNetwork.
FOUNDATION_EXPORT double UMSocialNetworkVersionNumber;
//! Project version string for UMSocialNetwork.
FOUNDATION_EXPORT const unsigned char UMSocialNetworkVersionString[];
// In this header, you should import all the public headers of your framework using statements like #import <UMSocialNetwork/PublicHeader.h>
#import <UMSocialNetwork/UMSocialHttpFactory.h>
#import <UMSocialNetwork/UMSocialTaskConfig.h>
#import <UMSocialNetwork/UMSocialTask.h>
#import <UMSocialNetwork/UMSocialTaskManager.h>
@@ -0,0 +1,65 @@
//
// UMSocialTask.h
// UMSocialSDK
//
// Created by 张军华 on 16/8/11.
// Copyright © 2016年 dongjianxiong. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "UMSocialTaskConfig.h"
@class UMSocialTaskOperation;
@class UMSocialTask;
NS_ASSUME_NONNULL_BEGIN
/**
* task的回调代理
*/
@protocol UMSocialTaskDelegate <NSObject>
-(void)handleTask:(UMSocialTask*)task withError:(NSError*) error;
@end
/**
* 所有网络请求的基本任务类
*/
@interface UMSocialTask : NSObject<NSCopying,NSCoding>
@property(nonatomic,assign)UMSocialHttpMethodType httpMethodType; //http请求类型
@property(nonatomic,copy)NSString* hostUrlPath;//http请求的host
@property(nonatomic,copy)NSString* relatedUrlPath; //http请求的相对url
@property(nonatomic,strong)NSDictionary* paramDic; //post或者get请求需要的字典
@property(nonatomic,copy)UMSocialTaskCompletion completion;//回调
@property(nonatomic,readonly,assign)NSInteger taskIdentifier; //唯一id
@property(nonatomic,readonly,assign)NSInteger retryCount;//retryCount
@property(nonatomic,readonly,assign)UMSoicalTaskState taskState;//task的状态
#pragma mark - override
/**
* 创建的NSURLRequest
*
* @return @see NSURLRequest
* @discuss 用户可以重载此函数,自己实现makeURLRequest的逻辑,
* 如果不重载此函数会用
* 默认会用httpMethodType,relatedUrlPathparamDic来产生对应的NSURLRequest
*/
-(NSURLRequest*)makeURLRequest;
#pragma mark - private
/**
* 在指定的operationTaskQueue的执行对应task的任务
*
* @param operationTaskQueue @see NSOperationQueue
* @discuss 本函数不需要直接调用,UMSocialNetworkCore会自动调用
* @see UMSocialTaskManager -(void)addAndExcuteSocialTask:(UMSocialTask*)task
*/
-(void)executeTaskWithOperationQueue:(NSOperationQueue*)operationTaskQueue;
@end
NS_ASSUME_NONNULL_END
@@ -0,0 +1,59 @@
//
// UMSocialTaskConfig.h
// UMSocialSDK
//
// Created by 张军华 on 16/8/12.
// Copyright © 2016年 dongjianxiong. All rights reserved.
//
#import <Foundation/Foundation.h>
//task的网络请求
typedef NS_ENUM(NSInteger, UMSocialHttpMethodType)
{
UMSocialHttpMethodTypeGet,
UMSocialHttpMethodTypePut,
UMSocialHttpMethodTypePost,
UMSocialHttpMethodTypeMultipartPost,
UMSocialHttpMethodTypeMultipartPut,
UMSocialHttpMethodTypeDelete
};
//task的状态
typedef NS_ENUM(NSInteger, UMSoicalTaskState)
{
UMSoicalTaskState_Paused = -1,//目前没用
UMSoicalTaskState_Ready = 1,
UMSoicalTaskState_Executing = 2,
UMSoicalTaskState_ExecutingDependency = 3,
UMSoicalTaskState_Finished = 4,
UMSoicalTaskState_Canceled = 5,//目前没有用
UMSoicalTaskState_Error = 6,
};
/**
* task完成的回调
*
* @param result 返回的数据
* @param error @see NSError
*/
typedef void (^UMSocialTaskCompletion)(id result,NSError* error);
/**
* task error
*/
extern NSString* const UMSoicalTaskErrorDomain;
extern NSString* const UMSoicalTaskErrorUserInfoKey;
typedef NS_ENUM(NSInteger, UMSoicalTaskErrorType)
{
UMSoicalTaskErrorType_UnKnown,
UMSoicalTaskErrorType_ParameterError,//参数错误 例如没有设置OperationQueue等
UMSoicalTaskErrorType_CFNetworkErrors, //http的请求的错误 @see CFNetworkErrors,该错误放在UMSoicalTaskErrorUserInfoKey为key的字典中
UMSoicalTaskErrorType_UMSoicalServerCode,//服务器的错误,根据当前UMSocial服务器的错误码文档来区分
};
extern NSError* errorWithSoicalTaskError(UMSoicalTaskErrorType taskErrorType,id userInfo);
@@ -0,0 +1,32 @@
//
// UMSocialTaskManager.h
// UMSocialSDK
//
// Created by 张军华 on 16/8/12.
// Copyright © 2016年 dongjianxiong. All rights reserved.
//
#import <Foundation/Foundation.h>
@class UMSocialTask;
@class UMSocialTaskOperation;
NS_ASSUME_NONNULL_BEGIN
/**
* 所有task的管理类
*/
@interface UMSocialTaskManager : NSObject
+(instancetype)shareManager;
/**
* 创建好task直接执行task
*
* @param task @see UMSocialTask
*/
-(void)addAndExcuteSocialTask:(UMSocialTask*)task;
@end
NS_ASSUME_NONNULL_END
@@ -0,0 +1,77 @@
/* A single strings file, whose title is specified in your preferences schema. The strings files provide the localized content to display to the user for each of your preferences. */
//core模块的平台相关
"core_platform_error_1" = "创建相应平台失败:%@\n请检查:\n1、平台类已实现<UMSocialPlatformProvider>协议\n2、此平台枚举值在正常枚举区间内,参考UMSocialPlatformConfig.h —> UMSocialPlatformType枚举。 参考链接检查 https://at.umeng.com/mKfWve?cid=2723";
"core_platform_error_2" = "创建平台失败:%@ 参考链接检查 https://at.umeng.com/mKfWve?cid=2723";
"core_platform_warn_1" = "平台检查失败:%@,请检查是否实现 @selector(socialPlatformType),参考UMSocialPlatformConfig.h头文件说明。 参考链接检查 https://at.umeng.com/mKfWve?cid=2723";
"core_platform_warn_2" = "平台异常:%@ > 未实现相应方法:@selector(umSocial_setAppKey:withAppSecret:withRedirectURL:)";
//core模块认证相关
"core_auth_error_1" = "未发现平台相应类:%@\n请检查:\n1、平台类已实现<UMSocialPlatformProvider>协议\n2、此平台枚举值在正常枚举区间内,参考UMSocialPlatformConfig.h —> UMSocialPlatformType枚举。 参考链接检查 https://at.umeng.com/mKfWve?cid=2723";
"core_auth_error_2" = "未实现<UMSocialPlatformProvider>协议方法@selector(umSocial_AuthorizeWithUserInfo:withViewController:withCompletionHandler:)%@";
"core_auth_error_3" = "未实现<UMSocialPlatformProvider>协议方法@selector(umSocial_cancelAuthWithCompletionHandler:)%@";
"core_auth_error_4" = "未发现平台相应类:%@\n请检查:\n1、平台类已实现<UMSocialPlatformProvider>协议\n2、此平台枚举值在正常枚举区间内,参考UMSocialPlatformConfig.h —> UMSocialPlatformType枚举。 参考链接检查 https://at.umeng.com/mKfWve?cid=2723";
"core_auth_error_5" = "未实现<UMSocialPlatformProvider>协议方法@selector(umSocial_AuthorizeWithUserInfo:withCompletionHandler:)%@";
"core_auth_error_6" = "平台%@分享时,传入的参数currentViewController应该是nil或者是继承UIViewController的子类";
//core模块获得用户资料相关
"core_getuserinfo_error_1" = "未发现平台相应类:%@\n请检查:\n1、平台类已实现<UMSocialPlatformProvider>协议\n2、此平台枚举值在正常枚举区间内,参考UMSocialPlatformConfig.h —> UMSocialPlatformType枚举。 参考链接检查 https://at.umeng.com/mKfWve?cid=2723";
"core_getuserinfo_error_2" = "未实现<UMSocialPlatformProvider>协议方法@selector(umSocial_RequestForUserProfileWithViewController:completion:)%@";
"core_getuserinfo_error_3" = "平台%@分享时,传入的参数currentViewController应该是nil或者是继承UIViewController的子类";
//core模块分享相关
"core_share_error_1" = "传入平台('%@')的UMSocialMessageObject类型参数messageObject的数据类型无效,请检查\n1.messageObject是否空。\n2.messageObject.text和messageObject.shareObject是否同时为空";
"core_share_error_2" = "未发现平台相应类:%@\n请检查:\n1、平台类已实现<UMSocialPlatformProvider>协议\n2、此平台枚举值在正常枚举区间内,参考UMSocialPlatformConfig.h —> UMSocialPlatformType枚举。 参考链接检查 https://at.umeng.com/mKfWve?cid=2723";
"core_share_error_3" = "未实现<UMSocialPlatformProvider>协议方法@selector(umSocial_ShareWithObject:withCompletionHandler:)%@";
"core_share_error_4" = "未发现平台相应类:%@\n请检查:\n1、平台类已实现<UMSocialPlatformProvider>协议\n2、此平台枚举值在正常枚举区间内,参考UMSocialPlatformConfig.h —> UMSocialPlatformType枚举。 参考链接检查 https://at.umeng.com/mKfWve?cid=2723";
"core_share_error_5" = "未实现<UMSocialPlatformProvider>协议方法@selector(umSocial_ShareWithObject:withViewController:withCompletionHandler:)%@";
"core_share_error_6" = "平台%@分享时,传入的参数currentViewController应该是nil或者是继承UIViewController的子类";
//wechat
"wechat_auth_error_1" = "请检查是否设置了微信的URLSchema。参考链接检查 https://at.umeng.com/O1Lryy?cid=2723";
"wechat_getuserinfo_error_1" = "请检查是否设置了微信的URLSchema。参考链接检查 https://at.umeng.com/O1Lryy?cid=2723";
"wechat_share_error_1" = "请检查是否设置了微信的URLSchema。参考链接检查 https://at.umeng.com/O1Lryy?cid=2723";
"wechat_share_error_2" = "分享前,请检查微信是否安装。参考链接检查 https://at.umeng.com/1DCO5D?cid=2723";
"wechat_share_error_3" = "当前的sdk不支持微信的OpenAPI,请更新最新的微信SDK。";
"wechat_share_error_4" = "微信分享不支持的分享类型,微信的分享类型为:文本,图片,网络链接,音乐链接,视频链接,Gif表情,文件。";
"wechat_share_error_5" = "下载UMShareImageObject的shareImage失败,请检查图片参数是否正确。(本地图片,请检查是否赋值,网络图片请检查是否为https,防止下载失败)。";
"wechat_shareWebPage_warn_1" = "微信分享网页链接的时候,提供的缩略图为错误的下载url或者下载失败,具体的原因如下:%@";
"wechat_shareWebPage_warn_2" = "微信分享网页链接的时候,提供的缩略图为错误的下载url或者下载失败。";
"wechat_shareImage_warn_1" = "微信分享图片的时候,提供的缩略图为为错误的下载url或者下载失败,具体的原因如下:%@";
"wechat_shareImage_warn_2" = "微信分享图片的时候,提供的缩略图为为错误的下载url或者下载失败。";
//qq
"qq_auth_error_1" = "请检查是否设置了QQ的URLSchema。参考链接检查 https://at.umeng.com/aeuC0D?cid=2723";
"qq_auth_error_2" = "授权失败,点击qq授权没有跳转,请查看是否设置了appid,查看初始化函数:[[UMSocialManager defaultManager] setPlaform:UMSocialPlatformType_QQ appKey:??? appSecret:nil redirectURL:???];";
"qq_getuserinfo_error_1" = "请检查是否设置了QQ的URLSchema。 参考链接检查 https://at.umeng.com/aeuC0D?cid=2723";
"qq_getuserinfo_info_1" = "提示获得用户信息的时候是否清除缓存,可以设置UMSocialGlobal的isClearCacheWhenGetUserInfo变量来改变,默认是每次都清除用户的授权缓存";
"qq_share_error_1" = "请检查是否设置了QQ的URLSchema。 参考链接检查 https://at.umeng.com/aeuC0D?cid=2723";
"qq_share_error_2" = "请检查是否安装了QQ。参考链接检查 https://at.umeng.com/1nu05b?cid=2723";
"qq_share_error_3" = "请检查当前的SDK是否支持API调用,如果不能请升级SDK或者QQ的版本。";
"qq_share_error_4" = "QQ分享不支持的分享类型,QQ的分享类型为:文本,图片,网络链接,音乐链接,视频链接。";
"qq_shareWebPage_warn_1" = "QQ分享网页链接的时候,提供的缩略图为错误的下载url或者下载失败,具体的原因如下:%@";
"qq_shareWebPage_warn_2" = "QQ分享网页链接的时候,提供的缩略图为错误的下载url或者下载失败";
//sina
"sina_auth_error_1" = "请检查是否设置了sina的URLSchema。 参考链接检查 https://at.umeng.com/ju49Du?cid=2723";
"sina_getuserinfo_error_1" = "请检查是否设置了sina的URLSchema。 参考链接检查 https://at.umeng.com/ju49Du?cid=2723";
"sina_share_error_1" = "请检查是否设置了sina的URLSchema。 参考链接检查 https://at.umeng.com/ju49Du?cid=2723";
"sina_share_error_2" = "新浪分享不支持的分享类型,新浪的分享类型为:文本,图片,图文,网络链接,音乐链接,视频链接。";
"sina_shareWebPage_error_1"="新浪分享webpage类型(需要强制加入缩略图)错误,具体原因如下:%@";
"sina_shareText_Info_1" = "新浪文本分享最大的字是140个,如果超过就不能分享成功,sdk默认开启截断功能,如果需要停止截断需要在调用分享前加入代码[UMSocialGlobal shareInstance].isTruncateShareText=NO";
//facebook
"facebook_share_error_1" = "facebook分享不支持的分享类型,facebook的分享类型为:文本,图片,网络链接,音乐链接,视频链接。(新版的facebook采用的是对话框的形式分享的,如果设置文本的话需要有publish_actions权限调用OpenAPI)";
@@ -0,0 +1,77 @@
/* A single strings file, whose title is specified in your preferences schema. The strings files provide the localized content to display to the user for each of your preferences. */
//core模块的平台相关
"core_platform_error_1" = "创建相应平台失败:%@\n请检查:\n1、平台类已实现<UMSocialPlatformProvider>协议\n2、此平台枚举值在正常枚举区间内,参考UMSocialPlatformConfig.h —> UMSocialPlatformType枚举。 参考链接检查 https://at.umeng.com/mKfWve?cid=2723";
"core_platform_error_2" = "创建平台失败:%@ 参考链接检查 https://at.umeng.com/mKfWve?cid=2723";
"core_platform_warn_1" = "平台检查失败:%@,请检查是否实现 @selector(socialPlatformType),参考UMSocialPlatformConfig.h头文件说明。 参考链接检查 https://at.umeng.com/mKfWve?cid=2723";
"core_platform_warn_2" = "平台异常:%@ > 未实现相应方法:@selector(umSocial_setAppKey:withAppSecret:withRedirectURL:)";
//core模块认证相关
"core_auth_error_1" = "未发现平台相应类:%@\n请检查:\n1、平台类已实现<UMSocialPlatformProvider>协议\n2、此平台枚举值在正常枚举区间内,参考UMSocialPlatformConfig.h —> UMSocialPlatformType枚举。 参考链接检查 https://at.umeng.com/mKfWve?cid=2723";
"core_auth_error_2" = "未实现<UMSocialPlatformProvider>协议方法@selector(umSocial_AuthorizeWithUserInfo:withViewController:withCompletionHandler:)%@";
"core_auth_error_3" = "未实现<UMSocialPlatformProvider>协议方法@selector(umSocial_cancelAuthWithCompletionHandler:)%@";
"core_auth_error_4" = "未发现平台相应类:%@\n请检查:\n1、平台类已实现<UMSocialPlatformProvider>协议\n2、此平台枚举值在正常枚举区间内,参考UMSocialPlatformConfig.h —> UMSocialPlatformType枚举。 参考链接检查 https://at.umeng.com/mKfWve?cid=2723";
"core_auth_error_5" = "未实现<UMSocialPlatformProvider>协议方法@selector(umSocial_AuthorizeWithUserInfo:withCompletionHandler:)%@";
"core_auth_error_6" = "平台%@分享时,传入的参数currentViewController应该是nil或者是继承UIViewController的子类";
//core模块获得用户资料相关
"core_getuserinfo_error_1" = "未发现平台相应类:%@\n请检查:\n1、平台类已实现<UMSocialPlatformProvider>协议\n2、此平台枚举值在正常枚举区间内,参考UMSocialPlatformConfig.h —> UMSocialPlatformType枚举。 参考链接检查 https://at.umeng.com/mKfWve?cid=2723";
"core_getuserinfo_error_2" = "未实现<UMSocialPlatformProvider>协议方法@selector(umSocial_RequestForUserProfileWithViewController:completion:)%@";
"core_getuserinfo_error_3" = "平台%@分享时,传入的参数currentViewController应该是nil或者是继承UIViewController的子类";
//core模块分享相关
"core_share_error_1" = "传入平台('%@')的UMSocialMessageObject类型参数messageObject的数据类型无效,请检查\n1.messageObject是否空。\n2.messageObject.text和messageObject.shareObject是否同时为空";
"core_share_error_2" = "未发现平台相应类:%@\n请检查:\n1、平台类已实现<UMSocialPlatformProvider>协议\n2、此平台枚举值在正常枚举区间内,参考UMSocialPlatformConfig.h —> UMSocialPlatformType枚举。 参考链接检查 https://at.umeng.com/mKfWve?cid=2723";
"core_share_error_3" = "未实现<UMSocialPlatformProvider>协议方法@selector(umSocial_ShareWithObject:withCompletionHandler:)%@";
"core_share_error_4" = "未发现平台相应类:%@\n请检查:\n1、平台类已实现<UMSocialPlatformProvider>协议\n2、此平台枚举值在正常枚举区间内,参考UMSocialPlatformConfig.h —> UMSocialPlatformType枚举。 参考链接检查 https://at.umeng.com/mKfWve?cid=2723";
"core_share_error_5" = "未实现<UMSocialPlatformProvider>协议方法@selector(umSocial_ShareWithObject:withViewController:withCompletionHandler:)%@";
"core_share_error_6" = "平台%@分享时,传入的参数currentViewController应该是nil或者是继承UIViewController的子类";
//wechat
"wechat_auth_error_1" = "请检查是否设置了微信的URLSchema。参考链接检查 https://at.umeng.com/O1Lryy?cid=2723";
"wechat_getuserinfo_error_1" = "请检查是否设置了微信的URLSchema。参考链接检查 https://at.umeng.com/O1Lryy?cid=2723";
"wechat_share_error_1" = "请检查是否设置了微信的URLSchema。参考链接检查 https://at.umeng.com/O1Lryy?cid=2723";
"wechat_share_error_2" = "分享前,请检查微信是否安装。参考链接检查 https://at.umeng.com/1DCO5D?cid=2723";
"wechat_share_error_3" = "当前的sdk不支持微信的OpenAPI,请更新最新的微信SDK。";
"wechat_share_error_4" = "微信分享不支持的分享类型,微信的分享类型为:文本,图片,网络链接,音乐链接,视频链接,Gif表情,文件。";
"wechat_share_error_5" = "下载UMShareImageObject的shareImage失败,请检查图片参数是否正确。(本地图片,请检查是否赋值,网络图片请检查是否为https,防止下载失败)。";
"wechat_shareWebPage_warn_1" = "微信分享网页链接的时候,提供的缩略图为错误的下载url或者下载失败,具体的原因如下:%@";
"wechat_shareWebPage_warn_2" = "微信分享网页链接的时候,提供的缩略图为错误的下载url或者下载失败。";
"wechat_shareImage_warn_1" = "微信分享图片的时候,提供的缩略图为为错误的下载url或者下载失败,具体的原因如下:%@";
"wechat_shareImage_warn_2" = "微信分享图片的时候,提供的缩略图为为错误的下载url或者下载失败。";
//qq
"qq_auth_error_1" = "请检查是否设置了QQ的URLSchema。参考链接检查 https://at.umeng.com/aeuC0D?cid=2723";
"qq_auth_error_2" = "授权失败,点击qq授权没有跳转,请查看是否设置了appid,查看初始化函数:[[UMSocialManager defaultManager] setPlaform:UMSocialPlatformType_QQ appKey:??? appSecret:nil redirectURL:???];";
"qq_getuserinfo_error_1" = "请检查是否设置了QQ的URLSchema。 参考链接检查 https://at.umeng.com/aeuC0D?cid=2723";
"qq_getuserinfo_info_1" = "提示获得用户信息的时候是否清除缓存,可以设置UMSocialGlobal的isClearCacheWhenGetUserInfo变量来改变,默认是每次都清除用户的授权缓存";
"qq_share_error_1" = "请检查是否设置了QQ的URLSchema。 参考链接检查 https://at.umeng.com/aeuC0D?cid=2723";
"qq_share_error_2" = "请检查是否安装了QQ。参考链接检查 https://at.umeng.com/1nu05b?cid=2723";
"qq_share_error_3" = "请检查当前的SDK是否支持API调用,如果不能请升级SDK或者QQ的版本。";
"qq_share_error_4" = "QQ分享不支持的分享类型,QQ的分享类型为:文本,图片,网络链接,音乐链接,视频链接。";
"qq_shareWebPage_warn_1" = "QQ分享网页链接的时候,提供的缩略图为错误的下载url或者下载失败,具体的原因如下:%@";
"qq_shareWebPage_warn_2" = "QQ分享网页链接的时候,提供的缩略图为错误的下载url或者下载失败";
//sina
"sina_auth_error_1" = "请检查是否设置了sina的URLSchema。 参考链接检查 https://at.umeng.com/ju49Du?cid=2723";
"sina_getuserinfo_error_1" = "请检查是否设置了sina的URLSchema。 参考链接检查 https://at.umeng.com/ju49Du?cid=2723";
"sina_share_error_1" = "请检查是否设置了sina的URLSchema。 参考链接检查 https://at.umeng.com/ju49Du?cid=2723";
"sina_share_error_2" = "新浪分享不支持的分享类型,新浪的分享类型为:文本,图片,图文,网络链接,音乐链接,视频链接。";
"sina_shareWebPage_error_1"="新浪分享webpage类型(需要强制加入缩略图)错误,具体原因如下:%@";
"sina_shareText_Info_1" = "新浪文本分享最大的字是140个,如果超过就不能分享成功,sdk默认开启截断功能,如果需要停止截断需要在调用分享前加入代码[UMSocialGlobal shareInstance].isTruncateShareText=NO";
//facebook
"facebook_share_error_1" = "facebook分享不支持的分享类型,facebook的分享类型为:文本,图片,网络链接,音乐链接,视频链接。(新版的facebook采用的是对话框的形式分享的,如果设置文本的话需要有publish_actions权限调用OpenAPI)";