//
//  FunCellSDK.h
//  FunCellSDK
//
//  Created by 胡鑫 on 16/4/11.
//  Copyright © 2016年 huxin. All rights reserved.
//

#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0

#import <UserNotifications/UserNotifications.h>

#endif

typedef void(^SessionBlock)(NSData* data, NSURLResponse* response, NSError* error);

@protocol FunCellPlatformDelegate <NSObject>

@optional

/**
 *初始化成功回调
 */
- (void)FCPDInitSuccessCallback;

/**
 *注册或游客登录成功回调
 */
- (void)FCPDRegisterCloseCallback;

/**
 *登录成功回调
 *username:渠道uid
 *userID:平台uid
 *sessionID:时间戳
 *token:平台验证用的token
 *datadict:扩展返回参数,登录验证后平台服务器返回的所有数据
 */
- (void)FCPDLoginCallBack:(NSString *)username anduserid:(NSString *)userID andsessionid:(NSString *)sessionID andtoken:(NSString *)token anddatadict:(NSDictionary *)datadict;

/**
 *切换账号回调
 */
- (void)FCPDSwichAccountCallBack:(NSString *)username anduserid:(NSString *)userID andsessionid:(NSString *)sessionID andtoken:(NSString *)token anddatadict:(NSDictionary *)datadict;

/**
 *登陆失败回调
 *result值,失败时为@"fail",取消时为@"close"
 */
- (void)FCPDLoginFailOrClose:(NSString*)result;

/**
 *游戏中心关闭回调
 */
- (void)FCPDGameCenterCloseCallback;

/**
 *funcell平台查询完成订单号回调(已经弃用)
 *billNo:平台订单号
 *accessToken:平台验证用的token
 */
- (void)FCPDPayCallBack:(NSString *)billNo andaccesstoken:(NSString *)accessToken NS_DEPRECATED_IOS(7_0, 11_0, "Use -FCPDPaySuccessCallBack:andextdata: and -FCPDPayFailCallBack: and -FCPDPayCancelCallBack: and -FCPDPayClosePayPage:");

/**
 *渠道支付成功回调
 *billNo
 平台订单号
 *extData
 调用支付传入的附加字符串,透传参数
 */
- (void)FCPDPaySuccessCallBack:(NSString*)billNo andextdata:(NSString *)extData;

/**
 *渠道支付失败回调
 *information
 回调通知信息
 */
- (void)FCPDPayFailCallBack:(NSString*)information;

/**
 *渠道支付取消回调
 *information
 回调通知信息
 */
- (void)FCPDPayCancelCallBack:(NSString*)information;

/**
 *渠道回调支付关闭界面,网络请求失败,未知错误等
 *information
 回调通知信息
 */
- (void)FCPDPayClosePayPage:(NSString*)information;

/**
 *渠道支付回调
 *result: 支付结果回调，字典类型，key值如下：
 *          status: 支付状态，success / fail / cancel / close
 *          billNo: 平台订单号
 *         extData: 调用支付传入的附加字符串,透传参数
 *        currency: 货币类型
 *           money: 支付金额，单位元
 *          itemID: 商品ID
 *        itemName: 商品名称
 *          roleid: 角色ID
 *          zoneid: 服务器ID
 */
- (void)FCPDPayCallBack:(NSDictionary*)result;

/**
 *sdk通知游戏退出登录
 */
- (void)FCPDPlatformToGameLogout;

/**
 *获取充值列表
 */
- (void)FCPDGetPayListCallback:(NSString*)paylistresult;

/**
 *获取服务器列表回调
 */
- (void)FCPDGetServerListCallback:(NSString*)serverlist;

/**
 *获取公告列表回调
 */
- (void)FCPDGetNoticeListCallback:(NSString*)noticelist;

/**
 *分享结果反馈
 *sharetype
 传入的分享类型
 *state
 分享状态,成功:@"success"，失败:@"fail"，取消:@"cancel"
 *result
 分享返回的内容
 */
- (void)FCPDShareResult:(NSString*)sharetype andState:(NSString*)state andresult:(NSDictionary*)result;

- (void)FCPDPushNoticeResult:(NSDictionary*)result;

//-----------语音回调------------
/**
 * 进入房间成功回调
 */
- (void)FCVoiceEnterChatRoomSuccCallBack;

/**
 * 进入房间失败回调
 */
- (void)FCVoiceEnterChatRoomFailCallBack;

/**
 * 用户打开/关闭麦克风回调，只有在加入房间时参数autoSendStatus设为true时才会进入此回调
 * 返回mess为json字符串：{“strUserID”:"status"} 例如{“user001”:"1"}
 * status为 1:打开 0:关闭
 */
- (void)FCVoiceHostMicSTCallBack:(NSString*)mess;

/**
 * 用户打开/关闭扬声器回调，只有在加入房间时参数autoSendStatus设为true时才会进入此回调
 * 返回mess为json字符串：{“strUserID”:"status"} 例如{“user001”:"1"}
 * status为 1:打开 0:关闭
 */
- (void)FCVoiceHostSpeakSTCallBack:(NSString*)mess;

/**
 * “我”被打开/关闭麦克风回调，只有在加入房间时参数autoSendStatus设为true时才会进入此回调
 * 返回mess为json字符串：{“strUserID”:"status"} 例如{“user001”:"1"}
 * status为 1:打开 0:关闭
 */
- (void)FCVoiceUserMicSTCallBack:(NSString*)mess;

/**
 * “我”被打开/关闭扬声器回调，只有在加入房间时参数autoSendStatus设为true时才会进入此回调
 * 返回mess为json字符串：{“strUserID”:"status"} 例如{“user001”:"1"}
 * status为 1:打开 0:关闭
 */
- (void)FCVoiceUserSpeakSTCallBack:(NSString*)mess;

/**
 * “我”是否被屏蔽声音回调，只有在加入房间时参数autoSendStatus设为true时才会进入此回调
 * 返回mess为json字符串：{“strUserID”:"status"} 例如{“user001”:"1"}
 * status为 1:未屏蔽 0:屏蔽
 */
- (void)FCVoiceUserAvoidSTCallBack:(NSString*)mess;

/**
 * 房间成员列表变化回调，只有加入房间时参数needUserList设为true时才会进入此回调
 * 返回strUserIDs为用","分隔的房间所有成员id列表，包含自己
 */
- (void)FCVoiceTalkRoomMemberCallBack:(NSString*)strUserIDs;

/**
 * 返回即时通讯中的一些状态
 * messDict 字典中 type 表示返回的类型，分别有login 、logout 、joinroom 、 leaveroom 、sendTextMsg 、sendAudioMsg 、receiveTextMsg、 receiveAudioMsg、 downloadAudio
 * messDict 字典中 code 表示返回状态码，0表示成功、非0表示不成功
 */
- (void)FCVoiceIMCallback:(NSString*)mess;

@end

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0

@interface FunCellPlatform : NSObject <UNUserNotificationCenterDelegate>

#else

@interface FunCellPlatform : NSObject

#endif
{
    NSString* ns_serverid;
    NSString* ns_servername;
    NSString* ns_roleid;
    NSString* ns_rolename;
    NSString* ns_profession;
    NSString* ns_sharetype;
    
    int m_nrolelevel;
    int m_nrolepower;
    int m_nrolegold;
}

@property (nonatomic, assign) id<FunCellPlatformDelegate> funcellplatformdelegate;
@property (nonatomic, assign) BOOL IsShowLog;
@property (nonatomic, assign) BOOL IsChange;
@property (nonatomic, assign) BOOL IsShowToast;
@property (nonatomic, assign) BOOL IsInitChannelSuccess;
@property (nonatomic, assign) NSDictionary* logindatadict;

/**
 *单例
 */
+ (FunCellPlatform *)sharedInstance;

/**
 *初始化
 */
- (void)InitFuncellPlatform;
- (void)InitEveSuccess;

/**Loginverifycall
 *登陆
 */
- (void)Login;
- (void)Loginverifycallback:(NSString *)platformuid anduserid:(NSString *)fedid andsessionid:(NSString *)sessionID andtoken:(NSString *)token anddatadict:(NSDictionary *)datadict;

/**
 *支付
 *itemid
 商品id
 *itemName
 商品名字
 *type
 商品类型
 *num
 商品数量
 *money
 货币数量
 *currency
 货币类型
 *extData
 附加字段,透传参数
 *paysdktype
 支付sdk类型
 */
- (void)Pay:(NSString *)itemid anditemName:(NSString *)itemName andtype:(NSString *)type andnum:(int)num andmoney:(float)money andcurrency:(NSString *)currency andextdata:(NSString *)extData andpaysdktype:(NSString *)paysdktype;
/**
 *支付方法,为统一android接口,参数可以传字典,key值参考文档
 */
- (void)Pay:(NSDictionary* )PayParams;
- (void)PayVerifyCallBack:(NSString*)BillNo andAccessToken:(NSString*)accesstoken;

/**
 *获取支付列表
 */
- (void)GetPayList;
- (void)GetPayList:(NSString*)category;
- (void)PayListCallback:(NSString*)paylist;

/**
 *获取未完成订单,当前服，当前角色(登陆之后调用)(已经弃用)
 */
- (void)GetOrderList;

/**
 *获取服务器列表
 *whitekey
 白名单标识,没有填空字符，如:“”
 */
- (void)GetServerList:(NSString*)whitekey;
- (void)ServerListCallback:(NSString*)serverlist;

/**
 *获取公告列表
 *type
 公告类型
 *serverid
 服务器id，没有填空字符,如:""
 */
- (void)GetNoticeList:(NSString*)type andserverid:(NSString*)serverid;
- (void)NoticeListCalback:(NSString*)noticelist;

/**
 *获取平台支付sdk类型,默认appstore
 */
- (NSString*)GetPayType;

/**
 *获取平台gameid
 */
- (NSString*)GetGameID;

/**
 *获取平台编号
 */
- (int)GetPlatformID;

/**
 *获取平台名字
 */
- (NSString*)GetPlatformName;

/**
 *获取发现服返回结果
 */
- (NSString*)GetEveData;

/**
 *获取AccessToken
 */
- (NSString*)GetAccessToken;

/**
 *获取游戏的clientid
 */
- (NSString*)GetClientId;

/**
 *获取部分渠道的充值回调地址(非通知模式的渠道),eve返回的callback
 */
- (NSString*)GetPayCallbackUrl;

/**
 *获取部分渠道的充值回调地址(非通知模式的渠道),eve返回的pay字段
 */
- (NSString*)GetPayCallbackUrl2;

/**
 *获取平台当前订单
 */
- (NSString*)GetPlatfromOrder;

/**
 *获取当前账号是否绑定
 */
- (BOOL)GetBindAccountFlag;

/**
 *是否显示浮标,渠道sdk有开关才起作用
 */
- (void)showToolbar:(bool) bShow;
/**
 *设置浮标位置,渠道sdk有此接口才起作用
 */
- (void)settoolbarpoint:(float)pointx andy:(float)pointy;

/**
 *生成一个平台订单号
 */
- (NSString*)GetOrderString:(NSString*)itemid ItemType:(NSString*)type amount:(int)num ServerID:(NSString*)serverid RoleID:(NSString*)roleid andextData:(NSString*)extData;

/**
 *游戏处理完充值订单后反馈平台
 */
- (void)PayFeedback:(NSString*)billNo;

/**
 *游戏通知平台退出登录
 */
- (void)GameToPlatformLogout;
/**
 *游戏通知平台退出登录,等同于GameToPlatformLogout
 */
- (void)Logout;

/**
 *设置区号areaID和区名areeaName
 */
- (void)SetAreaInfo:(NSString*)areaID andAreaName:(NSString*)areeaName;

/**
 *设置角色信息
 *rolename:角色名
 *roleid:角色id
 *rolelevel:角色等级
 *profession:职业
 *power:战力
 *gold:财富
 */
- (void)SetRoleInfo:(NSString*)roleName androleID:(NSString*)roleid androlelevel:(int)rolelevel andProfession:(NSString*)profession andPower:(int)power andGold:(int)gold;

/**
 *获取uid(平台登陆验证返回的platform_uid)
 */
- (NSString*)GetPlatformUserName;

/**
 *获取用户平台id(平台登录验证返回的fed_id)
 */
- (NSString*)GetFedID;

/**
 *获取服务器名字
 */
- (NSString*)GetAreaName;

/**
 *获取服务器id
 */
- (NSString*)GetAreaID;

/**
 *获取角色名字
 */
- (NSString*)GetRoleName;

/**
 *获取角色id
 */
- (NSString*)GetRoleID;

/**
 *获取角色等级
 */
- (int)GetRoleLevel;

/**
 *获取角色职业
 */
- (NSString*)GetProfession;

/**
 *获取角色战力
 */
- (int)GetPower;

/**
 *获取角色金币(财富值)
 */
- (int)GetGold;

/**
 *是否打印SDK日志,默认YES打印日志
 */
- (void)setIsShowLog:(BOOL)IsShowLog;

/**
 *SDK 打印 Log方法 单条字符串
 */
- (void)FCPLog:(NSString*)str;

/**
 *是否显示Toast
 */
- (void)setIsShowToast:(BOOL)IsShowToast;

/**
 *获取打包工具后台配置的游戏参数，返回json字符串，如果未配置则返回nil
 */
- (NSString*)getCustomKey;

/**
 *网络请求Block异步Session
 *url
 请求地址
 *method
 请求方式,POST或者GET
 *header
 请求头,没有就填nil
 *pdata
 post的数据
 *bolck
 逻辑处理
 */
+ (void)SessionRequestDataTask:(NSString *)url andMethod:(NSString*)method andHeader:(NSDictionary*)header anddatastr:(NSString *)pdata andblock:(SessionBlock)block;

/**
 *网络请求同步Connection
 *strUrl
 请求地址
 *method
 请求方式,POST或者GET
 *strData
 post的数据
 */
+ (NSString *)FCdoSendHttpRequest:(NSString*)strUrl Method:(NSString*)method  PostData:(NSString*)strData;

/**
 *持续时间显示一个Tip后自动消失
 *text
 显示内容
 *time
 显示时间
 */
+ (void)FCShowAlertForTime:(NSString *)text andtime:(CGFloat)time;

/**
 * errorContent: 错误内容
 * type : 错误类型
 */
+ (void)FCFlumeError:(NSString*)errorContent andErrorType:(NSString *)type;

//-------------------------重做DealMessage写成函数形式-----------------
/**
 *用户中心
 */
- (void)FCDMUsercenter;

/**
 *论坛
 */
- (void)FCDMWebbbs;

/**
 *反馈页面
 */
- (void)FCDMWebbackup;

/**
 *统计功能
 */
- (void)FCDMWebtotal;

/**
 *创建角色
 */
- (void)FCDMCreaterole;

/**
 *进入游戏
 */
- (void)FCDMEntergame;

/**
 *等级变化
 */
- (void)FCDMLevelChange:(int)level;

/**
 *游戏激活
 */
- (void)FCDMGameActive;

/**
 *官方网站
 */
- (void)FCDMWeburl:(NSString*)url;

/**
 *统计完成了新手引导
 */
- (void)FCDMCompletedTutorial;

/**
 *打开facebook界面,某些国外渠道需要
 */
- (void)FCDMFacebookBtn;

//------------第三方推送-------------
/**
 *是否接受第三方sdk推送
 */
- (void)FCDMIsPush:(BOOL)ispush;

/**
 *分享多类型
 *sdktype 用哪个sdk分享,值参照文档 @"facebook" @"shrsdk"
 *sharetype 分享的类型,值参照文档 分享链接:@“link” 分享图片:@“photo” 点赞:@“like”(facebook支持)
 *values 分享的内容,key值参照文档
 key值参考:
 若sharetype为@“photo”,字典需要1个key: { @“image” ：UIImage对象 }
 若sharetype为@“like”,字典需要1个key: { @“likeurl” ：@“点赞链接” }
 若sharetype为@“link”,字典需要4个key:
 标题:@“title"
 图片链接:@“imageurl”
 内容说明:@“description”
 分享链接地址:@“contenturl”
 )
 */
- (void)FCDMShare:(NSString*)sdktype andShareType:(NSString*)sharetype withValues:(NSDictionary*)values;
/**
 *分享链接
 *AppName
 应用名
 *imageurl
 图片链接
 *despt
 内容说明
 *url
 分享的链接
 */
//- (void)FCDMShare:(NSString*)title pictureURL:(NSString*)imageurl description:(NSString*)despt linkUrl:(NSString*)url;

/**
 *点赞
 *objectid
 通过 objectID 属性将网址分配到赞
 */
//- (void)FCDMLike:(NSString*)objectid;

/**
 *第三方Event统计
 *eventName
 自定义事件的名字
 *values
 上传给统计sdk的数据,没有的事件可以传nil,支付统计的key参考文档
 *eventtype
 统计事件分类,funcellsdk定义的值,传值参考:
 登录:@“login”
 支付开始:@“purchase_open”
 支付关闭:@“purchase_close”
 支付取消:@“purchase_cancle”
 支付成功:@“purchase_success”(必须是这个字符串,并且values中包含AF标准定义key:af_revenue)
 完成新手引导:@“tutorial_completed”
 等级变化:@“level_achieved”
 创建角色:@“create_role”
 *sdktype
 调用哪种sdk,一般为sdk名字小写全称
 值可以有:@"facebook",@"appsflyer",@"all",all为所有sdk都调用
 */
- (void)FCDMThirdEvent:(NSString*)eventName withValues:(NSDictionary*)values andEventType:(NSString*)eventtype andSdkType:(NSString*)sdktype;

/**
 *  统计事件
 *  @param channelType 所要调用的接口的渠道，比如：reyun，appsflyer等
 *  @param event 统计的事件类型，比如：login，regist，purchase等
 *  @param params 参数列表，参数名 -> 值 的形式
 */
- (void)FCDMLogEvent:(NSString*)channelType event:(NSString*)event params:(NSDictionary*)params;

/**
 *显示官方gamecenter界面
 *leaderboardID
 排行榜或成就id,可以传空,显示默认界面
 */
- (void)FCDMShowGameCenterView:(NSString*)boardID;

/**
 *上传分数到排行榜
 *score
 上传的分数
 *identifier
 排行榜id
 */
- (void)FCDMreportScore:(int64_t)score forLeaderboardID:(NSString*)identifier;

/**
 *报告成就
 *identifier
 成就id
 *percent
 要报告的成就的进度
 */
- (void)FCDMreportAchievementIdentifier:(NSString*)identifier percentComplete:(float)percent;

/**
 *展示Helpshift
 */
- (void)FCDMHelpshiftView;

/**
 *显示账号绑定和切换界面
 */
- (void)FCDMShowFuncellAccount;

/**
 *设置统计sdk货币单位
 *currencyCode
 币种:RMB/USD…
 */
- (void)setAppsFlyerCurrencyCode:(NSString*)currencyCode;

/**
 *获取AppsFlyer Unique ID
 */
- (NSString*)getAppsFlyerUID;

/**
 *设置AppsFlyer  Customer User ID (用户账户ID)
 *userId
 用户ID
 */
- (void)setAppsFlyerCustomerUserId:(NSString*)userId;

/**
 *AppsFlyer基于深度链接Re-targeting广告追踪
 */
- (void)setAppsFlyerSendDeepLinkData;


//-----------------第三方异常统计接口----------------------
//SDK内部已经做了崩溃、闪退、卡顿监听

/**
 *  设置关键数据，随崩溃信息上报
 *  @param value KEY
 *  @param key VALUE
 */
- (void)FCCrashSetUserValue:(NSString *)value
                 forKey:(NSString *)key;

/**
 *  获取关键数据
 *  @return 关键数据, Json字符串
 */
- (NSString *)FCCrashAllUserValues;

/**
 *  上报异常
 *  @param name 异常信息名
 *  @param reason 异常信息原因
 *  @param userinfo 用户信息，为json字符串
 */
- (void)FCCrashReportExceptionWithName:(NSString*)name reason:(NSString*)reason userinfo:(NSString*)userinfo;

/**
 *  上报错误
 *  @param domain 错误信息Demain
 *  @param code 异常信息代码
 *  @param userinfo 用户信息，为json字符串
 */
- (void)FCCrashReportErrorWithDomain:(NSString*)domain errorCode:(NSInteger)code userInfo:(NSString*)userinfo;

/**
 *    打印日志并上传
 *    @param level 日志级别: 0为silent 1为Error，2位Warn，3为Info，4为Debug，5为Verbose
 *    @param message   日志内容 总日志大小限制为：字符串长度30k，条数200
 */
- (void)FCCrashLogWithLevel:(int)level logs:(NSString *)message;


//--------------------第三方语音接口-----------------------

/**
 * 设置扬声器静音 bSpeakerMute: true——静音，false——取消静音
 */
- (void)FCVoiceSetSpeakerMute:(bool)bSpeakerMute;

/**
 * 获取扬声器静音状态，返回：true——静音，false——取消静音
 */
- (bool)FCVoiceGetSpeakerMute;

/**
 * 设置麦克风静音,bMicrophoneMute: true——静音，false——取消静音
 */
- (void)FCVoiceSetMicrophoneMute:(bool)bMicrophoneMute;

/**
 * 获取麦克风静音状态,return true——静音，false——没有静音
 */
- (bool)FCVoiceGetMicrophoneMute;

/**
 * 获取音量大小,此音量值为程序内部的音量，与系统音量相乘得到程序使用的实际音量
 * return 音量值[0,100]
 */
- (unsigned int)FCVoiceGetCurrentVolume;

/**
 * 设置音量，音量值uiVolume[0,100]
 */
- (void)FCVoiceSetVolume:(unsigned int)uiVolume;

/**
 * 是否可使用移动网络 返回：true-可以使用，false-禁用
 */
- (bool)FCVoiceGetUseMobileNetworkStatus;

/**
 * 设置是否使用移动网络,参数bEnabled:true-可以启用，false-禁用
 */
- (void)FCVoiceSetUseMobileNetworkEnabled:(bool)bEnabled;

/**
 *  功能描述:加入房间
 *
 *  @param type 加入房间类型，1 主播模式, 2 听主播模式, 3 普通房间模式
 *  @param strUserID 用户ID，要保证全局唯一
 *  @param strRoomID 房间ID，要保证全局唯一
 *  @param needUserList 是否接收房间里的用户列表，并在有用户进出房间时获得更新信息。如果你要建立的是一个大型的房间（比如几百个人），那么这个值
 *                       通常应该设为false。
 *  @param needMic 是否启用麦克风，如果设为false, 则表明在整个通话过程只听不说， setMicrophoneMute()不起作用。
 *                  SDK会根据这个配置做一定的优化。如果你不确定应该选择哪个值，那么把这个值设为true.
 *  @param needSpeaker 是否启用扬声器，如果设为false, 则表明整个通话过程扬声器都不会有声音输出(比如：没有音频数据到达，或者全程带耳机等情况),
 *                      SDK会根据这个配置做一定的优化。 如果你不确定应该选择哪个值，那么把这个值设为true.
 *  @param autoSendStatus 每次扬声器，麦克风等状态改变时，把状态改变信息发送到同房间的其他人。如果你的应用不需要获取其他人的状态，请设为false,
 *                         避免流量浪费。
 */
- (void)FCVoiceJoinTalkRoomWithType:(int)type userID:(NSString *)strUserID roomID:(NSString *)strRoomID userList:(bool)needUserList mic:(bool)needMic speaker:(bool)needSpeaker andAutoSendStatus:(bool)autoSendStatus;

/**
 * 离开房间
 */
- (void)FCVoiceLeaveTalkRoom;

/**
 * 控制其他人的麦克风开关
 * 参数strUserID:用户ID，要保证全局唯一
 * 参数status:false关闭对方麦克风，true打开对方麦克风
 */
- (void)FCVoiceSetOtherMicStatus:(NSString *)strUserID status:(bool)status;

/**
 * 控制其他人的扬声器开关
 * 参数 strUserID:用户ID，要保证全局唯一
 * 参数 status:false关闭对方扬声器，true打开对方扬声器
 */
- (void)FCVoiceSetOtherSpeakerStatus:(NSString *)strUserID status:(bool)status;

/**
 * 屏蔽用户（选择消除其他人的语音）
 * 参数 strUserID: 用户ID，要保证全局唯一
 * 参数 status: false屏蔽对方语音，true取消屏蔽
 */
- (void)FCVoiceAvoidOtherVoiceStatus:(NSString *)strUserID status:(bool)status;

/**
 * 播放背景音乐
 *  参数 path 音乐文件的路径
 *  参数 bRepeat 是否重复播放
 *  参数 mode: 0 背景音乐混合到输出语音，并通过扬声器播出
 *            1 背景音乐混合到麦克风语音，并一起发送给接收端
 */
- (void)FCVoicePlayBackgroundMusic:(NSString *)path repeat:(bool)bRepeat mode:(int)mode;

/**
 * 停止背景音乐
 */
- (void)FCVoiceStopBackgroundMusic;

/**
 * 设置背景音乐音量
 * 参数 mode: 0 背景音乐混合到输出语音，并通过扬声器播出
 *           1 背景音乐混合到麦克风语音，并一起发送给接收端
 * 参数 bgVolume 背景音乐的音量，范围 0-100
 */
- (void)FCVoiceSetBgMusicVolume:(int)mode volume:(unsigned int)bgVolume;

/**
 * 设置监听，设置是否将麦克风声音旁路到扬声器输出，可以为主播等提供监听自己声音和背景音乐的功能
 * 参数 enabled: true 旁路到扬声器，false 不旁路
 */
- (void)FCVoiceSetMicBypassToSpeaker:(bool)enabled;

/**
 * 监听卡拉ok模式下设置音乐的延迟
 * 参数delay: 0~400 ms, 以20ms为单位
 */
- (void)FCVoiceSetBgMusicDelay:(int)delay;

/**
 * 暂停通话，释放麦克风等设备资源
 */
- (void)FCVoicePauseVoice;

/**
 * 恢复通话
 */
- (void)FCVoiceResumeVoice;

#pragma mark - IM接口

/**
 * 登录房间
 * userId 为全局唯一id
 */
- (void)FCIMLogin:(NSString*)userId;

/**
 * 退出房间
 */
- (void)FCIMLogout;

/**
 * 加入聊天房间，在登录成功后调用
 * roomId 为全局唯一id
 */
- (void)FCIMJoinRoom:(NSString*)roomId;

/**
 * 离开聊天房间，在登录成功后调用
 * roomId 为全局唯一id
 */
- (void)FCIMLeaveRoom:(NSString*)roomId;

/**
 * 开始录制语音，声音录制超过60s将自动停止并发送
 * receiverID 接收者id，chatType为0时，receiverID为好友id；chatType为1时，receiverID为房间id
 * chatType 聊天类型，1-向单个好友发送，2-向整个房间成员发送
 */
- (void)FCIMStartRecord:(NSString*)receiverID chatType:(int)chatType;

/**
 * 取消录音
 */
- (void)FCIMCancelRecord;

/**
 * 停止录音并发送
 */
- (void)FCIMStopRecordAndSend;

/**
 * 发送文本信息
 * receiverID 接收者id，chatType为0时，receiverID为好友id；chatType为1时，receiverID为房间id
 * chatType 聊天类型，1-向单个好友发送，2-向整个房间成员发送
 * content 发送的文本内容
 */
- (void)FCIMSendTextMessage:(NSString*)receiverID chatType:(int)chatType content:(NSString*)content;

/**
 * 下载语音消息，通常在接收到消息回调后调用
 * messageID 需要下载的语音消息ID，在接收到消息回调中可以获得
 * path 下载语音保存路径，需要手动传入
 */
- (void)FCIMDownloadAudio:(unsigned long long)messageID path:(NSString*)path;

/**
 * 播放语音消息
 * path 待播放语音的路径
 */
- (void)FCIMPlayAudioVoice:(NSString*)path;

/**
 * 停止播放语音消息
 */
- (void)FCIMStopPlayAudioVoice;

//------------------提供SDK通用接口------------
/**
 * 提供SDK通用接口
 * pluginType : 调用的插件类型，如：语音@"voice", 分享@"share", 与funcellplugin.plist中的typePlugin一致。如果需调用FuncellChannel中的接口，pluginType传入参@"channel"
 * sdkType : 对应pluginType下的具体第三方sdk，比如：语音的第三方游密传参@"youme", 分享第三方facebook传参 @"facebook" 等，与funcellplugin.plist中的channel一致. 如果传入all，则可以执行pluginType下的所有第三方sdk。如果pluginType为@"channel", sdkType则需要传入@”funcellchannel“
 * function : 需要执行的 OC 方法名，字符串形式
 *   values : 该方法名需要的参数，以字典形式传入, 如果无参数就传入nil
 *    返回值 : 返回字典，字典的key为sdkType，value为对应的返回值，如果为空字典（没有任何key值）则方法返回为空
 */
- (NSDictionary*)FCCallFunctionWithPlugintype:(NSString*)pluginType sdkType:(NSString*)sdkType function:(NSString*)function values:(NSDictionary*)values;


//-------------------------周期函数-----------------------
/**
 *告诉代理启动基本完成程序准备开始运行
 */
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;

/**
 * no equiv. notification. return NO if the application can’t open for some reason
 *当用户通过其它应用启动本应用时，会回调这个方法，url参数是其它应用调用openURL:方法时传过来的。
 */
#ifdef __IPHONE_9_0
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options;
#endif

//Deprecated in iOS 9.0.
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation;

/**
 *与openURL类似,版本较老,可能在将来被废弃
 */
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url;

/**
 *当应用程序将要入非活动状态执行，在此期间，应用程序不接收消息或事件，比如来电话了
 */
- (void)applicationWillResignActive:(UIApplication *)application;

/**
 *当程序被推送到后台的时候调用。所以要设置后台继续运行，则在这个函数里面设置即可
 */
- (void)applicationDidEnterBackground:(UIApplication *)application;

/**
 *当程序从后台将要重新回到前台时候调用，与DidEnterBack方法相反。
 */
- (void)applicationWillEnterForeground:(UIApplication *)application;

/**
 *当应用程序入活动状态执行，与WillResign方法相反
 */
- (void)applicationDidBecomeActive:(UIApplication *)application;

/**
 *当程序将要退出是被调用，通常是用来保存数据和一些退出前的清理工作。这个需要要设置UIApplicationExitsOnSuspend的键值
 */
- (void)applicationWillTerminate:(UIApplication *)application;

/**
 *控制屏幕横竖向
 */
-(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window;

/**
 *一般用于消息推送,token登录
 *result一般用于第三方注册后返回结果，比如信鸽推送就会返回字符串的deviceToken
 */
-(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken;

//Local Push Handler
- (void)application:(UIApplication*)application didReceiveLocalNotification:(UILocalNotification *)notification;

/**
 *说明设备只有有限的内存，如果为应用程序分配了太多内存操作系统会终止应用程序的运行，在终止前会执行这个方法，通常可以在这里进行内存清理工作防止程序被终止
 */
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application;

- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler;

/**
 *token登录失败信息
 */
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error;

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo;

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler;

// iOS 10 新增 API
// iOS 10 会走新 API, iOS 10 以前会走到老 API
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0
// App 用户点击通知的回调，无论本地推送还是远程推送都会走这个回调
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)())completionHandler;

// App 在前台弹通知需要调用这个接口
- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler;
#endif


#if __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_7_0
#warning "Remote push open tracking is counted only when user touches notification center under iOS SDK 7.0"
// iOS version7 以下时,
- (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary *)userInfo;
#else
// iOS version7 以上时,
- (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler;
#endif

@end




