最近我一直在尝试使用新的 Social.Framework 和其中的 SLRequest,两者都可以在 iOS 6 及以上版本使用。但是,当我尝试发送请求时,却遇到了一个令人惊讶的崩溃错误。
我在 Facebook 和 Twitter 账户上都遇到了这个问题,所以我知道这不是与某一个账户特定问题有关。它必须与 ACAccount 对象有关,我是通过以下方式获取该对象:
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"6.0")) {
//iOS 6
if (_twitterEnabled) {
if ([SLComposeViewController isAvailableForServiceType:SLServiceTypeTwitter]) {
//Set up account
[accountStore requestAccessToAccountsWithType:accountTypeTwitter options:nil completion:^(BOOL granted, NSError *error) {
if (granted && !error) {
//Get account and get ready to post.
NSArray *arrayOfAccounts = [accountStore accountsWithAccountType:accountTypeTwitter];
if ([arrayOfAccounts count] > 0) {
_twitterAccount = [arrayOfAccounts lastObject];
}
}
}];
}
}
if (!_facebookEnabled) {
ACAccountType *accountTypeFacebook = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];
if ([SLComposeViewController isAvailableForServiceType:SLServiceTypeFacebook]) {
NSArray *permissions = @[@"user_about_me",@"user_likes",@"email"];
NSMutableDictionary *options = [NSMutableDictionary dictionaryWithObjectsAndKeys:kFacebookAppIDString, ACFacebookAppIdKey, permissions, ACFacebookPermissionsKey, ACFacebookAudienceFriends, ACFacebookAudienceKey, nil];
[accountStore requestAccessToAccountsWithType:accountTypeFacebook options:options completion:^(BOOL granted, NSError *error) {
if (granted && !error) {
[options setObject:@[@"publish_stream",@"publish_actions"] forKey:ACFacebookPermissionsKey];
[accountStore requestAccessToAccountsWithType:accountTypeFacebook options:options completion:^(BOOL granted, NSError *error) {
if (granted && !error) {
NSArray *arrayOfAccounts = [accountStore accountsWithAccountType:accountTypeFacebook];
if ([arrayOfAccounts count] > 0) {
_fbAccount = [arrayOfAccounts lastObject];
}
}
}];
}
}];
}
}
}
_twitterAccount和_fbAccount都是ACAccount对象,在从Account Store检索到相关帐户时我会将其存储在这些对象中。
问题出现在后来我尝试使用这些对象时(为了简洁起见,这里只发布Twitter方法):
NSDictionary *twitterMsg = @{@"status" : message};
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"6.0")) {
SLRequest *postRequest = [SLRequest requestForServiceType:SLServiceTypeTwitter requestMethod:SLRequestMethodPOST URL:kTwitterUpdateStatusURL parameters:twitterMsg];
[postRequest setAccount:_twitterAccount];
[postRequest performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {
NSLog(@"Twitter HTTP response: %d", [urlResponse statusCode]);
}];
}
当我在postRequest中调用setAccount:时,我收到了一个异常,错误信息为“该请求的帐户类型无效”,显然这是错误的。我尝试调试代码,奇怪的是_twitterAccount上的accountType在被发送到ACAccount对象之前被设置为nil。更奇怪的是,如果我放置
NSLog(@"%@",_twitterAccount);
就在下方
_twitterAccount = [arrayOfAccounts lastObject]
在第一段代码中,它能正常工作。
我已经检查了我的代码,我不认为我做错了任何事情,所以我认为这可能是框架的一个bug?看起来ACAccountType被释放了,但它不应该被释放,但我想检查一下是否有人能发现我的代码有什么问题引起了这个问题,并/或者找到一个解释这个问题的解决方法,而我自己无法解决。
谢谢
更新
似乎还有其他人遇到了同样的问题,我接受了其中一个答案,因为它实际上解决了问题,但我会继续寻找任何人能够找到这个问题的解释。