通过shareSDK分享链接,通过scheme传参到IOS和安卓.棋牌游戏只需要这些,丢掉魔窗吧

最近独立完成一个棋牌项目,对,没错,服务器,客户端都是我自己一个人完成的,真是累的想死.

服务器用的是photon,客户端用unity,客户端使用ab实现资源热更.时间太紧也就没做lua的代码热更了.

撸代码的过程就是一个苦力活,没什么好说的,最后项目结束的时候遇到了麻烦,

根据甲方要求,要接入shareSDK做分享,魔窗或者moblink做跳转和传参.yaya语音做接入.

然后被yaya的SDK坑了半个月,跟他们的技术联调半个月,才把实时视频接完成.过程只想杀人.然后又被moblink坑了一星期,之前接好的跳转出问题了,天天找他们客户,

一星期后,他们客户告诉我,他们那边出了问题,让我下载最新SDK.好吧,反正是被第三方SDK坑惨了.于是我想到之前一个项目,自己实现了scheme的跳转,没用使用任何第三方

于是果断丢掉魔窗和moblink.


于是通过IOS和安卓的SCHEME自己来实现跳转和传参.因为棋牌只要求拉起APP,和传递房间号就可以了.于是花了2天时间搞定,一测试.yo,倍稳定,再也不怕第三方出问题导致跳不过去了!哈哈,


1.unity中代码实现获取参数的代码,并根据参数来处理

在需要的UI中实现OnApplicationPause()方法,当APP退出和唤醒的时候检查是否有参数传进来.

 /// <summary>
    /// app切换出去或者切换进来的时候会被调用.
    /// </summary>
    /// <param name="pause"></param>
    private void OnApplicationPause(bool pause)
    {
        //是切换出去
        if (pause)
        {
            //切换出去的时候清空暂时存储参数的地方
            APPsetting.ShareJionRoom = new Hashtable();
        }
        //是切换进来
        else
        {
            //获取参数
            shareStartApp();
            //检查是否有参数,并根据参数采取下一步操作
            CheckShareJionRoom();
        }
    }

实现获取参数的方法

#if UNITY_IOS
        //调用xcode中的方法
        [DllImport("__Internal")]
        private static extern string _nameType();
#endif

    /// <summary>
    /// 获取进入房间参数
    /// </summary>
    public void shareStartApp()
    {

       
        string StartApp = "";
        string iType = "";
        string iName = "";
        if (iType == "" && iName == "")
        {
#if UNITY_EDITOR || UNITY_STANDLONE
            Debug.Log("在PC或者编辑器中不获取进入房间的参数");
#elif UNITY_ANDROID
           
            using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
            {
              
                using (AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"))
                {
                    Debug.Log("UNITY_ANDROID res room AndroidJavaObject......"    );
                    //Android SDK 返回的数据格式为: type|name    例如进入房间1|123456
                     StartApp = jo.Call<string>("StartApp1", "随便什么");
                   
                    Debug.Log("UNITY_ANDROID res room  "   +StartApp );
                }
            }
#elif UNITY_IOS
           // _nameType()
            Debug.Log("UNITY_IOS res data  "  );
            StartApp = _nameType();
            Debug.Log("UNITY_IOS res data  " + StartApp  );

#endif
            if (StartApp != "")
            {
                Debug.Log("share link param " + StartApp);
                string[] StartApp_arr = StartApp.Split('|');
                if (StartApp_arr.Length == 2)
                {
                    iType = StartApp_arr[0];
                    iName = StartApp_arr[1];
                    Debug.Log("iType :" + iType + "iName :" + iName);
                    APPsetting.ShareJionRoom = new Hashtable();
                    APPsetting.ShareJionRoom[iType] = iName;
                }
            }
        }
        
    }


以上就完成了unity的代码

2/安卓中的代码.

在上面的代码中可以看到,安卓中必须有一个叫做StartApp1的方法,用来返回参数给unity.

2.1:第一步,使用eclips建立一个android工程,引用unity中的class.jar.报名需要与我们的unity的包名相同.

2.2:然后建立一个脚本.它必须继承于UnityPlayerActivity.我这里建立了一个叫做MainActivity的java脚本,需要引用一些东西,大家自己引用吧

public class MainActivity extends UnityPlayerActivity {
	public String _name = "";
	public String _type = "";
@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		
        Uri mLink = getIntent().getData();
        
        if(mLink != null){
        	_type = mLink.getQueryParameter("type");
        	_name= mLink.getQueryParameter("name");
         }

        
       
	}
public String StartApp1(String name) {
	
	Uri mLink = getIntent().getData();
        
        if(mLink != null){
         _type = mLink.getQueryParameter("type");
         _name= mLink.getQueryParameter("name");
         }
  
  Log.i(TAG, "有啊!   StartApp");
  Log.i(TAG, _type+"|"+_name);
  // if(name.equals("0")){
  
  String retrunVar=_type+"|"+_name;
  
  _type="";
  _name="";
  //调用过一次就清除掉,不然进行微信分享动作,或者接个电话的时候回到大厅就会再次调用这个数据!
  getIntent().setData(null);
  return retrunVar;
}

2.3-,好了,以上就完成了jar包的编写了,其中还可以写一些安卓的原生方法,例如看电池百分比,网络状态等.然后输出jar包


右键选择输出:

选择jar file->next

直接finish,

然后把得到的jar包丢到unity中的\Assets\Plugins\\Android\文件夹中.

2.4:编写AndroidManifest.xml文件,这个是安卓的配置页面,所有的安卓调用的东西都需要在这里编写,如果没有就在Assets\Plugins\\Android\文件夹中建立一个,shareSDK也会需要一个,还有微信分享的回调页面也会写在这里

<?xml version="1.0" encoding="utf-8"?>
<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.你的包名要和unity的一样.chess"
    xmlns:tools="http://schemas.android.com/tools"
    android:installLocation="preferExternal"
    android:versionCode="201"
    android:versionName="2.0.1">
    <supports-screens
        android:smallScreens="true"
        android:normalScreens="true"
        android:largeScreens="true"
        android:xlargeScreens="true"
        android:anyDensity="true"/>
  <uses-feature android:name="android.hardware.camera"/>
  <uses-feature
      android:name="android.hardware.camera.autofocus"
      android:required="false" />
  <uses-permission android:name="android.permission.GET_TASKS" />
  <uses-permission android:name="android.permission.INTERNET" />
  <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  <uses-permission android:name="android.permission.READ_PHONE_STATE" />
  <uses-permission android:name="android.permission.MANAGE_ACCOUNTS"/>
  <uses-permission android:name="android.permission.GET_ACCOUNTS"/>
  <uses-permission android:name="android.permission.RECEIVE_SMS" />
  <!-- 蓝牙分享所需的权限 -->
  <uses-permission android:name="android.permission.BLUETOOTH" />
  <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
  <!--yunva P2P video-->
  <uses-permission android:name="android.permission.INTERNET"/>
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
  <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
  <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
  <uses-permission android:name="android.permission.RECORD_AUDIO"/>
  <uses-permission android:name="android.permission.CAPTURE_AUDIO_OUTPUT"/>
  <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
  <uses-permission android:name="android.permission.BLUETOOTH"/>

  <uses-feature android:name="android.hardware.camera" />
  <uses-permission android:name="android.permission.CAMERA" />
  <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  <uses-permission android:name="android.permission.READ_CONTACTS" />
  <!-- 向SDCard写入数据权限 -->
  <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
  <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
  <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
  <uses-permission android:name="android.permission.CHANGE_CONFIGURATION" />
  <uses-feature android:name="android.hardware.camera.autofocus" />
	
    <application
		    android:name="com.mob.MobApplication"
        android:theme="@style/UnityThemeSelector"
        android:icon="@drawable/app_icon"
        android:label="@string/app_name"
        android:debuggable="true">
		
<activity android:name=".MainActivity"
                  android:label="@string/app_name" 
                 android:clearTaskOnLaunch="false"
				  android:launchMode="singleInstance"
                >
        <intent-filter>
          <action android:name="android.intent.action.MAIN" />
          <category android:name="android.intent.category.LAUNCHER" />
          <category android:name="android.intent.category.DEFAULT"/>
        </intent-filter>
        <intent-filter>
          <data android:scheme="你设置的scheme别名" />
          <action android:name="android.intent.action.VIEW" />
          <category android:name="android.intent.category.VIEW" />
          <category android:name="android.intent.category.DEFAULT" />
          <category android:name="android.intent.category.BROWSABLE" />
        </intent-filter>
        <meta-data android:name="unityplayer.UnityActivity" android:value="true"/>
        
      </activity>

     


<!-- shareSDK需要的-->
      <activity
             android:name="com.mob.tools.MobUIShell"
             android:configChanges="keyboardHidden|orientation|screenSize"
             android:theme="@android:style/Theme.Translucent.NoTitleBar"
             android:windowSoftInputMode="stateHidden|adjustResize" >


      </activity>

      <!-- 微信分享回调 -->
      <activity
          android:name=".wxapi.WXEntryActivity"
          android:theme="@android:style/Theme.Translucent.NoTitleBar"
          android:configChanges="keyboardHidden|orientation|screenSize"
          android:exported="true" />

          </application>
</manifest>


然后输出层安卓就可以了!


3:Ios编写部分,首先需要设置scheme,2种方式设置

3.1:unity中设置,在build setting->player setting中设置


可以设置多个scheme,我们自己需要一个,shareSDK也需要一个!其中一个必须和安卓的设置成一样的

3.2:Xcode中设置,与3.1随便选一种方式即可

3.3:xcode中编写代码

找到xcode中的入口文件,打开它,编写和实现需要的方法


添加我们再unity中调用的方法

//跳转传参需要的方法
static NSString * _name=@"";
static NSString * _type=@"";

extern "C"{
    char* _nameType(){
        
        
        NSLog(@"_name:被调用:%@",_name);
        NSLog(@"_type被调用:%@",_type);
        if (_name!=nil && _type!=nil && _name!= NULL && _type!= NULL){
            NSString *  string = [_type stringByAppendingString:@"|"];
            //NSString * str = @"1|123456";
            NSString * str = [string stringByAppendingString:_name];
            char * x = (char *)malloc(strlen([str UTF8String]) + 1);
            strcpy(x, [str UTF8String]);
            _name = @"";
            _type = @"";
            return x;
        }else{
            NSString * str = @"";
            char * x = (char *)malloc(strlen([str UTF8String]) + 1);
            strcpy(x, [str UTF8String]);
            return x;
        }
        
        
        
        //        char* x=(char*)malloc(strlen([@"hmok" UTF8String])+1);
        //        return x;
    }
}

实现并编写xcoede中的openurl方法(这个方法根据xcode版本不同有3个,最新的就是app openURL,保险起见3个都实现掉吧)

-(bool)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options{
   
    if([url query] == NULL){
        _name=@"";
        _type=@"";
        return YES;
    }
    NSString *string = [NSString stringWithString:[url query]];
    NSArray *array = [string componentsSeparatedByString:@"&"];
    [array enumerateObjectsUsingBlock:^(NSString *obj, NSUInteger idx, BOOL * _Nonnull stop) {
        NSArray *childArray = [obj componentsSeparatedByString:@"="];
        if (childArray.count > 1) {
            if([childArray.firstObject isEqual:@"name"])
            {
                _name = childArray.lastObject;
            }
            if([childArray.firstObject isEqual: @"type"])
            {
                _type = childArray.lastObject;
            }
            NSLog(@"%@",childArray.lastObject);
        }
    }];
    NSLog(@"_name:%@",_name);
    NSLog(@"_type:%@",_type);
    return YES;
}

OK,xcode中的相关代码也写完了,

另外shareSDK如果采用的不是自动打包方式的话需要添加mobappid和密码等信息到info:还有需要在unity中设置(其他的安卓sharesdk官网的配置就可以了)


或者在info.plist文件中添加

<key>MOBAppKey</key>
	<string>2278549adfc3b</string>
	<key>MOBAppSecret</key>
	<string>561ffa05dc4b2ad6b54c1a79793f9632</string>
	<key>LSApplicationQueriesSchemes</key>
	<array>
		<string>mcqiqi</string>
		<string>weixin</string>
	</array>

然后就可以了!输出安卓项目和IOS项目


你可以分享 http://www.你的网站.com/?name=123&type=abc的方式分享跳转链接.

当然在web上需要设置自动跳转到  

你设置的scheme://?name=123&type=abc(例如:  hmok://?name=321&type=bcd)

那么你再安卓或者IOS中就会主动拉起你的APP,并且传递参数进去了!

其实很简单,主要是要跨平台编写代码,还要熟悉各平台的东西!

好吧,我承认我对object-C完全不懂,里面的代码是请朋友写的;  (

最近真的好累,有没有轻松点的公司招人的,我想跳槽!只限湖南哦!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值