代码之家  ›  专栏  ›  技术社区  ›  Daniel A. White

通过发布版本有效地测试iPhone应用程序

  •  4
  • Daniel A. White  · 技术社区  · 14 年前

    我们有一个应用程序在上崩溃了 armv6 来自应用商店的iOS设备。 armv7 armv6发动机 armv7系列 . 在日志里,我发现 EXC_BAD_INSTRUCTION 当它试图从库中构造一个对象时。崩溃似乎是发布版本上的链接错误,因为我有几个来自three20的静态库。起初我认为这是一个iOS版本的问题,但现在它看起来像一个“胖二进制”的问题。

    ad-hoc是拥有模拟应用程序商店进行测试的最佳方式吗?在设备上测试发布版本的最佳方法是什么?在一台计算机上测试与不同设备的连接的最佳方法是什么 建造?

    4 回复  |  直到 14 年前
        1
  •  1
  •   Community Doug McClean    7 年前

    我找不到iOS兼容性测试实验室的参考资料,但我听说这是目前可用的。如果我能找到这个资源,我会更新我的回复。

    同时,您可以在这里找到UI自动化测试建议: Automated testing for iPhone

    不幸的是,你必须找到一个3g的iPhone来验证arm6的兼容性。我希望你只要问问你认识的每一个有新iPhone的人就可以很容易地找到一个。他们可能和我一样把旧手机放在抽屉里。我用我的做测试。

    如果您可以证明一个复杂的解决方案是正确的,那么您可以将旧的iPhone永久地连接到macmini上,并使用上述使用Hudson或CruiseControl的UI测试框架驱动UI。这将是最可靠和最省时的方法,如果你能使前期投资。

        2
  •  1
  •   AndrewS    14 年前

    您可以使用 协同设计 命令行工具。构建分发目标后,应用程序文件将具有“分发”权限;您需要将其更改为 权威。更改之后,您可以在开发设备上安装构建并进行测试。

    要查看应用程序签名的详细转储,请执行以下操作:

    $ codesign -d -vv MyApp.app/MyApp
    

    要更改代码设计权限,请执行以下操作:

    $ codesign -f -s "My iPhone Developer Name" -vv MyApp.app/MyApp
    

    您可能需要创建一个环境变量来获取codesign的正确版本:

    $ export CODESIGN_ALLOCATE=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate
    

    我在Craig Hockenberry的博客上找到了这些说明,其中有很多关于这个过程的附加信息: http://furbo.org/2008/11/12/the-final-test/

        3
  •  1
  •   Daniel A. White    13 年前

        4
  •  -1
  •   TyB    14 年前

    我使用ANT创建发行版,使用xcodebuild命令行实用程序。蚂蚁的目标是这样的:

     <target name="build-adhoc">
            <echo>Running XCODE compiler</echo>
            <exec executable="xcodebuild" failonerror="true" vmlauncher="false" dir="${connect_src}">
                <arg value="build"/>
                <arg value="-target" />
                <arg value="myappname" />
                <arg value="-configuration"/>
                <arg value="AdHoc"/>
                <arg value="SYMROOT=${export_app}-${version.number}/AdHoc" />
                <env key="USER_HEADER_SEARCH_PATHS" value="/tmp/build/trunk/Libraries/somesource/**\ /tmp/build/trunk/Libraries/somemoresource/**"/>
            </exec>
            <echo>xcode build complete</echo>
        </target>
    

    为临时版本创建一个配置,并确保它使用一个临时准备的配置文件。或者,您可以创建一个普通的、非特别的配置,使用您的开发人员配置文件。如果您使用前一种方法,您可以通过电子邮件将产品以及您的配置概要文件发送给测试人员。如果使用后者,则可以使用iPhone Config实用程序在配置文件中的任何设备上安装。

    另外,我们还有一个ANT目标设置,它依赖于从源代码管理执行一个新的签出并从那里进行构建。最后,我们使用一个真正的App Store就绪配置来完成一个构建,这样我们就可以测试第一个构建并将第二个发布给Apple,在一定程度上确定代码行为是相同的。

    以下是按处理顺序列出的ANT目标摘要:

    1. 清除签出和生成目录
    2. 修改plist以删除调试和元素,仅用于内部使用(使用PLISTBUDDY)
    3. 运行单元测试(这需要将sdk设置设置为iphonesimulator4.x和一个特殊的目标——请参阅iPhone开发者指南了解单元测试)
    4. 执行内部构建(使用dev概要文件或临时概要文件)
    5. 执行分发生成(使用应用商店分发证书)
    6. 签入具有新生成版本的plist文件
    7. 在源代码管理中做一个标记,指示生成
    8. 报告生成统计信息(生成版本、位置等)

    注意:确保您在xcodebuild命令语法中设置了SYMROOT env变量,以便您的构建最终位于正确的目录中。我们在事后复制应用商店版本时遇到了问题。

    此脚本是“已清理”的,因此它仅用作开始的模型:

    <?xml version="1.0" ?>
    
    <project basedir="." default="xcode-build" name="Temp">
        <property file="build.properties" />
        <property name = "CONFIGURATION_INTERNAL" value = "InternalRelease" />
        <property name = "CONFIGURATION_DISTRIBUTION" value = "Distribution" />
        <property name = "CONFIGURATION_ADHOC" value = "InternalAdHoc" />
        <property name="cvsroot" value=":pserver:${username}:${password}@${cvsurl}"/>
        <tstamp>
          <format property="TODAY"
                  pattern="MM-dd-yyyy"
                  locale="en,US"/>
        </tstamp>
    
    
        <target name="init">
            <echo message="deleting old directories" />
            <delete dir="${check_out_location}"/>
            <mkdir dir="${check_out_location}"/>
        </target>
    
    
        <target name="set-source-trees" depends="init">
        <echo message="exporting source tree variables" />
            <echo message="${somesourcedir}" />
            <exec executable="/bin/bash" os=" Mac OS X">
                <arg value="-c" />
                <arg value="${export_src_trees}"/>
                <arg value="${anothersourcedir}"/>
            </exec>
            <exec executable="/bin/bash" os=" Mac OS X">
                <arg value="-c" />
                <arg value="${export_src_trees}"/>
                <arg value="${yetanothersourcedir}"/>
            </exec>
        </target>
    
    
        <target name="cvs-login" depends="init" description="CVS Login">
            <echo>Login CVS</echo>
            <cvs cvsroot=":pserver:${username}:${password}@${cvsurl}" command="login" />
        </target>
    
        <target name="checkout" depends="cvs-login" description="Check out source from CVS">
            <echo message="check out from CVS ...." />
            <echo message="${check_out_location}" />
            <cvs cvsroot="${cvsroot}"  command=" -Q checkout -P -d${project_trunk} ${project_repository_root}/${project_trunk} " dest="${check_out_location}" compression="true" />
            <echo message="...check out from CVS done" />
        </target>
    
    
         <target name="strip-settings" depends="checkout" description="Remove elements from the Settings.bundle that we don't want in the distribution">
            <echo message="Removing Settings not valid for distribution"/>
    
            <exec executable="/usr/libexec/PlistBuddy" failonerror="TRUE" dir="${app_src}/Resources">
                <arg value="-c"/>
                <arg value="Delete :PreferenceSpecifiers:3"/>
                <arg value="Settings.bundle/Root.plist"/>
            </exec>
    
            <exec executable="/usr/libexec/PlistBuddy" failonerror="TRUE" dir="${app_src}/Resources">
                <arg value="-c"/>
                <arg value="Delete :PreferenceSpecifiers:3"/>
                <arg value="Settings.bundle/Root.plist"/>
            </exec>
        </target>
    
    
        <target name="build-version" depends="checkout">
    
            <property name = "LOGLEVEL" value = "DEBUG" />
    
           <!-- GET THE NEXT VERSION NUMBER (major and minor) -->
            <exec executable="/tmp/build/trunk/Build/version.sh" failonerror="TRUE" outputproperty="version.number" dir="${app_src}"></exec>
    
            <echo message="Increment Build Number"/>
    
            <exec executable="agvtool" failonerror="TRUE" dir="${app_src}">
                <arg value="new-version"/>
                <arg value="-all"/>
                <arg value="${version.number}"/>
            </exec>
    
            <!-- GET THE MINOR portion of the version number for later use -->
            <exec executable="/tmp/build/trunk/Build/minor.sh" failonerror="TRUE" outputproperty="version.minor" dir="${app_src}"></exec>
    
            <!-- SET the version number as reference in the Settings.bundle -->
            <exec executable="/usr/libexec/PlistBuddy" failonerror="TRUE" dir="${app_src}">
                <arg value="-c"/>
                <arg value="Set :PreferenceSpecifiers:1:DefaultValue ${version.number}"/>
                <arg value="./Resources/Settings.bundle/Root.plist"/>
            </exec>
    
            <echo message="New build number=${version.number}"/>
    
            <!-- SET the log level - NOTE, ANT vars are immutable, if LOGLEVEL was previously set, it cannot be overridden -->
            <exec executable="/usr/libexec/PlistBuddy" failonerror="TRUE" dir="${app_src}">
                <arg value="-c"/>
                <arg value="Set LogLevel.Default ${LOGLEVEL}"/>
                <arg value="./Resources/SharedConfig.plist"/>
            </exec>
            <echo message="Log level set to ${LOGLEVEL}"/>
    
        </target>
    
    
         <target name="encrypt" depends="build-version">
            <!-- SOME ENCRYPTION OF SENSITIVE DATA -->
        </target>
    
    
        <target name="build-internal" depends="test-lib1, test-lib2, test-app, encrypt">
            <echo>Running XCODE compiler</echo>
            <exec executable="${xcode_builder}" failonerror="true" vmlauncher="false" dir="${app_src}">
                <arg value="clean"/>
                <arg value="install"/>    
                <arg value="-target" />
                <arg value="MyApp" />
                <arg value="-configuration"/>
                <arg value="${CONFIGURATION_INTERNAL}"/>
                <arg value="SYMROOT=${build_release}" />
                <env key="USER_HEADER_SEARCH_PATHS" value="/tmp/build/trunk/Libraries/somesource/**\ /tmp/build/trunk/Libraries/someothersource/**"/>
            </exec>
            <echo>xcode build complete</echo>
        </target>
    
         <target name="test-lib1" depends="checkout">
            <echo>Running XCODE compiler</echo>
            <exec executable="${xcode_builder}" failonerror="true" vmlauncher="false" dir="${somelib_dir}">
                <arg value="clean"/>
                <arg value="build"/>
                <arg value="-target" />
                <arg value="Lib1UnitTests"/>
                <arg value="-sdk"/>
                <arg value="iphonesimulator4.1"/>
                <arg value="SYMROOT=${build_release}" />
            </exec>
            <echo>xcode build complete</echo>
        </target>
    
         <target name="test-lib2" depends="checkout">
            <echo>Running XCODE compiler</echo>
            <exec executable="${xcode_builder}" failonerror="true" vmlauncher="false" dir="${somelib2_src_dir}">
                <arg value="clean"/>
                <arg value="build"/>
                <arg value="-target" />
                <arg value="Lib2UnitTests"/>
                <arg value="-sdk"/>
                <arg value="iphonesimulator4.1"/>
                <arg value="SYMROOT=${build_release}" />
                <env key="USER_HEADER_SEARCH_PATHS" value="/tmp/build/trunk/Libraries/Lib1source/**"/>
            </exec>
            <echo>xcode build complete</echo>
        </target>
    
          <target name="test-app" depends="checkout">
            <echo>Running XCODE compiler</echo>
            <exec executable="${xcode_builder}" failonerror="true" vmlauncher="false" dir="${app_src}">
                <arg value="clean"/>
                <arg value="build"/>
                <arg value="-target" />
                <arg value="AppUnitTests"/>
                <arg value="-sdk"/>
                <arg value="iphonesimulator4.1"/>
                <arg value="SYMROOT=${build_release}" />
                <env key="USER_HEADER_SEARCH_PATHS" value="/tmp/build/trunk/Libraries/Lib1/**\ /tmp/build/trunk/Libraries/Lib2/**"/>
            </exec>
            <echo>xcode build complete</echo>
        </target>
    
         <target name="build-distribution" depends="internal-release, test-lib1, test-lib2, test-app">
            <echo>Running XCODE compiler</echo>
            <exec executable="${xcode_builder}" failonerror="true" vmlauncher="false" dir="${app_src}">
                <arg value="build"/>
                <arg value="-target" />
                <arg value="MyApp" />
                <arg value="-configuration"/>
                <arg value="${CONFIGURATION_DISTRIBUTION}"/>
                <arg value="SYMROOT=${export_app}-${version.number}/Distribution" />
                <env key="USER_HEADER_SEARCH_PATHS" value="/tmp/build/trunk/Libraries/Lib1/**\ /tmp/build/trunk/Libraries/Lib2/**"/>
            </exec>
            <echo>xcode build complete</echo>
        </target>
    
        <target name="build-adhoc" depends="internal-release, test-lib1, test-lib2, test-app">
            <echo>Running XCODE compiler</echo>
            <exec executable="${xcode_builder}" failonerror="true" vmlauncher="false" dir="${app_src}">
                <arg value="build"/>
                <arg value="-target" />
                <arg value="MyApp" />
                <arg value="-configuration"/>
                <arg value="${CONFIGURATION_ADHOC}"/>
                <arg value="SYMROOT=${export_app}-${version.number}/AdHoc" />
                <env key="USER_HEADER_SEARCH_PATHS" value="/tmp/build/trunk/Libraries/Lib1/**\ /tmp/build/trunk/Libraries/Lib2/**"/>
            </exec>
            <echo>xcode build complete</echo>
        </target>
    
    
        <target name="checkin" depends="build-internal" description="Commit source to CVS" >
            <echo message="Committing to CVS ...." />
            <echo message="${check_out_location}" />
    
             <cvs cvsroot="${cvsroot}"  command="commit -m 'Commit of internal release build ${version.number}' MyApp-Info.plist" dest="${check_out_location}/trunk/Applications/MyApp" />
            <echo message="...commit done" />
        </target>
    
    
         <target name="tag-release" depends="checkin" description="Tag source in CVS" >
            <echo message="Tagging source ... Release-${version.minor}" />
            <echo message="${check_out_location}" />
            <cvs cvsroot="${cvsroot}"  command="tag Release-${version.minor}" dest="${check_out_location}"/>
            <echo message="...tag done" />
        </target>
    
    
         <target name="internal-release" depends="tag-release" description="Tag source in CVS" >
            <echo message="Creating Internal release ..." />
            <echo message="Deploying files to . . .${export_app}" />
            <copy todir="${export_app}-${version.number}">
                <fileset dir="${prod_dir_internal}"/>
            </copy>
    
            <echo message="Internal release ${version.number} complete." />
        </target>
    
    
         <target name="override-default-env"  description="Setup Env for Distribution" >
                    <property name = "LOGLEVEL" value = "WARN" />
         </target>
    
    
         <target name="distribution" depends="override-default-env, strip-settings, build-distribution" description="Create Distribution" >
    
            <echo message="Creating Distribution ..." />
            <echo message="Deploying files to . . .${export_app}-${version.number}/Distribution" />
            <echo message="Distribution ${version.number} complete." />
    
        </target>
    
         <target name="adhoc" depends="override-default-env, strip-settings, build-adhoc" description="Create Ad Hoc Distribution" >
    
            <echo message="Creating ad hoc distribution ..." />
            <echo message="Deploying files to . . .${export_app}-${version.number}/AdHoc" />
            <echo message="Ad hoc distribution ${version.number} complete." />
    
        </target>
    
    
    </project>
    
    Hope this helps.