判断App是否安装

一、需求判断游戏是否已经安装

  iOS新版本的系统上苹果已经不允许通过scheme判断app是否安装,可以通过以下手段判断一个app是否安装

 

二、下面的方法调用的私有api,如果需要提交appstore使用的话,需要对selector进行混淆

   使用过程中需要注意线程安全问题

  

//
//  LAApplicationHelper.h
//  App
//
//  Created by qqvipfunction on 2017/4/1.
//  Copyright © 2017年 SZ. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface LAApplicationHelper : NSObject

+ (instancetype)shareInstance;

- (void)refreshInstalledList;

- (BOOL)isAppInstalled:(NSString *)appBundleID;

- (NSArray<NSString *> *)appList;

@end

  实现文件

//
//  LAApplicationHelper.m
//  App
//
//  Created by qqvipfunction on 2017/4/1.
//  Copyright © 2017年 SZ. All rights reserved.
//

#import "LAApplicationHelper.h"
#import <objc/runtime.h>

@interface LAApplicationHelper ()

@property (nonatomic, strong) NSMutableArray*      appList;
@property (nonatomic, strong) NSMutableArray*      appNameList;

@end

@implementation LAApplicationHelper

+ (instancetype)shareInstance
{
    static dispatch_once_t onceToken;
    static LAApplicationHelper *instance = nil;
    dispatch_once(&onceToken, ^{
        instance = [[LAApplicationHelper alloc] init];
    });
    
    return instance;
}

- (instancetype)init
{
    if(self = [super init])
    {
        _appList = [[NSMutableArray alloc] init];
        _appNameList = [[NSMutableArray alloc] init];
        [self loadInstalledApps];
    }
    return self;
}

- (void)refreshInstalledList
{
    [self loadInstalledApps];
}

- (void)loadInstalledApps
{
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wundeclared-selector"
    
    [_appList removeAllObjects];
    [_appNameList removeAllObjects];

    Class LSApplicationWorkspace_class = objc_getClass("LSApplicationWorkspace");
    NSObject* workspace = [LSApplicationWorkspace_class performSelector:@selector(defaultWorkspace)];
    NSArray *arr = [workspace performSelector:@selector(allApplications)];
    if([arr count] > 0)
    {
        for (NSObject * obj in  arr) {
            [_appList addObject:obj];
            NSArray *itemArr = [[obj description] componentsSeparatedByString:@" "];
            if([itemArr count] > 2)
            {
                NSString *appName = itemArr[2];
                if([appName length] > 0)
                {
                    [_appNameList addObject:appName];
                }

            }
        }
    }
    
#pragma clang diagnostic pop
}

- (BOOL)isAppInstalled:(NSString *)appBundleID
{
    for (NSString *bundleID in self.appNameList) {
        if([appBundleID isEqual:bundleID])
            return YES;
    }
    return NO;
}

- (NSArray<NSString *> *)appList
{
    return [self.appNameList copy];
}

@end

  

转载于:https://www.cnblogs.com/doudouyoutang/p/6657405.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值