iOS之通用SDK管理平台框架
常用第三方平台SDK管理
手机上的任何APP,几乎都会看到类似的需求功能:
支持第三方平台授权登陆
支持第三方平台授权分享
支持第三方平台授权支付
等等行为
常见的是
微信,qq,新浪微博,支付宝,易信等等
如果我们直接将对应的平台SDK拉进公司A项目里,开发完毕后,下半年公司另起锅灶开启新项目,同样的工作还是要在做一次,对于公司而言,缺少的是技术积累,对我们开发而言,同样的事情再做几次,缺少的是对工作和技术的总结。于是对于在维护着公司自家几个项目的人来说,实在痛苦,每次更新sdk时,都需要反复。于是便设计了一个企业下的通用sdk管理盒子,通过Cocoapods集成版本管理,释放开发的成本,缩短相应的开发时间。
盒子设计
SDK(登陆 - 分享 - 支付)统一管理平台,What is Needed By Imp-Protocol
设计一个由配置协议统一通用Api的盒子,方法暴露如下:
1)注册到某一个平台的入口Api
2)获取某一个的平台某一种特性下的执行单例,遵守统一协议,比如
最基本的注册协议
该平台可以分享则遵守分享协议
该平台可以支付则遵守支付协议
3)相关平台 : 常用的配置如下
旨在通过协议使得各个平台均可实现相关调用入口Api
基本协议:注册协议
其他扩展协议根据不同的平台遵守和实现
QQ : 注册协议 、 登陆协议、分享协议
微信: 注册协议 、 登陆协议、分享协议、支付协议
微博: 注册协议 、 登陆协议、分享协议
支付宝: 注册协议 、 支付协议
4)关系流程图
(遵守需要实现的协议)
|
|
|
Imp(平台协议实现类) <- - - - 根据Type获取 - - - - Manager - - - - - - 微信
- - - - - - QQ
- - - - - - 阿里支付
- - - - - - 微博
5)通过podspec文件灵活配置每个工程下需要的第三方sdk平台podfile
// Core 是盒子的基本代码,实现了一个盒子和协议内容。
// WithXXX 是对应平台的基本逻辑实现
// 通过编写podspec完成灵活配置平台和依赖关系
# 盒子
# pod 'SDKKit/Core', :git => 'git@std.xxx.cn:Lib/SDKKit.git'
# pod 'SDKKit/WithWechat', :git => 'git@std.xxx.cn:Lib/SDKKit.git'
# pod 'SDKKit/WithWeibo', :git => 'git@std.xxx.cn:Lib/SDKKit.git'
# pod 'SDKKit/WithQQ', :git => 'git@std.xxx.cn:Lib/SDKKit.git'
# pod 'SDKKit/WithAliPay', :git => 'git@std.xxx.cn:Lib/SDKKit.git'
代码展示
盒子的实现.h
#import <Foundation/Foundation.h>
#import "RegisterServer.h"
/** 各个平台插件声明 */
@class QQServerImp, WXServerImp, ALServerImp, WBServerImp;
@interface FrameworkManager : NSObject
/**
* 获取对应平台的服务单例对象,根据对应平台的服务单例对象的具体实现,满足或部分满足以下一些需求行为
* 可执行:注册行为、登陆行为、分享行为、支付行为等..
*/
+ (id<RegisterServer>)frameworkServiceImp:(managerType)platformType;
@end
盒子的实现.m
/**
* 根据Type获取对应的平台注册管理单例
*/
+ (id<RegisterServer>)frameworkImpPlatformType:(ManagerType)platformType{
NSString *platformName = nil;
switch (platformType) {
case ManagerTypeQQ:
{
# 是否集成了对应平台的判断
if (FrameworkQQ) {
platformName = @"QQServerImp";
}
}
break;
case ManagerTypeWechat:
{
if (FrameworkWechat) {
platformName = @"WXServerImp";
}
}
break;
case ManagerTypeAlipay:
{
if (FrameworkAlipay) {
platformName = @"ALServerImp";
}
}
break;
case MMFrameworkManagerTypeWeibo:
{
if (MMFrameworkWeibo) {
platformName = @"WBServerImp";
}
}
break;
case ManagerTypeNone:
default:
break;
}
if (platformName && [NSClassFromString(platformName) conformsToProtocol:@protocol(RegisterServer)]) {
id <RegisterServer> objc = [NSClassFromString(platformName) sharedService];
return objc;
}
return nil;
}
@end
举例子
1.注册协议
@protocol RegisterServer <NSObject>
@required
/**
* 每个注册SDK自行管理其服务单例
*/
+ (instancetype)sharedService;
@optional
/**
* 检测api
*/
- (BOOL)registerServerPlatformAppInstalled;
/**
* 注册api
* RegisterObject 是通用注册信息存储模型
*/
- (BOOL)registerServerToRegisterPlatform:(RegisterObject *)registerObject;
@end
总结建议
- 到这里基本一个由Protocol-Imp实现的盒子的设计基本思路已经完成,其他的需求行为还可以通过更多的协议来支持。
- 关于第三方的框架,如果是常用的框架,也建议多使用盒子封装多一层,后期的维护和升级方便很多,包括替换sdk的成本也降低了不少,日常开发里有如下但不局限于:网络请求库、提示信息库,异常信息上报库等等。