我一直在使用新的 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]
在代码的第一部分,它没有问题。
我已经查看了我的代码,我认为我没有做错任何事情,所以我认为这可能是框架上的错误?看起来 ACAccountType 是在不应该发布的时候发布的,但我想检查你们中的任何人是否可以看到我的代码有什么问题导致它和/或找到问题的解释,我无法自己解决。
谢谢
更新
似乎其他一些人也有同样的问题,我接受其中一个答案,因为它实际上解决了这个问题,但我期待任何能找到该问题解释的人。