无法使用实际设备上的共享扩展使用NSURLSession
我正在构建一个共享扩展,需要下载一些JSON作为响应。我完全不知道为什么这不起作用,我试着按摩它的许多小部分,但仍然没有。在模拟器上,这工作正常。无法使用实际设备上的共享扩展使用NSURLSession
下面是我得到了什么:
- (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副本中提取值。
有没有人能得到这个工作正常?好像我必须错过一些东西。
UPDATE:
被挖掘到这进一步。
我看到这个记录的分机结束后。
Aug 28 12:03:41 Tim-Johnsens-iPod nsurlsessiond [98]:无法在file:/// private/var/mobile/Containers/Shared/AppGroup/4C86E3B4-6795-4D8A- 9C47-11B88A252703 /图书馆/缓存/ com.apple.nsurlsessiond /下载/ com.flipboard.flipboard-IPAD调试/,错误:错误域= NSCocoaErrorDomain代码= 513“的操作无法完成(可可错误513。 )”的UserInfo = 0x14ea3460 {NSFilePath = /私有的/ var /移动/容器/共享/ AppGroup/4C86E3B4-6795-4D8A-9C47-11B88A252703 /库/缓存/ com.apple.nsurlsessiond /下载/ com.flipboard.flipboard-ipad的-debug,NSUnderlyingError = 0x14e7f320“无法完成操作,不允许操作”}
奇怪的是我已经将文件存储在file:/// private/var/mobile/Containers/Sh ared/AppGroup/4C86E3B4-6795-4D8A-9C47-11B88A252703 /成功,出于某种原因NSURLSession似乎无法将文件放在那里。
我添加了一行手动创建在我的分机的-viewDidLoad这个目录和错误而停止,但现在我得到不同的错误。它看起来像是一个临时文件正在创建,但在iOS创建一个无效的URL的地方,然后我的-URLSession:任务:didCompleteWithError:在会话连续两次调用。 (注:以“~~”开头的行是我加的)。 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0创建临时文件:/ private/var/mobile/Containers/Shared/AppGroup/4C86E3B4-6795-4D8A-9C47- 11B88A252703 /库/缓存/ com.apple.nsurlsessiond /下载/ com.flipboard.flipboard-ipad的调试/ CFNetworkDownload_BUqFkv.tmp 08月28 13点33分34秒TIM-Johnsens-的iPod nsurlsessiond [98]:从PID 502连接:警告:在调用收到的消息期间捕获异常,丢弃传入的消息并使连接无效。 例外:* - [NSURL initFileURLWithPath:]:零字符串参数 Aug 28 13:33:34 Tim-Johnsens-iPod ShareExtension [502]:~~ - [FLShareExtensionViewController URLSession:task:didCompleteWithError:] - Error Domain = NSURLErrorDomain Code = -1“未知错误”UserInfo = 0x176d19d0 {NSErrorFailingURLKey = [已编辑],NSErrorFailingURLStringKey = [已编辑],NSLocalizedDescription =未知错误} Aug 28 13:33:34 Tim-Johnsens-iPod ShareExtension [502]:~~ - [FLShareExtensionViewController URLSession:任务:didCompleteWithError:] - 错误域= NSURLErrorDomain代码= -997 “丢失连接到后台传输服务” 的UserInfo = 0x1765fb80 {NSErrorFailingURLKey = [删除],NSErrorFailingURLStringKey = [删除],NSLocalizedDescription =失去连接到后台传输服务}
我猜我的扩展正在获取与“丢失的连接到后台传输服务”错误的回调,因为背景传输服务因抛出异常而崩溃。
原来,这在iOS 8 GM中已修复,它只是beta版本中的一个bug。
在开发论坛上也问过这个问题,并为它开了一个雷达。 https://devforums.apple.com/message/1031240#1031240 – 2014-08-28 17:54:28
当构建一个基本的示例应用程序时,我得到了相同的结果。 – 2014-08-28 17:54:50
还有更多的事情,当我使用GET请求而不是POST时,我得到了相同的结果(请求永远不会发送)。苹果说你可以使用POST请求下载任务。 – 2014-08-28 18:56:03