Social.framework              Account.framework                  MediaTechnologyLabs                       黒田 樹13年1月25日金曜日
自己紹介  • TwitterID : i2key  • MediaTecnologyLabsのJavaエンジニア   • Social x Music App「Attacca」     • 企画&開発(ObjC/Java)&運用  • 前職時...
Agenda  •   サンプルアプリの紹介  •   Tweet / Wall Post      •   SLComposeViewController  •   Login      •   ACAccountStore , ACAcco...
サンプルアプリ紹介再生している曲情報をTwitter/Facebookに投稿Github : i2keyhttps://github.com/i2key/SocialframeworkExample13年1月25日金曜日
13年1月25日金曜日
Tweet/WallPost    SLComposeViewController- (IBAction)tweet:(id)sender {    SLComposeViewController *twitterPostVC      = [...
Login(Twitter)    ACAccountStore, ACAccount Accountへのアクセス要求- (IBAction)showTwitterAccounts:(id)sender {! ACAccountStore *a...
Login(Twitter) ACAccountStore, ACAccount                             入力だるい                             離脱・・?13年1月25日金曜日
Login(Twitter) ACAccountStore, ACAccount                             便利になったものの、iOSにアカウント                             設定してい...
Login(Twitter) ACAccountStore, ACAccount                               Migration                                  to      ...
Login(Facebook) ACAccountStore, ACAccount Accountへのアクセス要求- (IBAction)showFacebookAccounts:(id)sender { ACAccountType *face...
Login(Facebook) ACAccountStore, ACAccount Accountへのアクセス要求- (IBAction)showFacebookAccounts:(id)sender { ACAccountType *face...
ACFacebookAppIdKey : APPIDACFacebookPermissionsKey : 取得したいパーミッションACFacebookAudienceKey : 開示範囲              https://develop...
ACFacebookAppIdKey : APPIDACFacebookPermissionsKey : 取得したいパーミッション ACFacebookAudienceKey : 開示範囲https://developers.facebook....
ACFacebookAppIdKey : APPIDACFacebookPermissionsKey : 取得したいパーミッションACFacebookAudienceKey : 開示範囲13年1月25日金曜日
ACFacebookAppIdKey : APPIDACFacebookPermissionsKey : 取得したいパーミッションACFacebookAudienceKey : 開示範囲  ACFacebookAudienceEveryone ...
Tweet/WallPost (Twitter) SLRequest(iOS5 : TWRequest) - (void)tweetUsingSLRequest{     if ([SLComposeViewController isAvail...
Tweet/WallPost (Facebook)    SLRequest- (void)postWallUsingSLRequest{    ACAccountStore *accountStore = [[ACAccountStore a...
ReverseAuth (Twitter)    ServerサイドでもTwitterAPIを利用する場合、    AccessTokenが必要になるが、    ACAccount.frameworkからは取り出せない13年1月25日金曜日
ReverseAuth (Twitter)https://dev.twitter.com/docs/ios/using-reverse-authStep1: Special Request Token取得                 <in...
ReverseAuth (Twitter)Step1: Special Request Token取得   Signed Request(Header)の作り方     https://dev.twitter.com/docs/auth/aut...
ReverseAuth (Twitter)Step1: Special Request Token取得   https://github.com/seancook/TWReverseAuthExample13年1月25日金曜日
ReverseAuth (Twitter)- (IBAction)reverseAuth:(id)sender {    // Step 1) Ask Twitter for a special request_token for revers...
Upcoming SlideShare
Loading in...5
×

Social.framework&Account.framework #twtr_hack

7,108

Published on

社内のObjective-Cエンジニアの勉強会で発表する(した)スライドです。
iOS6のフレームワーク周りの説明をしています。Facebook周り、SLRequest使おうとするとpermission周り意外とめんどいね。

0 Comments
10 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
7,108
On Slideshare
0
From Embeds
0
Number of Embeds
5
Actions
Shares
0
Downloads
22
Comments
0
Likes
10
Embeds 0
No embeds

No notes for slide

Social.framework&Account.framework #twtr_hack

  1. 1. Social.framework Account.framework MediaTechnologyLabs 黒田 樹13年1月25日金曜日
  2. 2. 自己紹介 • TwitterID : i2key • MediaTecnologyLabsのJavaエンジニア • Social x Music App「Attacca」 • 企画&開発(ObjC/Java)&運用 • 前職時代はSIerにてアーキテクトとして 官公庁のシステム開発(Java/C#)に参画13年1月25日金曜日
  3. 3. Agenda • サンプルアプリの紹介 • Tweet / Wall Post • SLComposeViewController • Login • ACAccountStore , ACAccount , ACCredential • Tweet / Wall Post • SLRequest • ReverseAuth13年1月25日金曜日
  4. 4. サンプルアプリ紹介再生している曲情報をTwitter/Facebookに投稿Github : i2keyhttps://github.com/i2key/SocialframeworkExample13年1月25日金曜日
  5. 5. 13年1月25日金曜日
  6. 6. Tweet/WallPost SLComposeViewController- (IBAction)tweet:(id)sender { SLComposeViewController *twitterPostVC = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeTwitter]; [twitterPostVC setInitialText:@”メッセージ本文”]; [twitterPostVC addImage:UIImageクラスによる画像データ]; [self presentViewController:twitterPostVC animated:YES completion:nil];}- (IBAction)postWall:(id)sender { SLComposeViewController *facebookPostVC = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeFacebook]; [facebookPostVC setInitialText:@”メッセージ本文”]; [facebookPostVC addImage: UIImageクラスによる画像データ]; [self presentViewController:facebookPostVC animated:YES completion:nil];} iOS5 : TWTweetComposeViewController iOS6 : SLComposeViewController13年1月25日金曜日
  7. 7. Login(Twitter) ACAccountStore, ACAccount Accountへのアクセス要求- (IBAction)showTwitterAccounts:(id)sender {! ACAccountStore *accountStore = [[ACAccountStore alloc] init]; ACAccountType *twitterType = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter]; [accountStore requestAccessToAccountsWithType:twitterType options:Nil completion:^(BOOL granted, NSError *error) { if (granted) {! ! ! //ActionSheetを表示する処理! ! } }];} Accountを取り出すself.accounts = [self.accountStore accountsWithAccountType:serviceType];13年1月25日金曜日
  8. 8. Login(Twitter) ACAccountStore, ACAccount 入力だるい 離脱・・?13年1月25日金曜日
  9. 9. Login(Twitter) ACAccountStore, ACAccount 便利になったものの、iOSにアカウント 設定していない人は・・? TweetSheetであれば設定へ遷移させる ことが出来るが、この場合は出来ない のでユーザに設定させることになる ・・・離脱・・?13年1月25日金曜日
  10. 10. Login(Twitter) ACAccountStore, ACAccount Migration to AccountFW 設定無し Login 設定済み ServerでもiOS5 > version AccessToken必要 ReverseAuth13年1月25日金曜日
  11. 11. Login(Facebook) ACAccountStore, ACAccount Accountへのアクセス要求- (IBAction)showFacebookAccounts:(id)sender { ACAccountType *facebookType = [self.accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook]; NSDictionary *options = @{ACFacebookAppIdKey : @"AppID", ACFacebookPermissionsKey : @[@"email"], ACFacebookAudienceKey : ACFacebookAudienceOnlyMe}; [self.accountStore requestAccessToAccountsWithType:facebookType options:options completion:^(BOOL granted, NSError *error) { if(granted){ //ActionSheet表示する処理 } }];} Accountを取り出すself.accounts = [self.accountStore accountsWithAccountType:serviceType];13年1月25日金曜日
  12. 12. Login(Facebook) ACAccountStore, ACAccount Accountへのアクセス要求- (IBAction)showFacebookAccounts:(id)sender { ACAccountType *facebookType = [self.accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook]; NSDictionary *options = @{ACFacebookAppIdKey : @"AppId", ACFacebookPermissionsKey : @[@"email"], ACFacebookAudienceKey : ACFacebookAudienceOnlyMe}; [self.accountStore requestAccessToAccountsWithType:facebookType options:options completion:^(BOOL granted, NSError *error) { if(granted){ //ActionSheet表示する処理 ACFacebookAppIdKey : APPID } }]; ACFacebookPermissionsKey : 取得したいパーミッション} Accountを取り出す ACFacebookAudienceKey : 開示範囲self.accounts = [self.accountStore accountsWithAccountType:serviceType];13年1月25日金曜日
  13. 13. ACFacebookAppIdKey : APPIDACFacebookPermissionsKey : 取得したいパーミッションACFacebookAudienceKey : 開示範囲 https://developers.facebook.com/apps13年1月25日金曜日
  14. 14. ACFacebookAppIdKey : APPIDACFacebookPermissionsKey : 取得したいパーミッション ACFacebookAudienceKey : 開示範囲https://developers.facebook.com/docs/howtos/ios-6/ Step 1: Request basic profile information 初めから書き込み権限、読み込み要求はNG 例1)ACFacebookPermissionsKey : Step 2: Request read permissions @[@”publish_actions”] 例2)ACFacebookPermissionsKey : @[@”email”,@”read_stream”] 以下のようなエラーが出る The Facebook server could not fulfill this access request: The app must ask for a basic read permission at install time.” 初めから基本情報権限要求のみはOK ACFacebookPermissionsKey : @[@”email”] Step 3: Request publish permissions 基本情報権限要求後なら書き込み権限要求OK ACFacebookPermissionsKey : @[@”publish_action”]13年1月25日金曜日
  15. 15. ACFacebookAppIdKey : APPIDACFacebookPermissionsKey : 取得したいパーミッションACFacebookAudienceKey : 開示範囲13年1月25日金曜日
  16. 16. ACFacebookAppIdKey : APPIDACFacebookPermissionsKey : 取得したいパーミッションACFacebookAudienceKey : 開示範囲 ACFacebookAudienceEveryone : Posts are visible to everyone. ACFacebookAudienceFriends : Posts are visible only to friends. ACFacebookAudienceOnlyMe : Posts are visible to the user only.13年1月25日金曜日
  17. 17. Tweet/WallPost (Twitter) SLRequest(iOS5 : TWRequest) - (void)tweetUsingSLRequest{ if ([SLComposeViewController isAvailableForServiceType:SLServiceTypeTwitter]) { NSURL *url = [NSURL URLWithString:@"http://api.twitter.com/1.1/statuses/update_with_media.json"]; NSDictionary *params = [NSDictionary dictionaryWithObject:[[MusicManager sharedManager] createShareMessage] forKey:@"status"]; SLRequest *request = [SLRequest requestForServiceType:SLServiceTypeTwitter requestMethod:SLRequestMethodPOST URL:url parameters:params]; NSData *imageData=UIImagePNGRepresentation([[MusicManager sharedManager] trackImage]); [request addMultipartData:imageData withName:@"media[]" type:@"multipart/form-data" filename:@"hoge"]; [request setAccount:self.selectedAccount]; [request performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) { NSLog(@"responseData=%@", [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]); }]; } }13年1月25日金曜日
  18. 18. Tweet/WallPost (Facebook) SLRequest- (void)postWallUsingSLRequest{ ACAccountStore *accountStore = [[ACAccountStore alloc] init]; ACAccountType *facebookType = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook]; NSDictionary *options = @{ACFacebookAppIdKey : @"AppID", ACFacebookPermissionsKey : @[@"publish_actions"], ACFacebookAudienceKey : ACFacebookAudienceOnlyMe}; [accountStore requestAccessToAccountsWithType:facebookType options:options completion:^(BOOL granted, NSError *error) { if(granted){ NSString *urlStr = [NSString stringWithFormat:@"https://graph.facebook.com/me/feed"]; NSURL *url = [NSURL URLWithString:urlStr]; NSDictionary *params = @{@"message" : [[MusicManager sharedManager] createShareMessage]}; SLRequest *request = [SLRequest requestForServiceType:SLServiceTypeFacebook requestMethod:SLRequestMethodPOST URL:url parameters:params]; [request setAccount:self.selectedAccount]; [request performRequestWithHandler:^(NSData *response, NSHTTPURLResponse *urlResponse, NSError *error){ NSLog(@"response:%@",[[NSString alloc]initWithData:response encoding:NSUTF8StringEncoding]); }]; }else{ NSLog(@"error post:%@",[error description]); } }];}13年1月25日金曜日
  19. 19. ReverseAuth (Twitter) ServerサイドでもTwitterAPIを利用する場合、 AccessTokenが必要になるが、 ACAccount.frameworkからは取り出せない13年1月25日金曜日
  20. 20. ReverseAuth (Twitter)https://dev.twitter.com/docs/ios/using-reverse-authStep1: Special Request Token取得 <input> header : consumer_key...etc body: x_auth_mode(reverseauth) Singed https://api.twitter.com /oauth/request_token Request <output> reverseauth用token...etcStep2: Access Token取得 <input> Twitter Singned Requestのresponse SLRequest ConsumerKey https://api.twitter.com /oauth/access_token ACAcount <output> oauth_token oauth_tokenSecret Social screen_name framework user_id13年1月25日金曜日
  21. 21. ReverseAuth (Twitter)Step1: Special Request Token取得 Signed Request(Header)の作り方 https://dev.twitter.com/docs/auth/authorizing-request13年1月25日金曜日
  22. 22. ReverseAuth (Twitter)Step1: Special Request Token取得 https://github.com/seancook/TWReverseAuthExample13年1月25日金曜日
  23. 23. ReverseAuth (Twitter)- (IBAction)reverseAuth:(id)sender { // Step 1) Ask Twitter for a special request_token for reverse auth! NSURL *url = [NSURL URLWithString:TW_OAUTH_URL_REQUEST_TOKEN];!! // "reverse_auth" is a required parameter! NSDictionary *dict = [NSDictionary dictionaryWithObject:TW_X_AUTH_MODE_REVERSE_AUTH forKey:TW_X_AUTH_MODE_KEY];! TWSignedRequest *signedRequest = [[TWSignedRequest alloc] initWithURL:url parameters:dict requestMethod:TWSignedRequestMethodPOST];!! [signedRequest performRequestWithHandler:^(NSData *data, NSURLResponse *response, NSError *error) {! ! if (!data) {! ! ! [self dismissProgress:@"Error occurred in Step 1."];! ! }! ! else {! ! ! NSString *signedReverseAuthSignature = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];! ! !! ! ! // Step 2) Ask Twitter for the users auth token and secret! ! ! // include x_reverse_auth_target=CK2 and x_reverse_auth_parameters=signedReverseAuthSignature parameters! ! ! dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{! ! ! ! NSDictionary *step2Params = [NSDictionary dictionaryWithObjectsAndKeys:[TWSignedRequest consumerKey], TW_X_AUTH_REVERSE_TARGET, signedReverseAuthSignature, TW_X_AUTH_REVERSE_PARMS, nil];! ! ! ! NSURL *authTokenURL = [NSURL URLWithString:TW_OAUTH_URL_AUTH_TOKEN]; //-- iOS5 -----! ! ! //TWRequest *step2Request = [[TWRequest alloc] initWithURL:authTokenURL parameters:step2Params requestMethod:TWRequestMethodPOST]; //------------- //-- iOS6 -----! ! ! ! SLRequest *step2Request = [SLRequest requestForServiceType:SLServiceTypeTwitter requestMethod:SLRequestMethodPOST URL:authTokenURL parameters:step2Params]; //-------------! ! ! ! [step2Request setAccount:self.selectedAccount];! ! ! ! [step2Request performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {! ! ! ! ! if (!responseData || ((NSHTTPURLResponse*)response).statusCode >= 400) {! ! ! ! ! ! [self dismissProgress:@"Error occurred in Step 2."];! ! ! ! ! } else {! ! ! ! ! ! NSString *responseStr = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; NSLog(@"AuthData : %@",responseStr); ! ! ! ! ! }! ! ! ! }];! ! ! });! ! }! }];}13年1月25日金曜日
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×