说一下技术背景,在我工作以来,我尚未在这个行业内做过这部份工作,而在写这份随笔的时候,这个已经是第二个版本了!作为第一次做这部份工作,我表示压力满大的,一个不好,可能就把队友给坑了,被坑的感觉是很不爽的!如果阅读在大大有更好的方案,可以直接回复我,指教一下新人!
我是一个手机游戏前端游戏开发者,在这一行内,如果游戏上线,我们会接到各种各样的平台的sdk,而且又有一些平台是有一些比较奇葩的需求的。就目前我能接到平台sdk就已经差不多100个,有无数个是我连听都没有听过的(太孤陋寡闻了我!bs一下自己),而且我用的是改版的cocos2dx(公司的一些所谓大牛改得面目全非,总之满满的都是泪!)!
先说一下先一套方案的做法吧,毕竟这样子,也方便大家了解一下我为什么会有这样的想法的之后第二个版本出现的原因!
方案一:
解释:
玩家行为:玩家通过点击一些按钮之类的操作,使之一与各种平台交互!
第三方sdk管理类(唯一):该类对玩完的行为进行处理(处理事件可分为:登陆,金流,其它),并且处理对第三方库进行调度。
第三方库:这个库是不同target不同的,比如有uc,91等。
现在其它方面我就不多说,主要是在第三方sdk管理类那里,在这模式里,该类处理了大量的sdk调度逻辑,使这奕得越来越庞大。维护越来越困难的节奏!所以,其于这种情况,在后面,我改了一下,出现了第二种模式!
方案二:
相对于第一个模式,在这个模式里面,我添另多了一个类,并对第三方sdk管理类作出一些修改。
想信很多人都能看得出有什么不同,还是回到核心去说!
第三方sdk里,在iOS上我采用的是object-c的动态特性,那样更加灵活。而在协助里面,我让所有sdkManager都继承了一个通用的接口,在第三方sdk管理类里,我直接使用接口即可!这样子的话,第个平台的相关处理都能独立处理!
比如下面就是我的接口类的一些方法!
#import <Foundation/Foundation.h>
/// 说明,项目使用的是非arc,所以请做好回收
@protocol SDKProtocol <NSObject >
-(void) initSDK;
-(void) doLogin;
-(void) doLogout;
-(void) doOpenCenter;
-(BOOL) getIsLogin;
-(void) doPay:(NSMutableDictionary*)param withBill:(void*)billvoid;
-(BOOL) application:(UIApplication *)application handleOpenURL:(NSURL *)url;
-(void) applicationWillEnterForeground:(UIApplication*)application;
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation;
-(BOOL) needMakeBill;
@end
/// 说明,项目使用的是非arc,所以请做好回收
@protocol SDKProtocol <NSObject >
-(void) initSDK;
-(void) doLogin;
-(void) doLogout;
-(void) doOpenCenter;
-(BOOL) getIsLogin;
-(void) doPay:(NSMutableDictionary*)param withBill:(void*)billvoid;
-(BOOL) application:(UIApplication *)application handleOpenURL:(NSURL *)url;
-(void) applicationWillEnterForeground:(UIApplication*)application;
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation;
-(BOOL) needMakeBill;
@end
而每个协助类的写法大体如下:
@interface PPSDKManager : NSObject <PPAppPlatformKitDelegate, SDKProtocol]] >
{
BOOL b_isLogin;
}
{
BOOL b_isLogin;
}
在android上就还是采用第一种,而我现在是每个sdk都是独立一个工程的,第个工程的XXXX,java都是不同的,所以在,android上,我还是每一种方案就可以了,本来java也想用第二种的,但那时候代码已经写了好多了,就不想改了!