记录一下,供自己查阅,帮到其他人更好。是自己的总结,仅供参考。
主要逻辑,检测手机上是否有APP,如果有,根据URL地址打开APP,如果没有,URL打开网页。
先附上app安卓包名、URL链接(前包名、后URL,URL链接可直接在IOS手机浏览器输入后打开验证):
抖音: com.ss.android.ugc.aweme snssdk1128://
微信: com.tencent.mm weixin://
哔哩哔哩: tv.danmaku.bili bilibli://
微博: com.sina.weibo weibo://
youtube: com.google.android.youtube youtube://
facebook: com.facebook.katana fb://
twitter: com.twitter.android twitter://
discord: com.discaord discord://
PS:如果想打开APP特定界面(例如直接打开某一APP的个人界面),需要打开的是每个APP对应的URL特殊路径,这个可以在网络上查找对应APP的URL路径格式(一般是开发者文档)。
一、安卓
安卓比较简单直接,直接使用C#代码调用Android代码,检测是否存在包名,如果有打开APP
//检测是否手机上安装了对应包名的APP
bool CheckAndroidContainPackage(string packageName)
{
AndroidJavaClass up = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject ca = up.GetStatic<AndroidJavaObject> ("currentActivity");
AndroidJavaObject packageManager = ca.Call<AndroidJavaObject>("getPackageManager");
AndroidJavaObject appList = packageManager.Call<AndroidJavaObject>("getInstalledPackages",0);
int num = appList.Call<int>("size");
for(int i = 0;i<num;i++)
{
AndroidJavaObject appInfo = appList.Call<AndroidJavaObject>("get",i);
string packageNew = appInfo.Get<string>("packageName");
if(packageNew.CompareTo(packageName) == 0)
{
return true;
}
}
return false;
}
//通过包名和URL打开APP
void OpenPackage (string packName , string path)
{
AndroidJavaClass up = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject ca = up.GetStatic<AndroidJavaObject> ("currentActivity");
try
{
using (AndroidJavaObject joPackageManager = ca.Call<AndroidJavaObject>("getPackageManager");)
{
using(AndroidJavaObject jointent = joPackageManager.Call<AndroidJavaObject>("getLaunchIntentForPackage"),packName))
if(null != joIntent)
{
AndroidJavaClass intentClass = AndroidJavaClass("android.content.Intent");
AndroidJavaObject intentObject = AndroidJavaObject("android.content.Intent")
intentObject.Call<AndroidJavaObject>("setAction",intentClass.GetStatic<string>("ACTION_VIEW"));
AndroidJavaClass uriClass = AndroidJavaClass("android.net.Uri");
AndroidJavaObject uriObject = uri.Call<AndroidJavaObject>("parse",path);
if(uriObject != null)
{
intentObject.Call<AndroidJavaObject>("setData",uriObject);
intentObject.Call<AndroidJavaObject>("setPackage",packName);
activity.Call("startActivity",intentObject);
}
}
}
}
}
二、IOS
IOS分几部分(主要是检测是否安装了对应APP),首先需要配置白名单,一般是plist文件(不配置一些APP可能会报错),然后需要在.mm文件添加程序(否安装APP的检测),再用C#脚本调用.mm文件,直接用OpenURL打开APP。
plist文件添加的配置如下
<Key>LSApplicationQueriesSchemes</Key>
<array>
<string>snssdk1128</string>
<string>youtube</string>
<string>twitter</string>
</array>
.mm文件C语言程序
extern "C"
{
bool CheckPackageInstalled(const char* packageName);
}
bool CheckPackageInstalled(const char* packageName)
{
NSURL *lineURL = [NSURL URLWithString: packageName];
if([[UIApplication shareApplication] canOpenURl: lineURL])
{
return true;
}
else
{
return false;
}
}
C#调用.mm文件(注意需要加上IOS宏)
#if UNITY_IOS
[DLLImport("_Internal")]
private static extenr bool CheckPackageInstalled(string packageName)
#endif
public static bool IOSCheckPackageInstalled(string packageName)
{
#if UNITY_IOS
return CheckPackageInstalled(packageName);
#endif
}
打开APP
Application.OpenURL(path);//path为URL地址