我正在构建一个共享扩展程序,该扩展程序需要下载一些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副本中提取值。
有人能使它正常工作吗?好像我一定缺少什么。
更新:
一直在深入研究。
扩展程序完成后,我看到此日志。
8月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 /,错误:错误域= NSCocoaErrorDomain代码= 513“操作无法完成。(可可错误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:连续被调用了两次。(注意:我添加了以“ ~~”开头的行)。
8月28日13:33:34 Tim-Johnsens-iPod nsurlsessiond [98]:__NSCFLocalDownloadFile:创建临时文件的错误1:/ private / var / mobile / Containers / Shared / AppGroup / 4C86E3B4-6795-4D8A-9C47-11B88A252703 / Library /缓存/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:]:零字符串参数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 = [REDACTED],NSErrorFailingURLStringKey = [REDACTED],NSLocalizedDescription =与后台传输服务的连接断开}
我猜我的扩展程序正在收到带有“失去与后台传输服务的连接”错误的回调,因为后台传输服务由于抛出该异常而崩溃了。
事实证明,此问题已在iOS 8 GM中修复,仅是Beta中的一个错误。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句