我正在尝试安全地实施OAuth,如下所示:http://fireeagle.yahoo.net/developer/documentation/oauth_best_practice#custom-url-osx.我似乎遇到了绊脚石,因为我无法弄清楚如何处理在后台启动我的应用程序的URL.
我已经注册了我的申请来处理oauthtest.我已经确认oauthtest://和oauthtest:// callbacktest都会启动我的应用程序并在我的应用程序未在后台运行时按预期运行.
我正在实施
application:(UIApplication *) didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
Run Code Online (Sandbox Code Playgroud)
当我的应用程序冷启动时成功调用.我可以很容易地将url传递给我的应用程序.
但是,如果我的应用程序已在后台运行,则两者都没有
application:(UIApplication *) didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
Run Code Online (Sandbox Code Playgroud)
也不
application:(UIApplication *) handleOpenURL:(NSURL *)url
Run Code Online (Sandbox Code Playgroud)
被调用,我无法将传递给我的应用程序的参数作为URL的一部分.
有谁知道如何通过自定义URL方案获取传递给后台应用程序的参数?
我知道我可以通过禁用多任务来解决这个问题,但我不愿意这样做是因为显而易见的原因.提前致谢.
是否有可能有一个iPhone应用程序,当用户将其发送到后台时,它会继续侦听端口上的数据,如果有任何数据,应用程序可以显示本地通知并提醒用户?我知道多任务处理是有意限制的,但它允许这样做吗?
我有一个单视图应用程序.当我点击主页按钮并"最小化"应用程序时,我希望能够在用户重新打开时执行代码.
出于某种原因,当我最小化并重新打开应用程序时,viewDidAppear和viewWillAppear不会执行.
有什么建议?
在此先感谢sAdam
Apple的"应用程序状态和多任务处理"("移动到后台时应该做什么"部分)的文档说当应用程序转到后台时保存:
保存用户数据和应用程序状态信息.进入后台时,应将所有未保存的更改写入磁盘.此步骤是必要的,因为您的应用可能会因为各种原因而在后台安静地被杀死.您可以根据需要从后台线程执行此操作.
当我开始一个调度操作,例如保存,这需要花费一些时间,applicationDidEnterBackground:如下所示,当按下主页按钮时,我没有得到NSLog输出.返回应用程序后,将显示NSLog输出.
- (void)applicationDidEnterBackground:(UIApplication *)application {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self performOperation];
NSLog(@"Operation finished");
});
}
Run Code Online (Sandbox Code Playgroud)
performOperation当应用程序进入睡眠模式时,我可以确定该方法是完全执行还是中断?
我觉得在不支持UIApplication委托方法的情况下,iOS 7中引入的UIApplicationBackgroundRefreshStatusDidChangeNotification很少使用.因为,当用户为我的应用程序打开后台刷新状态时,不会通知应用程序.
这是我的通知处理程序......
- (void)applicationDidChangeBackgroundRefreshStatus:(NSNotification *)notification
{
NSLog(@"applicationDidChangeBackgroundRefreshStatus with notification info = %@ and refresh status = %d", notification, UIApplication.sharedApplication.backgroundRefreshStatus);
if (UIApplication.sharedApplication.backgroundRefreshStatus == UIBackgroundRefreshStatusAvailable) {
// if ([CLLocationManager locationServicesEnabled]) {
[self.locationManager startUpdatingLocation];
// }
}
}
Run Code Online (Sandbox Code Playgroud)
如上所述,我想在通过应用程序设置>常规>后台应用程序刷新使UIBackgroundRegreshStatus 可用时开始更新核心位置.我觉得UIApplicationDelegate中应该有一个合适的委托方法让应用知道这个变化,以便App可以重新建立它需要的一切.
要么我缺少某些东西(预先存在的API),要么Apple SDK工程师对此通知用法有其他/有限的意图.请指教.
background-process multitasking uiapplicationdelegate nsnotificationcenter ios
当我在C#上玩任务时,我想知道使用GetAwaiter()之间的区别是什么.OnCompleted()和回调
案例1: task1.GetAwaiter().OnCompleted()
Task task1 = new Task(() =>
{
//Do Work_1 here
});
task1.GetAwaiter().OnCompleted(() =>
{
//Do something here where Work_1 Completed
});
task1.Start();
Run Code Online (Sandbox Code Playgroud)
案例2: 回复
await Task2(() =>
{
//CallBack
});
private async Task Task2(Action callBack)
{
//do Work_2 here
await Task.Run(callBack);
}
Run Code Online (Sandbox Code Playgroud)
我想理解这一点,我想我错过了一些东西.
我知道这是可能的,因为Tapbots Pastebot这样做.当我的iPhone应用程序在后台运行时,我试图抓住UIPasteboard并将其添加到UITableView,就像Pastebot一样,但我也试图缩短链接,如果它是一个URL并将其复制回UIPastboard以便它准备就绪供用户粘贴到任何地方.现在,Pastebot通过播放音频文件10分钟显然在后台运行.我在applicationDidFinishLaunching中设置了NSNotificationCenter
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(pasteboardChangedNotification:) name:UIPasteboardChangedNotification object:[UIPasteboard generalPasteboard]];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(pasteboardChangedNotification:) name:UIPasteboardRemovedNotification object:[UIPasteboard generalPasteboard]];
- (void)pasteboardChangedNotification:(NSNotification*)notification {
pasteboardChangeCount_ = [UIPasteboard generalPasteboard].changeCount;
}
- (void)applicationDidBecomeActive:(UIApplication *)application
{
if (pasteboardChangeCount_ != [UIPasteboard generalPasteboard].changeCount) {
[[NSNotificationCenter defaultCenter] postNotificationName:UIPasteboardChangedNotification object:[UIPasteboard generalPasteboard]];
}
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以指点我抓住UIPasteboard并缩短链接,如果它是一个URL并将其发送回UIPasteboard?我已经阅读了多任务开发文档和UIPasteboard文档.如果有人有解决方案,请与我分享?
谢谢
Apple的任何设备是否支持iOS 4.0但不支持多任务处理?
如果没有,我不理解[UIDevice isMultitaskingSupported]API(仅在iOS 4.0中引入).
谢谢
我正在尝试在退出iOS应用程序的前台后添加对完成任务的支持.我在互联网上看到的所有教程都指出我在Application Delegate中写这样的东西:
- (void)applicationDidEnterBackground:(UIApplication *)application {
if ([[UIDevice currentDevice] isMultitaskingSupported]) {
UIApplication *application = [UIApplication sharedApplication];
__block UIBackgroundTaskIdentifier background_task;
background_task = [application beginBackgroundTaskWithExpirationHandler: ^ {
[application endBackgroundTask: background_task];
background_task = UIBackgroundTaskInvalid;
}];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//DO STUFF IN BACKGROUND HERE
MyTask *task = [[MyTask alloc] initWithURL:@"http://google.com"];
[task setDelegate:self];
[task start];
[application endBackgroundTask: background_task];
background_task = UIBackgroundTaskInvalid;
});
}
}
Run Code Online (Sandbox Code Playgroud)
该任务能够启动,但在启动后,下一行将被处理,我的应用程序将被终止.我可以告诉MyTask由于委托调用而停止的时间,但是如何更改我的程序,以便在调用委托后将后台任务设置为无效.我会搬家吗?
[application endBackgroundTask: background_task];
background_task = UIBackgroundTaskInvalid;
Run Code Online (Sandbox Code Playgroud)
委托功能,还是我需要做其他事情.
提前感谢您的帮助,Guvvy
我是iPhone开发的新手,并且通过GCD概念进行多线程处理.
'dispatch_queue_t'创建了一个串行队列,我已经读过一个串行队列一次只能执行一个作业.GCD旨在同时执行多个任务,然后为什么串行队列存在?
例如,我想做2个任务.任务A和任务B.我创建一个串行队列来执行这两个任务.我在主队列中这样做.这是我正在做的代码:
dispatch_queue_t my_serial_queue = dispatch_queue_create("queue_identifier", 0);
dispatch_sync(my_serial_queue, ^{
NSLog(@"Task 1");
});
dispatch_sync(my_serial_queue, ^{
NSLog(@"Task 2");
});
Run Code Online (Sandbox Code Playgroud)
现在,根据规则,任务将串行执行,因为它是串行队列,即首先执行任务A,然后在任务A完成后,将执行任务B. 而且它在日志中给我相同的输出.
所以,我的问题是,如果我想同时执行这两项任务怎么办?如果这个问题的答案是为任务B创建另一个串行队列,那么代码的结构应该是这样的:
dispatch_queue_t my_serial_queue_1 = dispatch_queue_create("queue_identifier_1", 0);
dispatch_queue_t my_serial_queue_2 = dispatch_queue_create("queue_identifier_2", 0);
dispatch_sync(my_serial_queue_1, ^{
NSLog(@"Task 1");
});
dispatch_sync(my_serial_queue_2, ^{
NSLog(@"Task 2");
});
Run Code Online (Sandbox Code Playgroud)
我得到了相同的输出.原因是我使用'dispatch_sync'调用而不是'dispatch_async'调用.但是当我在不同的队列中运行这两个任务时,它们不应该同时执行吗?如果没有,那么我们为什么要创建一个不同的队列呢?我可能通过'dispatch_async'调用使用相同的队列来同时执行这两个任务.
我真的需要回答这个问题,因为在将来设计我的多任务应用程序的结构之前,它会更好地指导我.
multithreading multitasking nsthread grand-central-dispatch ios
multitasking ×10
ios ×5
iphone ×3
ios4 ×2
objective-c ×2
.net ×1
async-await ×1
asynchronous ×1
c# ×1
cocoa-touch ×1
networking ×1
nsthread ×1
uipasteboard ×1
url ×1
xcode ×1