5种状态 ios应用的_ios---应用上架过程中app状态 - CSDN
精华内容
参与话题
  • 如何获取iOS应用网络权限?

    万次阅读 2017-03-21 21:38:21
    iOS 10下 ,首次进入应用时,会有询问是否允许网络连接权限的的弹窗,为更好进行用户交互,需要在打开应用时获取应用禁用网络权限状态状态分为:未知、限制网络、未限制网络),客户端根据不同的权限状态定制...

    疯狂

    问题描述

    • 在iOS 10下 ,首次进入应用时,会有询问是否允许网络连接权限的的弹窗,为更好进行用户交互,需要在打开应用时获取应用禁用网络权限状态(状态分为:未知、限制网络、未限制网络),客户端根据不同的权限状态定制相应的人机交互。

    问题调研

    • 针对请求应用网络权限可能存在的几种情形,操作与对应的状态都是笔者测试得到的,具体如下所示:
    可能操作 关闭 无线局域网 无线局域网&蜂窝 不进行操作 锁屏 解锁 按Home键
    权限状态 Restricted NotRestricted NotRestricted Unknown Unknown 恢复原始状态 保持原有状态

    解决问题

    • 使用CoreTelephony.framework框架下的CTCellularData类中的方法和属性进行解决,具体如下:
    • 当联网权限的状态发生改变时,会在上述方法中捕捉到改变后的状态,可根据更新后的状态执行相应的操作。
    CTCellularData *cellularData = [[CTCellularData alloc]init];
    cellularData.cellularDataRestrictionDidUpdateNotifier =  ^(CTCellularDataRestrictedState state){
            //状态改变时进行相关操作
        };
    
    • 当查询应用联网权限时可以使用下面的方法:
    CTCellularData *cellularData = [[CTCellularData alloc]init];
    CTCellularDataRestrictedState state = cellularData.restrictedState;
        switch (state) {
            case kCTCellularDataRestricted:
                NSLog(@"Restricrted");
                break;
            case kCTCellularDataNotRestricted:
                NSLog(@"Not Restricted");
                break;
            case kCTCellularDataRestrictedStateUnknown:
                NSLog(@"Unknown");
                break;
            default:
                break;
    }
    

    补充一下

    • CoreTelephony.frameworkiOS7之前还是私有框架,框架内部提供还是私有API,但在iOS7之后该框架就成为公开的框架,大家可以尽情的使用了。

    • 写这篇博客一方面是为了弥补前些日子写的博客iOS开发中的这些权限,你搞懂了吗?中的不足之处,另一方面是为了解决部分读者的疑惑,希望读者大人们多多支持!

    • 以上内容,就是我对常用算法的简单总结。大家如有其他意见欢迎评论。
    • 扫一扫下面的二维码,欢迎关注我的个人微信公众号攻城狮的动态(ID:iOSDevSkills),可在微信公众号进行留言,更多精彩技术文章,期待您的加入!一起讨论,一起成长!一起攻城狮!

    公众号

    展开全文
  • iOS应用程序的生命周期,还有程序是运行在前台还是后台,应用程序各个状态的变换,这些对于开发者来说都是很重要的。 iOS系统的资源是有限的,应用程序在前台和在后台的状态是不一样的。在后台时,程序会受到系统...

         iOS的应用程序的生命周期,还有程序是运行在前台还是后台,应用程序各个状态的变换,这些对于开发者来说都是很重要的。 iOS系统的资源是有限的,应用程序在前台和在后台的状态是不一样的。在后台时,程序会受到系统的很多限制,这样可以提高电池的使用和用户体验。

    //开发app,我们要遵循apple公司的一些指导原则,原则如下:

    1、应用程序的状态

    状态如下:

    Not running  未运行  程序没启动

    Inactive          未激活        程序在前台运行,不过没有接收到事件。在没有事件处理情况下程序通常停留在这个状态

    Active             激活           程序在前台运行而且接收到了事件。这也是前台的一个正常的模式

    Backgroud     后台           程序在后台而且能执行代码,大多数程序进入这个状态后会在在这个状态上停留一会。时间到之后会进入挂起状态(Suspended)。有的程序经过特殊的请求后可以长期处于Backgroud状态

    Suspended    挂起           程序在后台不能执行代码。系统会自动把程序变成这个状态而且不会发出通知。当挂起时,程序还是停留在内存中的,当系统内存低时,系统就把挂起的程序清除掉,为前台程序提供更多的内存。

    下图是程序状态变化图:


    各个程序运行状态时代理的回调:

    - (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions
          告诉代理进程启动但还没进入状态保存
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
         告诉代理启动基本完成程序准备开始运行
    - (void)applicationWillResignActive:(UIApplication *)application
        当应用程序将要入非活动状态执行,在此期间,应用程序不接收消息或事件,比如来电话了
    - (void)applicationDidBecomeActive:(UIApplication *)application 
         当应用程序入活动状态执行,这个刚好跟上面那个方法相反
    - (void)applicationDidEnterBackground:(UIApplication *)application
        当程序被推送到后台的时候调用。所以要设置后台继续运行,则在这个函数里面设置即可
    - (void)applicationWillEnterForeground:(UIApplication *)application
    当程序从后台将要重新回到前台时候调用,这个刚好跟上面的那个方法相反。
    - (void)applicationWillTerminate:(UIApplication *)application
    当程序将要退出是被调用,通常是用来保存数据和一些退出前的清理工作。这个需要要设置UIApplicationExitsOnSuspend的键值。
    - (void)applicationDidFinishLaunching:(UIApplication*)application
    当程序载入后执行

    在上面8个方法对应的方法中键入NSLog打印。

    现在启动程序看看执行的顺序:

    启动程序
    lifeCycle[40428:11303] willFinishLaunchingWithOptions
    lifeCycle[40428:11303] didFinishLaunchingWithOptions
    lifeCycle[40428:11303] applicationDidBecomeActive

    按下home键

    lifeCycle[40428:11303] applicationWillResignActive
    lifeCycle[40428:11303] applicationDidEnterBackground

    双击home键,再打开程序

    lifeCycle[40428:11303] applicationWillEnterForeground
    lifeCycle[40428:11303] applicationDidBecomeActive

    2、应用程序的生命周期

    2.1、加载应用程序进入前台


    2.2、加载应用程序进入后台



    2.3、关于main函数

    main函数是程序启动的入口,在iOS app中,main函数的功能被最小化,它的主要工作都交给了UIKit framework

    #import <UIKit/UIKit.h>
     
    int main(int argc, char *argv[])
    {
        @autoreleasepool {
            return UIApplicationMain(argc, argv, nil, NSStringFromClass([MyAppDelegate class]));
        }
    }
    

    UIApplicationMain函数有四个参数,你不需要改变这些参数值,不过我们也需要理解这些参数和程序是如何开始的

    argc 和argv参数包含了系统带过来的启动时间。  第三个参数确定了主要应用程序类的名称,这个参数指定为nil,这样UIKit就会使用默认的程序类UIApplication。第四个参数是程序自定义的代理类名,这个类负责系统和代码之间的交互。它一般在Xcode新建项目时会自动生成。

    另外 UIApplicationMain函数加载了程序主界面的文件。虽然这个函数加载了界面文件,但是没有放到应用程序的windows上,你需要在Delegate的 application:willFinishLaunchingWithOptions方法中加载它。

    一个应用程序可以有一个主的storyboard文件或者有一个主的nib文件,但不能同时有两个存在。

    如果程序在启动时没有自动加载主要的故事版或nib文件,你可以在application:willFinishLaunchingWithOptions方法里准备windows的展示。

    3、响应中断

    3.1 当一个基于警告式的中断发生时,比如有电话打进来了,这是程序会临时进入inactive状态,这用户可以选择如何处理这个中断,流程如下图:


    在iOS5,通知不会把程序变成为激活状态,通知会显示在状态栏上,如果你;拉下状态栏,程序会变成inactive,把状态栏放回去,程序变回active。

    按锁屏键也是另外一种程序的中断,当你按下锁屏键,系统屏蔽了所有触摸事件,把app放到了后台,这时app状态是 inactive,并进入后台。

    3.2 当有这些中断时,我们的app该怎么办呢?我们应该在applicationWillResignActive:方法中:

    • 停止timer 和其他周期性的任务
    • 停止任何正在运行的请求
    • 暂停视频的播放
    • 如果是游戏那就暂停它
    • 减少OpenGL ES的帧率
    • 挂起任何分发的队列和不重要的操作队列(你可以继续处理网络请求或其他时间敏感的后台任务)。
    当程序回到active状态 ,   applicationDidBecomeActive:   方法应该上面提到的任务重新开始,比如重新开始timer, 继续分发队列,提高OpenGL ES的帧率。不过游戏要回到暂停状态,不能自动开始。

    4、转到后台运行

    4.1 如图所示:


    PS:只有在IOS4以上系统或者支持多任务的设备才能后台运行。不然会直接结束状态。

    4.2 当应用程序进入后台时,我们应该做写什么呢?

    • 保存用户数据或状态信息,所有没写到磁盘的文件或信息,在进入后台时,最后都写到磁盘去,因为程序可能在后台被杀死,
    • 释放尽可能释放的内存
    applicationDidEnterBackgound: 方法有大概5秒的时间让你完成这些任务。如果超过时间还有未完成的任务,你的程序就会被终止而且从内存中清除。如果还需要长时间的运行任务,可以调用  beginBackgroundTaskWithExpirationHandler       方法去请求后台运行时间和启动线程来运行长时间运行的任务。
    4.3 应用程序在后台时的内存使用
    在后台时,每个应用程序都应该释放最大的内存。系统努力的保持更多的应用程序在后台同时 运行。不过当内存不足时,会终止一些挂起的程序来回收内存,那些内存最大的程序首先被终止。
    事实上,应用程序应该的对象如果不再使用了,那就应该尽快的去掉强引用,这样编译器可以回收这些内存。如果你想缓存一些对象提升程序的性能,你可以在进入后台时,把这些对象去掉强引用。
    下面这样的对象应该尽快的去掉强引用:
    • 图片对象
    • 你可以重新加载的 大的视频或数据文件
    • 任何没用而且可以轻易创建的对象
    在后台时,为了减少程序占用的内存,系统会自动在回收一些系统帮助你开辟的内存。比如:
    系统回收Core Animation的后备存储。
    去掉任何系统引用的缓存图片
    去掉系统管理数据缓存强引用

    5 、返回前台运行

    流程如图所示:

    当app处于挂起状态时,它是不能执行任何代码的。因此它不能处理在挂起期间发过来的通知,比如方向改变,时间改变,设置的改变还有其他影响程序展现的或状态的通知。在程序返回后台或前台是,程序都要正确的处理这些通知。

    6、程序的终止

    程序只要符合以下情况之一,只要进入后台或挂起状态就会终止:
    iOS4.0以前的系统
    app是基于iOS4.0之前系统开发的。
    设备不支持多任务
    在Info.plist文件中,程序包含了 UIApplicationExitsOnSuspend  键。
    app如果终止了  ,系统会调用app的代理的方法 applicationWillTerminate:   这样可以让你可以做一些清理工作。你可以保存一些数据或app的状态。这个方法也有5秒钟的限制。超时后方法会返回程序从内存中清除。
    注意:用户可以手工关闭应用程序。

    7、 The Main Run Loop  主运行循环

    Main Run Loop负责处理用户相关的事件。UIApplication对象在程序启动时启动main run Loop,它处理事件和更新视图的界面。看Main Run Loop就知道,它是运行在程序的主线程上的。这样保证了接收到用户相关操作的事件是按顺序处理的。

    Main Run Loop  处理事件的架构图:


    用户操作设备,相关的操作事件被系统生成并通过UIKit的指定端口分发。事件在内部排成队列,一个个的分发到Main run loop 去做处理。UIApplication对象是第一个接收到时间的对象,它决定事件如何被处理。触摸事件分发到主窗口,窗口再分发到对应出发触摸事件的View。其他的事件通过其他途径分发给其他对象变量做处理。

    大部分的事件可以在你的应用里分发,类似于触摸事件,远程操控事件(线控耳机等)都是由app的 responder objects 对象处理的。Responder objects 在你的app里到处都是,比如:UIApplication 对象。view对象,view controller 对象,都是resopnder objects。大部分事件的目标都指定了resopnder object,不过事件也可以传递给其他对象。比如,如果view对象不处理事件,可以传给父类view或者view controller。

    参考:https://developer.apple.com/library/ios/#documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html#//apple_ref/doc/uid/TP40007072-CH4-SW20

    容芳志 (http://blog.csdn.net/totogo2010)

    本文遵循“署名-非商业用途-保持一致”创作公用协议


    展开全文
  • iOS设计规范中要求,当应用退出的时候(包括被终止运行时候),画面中UI元素状态需要保持的,当再次进来的时候看状态与退出是一样的。iOS6之后苹果提供以下API使得UI状态保持和恢复变得很容易了。 在iOS6中我们可以...
    iOS设计规范中要求,当应用退出的时候(包括被终止运行时候),画面中UI元素状态需要保持的,当再次进来的时候看状态与退出是一样的。iOS6之后苹果提供以下API使得UI状态保持和恢复变得很容易了。
    

    在iOS6中我们可以在3地方实现状态保持和恢复:

    应用程序委托对象

    视图控制器

    自定义视图

    为了演示这个功能实现,我们把基于故事板的HelloWorld工程改造一下,在画面中添加一个文本框

    1

    用户在文本框中输入一些内容,应用程序退出并且终止后再次进来的时候,文本框中还会保持原来输入的内容。然后在IB的Scene中选中View Controller,打开右边的标识检查器,设置Restoration ID(恢复标识)为viewController。

     2

    恢复标识是iOS6为了实现UI状态保持和恢复添加的设置项目。我们还需要在应用程序委托对象AppDelegate代码部分做一些修改,添加的代码如下:

    -(BOOL) application:(UIApplication *)application shouldSaveApplicationState:(NSCoder *)coder
    
    {
    
    return YES;
    
    }
    
     
    
    -(BOOL) application:(UIApplication *)application shouldRestoreApplicationState:(NSCoder *)coder
    
    {
    
    return YES;
    
    }
    
     
    
    - (void)application:(UIApplication *)application willEncodeRestorableStateWithCoder:(NSCoder *)coder
    
    {
    
    [coder encodeFloat:2.0 forKey:@"Version"];
    
    }
    
     
    
    - (void)application:(UIApplication *)application didDecodeRestorableStateWithCoder:(NSCoder *)coder
    
    {
    
    float lastVer = [coder decodeFloatForKey:@"Version"];
    
    NSLog(@”lastVer = %f”,lastVer);
    
    }


    其中application:shouldSaveApplicationState:在应用退出的时候调用,负责控制是否允许保存状态,返回YES情况是可以保存,NO是不保存。

    application:shouldRestoreApplicationState:是应用启动时候调用,负责控制是否恢复上次退出的时候的状态,返回YES情况是可以恢复,NO是不恢复。

    application:willEncodeRestorableStateWithCoder:方法是保存时候调用,在这个方法中实现UI状态或数据的保存,其中[coder encodeFloat:2.0 forKey:@"Version"]是保存简单数据。

    application:didDecodeRestorableStateWithCoder:方法是恢复时候调用,在这个方法中实现UI状态或数据的恢复,其中[coder decodeFloatForKey:@"Version"]语句是恢复上次保存的数据。

    要想实现具体画面中控件的保持和恢复,还需要在它视图控制器中添加一些代码,ViewController.m中添加的代码如下:

    -(void)encodeRestorableStateWithCoder:(NSCoder *)coder
    
    {
    
    [super encodeRestorableStateWithCoder:coder];
    
    [coder encodeObject:self.txtField.text forKey:kSaveKey];
    
    }
    
     
    
    -(void)decodeRestorableStateWithCoder:(NSCoder *)coder
    
    {
    
    [super decodeRestorableStateWithCoder:coder];
    
    self.txtField.text = [coder decodeObjectForKey:kSaveKey];
    
    }


    在iOS6之后视图控制器都添加了两个:encodeRestorableStateWithCoder:和decodeRestorableStateWithCoder:用来实现该控制器中的控件或数据的保存和恢复。其中encodeRestorableStateWithCoder: 方法是在保存时候调用,[coder encodeObject:self.txtField.text forKey:kSaveKey]语句是按照指定的键保存文本框的内容,decodeRestorableStateWithCoder:方法是在恢复时候调用,[coder decodeObjectForKey:kSaveKey]是恢复文本框内容时候调用,保存和恢复事实上就是向一个归档文件中编码和解码的过程。


    展开全文
  • 不,苹果提供了一机制可以直接把下架的包重新上线,过程简单,且非常快捷,点击下就好了,具体看下操作:1.进入应用页面 看到目前的状态是被开发人员下架,确定你的开发账号没有到期,你的应用是上线后才被你...

    如果你的App因为某些版权之类的问题下线了,而你又想立马上架该怎么办呢?难道还要重新提交包进行审核再经过漫长的等待才能上线么?不,苹果提供了一种机制可以直接把下架的包重新上线,过程简单,且非常快捷,点击下就好了,具体看下操作:

    1.进入应用页面
    这里写图片描述
    看到目前的状态是被开发人员下架,确定你的开发账号没有到期,你的应用是上线后才被你手动下架的,这个时候,点击“在所在区域供应”,选择后可点击后面的编辑选择销售区域,然后点击保存就重新上架了。

    2.看上架后的状态
    这里写图片描述

    看到App的状态已经是“可供销售”,表明已经重新上架。

    但此方法适用范围有限,如果有bug或者升级还是乖乖的重新提交版本等待审核吧。

    展开全文
  • iOS 各种控件默认高度(图示)

    万次阅读 2013-02-04 15:47:43
    1.状态状态栏一般高度为20像素,在打手机或者显示消息时会放大到40像素高,注意,两倍高度的状态栏在好像只能在纵向的模式下使用。如下图 用户可以隐藏状态栏,也可以将状态栏设置为灰色,黑色或者...
  • iOS6 / iOS7 状态栏高度适配

    万次阅读 2014-04-20 11:21:15
    问题原因:iOS7的状态栏(status bar)不再占用单独的20px,所以如果你在iOS6上的界面布局是正常的,那么到了iOS7上就会变成下面这个样子:   左边是iOS6界面布局,右边是iOS7界面布局。这时有人会想着把iOS7界面...
  •   1.在info.plist中添加View controller-based status bar appearance,值为NO ...2.在设置状态栏的地方添加代码 [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLi...
  • [iOS]深入浅出 iOS 之生命周期

    万次阅读 多人点赞 2011-08-16 15:04:39
    深入浅出 iOS 之生命周期 ... 转载请注明出处 iOS应用程序的生命周期相比 Android 应用程序的生命周期来说,没那么简明易懂,但是也并不复杂。iOS应用程序的生命周期又根据系统是否支持多线程分为两
  • 经历了5年多的时间,苹果iOS经历过17个版本,支持了多代iPhone、iPad和iPod设备的成功,目前已经成长为一个市场上影响力最大、功能最丰富、生态最完整的移动操作系统.目前苹果设备正在使用的iOS5是一个对新用户界面...
  • HBuilder app 状态栏 颜色问题

    千次阅读 2017-06-23 10:12:21
    ios:  打开应用的manifest.json文件,切换到代码视图,在plus -> distribute -> apple 下添加UIReserveStatusbarOffset节点并设置值为false。  注意:  1. 真机运行不生效,需提交App云端打包后才生效;  2....
  • iOS打包app发给测试人员测试

    万次阅读 2015-03-27 15:42:40
    iOS打包app发给测试人员测试 说明:在项目开发过程中经常需要开发人员将项目打包成ipa包后,发给测试人员进行测试。本文贴图对打包的过程简单介绍。 一、Product ->archive (注意,不能是模拟器状态,如果...
  • 正常情况下,使用应用时,当用户按下home键,APP便被挂起(线程和runloop都会暂时挂起),但是依然驻留在内存中,这种状态下,如果不使用苹果允许的那几一直在后台运行的方法(如播放音乐、定位等),程序便会被挂起,...
  • iOS应用程序的生命周期,还有程序是运行在前台还是后台,应用程序各个状态的变换,这些对于开发者来说都是很重要的。 iOS系统的资源是有限的,应用程序在前台和在后台的状态是不一样的。在后台时,程序会受到系统...
  • IOS学习笔记56-IOS7状态栏适配方法一

    万次阅读 2013-10-11 12:07:06
    近期由于IOS7的发布,所以应用的适配潮可谓是都搞的锣鼓喧天,甚是热闹,因此呢,因适配IOS7而产生的问题也是铺天盖地的卷来,所以了,我也从简单的状态栏适配开始,先研究了下关于状态栏的适配,特总结如下,供广大...
  • 第一步:在info.plist中添加一个字段:view controller -
  • ios关于相机访问权限设置

    万次阅读 2014-04-04 12:35:16
    一般当应用在第一次访问相机的时候
  • 状态栏隐藏掉之后,页面上的tableView会自动向上滚20个像素 这是因为在iOS7.0之后,系统会自动调整scrollView的layout 和 contentInsets 。从而使其自动地适应iOS7之后那种整个屏幕都可以放入自定义控件的方法。...
  • iOS-微信分享成功回调问题

    万次阅读 2020-03-12 16:25:20
    本人用ShareSDK做分享和第三方登录,登录先不讲,本节只做分享成功或失败后回调问题。相信好多人会有这个疑惑就是在微信分享成功后没有成功后的方法回调,我在ShareSDK论坛也发表过帖子问过,ShareSDK论坛官方技术也...
  • IOS的AppDelegate方法中的事件触发调用

    万次阅读 2012-10-16 20:41:25
    IOS中AppDelegate中的生命周期事件的调用条件: //当应用程序将要进入非活动状态执行,在此期间,应用程序不接受消息或事件,比如来电 - (void)applicationWillResignActive:(UIApplication *)application { NSLog...
  • iOS 保持APP在后台长时间运行

    千次阅读 2018-12-05 15:10:34
    官方网站: ...一、iOS 应用程序5状态 1、停止运行-应用程序已经终止,或者还未启动。 2、不活动-应用程...
1 2 3 4 5 ... 20
收藏数 103,372
精华内容 41,348
关键字:

5种状态 ios应用的