我正在构建一个需要下载一些JSON作为响应的共享扩展。我完全不知道为什么这不起作用,我已经尝试过按摩它的许多小部分,但仍然没有。在模拟器上,这很好。
这就是我所拥有的:
- (void)didSelectPost
{
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
// ... set up the request
NSString *const kFLHTTPMethodPOST = @"POST";
[request setHTTPMethod:kFLHTTPMethodPOST];
NSString *sessionConfigurationIdentifier = [[NSBundle mainBundle] bundleIdentifier];
self.sessionConfiguration = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:sessionConfigurationIdentifier];
// The sharedContainerIdentifier must be populated for background sessions
// https://developer.apple.com/library/prerelease/ios/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html#//apple_ref/doc/uid/TP40014214-CH21-SW1
// http://cl.ly/image/0Y3P1B450U1Y
self.sessionConfiguration.sharedContainerIdentifier = kFLAppGroupIdentifier;
// The delegate must be populated for background sessions
// https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/URLLoadingSystem/Articles/UsingNSURLSession.html#//apple_ref/doc/uid/TP40013509-SW44
// http://cl.ly/image/431J0G2r2p0X
self.session = [NSURLSession sessionWithConfiguration:self.sessionConfiguration delegate:self delegateQueue:nil];
// Generate our task and start it
// Use of a download task is required for extensions even though a data task might be more apt here
// https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/URLLoadingSystem/Articles/UsingNSURLSession.html#//apple_ref/doc/uid/TP40013509-SW44
self.task = [self.session downloadTaskWithRequest:request];
[self.task resume];
// Finish the extension
[self.extensionContext completeRequestReturningItems:nil completionHandler:nil];
}
这与https://developer.apple.com/library/prerelease/ios/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html#//apple_ref/doc/uid/TP40014214-CH21-SW2的示例代码和我在别处看到的很多代码差别不大。根据我的知识,主应用程序和扩展程序都有适当的权利和配置。应用程序组似乎正在运行,因为扩展程序能够存储文件并从与主应用程序共享的NSUserDefaults副本中提取值。
有没有人能够正常工作?似乎我必须遗漏一些东西。
更新
进一步深入研究。
我看到在扩展程序完成后记录了这一点。
Aug 28 12:03:41 Tim-Johnsens-iPod nsurlsessiond [98]:无法在file:/// private / var / mobile / Containers / Shared / AppGroup / 4C86E3B4-6795-4D8A-9C47创建目录-11B88A252703 / Library / Caches / com.apple.nsurlsessiond / Downloads / com.flipboard.flipboard-ipad-debug /,error:Error Domain = NSCocoaErrorDomain Code = 513“操作无法完成。(Cocoa error 513.) “UserInfo = 0x14ea3460 {NSFilePath = / private / var / mobile / Containers / Shared / AppGroup / 4C86E3B4-6795-4D8A-9C47-11B88A252703 / Library / Caches / com.apple.nsurlsessiond / Downloads / com.flipboard.flipboard-ipad- debug,NSUnderlyingError = 0x14e7f320“操作无法完成。不允许操作”}
奇怪的是,我已经成功地将文件存储在file:/// private / var / mobile / Containers / Shared / AppGroup / 4C86E3B4-6795-4D8A-9C47-11B88A252703 /,出于某种原因,NSURLSession可以似乎把文件放在那里。
我添加了一行来在我的扩展程序的-viewDidLoad中手动创建此目录,并且该错误已停止,但是现在我遇到了不同的错误。它看起来像是一个临时文件,但是某个地方iOS正在创建一个无效的URL,然后我的-URLSession:task:didCompleteWithError:在会话中被连续两次调用。 (注意:由我添加以“~~”开头的行。)
Aug 28 13:33:34 Tim-Johnsens-iPod nsurlsessiond [98]:__ NSCFLocalDownloadFile:错误1创建临时文件:/ private / var / mobile / Containers / Shared / AppGroup / 4C86E3B4-6795-4D8A-9C47-11B88A252703 /Library/Caches/com.apple.nsurlsessiond/Downloads/com.flipboard.flipboard-ipad-debug/CFNetworkDownload_BUqFkv.tmp 8月28日13:33:34 Tim-Johnsens-iPod nsurlsessiond [98]:来自pid 502的连接:警告:在调用收到的消息,丢弃传入消息和使连接无效时捕获到异常。 例外: * - [NSURL initFileURLWithPath:]:nil字符串参数 8月28日13:33:34 Tim-Johnsens-iPod ShareExtension [502]:~~ - [FLShareExtensionViewController URLSession:task:didCompleteWithError:] - 错误域= NSURLErrorDomain代码= -1“未知错误”UserInfo = 0x176d19d0 {NSErrorFailingURLKey = [删除] ],NSErrorFailingURLStringKey = [删除],NSLocalizedDescription =未知错误} 8月28日13:33:34 Tim-Johnsens-iPod ShareExtension [502]:~~ - [FLShareExtensionViewController URLSession:task:didCompleteWithError:] - 错误域= NSURLErrorDomain代码= -997“与后台传输服务失去连接”UserInfo = 0x1765fb80 { NSErrorFailingURLKey = [已删除],NSErrorFailingURLStringKey = [已删除],NSLocalizedDescription =与后台传输服务失去连接}
我猜我的扩展程序正在通过“丢失连接到后台传输服务”错误获得回调,因为后台传输服务由于抛出该异常而崩溃。
答案 0 :(得分:0)
原来这是在iOS 8 GM中修复的,这只是beta版中的一个bug。