我知道这是可能的,因为 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]];
     }
}

任何人都可以指出我如何抓取 UIPasteboard 并缩短链接,如果它是一个 URL 并将其发送回 UIPasteboard?我已经阅读了多任务开发文档和 UIPasteboard 文档。如果有人有解决方案,您可以与我分享吗?

谢谢

最佳答案

我设法实现类似目标的唯一方法是不打扰 NSNotificationCenter,而只是在后台定期复制 UIPasteboard 的内容。

下面的代码每秒检查一次 UIPasteboard 一千秒。我相信一个应用程序可以在后台运行大约 10 分钟而不播放音频。如果您在后台播放音频文件,应用程序可以继续运行。

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    // Create a background task identifier
    __block UIBackgroundTaskIdentifier task;
    task = [application beginBackgroundTaskWithExpirationHandler:^{
        NSLog(@"System terminated background task early");
        [application endBackgroundTask:task];
    }];

    // If the system refuses to allow the task return
    if (task == UIBackgroundTaskInvalid)
    {
        NSLog(@"System refuses to allow background task");
        return;
    }

    // Do the task
    dispatch_async(dispatch_get_global_queue(0, 0), ^{

        NSString *pastboardContents = nil;

        for (int i = 0; i < 1000; i++)
        {
            if (![pastboardContents isEqualToString:[UIPasteboard generalPasteboard].string])
            {
                pastboardContents = [UIPasteboard generalPasteboard].string;
                NSLog(@"Pasteboard Contents: %@", pastboardContents);
            }

            // Wait some time before going to the beginning of the loop
            [NSThread sleepForTimeInterval:1];
        }

        // End the task
        [application endBackgroundTask:task];
    });


}

关于iphone - 在后台运行时像 Pastebot 一样抓取 UIPasteboard,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5721733/

10-10 23:59