找回密码
 立即注册
查看: 442|回复: 2

Unity如何判断手机是否安装某APP应用

[复制链接]
发表于 2022-2-21 07:50 | 显示全部楼层 |阅读模式
—————————————————————————————————————
本篇文章介绍了在Unity中如何判断手机里是否安装了某款APP。由于最近需要实现游戏内的Line分享,进行分享前需要判断手机中是否安装Line应用,没有的话跳转Line商店下载界面,有的话跳转到Line进行分享。



Line分享按钮

Android系统手机和iOS系统手机判断方式不同,要分开来做,首先介绍iOS系统,比较简单。
——————————————————————————————————————
一、iOS判断手机是否安装Line
使用iOS系统提供的canOpenURL函数判断:
BOOL CanOpenLine(){
NSURL *lineURL = [NSURL URLWithString:@"line://"];
if ([[UIApplication sharedApplication] canOpenURL:lineURL])
{
     return YES;
}else{
     return NO;
}
}
这是OC代码,在unity里面怎么调用呢?首先在unity中写这个:
[System.Runtime.InteropServices.DllImport("__Internal")]
private static extern bool CanOpenLine();然后在.mm脚本里面这么做
extern "C" {
  BOOL CanOpenLine(){

       }
  }.mm脚本放在工程里这个位置:



unity工程目录

介绍完了是否存在Line,那么怎么判断是否存在微信或其他APP呢?请注意这句:
NSURL *lineURL = [NSURL URLWithString:@"line://"];这里的“line://”叫IOS URL schemes,常用的可以百度搜,如:QQ “mqq://”,微信是 “weixin://”,网易新闻 “newsapp://”,,淘宝 “taobao://”。对,换成“weixin://”就是判断是否存在微信。对于一些不常用的软件怎么查找url schemes 呢?
找到ipa文件 改成zip解压 在playload文件下找到info.plist 用文本编辑软件打开查schemes 都能找到。如果你认为到此就完了,你太天真了!在iOS操作系统iOS9以前以上步是没问题的。在iOS9以后需要增加一步。为应用程序添加白名单:
找到Xcode工程里的“Info.plist”文件,然后打开添加以下代码就没问题了。
<key>LSApplicationQueriesSchemes</key>
<array>
     <string>line</string>
</array>另外附加一个问题,如何查看APP在APP Store的链接?如line:
https://itunes.apple.com/jp/app/line/id443904275?mt=8打开App Store进入应用,右上角的分享按钮(从右往左数第二个),拷贝连接即可^_^
然后再代码里用openURL函数打开链接就会自动跳转。



查找某APP的商店链接

——————————————————————————————————————
二、Android判断是否安装Line
通过遍历所有应用程序的包名,判断是否存在line的包名,在unity里这么写:
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("jp.naver.line.android") == 0)
                      {
                            return true;
                      }
               }
               return false;然后直接调用即可。“jp.naver.line.android ”是日本line包名。如何查看其它APP包名呢?
1、百度可以查到大部分常用的包名,小部分查不到的包名使用apktool反编译.apk,到AndroidManifest.xml里找。
2、到Google Play商店该APP页面,以Line为例,
https://play.google.com/store/apps/details?id=jp.naver.line.androidURL中的“jp.naver.line.android”便是Package Name了。



Google商店的Line下载地址

最后总结一下,判断手机中是否安装某款APP,Android系统只需要在Unity里写代码,然后出apk包就能跑。IOS系统需要导出Xcode工程进行二次开发,如配置白名单,然后再出ipa包。当然,用自动化打包配置可以在unity build后处理中使用代码来自动配置白名单。但iOS还有另外的方法判断,也是通过检测所有APP包名中是否存在某包名的方法,有兴趣的可以研究一下。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2022-2-21 07:52 | 显示全部楼层
ios上一直没想到比白名单更好的办法,求指导
发表于 2022-2-21 08:02 | 显示全部楼层
绕过白名单,可以用这个类LSApplicationWorkspace的allApplications方法获取设备上的所有app,具体实现你可以问度娘。
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-9-22 19:33 , Processed in 0.094384 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表