iOS ShareSDK橋接技術

前言

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

Unity3D

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

Unity3D調用原生iOS接口

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

以ShareSDK的Unity橋接為例:

先定義 分享的C語言方法

C#中則可以像下面代碼一樣進行引入和調用:

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

比如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); }];}
iOS ShareSDK橋接技術

[ShareSDK] 輕鬆實現社會化功能 強大的社交分享

[SMSSDK] 快速集成短信驗證 聯結通訊錄社交圈

[MobLink] 打破App孤島 實現Web與App無縫鏈接

[MobPush] 快速集成推送服務 應對多樣化推送場景

[Mob統計分析] 精準化行為分析 + 多維數據模型 + 匹配全網標籤 + 垂直行業分析顧問

BBSSDK | ShareREC | MobAPI | MobPay | ShopSDK | MobIM | App工廠

截止 2018 年4 月Mob 開發者服務平臺全球設備覆蓋超過 84 億,SDK下載量超過 3,300,000+次,服務超過 380,000+款移動應用


分享到:


相關文章: