iOS 批处理脚本打包-从编译到打包

2023-10-31

最近更新了Xcode9 ,由于项目需要,Xcode9打包出ipa后根据之前的脚本工具,继续我的批处理打包。但是!!!!!,打包后居然出现了iOS 11 安装后图标没有改变还是原始的图标。为了验证 我再一次用Xcode8 打包 ,然后脚本打包,没有出现问题。但是解压ipa文件 发现图片是替换了的,我用iOS10 安装 icon可以替换。

由于项目需要现在必须批量打包 如果一个一个打包。。。。。 估计要等一天。

看来要找一个Xcode9 的打包方式,.app 转ipa 这条路我暂时没有找到方法

看来只有从编译到打包的可行性方法。但是这种方式比较慢估计一个打包需要2-3分钟,但是总比没有方法好。

准备环境:

1.工程文件

2.shell命令

3.exportOptionsPlist.plist 配置文件

第一步 配置文件 exportOptionsPlist.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>compileBitcode</key>
	<false/>
	<key>method</key>
	<string>enterprise</string>
	<key>provisioningProfiles</key>
	<dict>
		<key>XXX.XXXX.XXXXX</key>
		<string>provisioningProfiles 描述文件名称</string>
	</dict>
	<key>signingCertificate</key>
	<string>iPhone Distribution</string>
	<key>signingStyle</key>
	<string>manual</string>
	<key>stripSwiftSymbols</key>
	<true/>
	<key>teamID</key>
	<string>XXXXXXX</string>
	<key>thinning</key>
	<string><none></string>
</dict>
</plist>

method:打包方式 我这里是企业打包  。

第二步:配置脚本文件shell.sh

结合我的这篇文章

http://blog.csdn.net/think_ma/article/details/72954467

思路都是一样的 遍历子文件然后根据配置来批量生产。

#使用方法

if [ ! -d ./shellHandle ];
    then
        mkdir -p ./shellHandle;
fi


if [ ! -d ./shellHandle/IPADir ];
    then
        mkdir -p ./shellHandle/IPADir;
fi



arr=();

#打包成功的个数
success=0;

#打包失败的个数
fail=0;


#工程绝对路径
project_path=$(cd `dirname $0`; pwd)

#工程名 将XXX替换成自己的工程名
project_name=XXXXXXX

#scheme名 将XXX替换成自己的sheme名
scheme_name=XXXXXXX

#打包模式 Debug/Release
development_mode=Release

#build文件夹路径
build_path=${project_path}/shellHandle/build

#plist文件所在路径
exportOptionsPlistPath=${project_path}/shellHandle/exportOptionsPlist.plist

#导出.ipa文件所在路径
exportIpaPath=${project_path}/shellHandle/IPADir/${development_mode}

echo "确认是否为release 环境?"
read number1
echo "服务器是否为正式环境?"
read number2
echo "是否关闭log日志?"
read number3
echo "[ 1:是 2:否] "

enterNum=1;

##
read number
    while([[ $number != 1 ]] && [[ $number != 2 ]])
    do
        if [ $enterNum == 5 ];
            then
        echo "输入多次错误退出!!"
        exit 0
        fi
        echo "Error! Should enter 1 or 2"
        echo "确认是否为release 环境?"
        echo "服务器是否为证实环境?"
        echo "是否关闭log日志?"
        echo "[ 1:是 2:去确认] "
        enterNum=$[$enterNum+1]
        read number
    done

if [ $number == 1 ];
    then 
    echo "开始批量打包"
    startTime=$(date +%c)
else
    echo "请确认打包环境再进行打包"
    exit 0
fi



# 循环进入

for file2 in `ls -a ./shellHandle/module`
do
    if [ x"$file2" != x"." -a x"$file2" != x".." -a x"$file2" != x".DS_Store" ]; then
        echo $file2

        #Conf file
        CONF=./shellHandle/module/$file2/resign.conf

        echo $CONF


        #Datetime
        NOW=$(date +"%Y%m%d_%s")
        Appcode1="121212121"
        Appcode2="121212121"
        appViewaon="2.03"


        #Load config
        if [ -f ${CONF} ]; then
            . ${CONF}
        fi

        #Temp
        TEMP="temp"
        if [ -e ${TEMP} ]; then
            echo "ERROR: temp already exists"
            exit 1
        fi



        #Check app ID
        if [ -z ${APP_ID} ]; then
            echo "ERROR: missing APP_ID"
            exit 1
        fi

        echo ${APP_ID}

        
        if [ -z ${APP_NAME} ]; then
            echo "ERROR: missing APP_NAME"
            exit 1
        fi

        echo ${APP_NAME}
        
        if [ -z ${APP_SCHOOLCODE} ]; then
            echo "ERROR: missing APP_SCHOOLCODE"
            exit 1
        fi
        echo ${APP_SCHOOLCODE}


        if [ -z ${APP_SCHOOLCODE2} ]; then
            echo "ERROR: missing APP_SCHOOLCODE2"
            exit 1
        fi
        echo ${APP_SCHOOLCODE2}


        #修改icon的目录文件
        APPICONTemp="${project_path}/XXXXXXXX/Assets.xcassets/AppIcon.appiconset"
        
        #修改plist文件的目录
        APPICONplist="${project_path}/XXXXXXXX"


        echo ${APPICONplist}/Info.plist

        # Change icon
        echo "Change icon"
        cp "./shellHandle/module/$file2${ASSETS_PATH}/Icon-iPad-40@2x.png" "${APPICONTemp}/Icon-iPad-40@2x.png"
        cp "./shellHandle/module/$file2${ASSETS_PATH}/Icon-iPad-40.png" "${APPICONTemp}/Icon-iPad-40.png"
        cp "./shellHandle/module/$file2${ASSETS_PATH}/Icon-iPad-29@2x.png" "${APPICONTemp}/Icon-iPad-29@2x.png"
        cp "./shellHandle/module/$file2${ASSETS_PATH}/Icon-iPad-29.png" "${APPICONTemp}/Icon-iPad-29.png"
        cp "./shellHandle/module/$file2${ASSETS_PATH}/Icon-iPad-50@2x.png" "${APPICONTemp}/Icon-iPad-50@2x.png"
        cp "./shellHandle/module/$file2${ASSETS_PATH}/Icon-iPad-50.png" "${APPICONTemp}/Icon-iPad-50.png"
        cp "./shellHandle/module/$file2${ASSETS_PATH}/Icon-iPad-72@2x.png" "${APPICONTemp}/Icon-iPad-72@2x.png"
        cp "./shellHandle/module/$file2${ASSETS_PATH}/Icon-iPad-72.png" "${APPICONTemp}/Icon-iPad-72.png"
        cp "./shellHandle/module/$file2${ASSETS_PATH}/Icon-iPad-76@2x.png" "${APPICONTemp}/Icon-iPad-76@2x.png"
        cp "./shellHandle/module/$file2${ASSETS_PATH}/Icon-iPad-76.png" "${APPICONTemp}/Icon-iPad-76.png"
        cp "./shellHandle/module/$file2${ASSETS_PATH}/Icon-iPhone-57.png" "${APPICONTemp}/Icon-iPhone-57.png"
        cp "./shellHandle/module/$file2${ASSETS_PATH}/Icon-iPhone-57@2x.png" "${APPICONTemp}/Icon-iPhone-57@2x.png"
        cp "./shellHandle/module/$file2${ASSETS_PATH}/Icon-iPhone-60@2x.png" "${APPICONTemp}/Icon-iPhone-60@2x.png"
        cp "./shellHandle/module/$file2${ASSETS_PATH}/Icon-iPhone-60@3x.png" "${APPICONTemp}/Icon-iPhone-60@3x.png"
        cp "./shellHandle/module/$file2${ASSETS_PATH}/Icon-iPhone-29@3x.png" "${APPICONTemp}/Icon-iPhone-29@3x.png"
        cp "./shellHandle/module/$file2${ASSETS_PATH}/Icon-iPhone-29@2x.png" "${APPICONTemp}/Icon-iPhone-29@2x.png"
        cp "./shellHandle/module/$file2${ASSETS_PATH}/Icon-iPhone-29.png" "${APPICONTemp}/Icon-iPhone-29.png"
        cp "./shellHandle/module/$file2${ASSETS_PATH}/Icon-iPhone-40@3x.png" "${APPICONTemp}/Icon-iPhone-40@3x.png"
        cp "./shellHandle/module/$file2${ASSETS_PATH}/Icon-iPhone-40@2x.png" "${APPICONTemp}/Icon-iPhone-40@2x.png"
        cp "./shellHandle/module/$file2${ASSETS_PATH}/Icon-iPhone-20@3x.png" "${APPICONTemp}/Icon-iPhone-20@3x.png"
        cp "./shellHandle/module/$file2${ASSETS_PATH}/Icon-iPhone-20@2x.png" "${APPICONTemp}/Icon-iPhone-20@2x.png"
        cp "./shellHandle/module/$file2${ASSETS_PATH}/Icon-iPad-83.5@2x.png" "${APPICONTemp}/Icon-iPad-83.5@2x.png"

        # cp "./module/$file2${ASSETS_PATH}/AppIcon40x40@2x.png" "${TEMP}/Payload/${APP_NAME}.app/AppIcon40@2x.png"
        # cp "./module/$file2${ASSETS_PATH}/AppIcon40x40@3x.png" "${TEMP}/Payload/${APP_NAME}.app/AppIcon40@3x.png"
        # cp "./module/$file2${ASSETS_PATH}/AppIcon57x57.png" "${TEMP}/Payload/${APP_NAME}.app/AppIcon29x29.png"
        echo '///-----------'
        echo '/// icon 替换完成'
        echo '///-----------'




        # #Change Bundleversion
        # if [[ ! -z ${APP_BUNDLE_VERSION} ]]; then
        #     /usr/libexec/PlistBuddy -c "Set CFBundleVersion ${APP_BUNDLE_VERSION}" ${TEMP}/Payload/${APP_NAME}.app/Info.plist
        # fi


        # #Change CFBundleShortVersionString
        # if [[ ! -z ${APP_BUNDLE_SHORT_VERSION_STRING} ]]; then
        #     /usr/libexec/PlistBuddy -c "Set CFBundleShortVersionString ${APP_BUNDLE_SHORT_VERSION_STRING}" ${TEMP}/Payload/${APP_NAME}.app/Info.plist
        # fi


        if [[ ! -z ${App_DisapleName} ]]; then
            /usr/libexec/PlistBuddy -c "Set CFBundleDisplayName ${App_DisapleName}" ${APPICONplist}/Info.plist
        fi
        # #Change CFBundleShortVersionString
        # if [[ ! -z ${APP_BUNDLE_SHORT_VERSION_STRING} ]]; then
        #     /usr/libexec/PlistBuddy -c "Set CFBundleShortVersionString ${appViewaon}" ${TEMP}/Payload/${APP_NAME}.app/Info.plist
        # fi

        # #Change Bundleidentifier
        # /usr/libexec/PlistBuddy -c "Set Bundle display name ${APP_NAME}" ${TEMP}/Payload/${APP_NAME}.app/Info.plist

        /usr/libexec/PlistBuddy -c "Set school_code ${APP_SCHOOLCODE}" ${APPICONplist}/Info.plist

        /usr/libexec/PlistBuddy -c "Set school_code2 ${appcode1}${APP_SCHOOLCODE2}${appcode2}" ${APPICONplist}/Info.plist

        echo '///-----------'
        echo '/// plist 文件修改完成'
        echo '///-----------'

        #/usr/libexec/PlistBuddy -c "Set school_message ${APP_SCHOOLMESSAGE}" ${TEMP}/Payload/${APP_NAME}.app/Info.plist
echo '///-----------'
echo '/// 正在清理工程'
echo '///-----------'
xcodebuild \
clean -configuration ${development_mode} -quiet  || exit

echo '///--------'
echo '/// 清理完成'
echo '///--------'
echo ''

echo '///-----------'
echo '/// 正在编译工程:'${development_mode}
echo '///-----------'
xcodebuild \
archive -workspace ${project_path}/${project_name}.xcworkspace \
-scheme ${scheme_name} \
-configuration ${development_mode} \
-archivePath ${build_path}/${project_name}.xcarchive -quiet  || exit

echo '///--------'
echo '/// 编译完成'
echo '///--------'
echo ''

echo '///----------'
echo '/// 开始ipa打包'
echo '///----------'

xcodebuild -exportArchive -archivePath ${build_path}/${project_name}.xcarchive \
-configuration ${development_mode} \
-exportPath ${exportIpaPath} \
-exportOptionsPlist ${exportOptionsPlistPath} \
-quiet || exit

if [ -e $exportIpaPath/$scheme_name.ipa ];
    then
    echo '///----------'
    echo '/// ipa包已导出'
    echo '///----------'
    mv $exportIpaPath/$scheme_name.ipa ${project_path}/shellHandle/IPADir/build/${APP_SCHOOLCODE}.ipa
    success=$[$success+1];

   # open $exportIpaPath
    else
    echo '///-------------'
    echo '/// ipa包导出失败${APP_SCHOOLCODE}'
    echo '///-------------'
    fail=$[$fail+1]

fi
echo '///------------'
echo '/// 打包ipa完成  '
echo '///-----------='
echo ''

    fi
done

endTime=$(date +%c)
echo "开始时间:${startTime}"
echo "结束时间:${endTime}"
echo "成功=${success} 失败=${fail}"
echo "批量打包ipa完成>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
exit 0

把这个文件放在工程目录下面,创建一个shellHandle文件夹 把exportOptionsPlist.plist这个文件放入文件夹中

运行 shell.sh

最后显示

开始时间:五 11/24 22:24:11 2017
结束时间:五 11/24 22:28:52 2017
成功=2 失败=0
批量打包ipa完成>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

由于这个每次都是编译然后打包 速度上比较慢,打一个包至少要2-3分钟,时间上比较慢。

这个算是曲线救国了,如果有什么好的批量打包的方式可以一起讨论。



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iOS 批处理脚本打包-从编译到打包 的相关文章

  • ios屏幕的旋转,Device Orientation

    屏幕旋转 我的理解是ios设备根据重力感应改变屏幕的方向 那么如何在屏幕转动后变换UI 或则保持原样呢 ios设备支持4个方向 UIInterfaceOrientationPortrait UIInterfaceOrientationPor
  • ios导航栏透明

    功能需求 根新浪微博个人主页类似 下拉拉伸放大图片下拉刷新 前面文章已解决 向上滑动的时候 导航栏的透明度逐渐增加 最后变成不透明的 当然说起来感觉其实没什么 不就是滑动改变透明度吗 但是做起来完全不是你想象的那样 首先解决透明度的问题 让
  • 两个app应用之间的跳转

    一 应用跳转的原理 从一个应用跳转到另一个应用 作为APP开发者 最熟悉的莫过于第三方登录 支付宝 微信支付时 那时候我们可能仅仅按照集成文档一步一步操作 在文档中配置很多类似URL Schemes 如下图 一般的配置 下面我们进入正题的为
  • iOS-Andriod百度地图仿百度外卖-饿了么-选择我的地址-POI检索/

    http zanderzhang gitcafe io 2015 09 19 iOS Andriod百度地图仿百度外卖 饿了么 选择我的地址 POI检索 title iOS Andriod百度地图仿百度外卖 饿了么 选择我的地址 POI检索
  • xcodebuild使用

    转自 xcodebuild命令简单使用 简书 流程 build archive IPA teamid xcodebuild命令简单使用 前提准备证书并熟悉xcodebuild介绍 以及官方文档 xcodebuild showsdks查看可用
  • iOS 15 适配踩坑:NavigationBar、UITabBar失效问题

    苹果前两天推出了iOS 15 秋天都等不及 相关链接 ios 15 0 适配问题 NavigationBar和UITabBar失效问题 Xcode 13 beta版 iOS 15 beta 3的系统 除了客户提出的问题 自己还发现了两处UI
  • 使用FTP(IOS FTP客户端开发教程)

    本文翻译自新近Wrox出版社出版的 由Peter van de Put所著的 Professional iOS Programming 该书题材比较新颖 结构合理 是一本不错的IOS开发书籍 本文译自该书第八章 Using FTP 本文开放
  • autorelease(IOS开发)的原理详解

    转载出处 http tieba baidu com p 3427605546 转载出处 http blog csdn net c395565746c article details 7613814 当您向一个对象发送一个autoreleas
  • objc学习笔记-基础

    1 xcode 4 3 3以后 NSAutoreleasePool 的用法发生改变 由 NSAutoreleasePool pool NSAutoreleasePool alloc init pool drain 变为 autoreleas
  • iOS内购-防越狱破解刷单

    2018 10 16更新 最近我们公司丢单率上涨 尤其是10月份比9月份来说丢单率翻了3倍 和一些同行交流了一下 发现他们也是丢单量增加 初步推断可能是苹果iOS12的原因 某些情况下会有用户内购成功后 却返回的是订单失败 错误类型为SKE
  • APNS编程----iOS真机测试消息推送

    一 准备工作 1 拥有一台iOS为操作系统的苹果设备 iPhone iPad iPod都可以 2 拥有苹果开发者账号 需要真机调试 最好是是付费开发者 后面的步骤将会更顺利 3 需要一台PC做推送服务器 如果是台拥有MAC OS系统 将会更
  • 适配IPv6遇到的坑,终极解决方案

    6 1AppStore发布之后的应用要兼容IPv6 然而我上个星期发布的版本并没有因为没兼容而被拒 这次提交却遇到IPv6兼容问题 话不多说 上代码 NSString getIPWithHostName const NSString hos
  • ad Hoc打包测试

    一 iOS证书 首先介绍一下iOS证书 iOS证书分两种 1 开发证书 用来给你 开发人员 做真机测试 2 发布证书 又分为两种 发布到app store 和发布测试的ad hoc证书 本文就详细讲解 ad hoc证书的创建 二 什么时候用
  • java学习笔记——JDBC 中 ResultSet、ResultSetMetaData配置对象的属性、批处理

    使用ResultSet ResultSetMetaData操作数据表 SELECT public void test1 1 获取连接 Connection conn null PreparedStatement ps null 4 执行 S
  • iOS App上架流程

    前言 作为一名IOS开发者 把开发出来的App上传到App Store是必须的 下面就来详细介绍下具体流程 1 打开苹果开发者中心 https developer apple com 打开后点击 Member Center 如果你的电脑没有
  • iOS开发中的网络请求

    转载自http www cocoachina com ios 20140919 9691 html 今天来说说关于iOS开发过程中的网络请求 关于网络请求的重要性我想不用多说了吧 对于移动客户端来说 网络的重要性不言而喻 常见的网络请求有同
  • Appstore审核被拒-[4. DESIGN: PREAMBLE]

    Appstore审核被拒原文如下 原因是设置里有一个版本信息可以响应点击事件进入一个版本详情页 苹果要求版本更新必须使用iOS版本更新内置更新机制 4 DESIGN PREAMBLE Design Preamble The version
  • 如何获取iPhone手机的UUID

    方法一 通过Windows下的iTunes 1 数据线连接iPhone手机 在Windows下打开iTunes 在 iPhone 管理界面下zhi点击 序列号 查看自己的 UUID 标识符 2 此dao时点击菜单 编辑 gt 复制 3 新建
  • 配置描述文件mobileconfig的生成及注意事项

    1 mobileconfig描述配置文件的下载 我们要控制ios上的移动设备 那么我们就需要下载mobileconfig描述配置文件 一般我们可以一个设备对应一个设备ID 即我们后面会看到的请求参数 deviceId 例如 PUT Path
  • iOS weak关键字实现原理

    在iOS中 使用weak关键字能够对内存对象进行弱引用 基于这个特性 使用weak关键字能够解决许多问题 例如delegate中对象的循环持有问题 Block对对象的强引用导致的对象无法及时释放问题 为何weak关键字能够实现对内存对象的弱

随机推荐

  • line-height和height的区别

    line height 是指每行的高度 假如定义p标签的行高为line heigth 20px 文字在浏览器中显示为一行时 这个p标签的高度会为20px 如果为两行 则p标签的高度为40px line height是20px不变 只是hei
  • Python实现熵值法确定权重

    该文为转载文章 无排版 链接直达 Python实现熵值法确定权重 本文从以下四个方面 介绍用Python实现熵值法确定权重 一 熵值法介绍 二 熵值法实现 三 Python实现熵值法示例1 四 Python实现熵值法示例2 一 熵值法介绍
  • 【大模型】自动化问答生成:使用GPT-3.5将文档转化为问答对

    自动化问答生成 使用GPT 3 5将文档转化为问答对 正文 步骤1 准备工作 步骤2 编写Python脚本 总结 当我们需要将大段文档转化为问答对时 OpenAI的GPT 3 5模型提供了一个强大的工具 这个教程将向您展示如何编写一个Pyt
  • python串口通信

    首先用USB线连上串口设备 然后确认是哪个COM口 下面用COM3为例 import serial t serial Serial COM3 115200 command aabbccddee 十六进制字符串 t write command
  • Redis实践(二)高可用的集群+哨兵部署

    项目中通常会需要若干台Redis服务器来协同担当起内存数据库的工作 在redis的部署方案上要考虑下面几点 结构上 单个 Redis 服务器会发生单点故障 而且一台服务器需要承受所有的请求负载 这就需要为数据生成多个副本并分配在不同的服务器
  • windows 安装 golang 多版本管理工具

    多版本管理工具 g 下载地址 https github com voidint g releases 1 得到一个g exe文件 直接将解压后的 g exe 放到D盘的g目录 解压后双击运行一次就行了 2 更改GOROOT G MIRROR
  • python中count函数的用法

    Python count 方法 描述 Python count 方法用于统计字符串里某个字符出现的次数 可选参数为在字符串搜索的开始与结束位置 count 方法语法 str count sub start 0 end len string
  • python url加密解密_python解密百度加密链接的脚本

    发个脚本吧 因为一般百度的超链接爬下来都是未解密的 导致数据用处不大 解密后就有很多用处了 下面是代码 做了两个版本 第二个速度和稳定性更好 1 import requests zhen open zhen txt w for i in o
  • 刷脸支付新的市场不断衍生新的需求

    人脸识别是一种基于人的面部特征信息进行身份辨识的生物特征识别技术 起始于20世纪60年代 在90年代后期开始进入应用阶段 目前已经是一类发展比较成熟的技术 人脸识别技术深奥且复杂 其算法基本思路是通过捕捉和对比分析人的 面部特征 来识别人的
  • 如何深度理解排序算法(一)

    如何深度理解排序算法 一 对于算法的理解 可以看成解决问题的过程和方式 无论算法是好还是坏 它都是一个独立的个体 在众多算法中 排序算法是经常被用到 或者在以往的生活或者面试当中会被提到的 所以理解和学会排序算法是非常重要的 还记得上小学的
  • crmeb安装教程说明

    安装教程说明 1 下载源码后解压到你的网站根目录下面 2 然后配置你的网站运行目录为public 3 配置伪静态为thinkphp的规则就行 location if e request filename rewrite index php
  • 机器学习: 神经网络中的Batch Normalization(BN)算法

    一 什么是Batch Normalization 1 从白化 Whiten 说起 之前的研究表明如果在图像处理中对输入图像进行白化 Whiten 操作的话 所谓白化 就是对输入数据分布变换到0均值 单位方差的正态分布 那么神经网络会较快收敛
  • C/C++ 开发利器 CLion安装与配置

    概述 CLion是Jetbrains公司旗下新推出的一款专为开发C C 所设计的跨平台IDE 它是以IntelliJ为基础设计的 同时还包含了许多智能功能来提高开发人员的生产力 提高开发人员的工作效率 这个强大的IDE不仅可以帮助开发人员在
  • 使用LL库开发STM32:GPIO口与外部中断

    文章目录 目的 初始化设置 输出与控制 输入与端口值读取 外部中断 总结 目的 GPIO口使用是单片机开发中最简单的一块 STM32的GPIO口无论是使用HAL库还是LL库开发起来都很简单 也没有什么坑 一般的对性能和内存等没有特殊要求的话
  • 时序预测

    时序预测 MATLAB实现ARMA自回归移动平均模型时间序列预测 目录 时序预测 MATLAB实现ARMA自回归移动平均模型时间序列预测 预测效果 基本介绍 程序设计 参考资料 预测效果 基本介绍 MATLAB实现ARMA时间序列预测 完整
  • 区块链经典图书推荐

    出品 白话区块链 ID hellobtc 白话区块链特精选区块链入门和进阶 必看书单 供君挑选 现在一本书最贵也就售价几十元 带来的也许是新时代更多的机遇 知识真心不贵 有需要的同学赶紧行动吧 01 区块链 元宇宙的基石 作者 简蓉蓉 马丹
  • 中国与外国(发达国家)

    偶尔就会看到什么崇洋媚外 就有人出来说 要看到自己的长处 不要什么都根国外学习 所以 以前总是希望能找到自己过人的长处 东西也用中国的 例如 买mp3 想到国外的那么贵 国产的便宜 而且功能多 于是就买国产的 例如 书籍 国外的书 都是E文
  • Google Play services SDK的安装

    官方网站可参考 http developer android com google play services setup html 2012年3月6日Google Market 改名为Google Play 相应的Google 不断在丰富
  • Java 静态绑定和动态绑定

    绑定 一个方法的调用与方法所在的类关联起来 静态绑定 final static private 在程序执行前已经被绑定 也就是说在编译过程中就已经知道这个方法是哪个类的方法 此时由编译器获取其他连接程序实现 动态绑定 在运行根据具体对象的类
  • iOS 批处理脚本打包-从编译到打包

    最近更新了Xcode9 由于项目需要 Xcode9打包出ipa后根据之前的脚本工具 继续我的批处理打包 但是 打包后居然出现了iOS 11 安装后图标没有改变还是原始的图标 为了验证 我再一次用Xcode8 打包 然后脚本打包 没有出现问题