我想将视频文件发布到Facebook。以前我使用Facebook iOS SDK3.0,它的工作原理。但是,对于iOS6社交框架,存在问题。
__block ACAccount * facebookAccount;
ACAccountStore* accountStore = [[ACAccountStore alloc] init];
NSDictionary *options = @{
ACFacebookAppIdKey: @"MY APP ID",
ACFacebookPermissionsKey: @[@"publish_actions", ],
@"ACFacebookAudienceKey": ACFacebookAudienceFriends
};
ACAccountType *facebookAccountType = [accountStore
accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];
[accountStore requestAccessToAccountsWithType:facebookAccountType options:options completion:^(BOOL granted, NSError *error) {
if (granted) {
NSArray *accounts = [accountStore
accountsWithAccountType:facebookAccountType];
facebookAccount = [accounts lastObject];
NSLog(@"access to facebook account ok %@", facebookAccount.username);
NSData *videoData = [NSData dataWithContentsOfFile:[self videoFileFullPath]];
NSLog(@"video size = %d", [videoData length]);
NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys:
videoData, @"video.mov",
@"video/quicktime", @"contentType" ,
@"Video title", @"title",
@"Video description", @"description",nil];
NSURL *requestURL = [NSURL URLWithString:@"https://graph.facebook.com/me/videos"];
SLRequest *request = [SLRequest requestForServiceType:SLServiceTypeFacebook
requestMethod:SLRequestMethodPOST
URL:requestURL
parameters:params];
request.account = facebookAccount;
[request performRequestWithHandler:^(NSData *data, NSHTTPURLResponse *response,NSError * error){
NSLog(@"response = %@", response);
NSLog(@"error = %@", [error localizedDescription]);
}];
} else {
NSLog(@"access to facebook is not granted");
// extra handling here if necesary
}
}];
由于未捕获的异常而终止应用 'NSInvalidArgumentException',原因:' - [NSConcreteData _fastCharacterContents]:无法识别的选择器发送到实例0x2097ead0'
答案 0 :(得分:5)
这是我的研究: 首先,视频数据不能成为参数列表的一部分,因为它会使SLRequest无效,这就是您遇到的崩溃。
视频数据必须包含在请求的多部分部分中。
现在,需要将参数与多部分数据相关联,这是棘手的部分。因此,有必要使用source属性来建立该链接。
Source需要一个字符串格式的URL,在参数中设置它,并在multipart请求的filename字段中设置相同的值。
应该这样做。
NSURL *url = [NSURL URLWithString:@"https://graph.facebook.com/me/videos"];
NSURL *videoPathURL = [[NSURL alloc]initFileURLWithPath:videoPath isDirectory:NO];
NSData *videoData = [NSData dataWithContentsOfFile:videoPath];
NSString *status = @"One step closer.";
NSDictionary *params = @{@"title":status, @"description":status};
SLRequest *request = [SLRequest requestForServiceType:SLServiceTypeFacebook
requestMethod:SLRequestMethodPOST
URL:url
parameters:params];
[request addMultipartData:videoData
withName:@"source"
type:@"video/quicktime"
filename:[videoPathURL absoluteString]];
答案 1 :(得分:0)
我正在处理同样的问题。我认为您的错误来自ARC,NSData *videoData
在performRequestWithHandler
返回之前被删除。