自己平时喜欢在某些应用里签到领取奖励,但是之前总是忘记签到,为了解决掉自己这个问题,于是乎最近就做了一款集中签到应用管理的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。