Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/44.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用发布版本有效地测试iPhone应用程序_Iphone_Objective C_Crash_Linker - Fatal编程技术网

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

使用发布版本有效地测试iPhone应用程序,iphone,objective-c,crash,linker,Iphone,Objective C,Crash,Linker,我们有一个应用程序在来自应用商店的armv6iOS设备上崩溃armv7iOS设备运行正常。当该应用程序作为debug进行构建和测试时,它在armv6和armv7上都运行良好。在日志中,当它试图从库中构造对象时,我得到了EXC\u BAD\u指令。崩溃似乎是发布版本上的链接错误,因为我有几个来自three20的静态库。起初我认为这是一个iOS版本的问题,但现在它看起来像一个“胖二进制”问题 ad-hoc是拥有模拟应用商店进行测试的最佳方式吗?在设备上测试发布版本的最佳方法是什么?在发布版本上测试与

我们有一个应用程序在来自应用商店的
armv6
iOS设备上崩溃
armv7
iOS设备运行正常。当该应用程序作为debug进行构建和测试时,它在
armv6
armv7
上都运行良好。在日志中,当它试图从库中构造对象时,我得到了
EXC\u BAD\u指令。崩溃似乎是发布版本上的链接错误,因为我有几个来自three20的静态库。起初我认为这是一个iOS版本的问题,但现在它看起来像一个“胖二进制”问题


ad-hoc是拥有模拟应用商店进行测试的最佳方式吗?在设备上测试发布版本的最佳方法是什么?在发布版本上测试与不同设备的链接的最佳方法是什么?

我使用ANT创建发布版本,使用xcodebuild命令行实用程序。ant目标如下所示:

 <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>

运行XCODE编译器
xcode构建完成
为临时版本创建配置,并确保它使用临时准备的配置文件。或者,您可以创建一个使用开发人员资源调配配置文件的普通、非特殊配置。如果您使用前一种方法,您可以通过电子邮件将产品以及您的配置文件发送给测试人员。如果使用后者,则可以使用iPhone配置实用程序在配置文件中的任何设备上安装

此外,我们还有ANT目标设置,它依赖于从源代码管理执行新的签出,并从源代码管理执行构建。最后,我们使用一个真正的AppStore准备好的配置来完成构建,这样我们就可以测试第一个构建,并将第二个构建交付给苹果,在一定程度上确定代码行为是相同的

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

  • 设置生成所需的环境变量
  • 清除签出和生成目录
  • 源代码管理的签出头
  • 修改plist以仅删除内部使用的调试和元素(使用PLISTBUDDY)
  • 增量生成版本(使用agvtool)
  • 运行单元测试(这需要将sdk设置设置为iphonesimulator4.x和一个特殊目标——请参阅《iPhone开发人员指南》了解单元测试)
  • 进行内部构建(使用开发人员配置文件或临时配置文件)
  • 进行分发构建(使用应用商店分发证书)
  • 签入具有新生成版本的plist文件
  • 在源代码管理中执行一个指示生成的标记
  • 报告生成统计信息(生成版本、位置等)
  • 注意:确保在xcodebuild命令语法中设置了SYMROOT env变量,以便您的构建最终位于正确的目录中。我们在事后复制应用商店版本时遇到问题

    下面是用于创建多个构建的完整ANT脚本,一个用于测试,一个用于分发。例如:“ant distribution”将使用开发人员配置文件创建一个构建,使用应用商店分发配置文件创建一个构建

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

    <?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.
    
    
    登录CVS
    运行XCODE编译器
    xcode构建完成
    运行XCODE编译器
    xcode构建完成
    运行XCODE编译器
    xcode构建完成
    运行XCODE编译器
    xcode构建完成
    运行XCODE编译器
    xcode构建完成
    运行XCODE编译器
    xcode构建完成
    希望这有帮助。
    
    我找不到有关iOS兼容性测试实验室的参考资料,但我听说这是目前可用的。如果我能找到这个资源,我会更新我的回复

    同时,您可以在此处找到UI自动化测试建议:

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

    如果你能证明一个复杂的解决方案,你可以
    $ codesign -d -vv MyApp.app/MyApp
    
    $ codesign -f -s "My iPhone Developer Name" -vv MyApp.app/MyApp
    
    $ export CODESIGN_ALLOCATE=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate