美文网首页
App 中打开另一个 App

App 中打开另一个 App

作者: 微笑中的你 | 来源:发表于2018-07-25 20:06 被阅读0次

基本都能百度到:首先感谢作者的分享。。。。
iOS 请参考这里:https://www.jianshu.com/p/0811ccd6a65d
Android 请参考这里:https://www.jianshu.com/p/42ae7066f8f3

可以看看我的总结

iOS 篇 Scheme 方式

前期准备:

首先在App-2中注册 URLtypes 如:URL Schemes 为prob

然后在 App-1中的info.plist中添加允许打开App-2的请求
<key>LSApplicationQueriesSchemes</key>
<array>
<string>prob</string>
</array>

实现功能:

在App-1中需要打开App-2的地方实现

NSString *urlStr = @"prob://www.xxx.com?name=zhangsan&password=123";
NSURL *url = [NSURL URLWithString:urtStr];
    
if ([[UIApplication sharedApplication] canOpenURL:url]) {
    [[UIApplication sharedApplication] openURL:url];
} else{
    //无法打开app
}

在 App-2 中实现此方法,进行打印url的所有属性值

- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options NS_AVAILABLE_IOS(9_0){
  //在这里进行判断,实现不同功能
}

发现有值的如下:可能和我的url字符串有关系
url-scheme-------prob
url-host-------www.xxx.com
url-query-------name=zhangsan&password=123

总结:也就是说在App-2中需要根据传递过来的数据,进行判断实现不同的功能。。。

说明下:
[[UIApplication sharedApplication] openURL:url options:options completionHandler:^(BOOL success) {
//...to do you want
}];
[[UIApplication sharedApplication] openURL:url]; //此方法在iOS10 已被 上面的方法所取代。所以请进行适配吧。。。

iOS 篇 bundle ID 方式


/// 通过bundleId打开App
/// @param bid NSString
+ (BOOL)openAppByBundleId:(NSString *)bid{
    Class LSApplicationWorkspace_class = objc_getClass("LSApplicationWorkspace");
    NSObject * workspace = [LSApplicationWorkspace_class performSelector:@selector(defaultWorkspace)];
    BOOL isOpen = [workspace performSelector:@selector(openApplicationWithBundleID:) withObject:bid];
    return isOpen;
}

如何获取bundleID

/// 获取所有的应用
+ (void)allApplications{
//    Class LSApplicationWorkspace_class = objc_getClass("LSApplicationWorkspace");
//    NSObject* workspace = [LSApplicationWorkspace_class performSelector:@selector(defaultWorkspace)];
//    NSLog(@"apps: %@", [workspace performSelector:@selector(allApplications)]);
    
    if (@available(iOS 12.0, *)) {
        Class LSApplicationWorkspace_Class = NSClassFromString(@"LSApplicationWorkspace");
        NSObject *workspace = [LSApplicationWorkspace_Class performSelector:NSSelectorFromString(@"defaultWorkspace")];
        NSArray *plugins = [workspace performSelector:NSSelectorFromString(@"installedPlugins")];
        for (id plugin in plugins) {
            id bundle = [plugin performSelector:NSSelectorFromString(@"containingBundle")];
            if (bundle) {
                NSString *itemName = [bundle performSelector:NSSelectorFromString(@"itemName")];
                if (itemName) {
                    NSLog(@"%@ <%@>", [bundle performSelector:NSSelectorFromString(@"bundleIdentifier")], [bundle performSelector:NSSelectorFromString(@"itemName")]);
                }
            }
        }
    }
}

Android 篇 包名方式

Android appA打开另一个appB

首先需要知道appB的包名,以及直接打开的Activity,
并且在appB的清单文件中将属性exported设置为true

使用以下代码即可,打开
    public static final String packname = "com.example.lxf.openb";


    /**
     * 直接打开AppB
     * @param view
     */
    public void openB(View view){
        //进行打开appB的操作
        PackageManager packageManager = getPackageManager();
        if (checkPackInfo(packname)) {
            Intent intent = packageManager.getLaunchIntentForPackage(packname);
            startActivity(intent);
        } else {
            Toast.makeText(MainActivity.this, "没有安装" + packname, Toast.LENGTH_LONG).show();
        }
    }


    /**
     * 打开B的某个页面
     * @param view
     */
    public void openActivityInB(View view){
        //进行打开appB的操作
        PackageManager packageManager = getPackageManager();
        if (checkPackInfo(packname)) {

            Intent intent = new Intent();
            //第一种方式
            ComponentName cn = new ComponentName(packname, "com.example.lxf.openb.InfoActivity");
            try {
                intent.setComponent(cn);
                //第二种方式
                //intent.setClassName(packname, "com.example.lxf.openb.InfoActivity");
                intent.putExtra("test", "intent1"); //将需要的东西传递
                startActivity(intent);
            } catch (Exception e) {
                //TODO  可以在这里提示用户没有安装应用或找不到指定Activity,或者是做其他的操作
            }

        } else {
            Toast.makeText(MainActivity.this, "没有安装" + packname,  Toast.LENGTH_LONG).show();
        }
    }



    /**
     * 检查包是否存在
     *
     * @param packname
     * @return
     */
    private boolean checkPackInfo(String packname) {
        PackageInfo packageInfo = null;
        try {
            packageInfo = getPackageManager().getPackageInfo(packname, 0);
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        return packageInfo != null;
    }

相关文章

  • App 中打开另一个 App

    基本都能百度到:首先感谢作者的分享。。。。iOS 请参考这里:https://www.jianshu.com/p/...

  • Flutter Scheme 使用(浏览器打开App,App内打

    Flutter Scheme 使用(浏览器打开App,App内打开另一个App)Android 配置 示例:

  • 34.APP中打开另一个APP

    假设两个APP:A和B,我们需要在B中打开A.首先需要在A中添加: identifier随便设置,URL Sche...

  • 基于10.0的activity分析(二)

    本文主要分析从当前activity打开另一个acivity(这里也包括了一个app打开另一个app的activit...

  • iOS 应用间相互跳转

    前言 在开发中我们会有一种需求,就是想让我们的app跳转另一个app,比如打开游戏,打开某个应用,这种应用间的相互...

  • Android APP打开另一个APP

    一丶概述 前段时间配合开发,完成了一个APP拉起另一个APP的需求,负责接收数据跨登录部分。当然整个实现思路挺感兴...

  • Android APP打开另一个APP

    A拉起B可实现的几种方法 (1)包名,特定Activity名拉起 B应用需要在manifest文件对应Activi...

  • IOS 打开另一个 APP

    在程序里打开另一个APP 1、首先,要在被打开的 APP 的 info.plist 文件里添加 URL types...

  • 网页启动Android APK

    点击网页中的URL链接,打开手机中已经存在的Android应用。 网页中URL格式: 打开app 例: 打开app...

  • IOS App之间的跳转

    // 在App A 中打开 App B // 1.0 在 App B Info.Plist URL Types 添...

网友评论

      本文标题:App 中打开另一个 App

      本文链接:https://www.haomeiwen.com/subject/mpymmftx.html