私のアプリでは、UISegmentControl を Yes または No に設定した Settings のビューがあり、SLRequest と Accounts Framework を使用して Facebook に表示されたページを自動的に投稿できます。その流れは次のようになります。
自動的に [いいえ] に設定されます。ユーザーが [はい] をクリックすると、次のコードが実行されます。
-(void)facebookpost {
ACAccountStore *accountStore = [[ACAccountStore alloc] init];
ACAccountType *facebookAccountType = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];
// We will pass this dictionary in the next method. It should contain your Facebook App ID key,
// permissions and (optionally) the ACFacebookAudienceKey
NSDictionary *options = @{ACFacebookAppIdKey : @"APPID",
ACFacebookPermissionsKey : @[@"email", @"publish_stream"],
ACFacebookAudienceKey:ACFacebookAudienceFriends};
// Request access to the Facebook account.
// The user will see an alert view when you perform this method.
[accountStore requestAccessToAccountsWithType:facebookAccountType
options:options
completion:^(BOOL granted, NSError *error) {
if (granted)
{
// At this point we can assume that we have access to the Facebook account
NSArray *accounts = [accountStore accountsWithAccountType:facebookAccountType];
// Optionally save the account
[accountStore saveAccount:[accounts lastObject] withCompletionHandler:nil];
}
else
{
[[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"facebook"];
[[NSUserDefaults standardUserDefaults] synchronize];
NSLog(@"Failed to grant access\n%@", error);
}
}];
}
また、facebookposting の NSUserDefault キーの Bool 値を YES に設定します。
次に、後のコードで、ページが表示されると、facebookposting の値が YES の場合にこのコードが実行されます。NO の場合、このコードは実行されません。
-(void)writetowall {
ACAccountStore *accountStore = [[ACAccountStore alloc] init];
ACAccountType *accountType = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];
NSArray *accounts = [accountStore accountsWithAccountType:accountType];
// If we don't have access to users Facebook account, the account store will return an empty array.
if (accounts.count == 0)
return;
// Since there's only one Facebook account, grab the last object
ACAccount *account = [accounts lastObject];
// Create the parameters dictionary and the URL (!use HTTPS!)
NSDictionary *parameters = @{@"message" : @"MY MESSAGE", @"link": _entry.articleUrl};
NSURL *URL = [NSURL URLWithString:@"https://graph.facebook.com/me/feed"];
// Create request
SLRequest *request = [SLRequest requestForServiceType:SLServiceTypeFacebook
requestMethod:SLRequestMethodPOST
URL:URL
parameters:parameters];
// Since we are performing a method that requires authorization we can simply
// add the ACAccount to the SLRequest
[request setAccount:account];
// Perform request
[request performRequestWithHandler:^(NSData *respData, NSHTTPURLResponse *urlResp, NSError *error) {
NSDictionary *responseDictionary = [NSJSONSerialization JSONObjectWithData:respData
options:kNilOptions
error:&error];
// Check for errors in the responseDictionary
}];
}
私が疑問に思っているのは、Facebook からのアクセス許可の削除やパスワードの変更などを処理する方法と場所です。これは、アクセス許可が取得される最初のコード セットで処理する必要がありますか? なぜなら、基本的にそのコード セットは 1 回だけ実行され、残りの時間はウォールにポストするコードを実行するだけだからです。