自己平时喜欢在某些应用里签到领取奖励,但是之前总是忘记签到,为了解决掉自己这个问题,于是乎最近就做了一款集中签到应用管理的APP【天天爱签到】(好记性不如烂笔头😄),每天打开【天天爱签到】后在签到列表里点一点进行签到就可以了。由于里面需要打开第三方APP,下面记录一下应用中的相关实现方案。

iOS:

因为iOS无法获取当前设备已安装的应用,所以只能让用户自己手动添加需要签到的应用,用户需要填写AppStore URL链接或URL Scheme。由于Bundle ID跳转属于私有API,所以在【天天爱签到】中,采用了方式1 和 方式2 结合的方案,如果填写了URL Scheme则优先通过URL Scheme进行跳转,如果跳转失败或者未填写,则通过AppStore URL方式跳转。

打开应用可通过以下三种方式:

1、URL Scheme,知道目标APP的URL Scheme后可通过以下代码进行跳转。如果你不知道目标应用的URL Scheme,那么你可以在一个叫捷径社区的网站里查找。

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:model.url_scheme] options:@{} completionHandler:^(BOOL success) {
            
}];

2、AppStore URL,根据用户填写的AppStore URL链接,可通过openURL跳转到AppStore,如果已安装该应用,则AppStore会显示打开,此时再点击打开就可以挑战到目标APP了。(相比第一种方式,这种方式多一步操作,需要用户手动点击打开)。

那么如何获取AppStore URL链接呢?首先打开AppStore,搜索目标应用,然后点击打开详情,再点击右上角分享按钮,在弹出菜单中点击拷贝链接,然后返回【天天爱签到】粘贴完成即可。

3、Bundle ID跳转,属于私有API(无法上架,本人已被拒绝过两次了😭)。

if (model.bundle_id.length > 0){
        Class lsawsc = NSClassFromString([NSString stringWithFormat:@"LSAppli%@",@"cationWorkspace"]);
        NSObject* workspace = [lsawsc performSelector:NSSelectorFromString([NSString stringWithFormat:@"defaultW%@",@"orkspace"])];
        SEL sel = NSSelectorFromString([NSString stringWithFormat:@"openApp%@",@"licationWithBundleID:"]);
        if ([workspace respondsToSelector:sel]) {
            BOOL result = [workspace performSelector:sel withObject:model.bundle_id];
            if (!result) {
                [self showAlertWithText:@"无法打开应用,请检查应用是否安装。"];
            } else {
                //跳转成功
            }
        }
    }

安卓:

安卓采用获取当前设备已安装的应用列表方式(注意:应用过多,获取应用列表时会特别的慢,需要处理),让用户选择要进行管理的应用。相比iOS的实现方案来说,安卓端不需要用户填写应用信息,只需要选择当前设备已安装的应用即可。跳转方式也直接通过包名进行跳转,相比安卓的AppStore URL方式体验会更好一些。

1、获取已安装的应用列表:

获取本设备已安装的应用列表需要添加权限:

<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
    public static ArrayList<AppInfo> getAllAppInfo(Context context,boolean isFilterSystem) {
        ArrayList<AppInfo> appBeanList = new ArrayList<>();
        AppInfo bean =  null;
        PackageManager packageManager = context.getPackageManager();
        List<PackageInfo> list = packageManager.getInstalledPackages(0);
        for (PackageInfo p : list) {
            bean = new AppInfo();
            Drawable drawable = p.applicationInfo.loadIcon(packageManager);
            bean.setIcon(drawable);
            bean.setLabel(packageManager.getApplicationLabel(p.applicationInfo).toString());
            bean.setPackage_name(p.applicationInfo.packageName);
            int flags = p.applicationInfo.flags;
            if ((flags & ApplicationInfo.FLAG_SYSTEM) != 0 && isFilterSystem) {
                //判断是否是系统的应用

            } else {
                appBeanList.add(bean);
            }
        }

        return appBeanList;
    }

2、打开第三方APP

    public static void launchApp(Context context,String packageName,String id) {
        try {
            PackageManager packageManager = context.getPackageManager();
            Intent intent = packageManager.getLaunchIntentForPackage(packageName);
            if (null != intent) {
                context.startActivity(intent);
            } else {
                Log.e("Sign","打开失败");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

想体验交互效果的可以在AppStore搜【天天爱签到】,安卓只上了Play。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐