2016-01-21 112 views
1

我在Xcode中使用启动屏幕为我的应用程序做启动屏幕。初始屏幕问题iPhone

在启动画面上只有一个图像,背景中没有API命中。
在时间超过20秒和应用程序崩溃的启动画面上花费的时间太长,我也在设备日志上检查过它。

有时它崩溃,有时它会运行,但它总是需要很长时间。
我不能从那里移动到下一个屏幕。并且它仅在iPhone 6 Plus的启动屏幕之前显示白色屏幕(其他设备上没有白色屏幕)。

如何解决iPhone 6 Plus的白屏问题并解决闪屏时间长的问题?

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool 
    { 

     // Override point for customization after application launch. 
     // self.prepareForContact() 
     if let a: AnyObject = (NSUserDefaults.standardUserDefaults().objectForKey("isFirstTime")) 
     { 
      if let a: AnyObject = (NSUserDefaults.standardUserDefaults().objectForKey("userid")) 
      { 
       self.createAppFromHomepage() 
      } 
     } 
     else 
     { 
      self.createAppFromWelcomeScreen() 
     } 

     isAllImageDownloading = false 
     // Save this data to hit friend service on login on every launch... 
     NSUserDefaults.standardUserDefaults().setObject("1", forKey: "hitFriendService") 

     let credentialsProvider = AWSCognitoCredentialsProvider(regionType: CognitoRegionType, identityPoolId: CognitoIdentityPoolID) 
     let configuration = AWSServiceConfiguration(region: DefaultServiceRegionType, credentialsProvider: credentialsProvider) 
     AWSServiceManager.defaultServiceManager().defaultServiceConfiguration = configuration 

     //print(credentialsProvider.secretKey) 

     if let event_id: AnyObject = NSUserDefaults.standardUserDefaults().objectForKey("eventId") 
     { 
      self.getEventDescription() 
      self.uploadEventRemainingImages() 
     } 


     let session1 = AVAudioSession.sharedInstance() 
     session1.setCategory(AVAudioSessionCategoryPlayAndRecord, withOptions: AVAudioSessionCategoryOptions.MixWithOthers|AVAudioSessionCategoryOptions.DefaultToSpeaker|AVAudioSessionCategoryOptions.AllowBluetooth, error: nil) 
     session1.setActive(true, error: nil) 
     UIApplication.sharedApplication().beginReceivingRemoteControlEvents() 


     let nsDocumentDirectory = NSSearchPathDirectory.DocumentDirectory 
     let nsUserDomainMask = NSSearchPathDomainMask.UserDomainMask 
     if let paths = NSSearchPathForDirectoriesInDomains(nsDocumentDirectory, nsUserDomainMask, true) 
     { 
     if let dirPath = paths[0] as? String 
     { 
      self.excludeFromBackupToICloud(dirPath) 
     } 
     } 

     if application.respondsToSelector("registerUserNotificationSettings:") { 

      let types:UIUserNotificationType = (.Alert | .Badge | .Sound) 
      let settings:UIUserNotificationSettings = UIUserNotificationSettings(forTypes: types, categories: nil) 

      application.registerUserNotificationSettings(settings) 
      application.registerForRemoteNotifications() 
     } 
     else 
     { 
      // Register for Push Notifications before iOS 8 
      // application.registerForRemoteNotificationTypes(.Alert | .Badge | .Sound) 
     } 

     if let isFirstTime: AnyObject = NSUserDefaults.standardUserDefaults().objectForKey("isFirstTime") 
     { 
     } 
     else 
     { 
      UIApplication.sharedApplication().applicationIconBadgeNumber = 0 
      // NSUserDefaults.standardUserDefaults().setObject("1", forKey: "isFirstTime") 
     } 
     return true 
    } 
+1

请分享应用程序代码 –

+0

您提到了“无背景API”,这对于保持UI的响应实际上是一件好事。有几个调用可能会超过20秒:'createAppFromHomepage','AWSServiceManager','uploadEventRemainingImages',... – SwiftArchitect

+0

AWSService管理器仅用于配置和其他方法,如createAppFromhomepage和uploadEventRemainingImages。这两个调用只有当我登录一次的应用程序,而我的问题是该应用程序在启动画面上崩溃。我无法访问登录屏幕,因此这两种方法不会影响它。 – Som

回答

0

你被看门狗杀死了。你说的应用程序不会崩溃。

调查

简介下仪器您的应用程序:你会马上看到什么是这么长时间。

修复

允许didFinishLaunchingWithOptions立即返回。分解出所有的辛勤工作在一个单独的方法,你可以调用像这样:

斯威夫特

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 
    self.performSelectorOnMainThread("didFinishLaunching", withObject: nil, waitUntilDone: false) 
    return true 
} 

和回国后做的辛勤工作(下一个事件循环)

func didFinishLaunching() { 
    // time consuming work goes here 
} 

Objective-C

[self performSelectorOnMainThread:@selector(didFinishLaunching) 
         withObject:nil 
        waitUntilDone:NO]; 

- (void) didFinishLaunching { 
    // time consuming work goes here 
}