标签: background-process

如何在后台启动录制iOS音频会话?

我试图kAudioSessionCategory_RecordAudio在我的应用程序在后台唤醒但不是最前沿(例如在重要的位置更改期间,我已经看到商店中的其他应用程序执行此操作,因此我知道它是可能的).但是每当我尝试像这样开始音频会话时

CheckError(AudioQueueStart(queue, NULL), "AudioQueueStart failed");

我收到此错误:

Error: AudioQueueStart failed (-12985)

所以我读到了这一点,但只有建议是将音频会话设置为活动,AudioSessionSetActive(YES)但也会因'!cat'错误而失败.显然你可以尝试切换音频会话的活动状态,但这对我没用.

我有音频背景模式plist标志设置并开始音频会话,而我的应用程序是最前面,然后切换到另一个应用程序工作(显示红色条显示它正在录制).它只是启动音频会话而应用程序不是最前沿的问题.

有没有人有一个示例项目我可以看看演示在后台开始录制音频会话?

注意:我正在寻找使用音频队列的解决方案,因为我需要缓冲区中的音频,而不是文件.

record core-audio background-process audioqueueservices ios

8
推荐指数
1
解决办法
4403
查看次数

应用程序未运行时的iOS 7后台获取

我编写了一个简单的应用程序,以测试和监控iOS7中后台提取功能的工作原理.

首先,我在Info.plist文件中设置了UIBackgroundMode选项.

在此输入图像描述

然后;

我加入到下面的代码到应用中:didFinishLaunchingWithOptions:方法在AppDelegate.m:

在此输入图像描述

最后,我已经实现了应用程序:(UIApplication*)应用程序performFetchWithCompletionHandler:方法.

在此输入图像描述

每次我单击Debug-> Simulate Background Fetch按钮时,它都会更改应用程序的批号并按预期工作.

但是,当应用程序未运行时,我甚至无法使其工作(即使在后台模式下也没有运行).

Apple表示,当应用程序未运行且操作系统要分别执行以下方法时:

application:(UIApplication *)application didFinishLaunchingWithOptions:
applicationDidEnterBackground:(UIApplication *)application
application:(UIApplication *)application performFetchWithCompletionHandler:
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,有没有办法在应用程序未运行时测试后台提取?

我正在使用iOS 7.1iPod 5th Gen上测试这个.

iphone objective-c background-process ios

8
推荐指数
1
解决办法
1万
查看次数

AFNetworking后台文件上传

我想从我的应用程序上传文件到我的服务器.当应用处于活动状态时,以下代码效果很好.如果我按下主页按钮或打开另一个应用程序上传停止.

我激活了后台提取但仍然无法正常工作.

Afnetworking有后台支持,但我无法弄清楚如何将这个功能实现到我的代码中.

NSString *str=[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"Archive.zip"];
NSDictionary *parameters = @{@"foo": @"bar"};
     NSURL *filePath = [NSURL fileURLWithPath:str];
    AFHTTPRequestSerializer *serializer = [AFHTTPRequestSerializer serializer];

    NSData *imageData=[NSData dataWithContentsOfURL:filePath];


    NSMutableURLRequest *request =
    [serializer multipartFormRequestWithMethod:@"POST" URLString:@"http://url"
                                    parameters:parameters
                     constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
                         [formData appendPartWithFileData:imageData
                                                     name:@"image"
                                                 fileName:@"Archive.zip"
                                                 mimeType:@"application/zip"];
                     }];


    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    AFHTTPRequestOperation *operation =
    [manager HTTPRequestOperationWithRequest:request
                                     success:^(AFHTTPRequestOperation *operation, id responseObject) {
                                         NSLog(@"Success %@", responseObject);
                                     } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
                                         NSLog(@"Failure %@", error.description);
                                     }];


    [operation setUploadProgressBlock:^(NSUInteger __unused bytesWritten,
                                        long long …
Run Code Online (Sandbox Code Playgroud)

file-upload objective-c background-process afnetworking

8
推荐指数
1
解决办法
5453
查看次数

使用&符号(&)在后台运行子进程时,运行bash脚本不会返回到终端

我有一个脚本(让我们称之为parent.sh),它对运行java进程的第二个脚本(child.sh)进行2次调用.child.sh脚本在后台运行,方法是在parent.sh中放置一行&.但是,当我运行parent.sh时,我需要按Ctrl + C返回终端屏幕.这是什么原因?是否与child.sh进程在parent.sh进程下运行这一事实有关.所以parent.sh不会死,直到孩子们这样做?

parent.sh

#!/bin/bash
child.sh param1a param2a &
child.sh param1b param2b &
exit 0
Run Code Online (Sandbox Code Playgroud)

child.sh

#!/bin/bash
java com.test.Main 
echo "Main Process Stopped" | mail -s "WARNING-Main Process is down." user@email.com    
Run Code Online (Sandbox Code Playgroud)

如您所见,我不想在后台运行java进程,因为我想在进程终止时发送邮件.从功能的角度来看,如上所述可以正常工作,但我想知道如何在执行parent.sh后让它返回终端.

bash shell scripting background-process ampersand

8
推荐指数
3
解决办法
1万
查看次数

NSURLSession后台上传无法正常工作

我正在尝试将一系列文件从iPhone上传到服务器,目的是即使应用程序处于后台或暂停,也会上传这些文件.

我正在使用由它及其系列API 提供的后台传输NSURLSession.

奇怪的是它在两周前完全正常工作.如:

  1. 我会点击UI上的"上传"按钮
  2. 文件将开始在我的服务器上逐一显示
  3. 我点击iPhone上的"主页"按钮,让应用程序进入后台
  4. 文件将继续上传到服务器,直到它们全部完成

最近几天,我一直在网络模块之外进行一些重构.几天前我再次尝试上传时,只要按下"主页"按钮,上面的步骤(3).当我再次进入应用程序时,文件上传将停止.上传将恢复.

这就好像后台上传甚至不起作用(对于一个文件,更不用说多个文件).

我已多次运行代码,发现它的工作量约为1/50.但其他49次没有.我还检查了以前使用的代码版本(服务器+ iOS),它不再有效 - 或者说,工作很少变化(1/50)

多次完成背景传输和URL会话生命周期规则,以确保我遵守Apple建议的指导方针,我正在绞尽脑汁想知道什么破坏了,这让人难以理解这是多么不合逻辑 - 我怀疑它是代码实现以外的东西.

所以任何帮助都表示赞赏......

履行

1)在init我的网络类(单例)的方法中,我初始化NSURLSessionConfigurationNSURLSession:

    urlSessionConfigUpload = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:kBACKGROUND_SESSION_CONFIG_ID];
    urlSessionConfigUpload.sessionSendsLaunchEvents = YES;
    urlSessionConfigUpload.discretionary = YES;
    urlSessionConfigUpload.HTTPMaximumConnectionsPerHost = 8;
    urlSessionConfigUpload.networkServiceType = NSURLNetworkServiceTypeBackground;
    urlSessionConfigUpload.HTTPShouldUsePipelining = NO; 
    urlSessionConfigUpload.allowsCellularAccess = NO;

    urlSession = [NSURLSession sessionWithConfiguration:urlSessionConfigUpload delegate:self delegateQueue:nil];
Run Code Online (Sandbox Code Playgroud)

2)有一种方便的方法叫做实际上传.每个会话只有1个上传任务:

    NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:url];
    [urlRequest setHTTPMethod:@"PUT"];
    [urlRequest addValue:@"keep-alive" forHTTPHeaderField:@"Connection"];
    [urlRequest addValue:contentType forHTTPHeaderField:@"Content-Type"];

    // NB: for upload …
Run Code Online (Sandbox Code Playgroud)

objective-c background-process ios

8
推荐指数
1
解决办法
3809
查看次数

iOS检测蓝牙连接/断开连接

即使我的应用程序处于后台,当蓝牙设备与iOS连接或断开连接时是否可以通知?在Android上,我使用ACTION_ACL_CONNECTEDACTION_ACL_DISCONNECTED事件.但我找不到iOS的等价物.

我发现CBCentralManager它可用于监视蓝牙事件,但是当蓝牙设备连接/断开时,我的功能不会被调用,只有当我启用/禁用蓝牙时.这是我的错误还是正常?

我还找到了关于音频路由更改的文档,这也可以是检测蓝牙连接/断开连接的想法.只需检查新路由的种类并检测当时连接的蓝牙设备.

在文档中,我也发现NSNotification类似IOBluetoothHostControllerXXX但没有解释它们.有人已经使用过吗?

有什么更好的东西还是我错过了什么?

bluetooth background-process ios core-bluetooth ios-bluetooth

8
推荐指数
1
解决办法
3709
查看次数

CoreBluetooth反复断开连接

我一直在寻找这个问题,但似乎没有人拥有它.

我有两个iPad.一个充当蓝牙外围设备,始终在前台.由于我对中心方面更感兴趣,因此我将中央iPad背景能够用于BLE-central.我的工作流程如下:

  1. 中央应用运行并开始扫描
  2. 外围广告服务(或在范围内)
  3. 中央设备连接到外围设备并停止扫描
  4. 周边停止广告(或叶子范围)
  5. 中央设备断开连接并开始扫描
  6. 无论中心位于前景还是后台,都可以无缝执行步骤1-5

当我运行我的中央iPad应用程序时,步骤3和5每10秒重复一次,即使该服务正在整个时间进行广告宣传.这发生在前景和背景中.

断开连接时,我收到此错误:

Error occurred while disconnecting peripheral: The specified device has disconnected from us.
Run Code Online (Sandbox Code Playgroud)

关于为什么它一直断开的任何想法?如果没有数据传输,CoreBluetooth会清理连接吗?现在,我的核心是对外围特征进行一次性读取.它没有订阅更新,因为值是静态的.谢谢!!

background-process ios core-bluetooth

7
推荐指数
1
解决办法
2173
查看次数

当python进程被杀死时运行atexit()

我有一个在后台运行的python进程,我希望它只在脚本终止时生成一些输出.

def handle_exit():
    print('\nAll files saved in ' + directory)
    generate_output()

atexit.register(handle_exit)
Run Code Online (Sandbox Code Playgroud)

调用引发KeyboardInterupt异常并正确sys.exit()调用handle_exit(),但是如果我kill {PID}要从终端执行它会终止脚本而不调用handle_exit().

有没有办法终止在后台运行的进程,并handle_exit()在终止之前仍然运行它?

python atexit background-process

7
推荐指数
1
解决办法
4106
查看次数

Flutter:在后台获取地理位置

我需要我的应用程序在后台将当前位置发送到 API,特别是在应用程序关闭时。我发现对于如何为 IOS 实施它存在限制。flutter 中是否有任何解决方案可以为两个平台实现这一点?

location background-process dart flutter

7
推荐指数
1
解决办法
7590
查看次数

iOS 模拟器中的静默通知

我一直在研究 iOS 中的后台执行。其中一种方法是无声通知。

无声通知(又名后台推送)可用于将应用程序从挂起状态唤醒并更新内容。从 Xcode 11.4 开始,可以模拟常规用户通知,如此处所述。然后,从 Xcode 14 开始,那些拥有 Apple Silicon Mac 笔记本电脑的用户将能够从 APNS 本身向模拟器发送通知......太棒了。

但这篇文章是关于无声通知的。

使用的 .apns 文件是,

{
    "Simulator Target Bundle": "com.example.IOSBackgroundExec",
    "aps": {
        "content-available": 1
    }
}
Run Code Online (Sandbox Code Playgroud)

在项目设置中,“签名和功能”选项卡下启用“远程通知”,并添加推送通知。无声通知不需要用户许可。

当应用程序被唤醒时,应该调用以下委托方法。

// Handling silent remote notification
    
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
        
    NSLog(AppDelegate.TAG + "application(_:didReceiveRemoteNotification:fetchCompletionHandler:)")

    // Some work
        
    completionHandler(.newData)
}
Run Code Online (Sandbox Code Playgroud)

问题):

  1. 当我拖放 .apns 文件时,不会调用委托方法。我知道后台获取和后台处理无法在模拟器中进行测试,因为它们的调度取决于系统条件,而这超出了模拟器的范围。那么静默通知也无法在模拟器中测试吗?
  2. 根据文档,通过用户强制退出,用户从应用程序切换器中滑动应用程序被引用?即使刷完 WhatsApp 后,只要有互联网连接,您仍然会收到传入消息的通知,对吗?

此外,如果您启用了远程通知后台模式,系统会启动您的应用程序(或将其从挂起状态唤醒),并在远程通知到达时将其置于后台状态。但是,如果用户强制退出,系统不会自动启动您的应用程序。

环境:Xcode 14.2、iOS 模拟器 16.x

background-process push-notification ios ios-simulator swift

7
推荐指数
1
解决办法
1173
查看次数