ネットワーク検索は次の結果を返しました。
- 完成した実装は見つかりませんでした
- 公式のsdk VKontakteがあります:承認メカニズムが含まれ、画像を操作しますが、 UIActivityViewControllerを介してロードするための既製のクラスはありません
- カスタムUIActivityを作成するためのAppleドキュメントがあります
VK SDKを使用する準備
VK SDKの使用を開始する前に、アプリケーション作成ページで スタンドアロンアプリケーションを作成する必要があります 。 アプリケーションIDを保存し、「iOS用アプリバンドル」フィールドに入力します。
VK Appを介して承認を構成するには、アプリケーションURLプロトコルを構成する必要があります。
- プロジェクト設定を開き、「情報」セクションを選択します。
- [URLの種類]セクションで、[+]をクリックします。
- [ 識別子]および[URLスキーム]フィールドにvk + APP_ID (たとえば、 vk1234567 )を入力します。
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];
プロジェクトのソースコードはこちらからダウンロードできます 。