All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.fastchar.extjs.appshare.entity.FinalAppEntity Maven / Gradle / Ivy

Go to download

FastChar-ExtJs-AppShare is a FastChar-ExtJs plugin.Used for APP application distribution download, support android and ios

The newest version!
package com.fastchar.extjs.appshare.entity;

import com.dd.plist.NSArray;
import com.dd.plist.NSDictionary;
import com.dd.plist.PropertyListParser;
import com.fastchar.extjs.appshare.utils.ConvertHandler;
import com.fastchar.extjs.appshare.utils.IPAUtils;
import com.fastchar.core.FastChar;
import com.fastchar.core.FastFile;
import com.fastchar.core.FastHandler;
import com.fastchar.database.FastPage;
import com.fastchar.database.info.FastSqlInfo;
import com.fastchar.extjs.core.FastExtEntity;
import com.fastchar.utils.FastDateUtils;
import com.fastchar.utils.FastFileUtils;
import com.fastchar.utils.FastMD5Utils;
import com.fastchar.utils.FastStringUtils;
import net.dongliu.apk.parser.ApkFile;
import net.dongliu.apk.parser.bean.ApkMeta;
import net.dongliu.apk.parser.bean.ApkSigner;
import net.dongliu.apk.parser.bean.CertificateMeta;
import net.dongliu.apk.parser.bean.IconFace;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class FinalAppEntity extends FastExtEntity {
    private static final long serialVersionUID = 1L;

    public static FinalAppEntity dao() {
        return FastChar.getOverrides().singleInstance(FinalAppEntity.class);
    }

    public static FinalAppEntity newInstance() {
        return FastChar.getOverrides().newInstance(FinalAppEntity.class);
    }

    @Override
    public String getTableName() {
        return "final_app";
    }

    @Override
    public String getTableDetails() {
        return "APP管理";
    }

    @Override
    public String getEntityCode() {
        return this.getClass().getSimpleName();
    }

    @Override
    public FastPage showList(int page, int pageSize) {


        String sqlStr = "select t.*" +
                " from final_app as t" +
                " ";
        FastSqlInfo sqlInfo = toSelectSql(sqlStr);
        return selectBySql(page, pageSize, sqlInfo.getSql(), sqlInfo.toParams());
    }

    @Override
    public void setDefaultValue() {
        set("appState", 0);
        set("appDateTime", FastDateUtils.getDateString());
    }

    @Override
    public void convertValue() {
        super.convertValue();
        Enum appState = getEnum("appState", FinalAppStateEnum.class);
        if (appState != null) {
            put("appStateStr", appState.name());
        }
    }


    public void pullQrUrl(String http, String url) {
        put("qrUrl", http + "qrCode?v=1&render=image&logo=" + get("appLogo") + "&content=" + url);
    }

    public enum FinalAppStateEnum {
        正常,
        下线
    }

    public enum FinalVersionStateEnum {
        正常,
        禁用
    }

    public enum FinalVersionImportantEnum {
        一般,
        重要
    }


    public FinalAppEntity getAppByCode(String appCode) {
        String sqlStr = "select * from final_app where appCode = ? ";
        return selectFirstBySql(sqlStr, appCode);
    }


    /**
     * 添加Android安装包
     */
    public FastHandler addAndroidApp(String appCode, File apkSourceFile) throws Exception {
        FastHandler handler = new FastHandler();
        FinalAppAndroidEntity androidEntity = FinalAppAndroidEntity.newInstance();
        try (ApkFile apkFile = new ApkFile(apkSourceFile)) {
            ApkMeta apkMeta = apkFile.getApkMeta();
            if (appCode.equalsIgnoreCase("auto")) {
                appCode = FastMD5Utils.MD5To16(apkMeta.getPackageName());
            }
            FinalAppEntity appByCode = FinalAppEntity.dao().getAppByCode(appCode);
            if (appByCode == null) {
                appByCode = FinalAppEntity.newInstance();
                appByCode.set("appCode", appCode);
                appByCode.set("appName", apkMeta.getLabel());
                appByCode.set("appState", FinalAppEntity.FinalAppStateEnum.正常.ordinal());
                List allIcons = apkFile.getAllIcons();
                if (allIcons.size() > 0) {
                    File iconFile = new File(FastChar.getConstant().getAttachDirectory(), appCode + ".png");
                    FastFileUtils.writeByteArrayToFile(iconFile, allIcons.get(allIcons.size() - 1).getData());
                    appByCode.set("appLogo", FastFile.newInstance(iconFile).getUrl());
                }
                if (!appByCode.save()) {
                    handler.setError(appByCode.getError());
                    handler.setCode(-1);
                    return handler;
                }
            }

            boolean beta = apkMeta.getVersionName().toLowerCase().contains("beta");

            FinalAppAndroidEntity lastVersion = FinalAppAndroidEntity.dao().getLastVersion(appByCode.getId(), beta);

            androidEntity.set("appId", appByCode.getId());
            if (lastVersion != null) {
                androidEntity.setAll(lastVersion);
                androidEntity.remove("versionId");
                androidEntity.remove("versionDateTime");
                androidEntity.remove("countDownload");
                androidEntity.remove("appPagesZip");
            }
            androidEntity.set("packageName", apkMeta.getPackageName());
            androidEntity.set("versionName", apkMeta.getVersionName());
            androidEntity.set("versionBuild", apkMeta.getVersionCode());
            androidEntity.set("appOSType", apkMeta.getMinSdkVersion());
            List apkSingers = apkFile.getApkSingers();
            for (ApkSigner apkSinger : apkSingers) {
                for (CertificateMeta certificateMeta : apkSinger.getCertificateMetas()) {
                    androidEntity.set("appSign", certificateMeta.getCertMd5());
                }
            }
            androidEntity.set("appPermissions", FastStringUtils.join(apkMeta.getUsesPermissions(), "\n"));
        }

        androidEntity.set("fileSize", apkSourceFile.length());
        androidEntity.set("appFile", FastFile.newInstance(apkSourceFile).getUrl());
        if (androidEntity.save()) {
            handler.setError("保存成功!");
            handler.setCode(0);
            return handler;
        }

        handler.setCode(-1);
        handler.setError("保存失败!");
        return handler;

    }

    /**
     * 添加IOS安装包
     */
    public FastHandler addIOSApp(String appCode, File ipaSourceFile) throws Exception {
        FastHandler handler = new FastHandler();
        File plistFile = IPAUtils.getPlistFile(ipaSourceFile);
        if (plistFile != null) {
            NSDictionary rootDict = (NSDictionary) PropertyListParser.parse(plistFile);

            if (appCode.equalsIgnoreCase("auto")) {
                appCode = FastMD5Utils.MD5To16(String.valueOf(rootDict.get("CFBundleIdentifier")));
            }

            FinalAppEntity appByCode = FinalAppEntity.dao().getAppByCode(appCode);
            if (appByCode == null) {
                appByCode = FinalAppEntity.newInstance();
                appByCode.set("appCode", appCode);
                if (rootDict.containsKey("CFBundleDisplayName")) {
                    appByCode.set("appName", String.valueOf(rootDict.get("CFBundleDisplayName")));
                } else {
                    appByCode.set("appName", String.valueOf(rootDict.get("CFBundleName")));
                }
                appByCode.set("appState", FinalAppEntity.FinalAppStateEnum.正常.ordinal());
                File appIcon = IPAUtils.getAppIcon(ipaSourceFile, plistFile);
                if (appIcon != null) {

                    File destFile = new File(appIcon.getParent(), "appIcon_dest.png");
                    File upFile = new File(appIcon.getParent(), "appIcon_up.png");
                    File downFile = new File(appIcon.getParent(), "appIcon_down.png");

                    ConvertHandler convertHandler = new ConvertHandler();
                    convertHandler.convertPNGFile(appIcon, destFile, upFile, downFile);

                    appByCode.set("appLogo", FastFile.newInstance(destFile).getUrl());

                    FastFileUtils.forceDelete(appIcon);
                    FastFileUtils.forceDelete(destFile);
                    FastFileUtils.forceDelete(upFile);
                    FastFileUtils.forceDelete(downFile);
                }

                if (!appByCode.save()) {
                    handler.setError(appByCode.getError());
                    handler.setCode(-1);
                    return handler;
                }
            }

            boolean beta = String.valueOf(rootDict.get("CFBundleShortVersionString")).toLowerCase().contains("beta");

            FinalAppIosEntity lastVersion = FinalAppIosEntity.dao().getLastVersion(appByCode.getId(), beta);
            FinalAppIosEntity iosEntity = FinalAppIosEntity.newInstance();
            iosEntity.set("appId", appByCode.getId());
            if (lastVersion != null) {
                iosEntity.setAll(lastVersion);
                iosEntity.remove("versionId");
                iosEntity.remove("versionDateTime");
                iosEntity.remove("countDownload");
            }
            iosEntity.set("packageName", String.valueOf(rootDict.get("CFBundleIdentifier")));
            iosEntity.set("versionName", String.valueOf(rootDict.get("CFBundleShortVersionString")));
            iosEntity.set("versionBuild", String.valueOf(rootDict.get("CFBundleVersion")));
            iosEntity.set("appOSType", String.valueOf(rootDict.get("MinimumOSVersion")));

            File mobileProvisionFile = IPAUtils.getMobileProvisionFile(ipaSourceFile);
            if (mobileProvisionFile != null && mobileProvisionFile.exists()) {
                NSDictionary nsDictionary = IPAUtils.parseMobileProvisionFile(mobileProvisionFile);
                if (nsDictionary != null) {
                    NSArray provisionedDevices = (NSArray) nsDictionary.get("ProvisionedDevices");
                    if (provisionedDevices != null) {
                        List uuidList = new ArrayList<>();
                        for (int i = 0; i < provisionedDevices.count(); i++) {
                            uuidList.add(provisionedDevices.objectAtIndex(i).toString());
                        }
                        iosEntity.set("appDevices", FastStringUtils.join(uuidList, "\n"));
                    }
                    iosEntity.set("appTeamName", String.valueOf(nsDictionary.get("TeamName")));
                }
                FastFileUtils.forceDelete(mobileProvisionFile);
            }

            IPAUtils.clearFile(ipaSourceFile);

            iosEntity.set("fileSize", ipaSourceFile.length());
            iosEntity.set("appFile", FastFile.newInstance(ipaSourceFile).getUrl());
            iosEntity.set("plistFile", iosEntity.getPlistFileUrl(appByCode));
            if (iosEntity.save()) {
                FastFileUtils.forceDelete(plistFile);
                handler.setError("上传成功!");
                handler.setCode(0);
                return handler;
            }
        }
        handler.setCode(-1);
        handler.setError("保存失败!");
        return handler;

    }




}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy