Unity判断手机是否安装某app并打开

一、查找判断是否安装app或者打开app所需要的包名

1、android

android使用的是包名,百度可以查到大部分app的包名,少部分可以使用apktool反编译.apk,到AndroidManifest.xml里找

也可以在gooleplay里搜索app,以QQ为例,https://play.google.com/store/apps/details?id=com.tencent.mobileqq

id后面的com.tencent.mobileqq就是QQ的包名

 

 

 

2、IOS

ios使用的是url schemes ,大部分的url schemes 也是可以百度到的

如:QQ mqq:// 微信是 weixin:// 网易新闻 newsapp:// 淘宝 taobao:// 

对于一些不常用的软件怎么查找url schemes 呢? 
找到ipa文件 改成zip解压 在playload文件下找到info.plist 用文本编辑软件打开查schemes 都能找到。

二、我们在unity里写的C#端代码

1、ios需要做的处理

(1)ios9及以上需要在XCode工程里的info.plist添加需要打开app的白名单,里面添加你需要打开app的url schemes

<key>LSApplicationQueriesSchemes</key>
    <array>
        <string>mqq</string>
        <string>weixin</string>
    </array>    

(2)在你的工程里,路径:Assets/Editor/IOS路径下的.mm文件里(如果没有就去百度如何添加)添加如下方法

    bool _IOS_IsInstallApp(const char *url)
    {
        if (url == NULL) {
            return false;
        }
        NSURL *nsUrl = [NSURL URLWithString:[NSString stringWithUTF8String:url]];
        if ([[UIApplication sharedApplication] canOpenURL:nsUrl]) {
            return true;
        }
        return false;
    }

(3)然后在使用的脚本里要这样写

[System.Runtime.InteropServices.DllImport("__Internal")]
private static extern bool _IOS_IsInstallApp(string iosPackage);

这里的方法一定要和你.mm里面的参数保持一致,要不会有问题

2、接下来就是提供的两个接口方法了

(1)是否安装app的接口

    Dictionary<string, bool> IsInstallAppTable = new Dictionary<string, bool>();
    public bool IsInstallApp(string packageAndroidName, string packageIOSName)
    {
        if (IsInstallAppTable.ContainsKey(packageAndroidName) || IsInstallAppTable.ContainsKey(packageIOSName))
        {
#if UNITY_ANDROID && !UNITY_EDITOR
            return IsInstallAppTable[packageAndroidName];
#elif (UNITY_IOS || UNITY_IPHONE) && !UNITY_EDITOR
            return IsInstallAppTable[packageIOSName];
#elif !UNITY_IOS && !UNITY_IPHONE && UNITY_EDITOR
            return true;
#endif
        }
        else
        {
#if UNITY_ANDROID && !UNITY_EDITOR
        try
        {
            using (AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
            using (AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity"))
            using (AndroidJavaObject packageManager = currentActivity.Call<AndroidJavaObject>("getPackageManager"))
            {
                AndroidJavaObject launchIntent = null;
                try
                {
                    launchIntent = packageManager.Call<AndroidJavaObject>("getLaunchIntentForPackage", packageAndroidName);
                }
                catch (System.Exception ex){}
                if (launchIntent == null){
                    IsInstallAppTable.Add(packageAndroidName,false);
                    return false;
                 }
                else{
                    IsInstallAppTable.Add(packageAndroidName,true);
                    return true;
            }
            }
        }
        catch (System.Exception ex)
        {
        }
        return false;
#elif (UNITY_IOS || UNITY_IPHONE) && !UNITY_EDITOR
            bool isIos = _IOS_IsInstallApp(packageIOSName);
            IsInstallAppTable.Add(packageIOSName, isIos);
            return isIos;
#elif !UNITY_IOS && !UNITY_IPHONE && UNITY_EDITOR
            return true;
#endif

        }
        return false;
    }

(2)打开app或者链接的接口

public void OpenPackage(string androidPackageName, string iosPackageName)
        {
#if UNITY_ANDROID && !UNITY_EDITOR
            using (AndroidJavaClass jcPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
            using (AndroidJavaObject joActivity = jcPlayer.GetStatic<AndroidJavaObject>("currentActivity"))
            using (AndroidJavaObject joPackageManager = joActivity.Call<AndroidJavaObject>("getPackageManager"))
            {
                using (AndroidJavaObject joIntent = joPackageManager.Call<AndroidJavaObject>("getLaunchIntentForPackage", androidPackageName))
                {
                    if (null != joIntent)
                    {
                        joActivity.Call("startActivity", joIntent);
                    }
                }
            }
#elif (UNITY_IOS || UNITY_IPHONE) && !UNITY_EDITOR
            Application.OpenURL(iosPackageName);
#endif
        }

亲测是可以实现的

发现问题:

1、三星手机无法拿到安装的Instagram这个APP的包名,拿到所有的app都拿不到这个

 

posted @ 2021-12-16 10:48  搬砖独行者  阅读(729)  评论(0)    收藏  举报