如何通过包名打开手机里的APP

目前已知的打开APP的方式有两种,

一种是通过openUrl打开,这种有一个严重的问题,即必须添加白名单,白名单之外的APP即时安装了也无法打开。

另一种就是今天的重点,通过包名打开APP。先上核心代码:

Class lsawsc = objc_getClass("LSApplicationWorkspace");
NSObject* workspace = [lsawsc performSelector:NSSelectorFromString(@"defaultWorkspace")];
BOOL open = [workspace respondsToSelector:NSSelectorFromString(@"openApplicationWithBundleID:")];
if (open)
{
     [workspace performSelector:NSSelectorFromString(@"openApplicationWithBundleID:") withObject:@"com.xxx.xxx"];
}

注:参考以下网址(已经不知道哪个是原创了,希望下面贴出来的有原创作者的)

iPhone获取手机里面所有的APP(私有库)+ 通过包名打开应用
https://www.cnblogs.com/fuunnyy/p/5392241.html
iOS 获取APP相关信息 私有API
https://www.cnblogs.com/qingjoin/p/4968570.html

上面只要传入你要打开的APP的包名即可。

但是上面的方法也有些小瑕疵,就是不知道是不是打开了APP,以下两种情况是打不开APP的:

1. APP还未安装。

2. APP正在下载安装。

接下来就是对这个问题的优化。

以上方法存在的问题有几个特征,如下:

1. 打开APP时,会需要一些时间去跳转(具体多少?这个不一定,要看各位用的时候的真实情况了,不过1秒应该够了吧)

2. 如果跳转成功,自己的APP就会进入后台,如果过打开失败,自己的APP还是活跃状态。

所以,按照这两条特征即可想到下面的解决方案:

在程序进入后台和进入前台时都做一下标记(用NSUserDefault即可),在打开APP的操作后延时执行下面的操作:

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    NSString *state = @"0|1"; //此处读取存好的标记0|1或其他你做的标记
    if([state isEqual:@"0"])
    {
        NSLog(@"进入后台");
    }
    else if([state isEqual:@"1"])
    {
        NSLog(@"活跃状态");
    }
});

这样就可以知道APP是否已经被打开。

原文地址:https://www.cnblogs.com/PaulpauL/p/9413226.html

时间: 2024-08-30 04:47:30

如何通过包名打开手机里的APP的相关文章

iPhone获取手机里面所有的APP(私有库)+ 通过包名打开应用

1.获取到手机里面所有的APP包名 - (void)touss { Class lsawsc = objc_getClass("LSApplicationWorkspace"); NSObject* workspace = [lsawsc performSelector:NSSelectorFromString(@"defaultWorkspace")]; NSArray *Arr = [workspace performSelector:NSSelectorFro

android4.4 通过包名打开第三方应用程序

第一种方法: 通过包名和启动的类名启动第三方apk xx.yy.zz:包名 xx.yy.zz.xxActivity:启动的类名 ComponentName componentName=new   ComponentName("xx.yy.zz","xx.yy.zz.xxActivity"); Intent intent=new Intent(); intent.setComponent(componentName); intent.setAction(Intent.

二.第一个自动化demo,打开APP-如何获取包名和activity。(真机)

环境配置成功后,我们就可以进行第一个自动化测试了.用真机则不需要安装安卓模拟器.以一个简单的打开APP为例. 一.获取包名和activtity      启动一个app,我们需要知道它的平台.版本号.包名.activity等信息,其中两个比较难找的是包名和activtiy,其他的直接在手机或者用Itools都可以看到. 1)在之前配置的安卓SDK文件夹中找到sdkmanager.exe并启动,勾选一个版本的build-tools并下载. 2)下载成功后,找到appt.exe,并将这个路径加到 环

Android手机里的垃圾文件和文件夹清理

SD卡中各个文件夹功能的最详尽分析SD卡用久了会有好多文件夹出现,大家看看都是干什么用~ 1..android_secure  是官方app2sd的产物,删了之后装到sd卡中的软件就无法使用了.2..Bluetooth  顾名思义,用蓝牙之后就会有这个.3..mobo  顾名思义,Moboplayer的缓存文件.4..QQ   顾名思义,QQ的缓存文件.5..quickoffice  顾名思义,quickoffice的缓存文件.6..switchpro  顾名思义,switchprowidget

使用adb 命令获取APP包名

最近开始使用adb了,感觉以前记得的命令又是从0开始了,所以由基础的开始总结起,好好让自己回顾一下. 方法一.获取APP包名 1.先连接上手机,使用命令    adb shell am monitor 2.打开想要获取包名的APP即可,以微信为例,如下就是我们想要的包名 方法二.获取APP包名 1.启动手机的app 2.使用adb shell dumpsys window | findstr mCurrentFocus  命令,可以查看当前启动中的应用信息 原文地址:https://www.cn

如何用同一份代码生成不同包名的APK包

有时候,我们需要用同一份生成几个不同的APK包在手机上测试,如果不修改配置,安装新APK时,会覆盖之前的APK.解决方法: 1.修改AndroidManifest中的包名: package="com.mini.app.abcd",将包名更改,重新clean一下,对应的gen文件下面的包名也会自动更新 2.修改APP名字(便于区分): android:label="@string/mcc_app_name" >,在Strings里找到对应的APP名字,修改为新A

Android Studio修改项目名和包名

为了提高开发效率,有时候需要使用现有的一些开源项目,记录一下自己修改项目名和包名的方法. 1.首先,修改包名(清单文件里找), ①展开所有包 ②选中想要修改的包,shift+F6(也可右键Refactor+Rename)进行修改,别忘记下边也要Do Refactor ③等待更名完成后,run一下app,发现报错,原因是依然还有文件import了旧包名,这时在project上右键Find in Path,在整个项目里找旧的包名,逐个修改,然后clean + Rebuild project; ④如果

重复安装相同包名APK出现的问题。

一. INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES 这样的问题主要是签名冲突造成的,比如你使用了ADB的debug权限签名,但后来使用标准sign签名后再安装同一个文件会出现这样的错误提示,解决的方法除了只有先老老实实从手机上卸载原有版本再进行安装,而adb install -r参数也无法解决这个问题. 二.INSTALL_PARSE_FAILED_NO_CERTIFICATES 这个问题是因为用zip打开apk文件删除某些不必要文件造成的.如删除

monkey测试之获取系统应用对应的包名

在做monkey测试的时候,有时候需要设置app与系统应用(比如调取系统权限类的系统应用)之间互跑,这时可以用腾讯GT,具体步骤如下: 此处以app调用系统相机为例,用adb shell pm list packages列出系统所有包名,然后复制黏贴到记事本查看,如图  有两个camera,天知道是哪个.这时可以用腾讯GT来辨别.步骤如下: 1.打开GT,点击被调试应用程序框 2.进入后,找到你熟悉的相机图标 3.这会就看到底下的包名了com.sec.android.app.camera