zoukankan      html  css  js  c++  java
  • iOS-应用闪退总结

    一、之前上架的 App 在 iOS 9 会闪退问题(iOS系统版本更新,未配置新版本导致闪退问题)

    最新更新:(2015.10.02)

    开发环境:

    真机测试(以下机种皆不闪退):

    • iPhone 3GS v6.1.2 (32 bit)
    • iPhone 4 v7.1.2 (32 bit)
    • iPhone 4S v9.0 (32 bit)
    • iPhone 5S v8.4.1 (64 bit)
    • iPad 2 mini v9.0 (64 bit)

    ※ 使用上面的配置,及 EMB 官方提供的 Hotfix,真机皆没有问题,下面的闪退问题可以略过了。


    问题一:iOS 9 于 2015/09/16 开放下载了,但之前使用 Delphi(XE8 或之前的版) 开发上架的 App 皆会闪退,无法运行在 iOS 9。

    问题二:使用 Delphi 10 Seattle + Xcode 7.0 + iOS SDK 9.0 发布到 iOS 9 的真机没有问题,但发布到 iOS 6~8 的机子会闪退

    为了解决以上问题,可以参考下列方法:

    1. 使用 Delphi 10 Seattle 重新上架:

    开发环境:

    • Delphi 10 Seattle
    • Xcode 7.0
    • iOS SDK 8.4(这个是关键,一定要用 SDK 8.4 才不会闪退)

    真机测试(以下机种皆不闪退):

      • iPhone 3GS v6.1.2 (32 bit)
      • iPhone 4 v7.1.2 (32 bit)
      • iPhone 4S v9.0 (32 bit)
      • iPhone 5S v8.4.1 (64 bit)
      • iPad 2 mini v9.0 (64 bit)

    2. 使用 XE8 重新上架:

    开发环境:

    • Delphi XE8 update 1
    • Xcode 6.4
    • iOS SDK 8.4

    修改源码:

    真机测试(以下机种皆不闪退):

    • iPhone 3GS v6.1.2 (32 bit)
    • iPhone 4 v7.1.2 (32 bit)
    • iPhone 4S v9.0 (32 bit)
    • iPhone 5S v8.4.1 (64 bit)
    • iPad 2 mini v9.0 (64 bit)

    赶快重新上架新版 App 吧。

    追加整理,依版本整理如下(2015.09.23):

    • Xcode 7.0 + SDK 8.4
      • XE8 + iOS 6 = 正常
      • XE8 + iOS 7 = 正常
      • XE8 + iOS 8 = 正常
      • XE8 + iOS 9 = 正常
    • Xcode 6.4 + SDK 8.4
      • XE8 + iOS 6 = 正常
      • XE8 + iOS 7 = 正常
      • XE8 + iOS 8 = 正常
      • XE8 + iOS 9 = 闪退(使用官方修复文件,不闪退)
    • Xcode 7.0 + SDK 9.0
      • D10 + iOS 6 = 闪退
      • D10 + iOS 7 = 闪退
      • D10 + iOS 8 = 退
      • D10 + iOS 9 = 正常

    官方 QC 讨论:

    https://quality.embarcadero.com/browse/RSP-12324

    官方 Apple Xcode 各版本下載位置:

    https://developer.apple.com/downloads/

    • OS X El Capitan

    二、iOS中app启动闪退

        秒退是发生在程序刚刚启动的时候,在开发、苹果审核阶段都没有被发现的最大可能性就是,这个问题只会发生在老版系统、老版机型上。  

        对于很多开发者(尤其是个人开发者),进行所有 iOS 版本,所有 iOS 机型覆盖测试是有难度的,苹果审核时也只是重点审核该应用在新机器、新版本下的运行情况,并不关注老系统。所以这也就是为什么会秒退的程序竟然也能通过苹果的审核。  
          概括:老机型,或者老系统版本的代码适配存在问题导致闪退。(很多公司提供测试组一套  测试机 的原因,是为了解决 用户 体验 问题。防止用户 流失。用户不满)
        在新 iOS 上正常的应用,到了老版本 iOS 上秒退最常见原因是系统动态链接库或Framework无法找到。这种情况通常是由于 App 引用了一个新版操作系统里的动态库(或者某动态库的新版本)或只有新 iOS 支持的 Framework,而又没有对老系统进行测试,于是当 App 运行在老系统上时便由于找不到而秒退。解决办法是等开发人员发现这个问题后升级程序,或由用户自行升级其操作系统。  
       概括:苹果官方审查力度加大,导致代码或者数据库更新,或者项目中使用的第三方代码已经不适合 当前 的苹果官方 的审查门槛。
       还有一种常见的秒退是程序在升级时,修改了本地存储的数据结构,但是对用户既存的旧数据没有做好升级,结果导致初始化时因为无法正确读取用户数据而秒退。这类问题通常只需删除程序后重新安装一遍就能解决。但缺点是用户的既存数据会丢失——就算有备份可能也无济于事,因为备份下来的旧数据还是无法被正确升级。如果旧数据非常重要,那么就需要联系开发人员要求其进行程序修正了。  
        概括:系统升级,数据丢失导致
       另一种已经变得不那么常见的秒退原因是 App 的设置不正确。例如在编译时没有编译 ARMv6 的版本,但是设置里却允许该 App 运行在 ARMv6 处理器的机器上(如:iPhone 1代,iPhone 3G,iPod touch 1、2代和3代8G版)。这个问题除了等开发人员升级外用户自己没什么办法解决。当然愿意换台新机器是最好的 ;) 这个问题目前已经能够在提交应用至 App Store 的时候被检查出来了,因此今后应该不太常见了。  
       概括:App设置错误
      还有一类秒退或是用到 App 里某个功能后必退的原因,是开发时用到了只有新版操作系统才支持的某个方法,而又没有对该方法是否存在于老系统中做出判断。例如程序启动时用到了 Game Center,而没有判断用户的机器是否支持 Game Center,于是就秒退了。  
          概括:iOS版本升级导致问题
      主要的秒退情况就是这么几个,这些都是以该 App 新版系统上能正常跑为前提的。  

      诸如内存不足、BAD_ACCESS 这类问题通常不管在新旧 iOS 上都会存在,如果是由于这类问题造成的秒退通常都能在测试和审核阶段被发现,因此并不常见。

      概括:内存不足导致闪退,几本上在苹果移动端 是暂时不可能出现的

    三.程序崩溃会导致闪退。

      常见程序崩溃原因:

      1.点击某个模块或者某个功能按钮,进行页面跳转,或者获取数据。没数据会崩溃,数据错误会崩溃。

      2.点击某个模块或者某个功能按钮,进行页面跳转,或者获取数据。业务逻辑处理不当会导致崩溃。

      3.点击某个模块或者某个功能按钮,直接导致崩溃:编辑代码时无报错,编译时出错。代码逻辑错误,或者存在闪退符号的代码。

      常见程序崩溃原因的获取:

      

    iOS开发中遇到程序崩溃是很正常的事情,如何在程序崩溃时捕获到异常信息并通知开发者?

    下面就介绍如何在iOS中实现:

    1. 在程序启动时加上一个异常捕获监听,用来处理程序崩溃时的回调动作

    1
    NSSetUncaughtExceptionHandler (&UncaughtExceptionHandler);

    官方文档介绍:Sets the top-level error-handling function where you can perform last-minute logging before the program terminates.
    UncaughtExceptionHandler是一个函数指针,该函数需要我们实现,可以取自己想要的名字。当程序发生异常崩溃时,该函数会得到调用,这跟C,C++中的回调函数的概念是一样的。

    2. 实现自己的处理函数

    1
    2
    3
    4
    5
    6
    7
    void UncaughtExceptionHandler(NSException *exception) {
        NSArray *arr = [exception callStackSymbols];//得到当前调用栈信息
        NSString *reason = [exception reason];//非常重要,就是崩溃的原因
        NSString *name = [exception name];//异常类型
        
        NSLog(@"exception type : %@ crash reason : %@ call stack info : %@", name, reason, arr);
    }

    以上代码很简单,但是带来的作用是非常大的。

    程序崩溃日志分析一: http://www.cnblogs.com/CoderAlex/p/4860075.html

    程序崩溃日志分析二:http://www.cnblogs.com/CoderAlex/p/4860075.html

  • 相关阅读:
    Files 的值“
    unable to open databse file
    你选择的点它并不一定在线上!
    各图元对应的DXF名
    combobox下拉列表进行模糊查找时,容易导致光标隐藏
    autocad2010在进行加密时总是出问题
    AutoCAD2010中没有RibbonFoldPanel,需要用RibbonRowPanel替代
    cad2009中把我在2016中定义的块打开为匿名块
    VS2015 未加载程序集时不允许进行更改
    无法将类型为“System.Windows.Forms.SplitContainer”的对象强制转换为类型“System.ComponentModel.ISupportInitialize”
  • 原文地址:https://www.cnblogs.com/LifeTechnologySupporter/p/4860319.html
Copyright © 2011-2022 走看看