iOS ShareSDK橋接技術

摘要: 前言 在遊戲開發中,不免會出現與原平生臺有交互才能完成一些特定的必要的功能。好比iOS的內購功能,或者你想用一款第三方SDK,可是此SDK卻沒有對應平臺的版本、而且未提供插件的狀況下,就會涉及到與第三方平臺的交互。ios

前言swift

在遊戲開發中,不免會出現與原平生臺有交互才能完成一些特定的必要的功能。好比iOS的內購功能,或者你想用一款第三方SDK,可是此SDK卻沒有對應平臺的版本、而且未提供插件的狀況下,就會涉及到與第三方平臺的交互。框架

Unity3D工具

簡介:Unity3D(如下簡稱U3D)是由Unity Technologies開發的一個讓玩家輕鬆建立諸如三維視頻遊戲、建築可視化、實時三維動畫等類型互動內容的多平臺的綜合型遊戲開發工具,是一個全面整合的專業遊戲引擎。開發工具

Unity3D調用原生iOS接口動畫

Unity3D 沒法直接調用iOS原生的OC或者swift語言,可是Unity3D使用的C#能夠和C進行交互。而C是能夠和OC進行交互的。從而就能夠實現C#調用OC。插件

以ShareSDK的Unity橋接爲例:code

先定義 分享的C語言方法orm

void __iosShareSDKShare (int reqID, int platType, void *content, void *observer){

    NSMutableDictionary *shareParams = __getShareParamsWithString(contentStr);
    [ShareSDK share:platType
         parameters:shareParams
     onStateChanged:nil];
}

C#中則能夠像下面代碼同樣進行引入和調用:視頻

using System.Runtime.InteropServices;

[DllImport("__Internal")]
private static extern void __iosShareSDKShare (int reqID, int platType, string content, string observer);

其中DllImport爲一個Attribute,目的是經過非託管方式將庫中的方法導出到C#中進行使用。而傳入"__Internal"則是表示這個是一個靜態庫或者是一個內部方法。經過上面的聲明,這個方法就能夠在C#裏面進行調用了

好比Unity遊戲須要分享的時候直接調用下面方法就能夠了:

void ShareContent (int reqID, PlatformType platform, ShareContent content) 
{
    __iosShareSDKShare (reqID, (int)platform, content.GetShareParamsStr(), _callbackObjectName);
}

iOS 調用Unity的接口

在特定場景下也會有iOS接口調用Unity的C#接口的狀況,好比分享後回調的分享結果就要傳遞到原生的unity層。最簡單的方式是經過UnitySendMessage方法來調用Unity所定義的方法。

仍然以ShareSDK的回調爲例:

在Unity的裏ShareSDK.cs定義一個回調方法

private void _Callback (string data) {

    Debug.LogFormat ("result string = {0}", data);
}

掛載ShareSDK.cs到Main Camera中 在OC層,在ShareSDK的分享回調block執行UnitySendMessage

void __iosShareSDKShare (int reqID, int platType, void *content, void *observer)
    {
        NSMutableDictionary *shareParams = __getShareParamsWithString(contentStr);

        [ShareSDK share:platType
             parameters:shareParams
         onStateChanged:^(SSDKResponseState state, NSDictionary *userData, SSDKContentEntity *contentEntity, NSError *error) {

             NSString *resultStr = nil;
             // process resultStr
             // ...
             UnitySendMessage(observer, "_Callback", [resultStr UTF8String]);

        }];
    }

其中 observer值爲掛載的"Main Camera"

注意:UnitySendMessage方式沒法同步獲取返回值,而且必需要掛載到對象後才能調用,複雜需求可使用 非託管的方式進行交互,具體能夠參考:https://www.jianshu.com/p/1ab65bee6692

Cocos2d

是一個基於MIT協議的開源框架,用於構建遊戲、應用程序和其餘圖形界面交互應用。可讓你在建立本身的多平臺遊戲時節省不少的時間。

因爲主流的cocos2d遊戲開發語言是C++,而C++ 和OC是能夠直接交互的,只需把OC的實現文件.m修改成.mm便可,那麼只須要定義一個C++的接口直接調用OC既可

typedef void(*C2DXShareResultEvent) (int reqID, C2DXResponseState state, C2DXPlatType platType, C2DXDictionary *res);

void C2DXiOSShareSDK::shareContent(int reqID,C2DXPlatType platType, C2DXDictionary *content,bool useClientShare, C2DXShareResultEvent callback) {
    NSMutableDictionary *parameters = convertPublishContent(content);
    [ShareSDK share:(SSDKPlatformType)platType
         parameters:parameters
     onStateChanged:^(SSDKResponseState state, NSDictionary *userData, SSDKContentEntity *contentEntity, NSError *error) {

     // process callback ...

     //callback
     callback(reqID,(C2DXResponseState)state,(C2DXPlatType)platType,userInfoDict);
    }];
}
相關文章
相關標籤/搜索