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都拿不到这个

浙公网安备 33010602011771号