def batch_check(app_folder, excel_path):
    '''
    批量检测多个ipa,并产生excel报告
    '''
    #遍历folder,找出.ipa文件
    if not app_folder or not excel_path:
        return False

    check_results = []
    ipa_list = os.listdir(app_folder)
    for ipa in ipa_list:
        result = {} #每个app的检查结果
        print 'start check :', ipa
        if ipa.endswith('.ipa'):
            ipa_path = os.path.join(app_folder, ipa)
            pid = utils.get_unique_str()
            #获得ipa信息和静态检查
            # ipa_parse = IpaParse.IpaParse(ipa_path)
            # result['name'] = ipa_parse.app_name()
            # result['version'] = ipa_parse.version()
            # result['bundle_id'] = ipa_parse.bundle_identifier()
            # result['tar_version'] = ipa_parse.target_os_version()
            # result['min_version'] = ipa_parse.minimum_os_version()
            result['md5'] = get_file_md5(ipa_path)
            print result['md5']

            rsts = check_app_info_and_provision(ipa_path)
            for key in rsts.keys():
                result[key] = rsts[key]
            #检查ios私有api
            app = get_executable_path(ipa_path, pid)
            methods_in_app, methods_not_in_app, private = check_private_api(app, pid)
            result['private_apis'] = methods_in_app
            result['private_frameworks'] = list(private)
            #检查ipa 64支持情况
            arcs = check_architectures(app)
            result['arcs'] = arcs
            #检查ghost情况
            ghost = check_xcode_ghost(app)
            result['ghost'] = ghost
            #检查codesign
            codesign = check_codesign(app)
            result['codesign'] = codesign

            check_results.append(result)

            cur_dir = os.getcwd() #删除检查临时目录
            dest_tmp = os.path.join(cur_dir, 'tmp/' + pid)
            if os.path.exists(dest_tmp):
                shutil.rmtree(dest_tmp)


    #将结果转化成excel报告
    report_utils.excel_report(check_results, excel_path)
    return excel_path
def batch_check(app_folder, excel_path):
    '''
    批量检测多个ipa,并产生excel报告
    '''
    #遍历folder,找出.ipa文件
    if not app_folder or not excel_path:
        return False

    check_results = []
    ipa_list = os.listdir(app_folder)
    for ipa in ipa_list:
        result = {}  #每个app的检查结果
        print 'start check :', ipa
        if ipa.endswith('.ipa'):
            ipa_path = os.path.join(app_folder, ipa)
            pid = utils.get_unique_str()
            #获得ipa信息和静态检查
            # ipa_parse = IpaParse.IpaParse(ipa_path)
            # result['name'] = ipa_parse.app_name()
            # result['version'] = ipa_parse.version()
            # result['bundle_id'] = ipa_parse.bundle_identifier()
            # result['tar_version'] = ipa_parse.target_os_version()
            # result['min_version'] = ipa_parse.minimum_os_version()
            result['md5'] = get_file_md5(ipa_path)
            print result['md5']

            rsts = check_app_info_and_provision(ipa_path)
            for key in rsts.keys():
                result[key] = rsts[key]
            #检查ios私有api
            app = get_executable_path(ipa_path, pid)
            methods_in_app, methods_not_in_app, private = check_private_api(
                app, pid)
            result['private_apis'] = methods_in_app
            result['private_frameworks'] = list(private)
            #检查ipa 64支持情况
            arcs = check_architectures(app)
            result['arcs'] = arcs
            #检查ghost情况
            ghost = check_xcode_ghost(app)
            result['ghost'] = ghost
            #检查codesign
            codesign = check_codesign(app)
            result['codesign'] = codesign

            check_results.append(result)

            cur_dir = os.getcwd()  #删除检查临时目录
            dest_tmp = os.path.join(cur_dir, 'tmp/' + pid)
            if os.path.exists(dest_tmp):
                shutil.rmtree(dest_tmp)

    #将结果转化成excel报告
    report_utils.excel_report(check_results, excel_path)
    return excel_path
def check_ipa(ipa_path):
    result = {}  #每个app的检查结果
    pid = utils.get_unique_str()
    print '1.', '+' * 10, 'get_file_md5'
    result['md5'] = get_file_md5(ipa_path)

    print '2.', '+' * 10, 'check_app_info_and_provision'
    rsts = check_app_info_and_provision(ipa_path)
    for key in rsts.keys():
        result[key] = rsts[key]
    #检查ios私有api
    print '3.', '+' * 10, 'check_private_api'
    app = get_executable_path(ipa_path, pid)
    if not app:
        #找不到math-o文件,说明不是正常的ipa,忽略
        return False

    methods_in_app, _, private = check_private_api(app, pid)
    result['private_apis'] = methods_in_app
    # result['private_apis_not'] = _
    result['private_frameworks'] = list(private)
    #检查ipa 64支持情况
    print '4.', '+' * 10, 'check_architectures'
    arcs = check_architectures(app)
    result['arcs'] = arcs
    if len(arcs) < 2:
        result['error'].append({
            'label': 'Architecture:',
            'description': 'app may be not support 64-bit'
        })
    #检查ghost情况
    print '5.', '+' * 10, 'check_xcode_ghost'
    ghost = check_xcode_ghost(app)
    result['ghost'] = ghost
    #检查codesign
    print '6.', '+' * 10, 'check_private_api'
    codesign = check_codesign(app)
    result['codesign'] = codesign

    print '7.', '+' * 10, 'remove tmp files'
    cur_dir = os.getcwd()  #删除检查临时目录
    dest_tmp = os.path.join(cur_dir, 'tmp/' + pid)
    # print 'tmp:', dest_tmp
    if os.path.exists(dest_tmp):
        shutil.rmtree(dest_tmp)

    return result
def export_excel_report(ipa_list):
    excel_dir = PathUtil.excel_dir()
    excel_path = os.path.join(excel_dir + utils.get_unique_str() + '.xlsx')
    ipa_folder = PathUtil.upload_dir()
    check_results = []

    for ipa in ipa_list:
        if ipa.endswith('.ipa'):
            ipa_path = os.path.join(ipa_folder, ipa)
            # 单个app的检查结果
            try:
                r = check_ipa(ipa_path)
                if r:
                    check_results.append(r)
            except Exception, e:
                print e
                continue
def check_ipa(ipa_path):
    result = {} #每个app的检查结果
    pid = utils.get_unique_str()
    print '1.', '+' * 10, 'get_file_md5'
    result['md5'] = get_file_md5(ipa_path)

    print '2.', '+' * 10, 'check_app_info_and_provision'
    rsts = check_app_info_and_provision(ipa_path)
    for key in rsts.keys():
        result[key] = rsts[key]
    #检查ios私有api
    print '3.', '+' * 10, 'check_private_api'
    app = get_executable_path(ipa_path, pid)
    if not app:
        #找不到math-o文件,说明不是正常的ipa,忽略
        return False

    methods_in_app, _, private = check_private_api(app, pid)
    result['private_apis'] = methods_in_app
    # result['private_apis_not'] = _
    result['private_frameworks'] = list(private)
    #检查ipa 64支持情况
    print '4.', '+' * 10, 'check_architectures'
    arcs = check_architectures(app)
    result['arcs'] = arcs
    if len(arcs) < 2:
        result['error'].append({'label': 'Architecture:',
                    'description': 'app may be not support 64-bit'})
    #检查ghost情况
    print '5.', '+' * 10, 'check_xcode_ghost'
    ghost = check_xcode_ghost(app)
    result['ghost'] = ghost
    #检查codesign
    print '6.', '+' * 10, 'check_private_api'
    codesign = check_codesign(app)
    result['codesign'] = codesign

    print '7.', '+' * 10, 'remove tmp files'
    cur_dir = os.getcwd() #删除检查临时目录
    dest_tmp = os.path.join(cur_dir, 'tmp/' + pid)
    # print 'tmp:', dest_tmp
    if os.path.exists(dest_tmp):
        shutil.rmtree(dest_tmp)
    
    return result
    # for aa in a:
    #     print aa
    #     print >>private_1, aa

    # print "=" * 50
    # print len(b), "Private Methods not in App, May in Framework Used:"
    # print "*" * 50
    # for bb in b:
    #     print >>private_2, bb

    # print "=" * 50
    # print len(c), "Private Framework in App:"
    # print "*" * 50

    ##########
    #test batch check ipa
    cwd = os.getcwd()
    excel_path = os.path.join(cwd, 'tmp/' + utils.get_unique_str() + '.xlsx')
    # excel_path = os.path.join(cwd, 'tmp/test.xlsx') # for test
    print excel_path
    ipa_folder = '/Users/netease/Downloads/ipas/mg/'
    # ipa_folder = '/Users/netease/Music/iTunes/iTunes Media/Mobile Applications/'
    # ipa_folder = '/Users/netease/Music/iTunes/iTunes Media/'
    print batch_check(ipa_folder, excel_path)

    #########
    #test check arcs
    # app_path = '/Users/netease/Downloads/ipas/mg/Payload'
    # app = app_utils.get_executable_file(app_path)
    # print check_architectures(app)
    # print "*" * 50
    # for aa in a:
    #     print aa
    #     print >>private_1, aa
     
    # print "=" * 50
    # print len(b), "Private Methods not in App, May in Framework Used:"
    # print "*" * 50
    # for bb in b:
    #     print >>private_2, bb
     
    # print "=" * 50
    # print len(c), "Private Framework in App:"
    # print "*" * 50

    ##########
    #test batch check ipa
    cwd = os.getcwd()
    excel_path = os.path.join(cwd, 'tmp/' + utils.get_unique_str() + '.xlsx')
    # excel_path = os.path.join(cwd, 'tmp/test.xlsx') # for test
    print excel_path
    ipa_folder = '/Users/netease/Downloads/ipas/mg/'
    print batch_check(ipa_folder, excel_path)

    #########
    #test check arcs
    # app_path = '/Users/netease/Downloads/ipas/mg/Payload'
    # app = app_utils.get_executable_file(app_path)
    # print check_architectures(app)