当前位置:首页 » 《关注互联网》 » 正文

【不求人】手机端内应用或网页根据apk/ipa内的scheme/包名唤起别的应用_hrlr1230的博客

15 人参与  2021年08月23日 09:43  分类 : 《关注互联网》  评论

点击全文阅读


        记录下,当别人要求唤起某个应用,但没提供太多信息(除了应用名称之外)的情况下,可能会用的上。

        第一步,查看包名和Scheme,需要下载对应App的apk,ipa。
        Android:解压apk,找出AndroidManifest.xml文件。使用AXMLPrinter2.jar对xml文件进行反编译。(环境要求:能运行java命令,在网上下载AXMLPrinter2.jar)
        编译命令:

java -jar AXMLPrinter2.jar AndroidManifest.xml > main.txt


        运行完毕后得到的main.txt里就是反编译后的明文xml。在其中找schemepackage就行;其中scheme可能有多个,你需要逐个去试下能不能唤起对应应用的期望界面;(按经验来说,含有“notification”字样的scheme大多符合唤起界面的要求)

        IOS:将ipa移至macbook上,把后缀名改成zip,利用归档工具解压;点进去,有个“显示包内容”选项,里面找到info.plist文件;URL Types里找对应的URL Scheme就行;包名的话,就找“CFBundleIdentifier”这个字段对应的值;

        第二步,编写唤起代码。(例子:包名:com.aaa.bbb;scheme:xxx)

  Android应用: 根据包名唤起的方法:openAppcation("com.aaa.bbb");

    public static boolean openAppcation(String packname){
        try {
            PackageManager packageManager = mContext.getPackageManager();
            Intent intent = new Intent();
            intent = packageManager.getLaunchIntentForPackage(packname);
            if (intent != null) {
                mContext.startActivity(Intent.createChooser(intent, ""));
                return true;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

根据scheme唤起:

    public static void openXXX() {
        try {
            PackageManager packageManager = mContext.getPackageManager();
            Intent intent = new Intent();
            intent = packageManager.getLaunchIntentForPackage("com.aaa.bbb");
            if (intent == null) {
                //Toast提示之类("请安装XXX客户端");
            } else {
                mContext.startActivity(Intent.createChooser(intent, ""));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

手机网页:根据scheme唤起:(TS版)

window.open("xxx://");

IOS内应用:根据包名唤起:[openAppcation:@"com.aaa.bbb"];

#import <objc/runtime.h> //objc_getClass 用到

//唤起应用
+(NSString *)openAppcation:(NSString *)packname{
    Class lsawsc = objc_getClass("LSApplicationWorkspace");

        NSObject* workspace = [lsawsc performSelector:NSSelectorFromString(@"defaultWorkspace")];
        // iOS6 没有defaultWorkspace
        if ([workspace respondsToSelector:NSSelectorFromString(@"openApplicationWithBundleID:")])
        {
          [workspace performSelector:NSSelectorFromString(@"openApplicationWithBundleID:") withObject:packname];
            return @"1";
        }
    //0 失败 1 成功 2其他平台默认
    return @"0";
}

根据URL Scheme唤起:

//打开XXX
+(void) openXXX:(NSString *)num{
    if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"xxx://"]]) {
        
         NSURL *url1 = [NSURL URLWithString:@"xxx://"];
        [[UIApplication sharedApplication] openURL:url1 options:@{} completionHandler:^(BOOL success) {
             if(success)
                 NSLog(@"open xxx successed");
             else{
                 NSLog(@"open xxx failed");
             }
         }];
    }else{
        NSLog(@"open xxx failed");
        //或者跳到APPSTORE里下载该应用
        //[XXX jumpAppStoreDL:@"该应用的appid"];
    }
}

//跳转app store 下载应用
+(void) jumpAppStoreDL:(NSString *)appid{
    
    NSString *url = [NSString stringWithFormat:@"itms-apps://itunes.apple.com/app/id%@",appid];
    //应用 在App Store的 app ID
    NSURL *url2 = [NSURL URLWithString:url];
    if (@available(iOS 10.0, *)){
        [[UIApplication sharedApplication]openURL:url2 options:@{UIApplicationOpenURLOptionsSourceApplicationKey:@YES} completionHandler:^(BOOL success) {
            if (success) {
                NSLog(@"10以后可以跳转 App Store下应用 id:%@",appid);
            }else{
                NSLog(@"10以后不可以跳转App Store下应用 id:%@",appid);
            }
        }];
    }else{
        BOOL success = [[UIApplication sharedApplication]openURL:url2];
        if (success) {
            NSLog(@"10以前可以跳转 App Store下应用 id:%@",appid);
        }else{
            NSLog(@"10以前不可以跳转 App Store 下应用 id:%@",appid);
        }
    }
}

并且还要在你应用的Info.plist里白名单(LSApplicationQueriesSchemes)加上它的URL Scheme。

	<key>LSApplicationQueriesSchemes</key>
	<array>
		<string>xxx</string>
		<string>itms-apps</string>
		<string>weixinULAPI</string>
		<string>weixin</string>
		<string>wechat</string>
		<string>mqq</string>
		<string>mqqwpa</string>
		<string>mqzone</string>
		<string>mqqapi</string>
		<string>mqqopensdkapiv2</string>
		<string>mqqopensdkapiV3</string>
		<string>mqqopensdkapiV4</string>
		<string>mqzoneopensdk</string>
		<string>mqzoneopensdkapiV2</string>
		<string>mqqopensdkminiapp</string>
		<string>mqzoneopensdkapi19</string>
		<string>mqzoneopensdkapi</string>
		<string>mqqOpensdkSSoLogin</string>
	</array>


至此,记录完毕。😄


点击全文阅读


本文链接:http://m.zhangshiyu.com/post/25953.html

唤起  跳转  不可以  
<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最新文章

  • 家宴过后,我捉奸了庶妹和我老公无广告_庶妹老公侍卫TOP10_小说后续在线阅读_无删减免费完结_
  • 寝室六个人,她们背着我建五人群必读文_太天真申请书冷笑最新阅读_小说后续在线阅读_无删减免费完结_
  • 开局获得狐仙传承结局+番外_江帆赵雪隐藏剧情_小说后续在线阅读_无删减免费完结_
  • 刀锈春根生,白骨犹温完结全文_卫舟棠棠知意一口气完结_小说后续在线阅读_无删减免费完结_
  • 夫君立筷子定我灾星罪名,我改嫁冷宫皇子后他追悔莫及好评_赵荀孟如安青瑶精心编著_小说后续在线阅读_无删减免费完结_
  • 邻居低素质,而我没素质独家番外_老太太赖皮欣欣超长版_小说后续在线阅读_无删减免费完结_
  • 重生后我转嫁首富瘸腿独子,总裁前夫却疯了一口气看完_妹妹傅云琛沈明辉独家番外_小说后续在线阅读_无删减免费完结_
  • 我拒绝给系花捐款后,全系同学悔疯了在线阅读_小说后续在线阅读_无删减免费完结_
  • 我让位给女友的透视眼竹马,他却说如果能重生再也不来了。虐心反转_玉石林若女友推荐_小说后续在线阅读_无删减免费完结_
  • 相国独子的丫鬟砸坏我的玉佩后,我当场拒婚阅读_玉佩陈郡谢氏全新_小说后续在线阅读_无删减免费完结_
  • 手术时,我看着病人惨死最新试读_淼淼陆知衍姜颜全本完结_小说后续在线阅读_无删减免费完结_
  • 男友霸道给我开黑卡,转头却骂我是捞女最新章节_肖年顾客黑卡热文_小说后续在线阅读_无删减免费完结_

    关于我们 | 我要投稿 | 免责申明

    Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1