在我的应用程序中,我将图像从iPhone上传到服务器.如果用户按下主页按钮同步,App将关闭.
我希望应用程序必须在后台运行,直到同步完成.
我的问题是:如何用" beginBackgroundTaskWithExpirationHandler" 添加当前正在运行的任务?
请分享您的想法.
我正在创建一个基于Swift的iOS应用程序,它结合了iBeacons,为WatchKit(OS 1)应用程序提供数据.应用程序根据信标CLProximity是否设置为.Near或将数据从JSON加载到tableView中.Immediate.iOS应用程序启动后,能够无问题地检测信标,填充变量,并使其可用于WatchKit应用程序.但是,当WatchKit应用程序尝试使用application:handleWatchKitExtensionRequestiOS尚未首先启动时从应用程序请求信标数据时,信标的对象将返回nil.我的假设是,当手机上的应用程序关闭时,打开父应用程序的WatchKit调用不会触发存储在AppDelegate中的信标范围代码.将信标初始化代码移动到application:handleWatchKitExtensionRequest该问题中并不能解决问题.
如何构建应用程序(一般来说,我知道足够的代码,我不一定需要逐行细分,但如果您认为它可以帮助其他人,您可以自由地执行此操作)其中:
我有一种感觉,我的解决方案的一部分在于DarwinNotification和注册观察者,这不是我以前曾经用过很多东西的东西,但是在StackOverflow上有足够的例子我可以实现它们,如果是这样的话.我想真正的问题是如何在尚未启动iOS应用程序时收集信标数据.
我的应用程序配置为支持静默推送(内容可用),并且还支持后台提取.想要实现是在接收静默推送时,我需要向服务器发送ajax请求,获取数据并保存(使用CoreData保存).
当然,如果没有用户打开应用程序,所有这些都会发生.当他打开应用程序时,会有新的数据等待.这是无声的回拨:
func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) {
// Use Alamofire to make an ajax call:
//...
let mutableURLRequest = NSMutableURLRequest(URL: URL)
let requestBodyData : NSMutableData = NSMutableData()
mutableURLRequest.HTTPBody = body
mutableURLRequest.HTTPMethod = "POST"
mutableURLRequest.setValue("Bearer " + accessToken, forHTTPHeaderField: "Authorization")
mutableURLRequest.setValue("application/json", forHTTPHeaderField: "Content-Type")
request(mutableURLRequest)
.responseJSON { (req, res, data, error) in
//We do not reach this code block !
// Save the incoming data to CoreData
completionHandler(UIBackgroundFetchResult.NewData)
} …Run Code Online (Sandbox Code Playgroud) 我在iOS应用程序上工作,我正在从图像创建视频.我AVAssetWriter用来实现这一目标.一切正常.但当应用程序进入后台并切换回来时,视频写入失败.AVAssetWriter的finishWritingWithCompletionHandler当我切换回应用程序是没有得到调用.
当应用程序在渲染期间进入背景时,可能是AVAssetWriter的副本失败,但我没有得到任何帮助.
对此有何看法?
谢谢
iOS版
应用程序最小化后我们可以调用该方法吗?
例如,被叫5秒后applicationDidEnterBackground:.
我使用此代码,但test方法不调用
- (void)test
{
printf("Test called!");
}
- (void)applicationDidEnterBackground:(UIApplication *)application
{
[self performSelector:@selector(test) withObject:nil afterDelay:5.0];
}
Run Code Online (Sandbox Code Playgroud) 抱歉,我被卡住了,但是我正在尝试启动后台任务(XCode8,迅速3)
来自此处的示例: https : //developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html#//apple_ref/doc/uid/TP40007072-CH4-SW3
在AppDelegate.swift中:
func applicationDidEnterBackground(_ application: UIApplication) {
var bgTask: UIBackgroundTaskIdentifier = 0;
bgTask = application.beginBackgroundTask(withName:"MyBackgroundTask", expirationHandler: {() -> Void in
print("The task has started")
application.endBackgroundTask(bgTask)
bgTask = UIBackgroundTaskInvalid
})
}
Run Code Online (Sandbox Code Playgroud)
该应用程序从未显示“任务已开始”消息。我究竟做错了什么?
我的应用程序有时会在后台崩溃并显示以下崩溃日志:
Nov 7 12:33:31 iPad backboardd[29] <Warning>: MyApp[3096] has active assertions beyond permitted time:
{(
<BKProcessAssertion: 0x14680c60> identifier: Called by MyApp, from -[AppDelegate applicationDidEnterBackground:] process: MyApp[3096] permittedBackgroundDuration: 180.000000 reason: finishTask owner pid:3096 preventSuspend preventIdleSleep preventSuspendOnSleep
)}
Run Code Online (Sandbox Code Playgroud)
通过其他问题我发现崩溃消息表明我没有正确结束任务,所以当它的时间到期时,操作系统结束了它并使我的应用程序崩溃.
所以我添加了一些NSLog:
- (void)applicationDidEnterBackground:(UIApplication *)application
{
[self saveContext];
[Settings setCallLock:YES];
[self saveStuff];
if ([self isBackgroundTaskNeeded])
{
UIApplication* app = [UIApplication sharedApplication];
bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
[self pauseDownloads];
NSLog(@"Debug - Ending background task %d",bgTask);
[app endBackgroundTask:bgTask];
NSLog(@"Debug - Background task %d ended",bgTask);
bgTask …Run Code Online (Sandbox Code Playgroud)