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]; 


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

Source: https://habr.com/ru/post/J214637/


All Articles