iOS后台模式下本地主机没有响应

Posted

技术标签:

【中文标题】iOS后台模式下本地主机没有响应【英文标题】:No response from localhost in iOS Background Mode 【发布时间】:2019-07-16 09:27:29 【问题描述】:

应用程序运行在 localhost:25989 上的 ios 移动设备 (iPhone\iPad) 本地服务器上,当转到浏览器时,我们发送了一些请求 http://localhost:25989 但服务器(应用程序)直到我们返回才发送响应到应用程序。

这种情况如下图所示

活动 - 我的 iOS 应用程序前台(服务器) 后台 - 在任何浏览器(Safari、Chrome 等)中向我的 iOS 应用程序发送请求后台

UPD:应用程序已配置为在后台工作

问题:如何组织在后台模式下工作的应用程序代码,服务器可以从 localhost:25989 返回答案?

【问题讨论】:

没有后台模式可以让您在后台连续运行您的应用程序。在后台运行一段时间后,您的应用将被暂停。 这个:developer.apple.com/documentation/uikit/app_and_environment/… 是你最好的选择。不过时间有限 【参考方案1】:

注意:iOS 13+ 的代码已损坏,许多部分现已被 Apple 弃用。 BGTaskSheduler 新类替换 UIBackground。

我解决了我的问题,在我的 AppDelegate.m 文件中使用以下代码来保持服务器在后台运行:

...
bool *isBackground = NO;

- (void)extendBackgroundRunningTime

    if (isBackground != UIBackgroundTaskInvalid)
        return;

    NSLog(@"Attempting to extend background running time");
    __block Boolean self_terminate = NO; //Do not suspend the application in the background

    isBackground = [[UIApplication sharedApplication] 
    beginBackgroundTaskWithName:@"BackgroundTask" expirationHandler:^
    
        if (self_terminate)
        
            NSLog(@"Background task expired by iOS");
            [[UIApplication sharedApplication] endBackgroundTask:isBackground];
            isBackground = UIBackgroundTaskInvalid;
        
    ];

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),^    
    
        NSLog(@"Background task started");
        while (true)
        
            if(!isBackground)
            
                [[UIApplication sharedApplication] endBackgroundTask:isBackground];
                isBackground = UIBackgroundTaskInvalid;
                break;
            
            if(self_terminate)
                NSLog(@"background time remaining: %8.2f", [UIApplication sharedApplication].backgroundTimeRemaining);
            [NSThread sleepForTimeInterval:2];
        
    );


- (void)applicationDidEnterBackground:(UIApplication *)application    
    NSLog(@"applicationDidEnterBackground");
    [self extendBackgroundRunningTime];  //Call function for upadte time
    NSLog(@"Time Remaining: %f", [[UIApplication sharedApplication] backgroundTimeRemaining]);



- (void)applicationWillEnterForeground:(UIApplication *)application 
    isBackground = NO;
    NSLog(@"Enter Foreground");

现在应用服务器可以正确地从 Foreground\Background 发送响应

结果

【讨论】:

以上是关于iOS后台模式下本地主机没有响应的主要内容,如果未能解决你的问题,请参考以下文章

当应用程序在后台 iOS 11 中时,UNNotification 本地通知用户点击不会触发委托

iOS10应用关闭时如何响应本地通知?

我可以在没有后台进程的情况下避免“不响应”消息吗

链图云没有获取到响应参数是怎么回事?

Pygame 窗口在全屏模式下没有响应

iOS 7 远程通知后台模式