TYPESDK手游聚合SDK客戶端設計思路與架構之三:iOS平臺統(tǒng)一化接口結構及思路

2018-06-14 16:09 更新

在上一篇《TypeSDK安卓平臺統(tǒng)一化接口結構及思路》中我們闡述了安卓平臺的接口結構和思路。在這里我們將闡述iOS平臺下的接口結構和思路。

       ios平臺主要是基于Objective-C的語言,總體的設計思路和安卓類似,具體實現(xiàn)的細節(jié)和接口的結構會有細微的不同。

       在ios平臺,我們會涉及到部分的c語法以及oc和c的混編,相對安卓需要注意點會多一點。

       那好,接下來我們來具體的闡述一下接口的結構,以及設計的思路。

       和安卓一樣,我們先來看看需要考慮的幾點需求。

一、相關的需求

       iOS平臺的統(tǒng)一化接口,我們需要考慮到具體以下的幾點:

       1.對外需要有統(tǒng)一的接口,保證不同的渠道sdk 對同一個游戲來說,是調(diào)用相同的接口,傳遞相同的參數(shù)

       2.對內(nèi)需要有一套擴展性很好的框架,可以應對不同渠道的sdk差異性

二、設計的模塊

       那么針對這些考慮點,安卓平臺的統(tǒng)一化接口,我們將主要分成以下幾個部分來設計:

       1.基礎架構設計

       2.具體渠道實現(xiàn)類

       3.統(tǒng)一化對外平臺接口

       4.跨平臺交互的設計

三、具體的細節(jié)


我們主要實現(xiàn)了這么一套結構

1.我們創(chuàng)建通用的基礎抽象類(BaseBonjour)。

       基于oc的特性,我們對基礎類添加了2個protocol,一個是必須實現(xiàn)的基礎接口,一個是可以不去實現(xiàn)的拓展接口的申明

       1.1 必須實現(xiàn)的基礎接口,我們做如下的定義

       1.1.1 初始化接口 @required -(void)InitSDK:(NSString*)_in_data;

       1.1.2  登錄接口 @required -(void)ShowLogin:(NSString*)_in_data;

       1.1.3 登出接口 @required -(void)ShowLogout;

       1.1.4 支付接口@required -(NSString*)PayItem:(NSString*)_in_data;

       1.1.5 顯示分享接口@required -(void)ShowShare:(NSString*)_in_data;

       1.2 非必需實現(xiàn)的拓展接口

       1.2.1 獲取緩存在ios層的用戶信息 @optional -(NSString*)GetUserData;

       1.2.2 獲取本地渠道的配置 @optional -(NSString*)GetPlatformData;

       1.2.3 根據(jù)函數(shù)名,調(diào)用具體實現(xiàn)類中的函數(shù)@optional -(NSString*)DoAnyFunction:(NSString*)_funcName withArgs:(NSString*)_json_string;

       1.2.4 大退游戲(殺進程) @optional -(void)ExitGame;

       1.2.4 提交玩家數(shù)據(jù) -(void)SetPlayerInfo:(NSString*)_in_data;

2.我們根據(jù)每一個渠道的sdk不同,單獨創(chuàng)建每個渠道自己的實現(xiàn)類Bonjour_xx。

       2.1 這個類繼承通用的框架基類(BaseBonjour)。

       2.2 在該框架下,實現(xiàn)基類所有的必需實現(xiàn)的抽象接口。如果沒有該接口的功能,也需要做出相應的處理,例如輸出log日志。

       2.3 同時該類可以增加渠道自有的特殊接口(例如獲取好友列表)

3.發(fā)布平臺有一個統(tǒng)一的給外部調(diào)用接口實現(xiàn)的類:TypeSDK

       3.1該類作為一個單例類,可以給在任何地方方便的提供接口的調(diào)用。

       3.2 該類的單利對象是框架基類對象(BaseBonjour)

       3.3 該類不是框架基類對象的子類

       3.4 通過配置文件,利用類名,創(chuàng)建基類對象的子類,該子類是該渠道的具體實現(xiàn)類,該子類賦值給單利對象

       3.5 所有的接口調(diào)用,通過獲取TypeSDK類的單利對象來調(diào)用

具體的實現(xiàn),可以參照以下一部分代碼

單例對象

static TypeBaseBonjour* sharedInstance = nil;

獲取單例對象的靜態(tài)函數(shù)


@implementation TypeSDK
 
+(TypeBaseBonjour*)GetIns
{
 
    if(nil == sharedInstance)
    {
        [self InitBonjourClass];
    }
    return sharedInstance;
}
@end

具體渠道實現(xiàn)類


@interface TypeBonjour_demo : TypeBaseBonjour
@end

通過類名動態(tài)創(chuàng)建子類對象


Class _cls = NSClassFromString(_type_name);
   
   if(_cls && [_cls isSubclassOfClass:[TypeBaseBonjour class]])
   {
            NSLog(@"success get bonjour class");
          sharedInstance = [[ _cls alloc]init];
               NSLog(@"share instance address %p",sharedInstance);
    }

這樣 我們就可以讓基礎框架,具體實現(xiàn),對外調(diào)用接口三方的耦合性進一步的降低。這三部分是可以完全各自獨立維護。   

4.跨平臺交互部分

       跨平臺交互我們需要考慮兩個方面

              a.如何將從發(fā)布平臺調(diào)用開發(fā)平臺函數(shù)

              b.如何將從開發(fā)平臺調(diào)用發(fā)布平臺函數(shù)

4.1.在ios層,我們只需要將需要給到unity調(diào)用的函數(shù)

       ios給unity調(diào)用,需要寫c的接口。c和oc混編,需要吧相關的類文件后綴名從.m修改成.mm

提供以下代碼參考



@implementation TypeSDKExtern
 
@end
 
#if defined(__cplusplus)
extern "C"
{
#endif
 
    void CallShowLogin ()
    {
       
             [[TypeSDK GetIns]ShowLogin:@""];
    }
   
   
#if defined(__cplusplus)
}
#endif


有關c接口代碼的一個注意點

       所有的返回值,需要返回的是常量,所以不能直接把原始oc代碼里的char*返回出去,需要拷貝一份常量返回出去

       切記c的代碼不要寫在oc的類申明里面

另有情提供2個非常有用的小函數(shù)



#if defined(__cplusplus)
extern "C"{
#endif
   
    //字符串轉(zhuǎn)化的工具函數(shù)
   
    NSString* SDKCreateNSString (const char* string)
    {
        if (string)
            return [NSString stringWithUTF8String: string];
        else
            return [NSString stringWithUTF8String: ""];
    }
   
    char* SDKMakeStringCopy( const char* string)
    {
        if (NULL == string) {
            return NULL;
        }
        char* res = (char*)malloc(strlen(string)+1);
        strcpy(res, string);
        return res;
    }
   
   
#if defined(__cplusplus)
}
#endif

第一個函數(shù)是把 char*類型數(shù)據(jù)轉(zhuǎn)換成nsstring*

第二個函數(shù)是 char*的拷貝函數(shù)

在unity中的調(diào)用oc層面的c接口舉例



[DllImport("__Internal")]
private static extern void CallShowLogin ();
public void ShowLogin()
{
       CallShowLogin();
}


在cocos2dx中調(diào)用c接口舉例


extern void CallShowLogin ();
 
void showLogin()
{
       CallShowLogin();
}

4.2.在unity層,提供了我們通用的跨平臺調(diào)用接口


extern void UnitySendMessage(const char *, const char *, const char *);

我們只需要知道unity部分用來接收消息的腳本名字,需要執(zhí)行的腳本函數(shù)名,以及傳遞的參數(shù),就可以調(diào)用unity的響應函數(shù)了。

       以下給出調(diào)用舉例



-(void)SendEvent:(NSString *)_notify_class_name withJson:(NSString *)_json_string
       {
               UnitySendMessage("TypeSDK" , [_notify_class_name UTF8String], [_json_string UTF8String]);
       }

綜上ios向unity平臺傳遞數(shù)據(jù)和調(diào)用函數(shù),主要通過消息機制發(fā)送消息

       unity向安ios平臺傳遞參數(shù)和調(diào)用函數(shù),則是直接調(diào)用oc層的c接口。

       以上就是我們ios發(fā)布平臺的聚合sdk設計思路細節(jié),下一章我們將講述unity聚合sdk的設計思路細節(jié)。


如果想了解更多,請聯(lián)系我們或關注官網(wǎng)

了解更多:www.typesdk.com

問題解答:1771930259

聯(lián)系郵箱:qianyuzhou@typesdk.com

項目地址:https://github.com/typesdk


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號