VKontakteソーシャルネットワーク上で写真とテキストを公開するためのカスタムUIActivityの作成

アプリケーションの次のバージョンの作業中に、標準コントローラーUIActivityViewControllerを介してソーシャルネットワークVKontakteに写真を公開するタスクが発生しました



画像






ネットワーク検索は次の結果を返しました。

  1. 完成した実装は見つかりませんでした
  2. 公式のsdk VKontakteがあります:承認メカニズムが含まれ、画像を操作しますが、 UIActivityViewControllerを介してロードするための既製のクラスはありません
  3. カスタムUIActivityを作成するためのAppleドキュメントがあります






VK SDKを使用する準備



VK SDKの使用を開始する前に、アプリケーション作成ページで スタンドアロンアプリケーションを作成する必要がありますアプリケーションIDを保存し、「iOS用アプリバンドル」フィールドに入力します。

VK Appを介して承認を構成するには、アプリケーションURLプロトコルを構成する必要があります。







SDKを使用する



メソッドを使用してアプリケーションを起動するときにSDKを初期化する必要があります

[VKSdk初期化:デリゲートおよびAppId:APP_ID];


認証には、次の方法を使用できます。

[VKSdk許可:スコープ];


成功した場合、デリゲートはメソッドと呼ばれます

-(void)vkSdkDidReceiveNewToken:(VKAccessToken *)newToken;


エラーの場合(たとえば、ユーザーが許可を拒否した)

-(void)vkSdkUserDeniedAccess:(VKError *)authorizationError;




VKのUIActivity



Appleのドキュメントに従って、UIActivityの子孫を作成します。



#import <UIKit/UIKit.h> @interface VKontakteActivity : UIActivity - (id)initWithParent:(UIViewController*)parent; @end
      
      





補助入力のコントローラーは、キャプチャ入力、メッセージ出力などに必要です。



次に、UIActivity要素を表示するメソッド(タイプ、名前、アイコン)を再定義します

 - (NSString *)activityType { return @"VKActivityTypeVKontakte"; } - (NSString *)activityTitle { return @""; } - (UIImage *)activityImage { return [UIImage imageNamed:@"vk_activity"]; }
      
      







クラスに渡されたactivityItemの共有をサポートしているかどうかを確認します。

 - (BOOL)canPerformWithActivityItems:(NSArray *)activityItems { for (UIActivityItemProvider *item in activityItems) { if ([item isKindOfClass:[UIImage class]]) { return YES; } else if ([item isKindOfClass:[NSString class]]) { return YES; } } return NO; }
      
      







私たちがサポートしているactivityItemを覚えています:

 - (void)prepareWithActivityItems:(NSArray *)activityItems { for (id item in activityItems) { if ([item isKindOfClass:[NSString class]]) { self.string = item; } else if([item isKindOfClass:[UIImage class]]) { self.image = item; } else if([item isKindOfClass:[NSURL class]]) { self.URL = item; } } }
      
      







UIActivityを選択するときに、ユーザーが承認されているかどうかを直接確認します。

 - (void)performActivity{ [VKSdk initializeWithDelegate:self andAppId:@"3974615"]; if ([VKSdk wakeUpSession]) { [self postToWall]; } else{ [VKSdk authorize:@[VK_PER_WALL, VK_PER_PHOTOS]]; } }
      
      







承認に成功すると、投稿を公開します。

 -(void)postToWall{ [self begin]; if (self.image) { [self uploadPhoto]; } else{ [self uploadText]; } } //    -(void)uploadText{ [self postParameters:@{ VK_API_FRIENDS_ONLY : @(0), VK_API_OWNER_ID : [VKSdk getAccessToken].userId, VK_API_MESSAGE : self.string}]; } //    -(void)postParameters:(NSDictionary *)params{ VKRequest *post = [[VKApi wall] post:params]; [post executeWithResultBlock: ^(VKResponse *response) { NSNumber * postId = response.json[@"post_id"]; [[UIApplication sharedApplication] openURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://vk.com/wall%@_%@", [VKSdk getAccessToken].userId, postId]]]; [self end]; } errorBlock: ^(NSError *error) { NSLog(@"Error: %@", error); [self end]; }]; }
      
      







さらに、投稿に写真が含まれている場合は、サーバーに事前アップロードします。

 - (void)uploadPhoto { NSString *userId = [VKSdk getAccessToken].userId; //     VKRequest *request = [VKApi uploadWallPhotoRequest:self.image parameters:[VKImageParameters jpegImageWithQuality:1.f] userId:[userId integerValue] groupId:0]; [request executeWithResultBlock: ^(VKResponse *response) { VKPhoto *photoInfo = [(VKPhotoArray*)response.parsedModel objectAtIndex:0]; NSString *photoAttachment = [NSString stringWithFormat:@"photo%@_%@", photoInfo.owner_id, photoInfo.id]; //    [self postParameters:@{ VK_API_ATTACHMENTS : photoAttachment, VK_API_FRIENDS_ONLY : @(0), VK_API_OWNER_ID : userId, VK_API_MESSAGE : [NSString stringWithFormat:@"%@ %@",self.string, [self.URL absoluteString]]}]; } errorBlock: ^(NSError *error) { NSLog(@"Error: %@", error); [self end]; }]; }
      
      







VKontakteActivityを使用して写真を公開する例:

  NSArray *items = @[[UIImage imageNamed:@"example.jpg"], @"Example" , [NSURL URLWithString:@"https://www.youtube.com/watch?v=S59fDUZIuKY"]]; VKontakteActivity *vkontakteActivity = [[VKontakteActivity alloc] initWithParent:self]; UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:items applicationActivities:@[vkontakteActivity]]; [self presentViewController:activityViewController animated:YES completion:nil];
      
      







プロジェクトのソースコードはこちらからダウンロードできます



All Articles