VK-ios-sdk 1.6.4

VK-ios-sdk 1.6.4

测试已测试
语言语言 Obj-CObjective C
许可 MIT
发布上次发布2022年11月

snalexeev، RValeriy Zhuravlev 维护。



  • Roman Truba

vk-ios-sdk

用于操作 VK API 的库,通过 VK 应用进行授权,使用 VK API 方法。支持 iOS 8.0 以上的应用程序。准备使用 VK SDK

要主要使用 VK SDK,您需要创建一个新的独立 VK 应用程序 这里。选择一个标题并通过短信确认操作,您将被重定向到应用程序设置页面。您需要 APP_ID 来使用此库。填写 iOS 字段中的 App Bundle。

设置您的应用程序的 URL 架构

要通过 VK 应用进行授权,您需要为您的应用程序设置一个类似于 vk+APP_ID 的 url-schema(例如,vk1234567)。

在此处实现您自己的 URL Scheme,此外还有Twitter 教程

针对iOS 9的应用程序配置

iOS 9改变了应用安全的方式和使用未加密连接的方式。基本上,您不需要更改传输安全设置。但是,如果您计划使用带有nohttps范围的VK API,您必须更改此方式的安全设置(在您的Info.plist文件中)

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>vk.com</key>
        <dict>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <false/>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
        </dict>
    </dict>
</dict>

我们推荐使用nohttps范围。

此外,针对iOS 9,您必须添加您的应用程序将使用的应用架构并检查canOpenURL:

将这些添加到您的Info.plist

<key>LSApplicationQueriesSchemes</key>
<array>
    <string>vk</string>
    <string>vk-share</string>
    <string>vkauthorize</string>
</array>

如何设置VK iOS SDK

使用CocoaPods进行安装

CocoaPods是一个Objective-C的依赖管理器,它自动并简化了在项目中使用像VK SDK这样的第三方库的过程。有关更多信息,请参阅入门指南

Podfile

platform :ios, '8.0'
target 'YourProjectName' do
  pod 'VK-ios-sdk'
end

然后根据您的 podfile 是否包含use_frameworks!指令将项目作为模块导入

@import VK_ios_sdk;

如果不使用use_frameworks!指令安装pods,则导入主要项目头文件

#import <VK-ios-sdk/VKSdk.h>

使用Carthage安装

iOS 8及以上版本

将这些添加到您的Cartfile

github "VKCOM/vk-ios-sdk" >= 1.4

有关构建说明,请参阅Carthage在此处

然后导入主要头文件。

#import <VKSdkFramework/VKSdkFramework.h>

使用框架项目安装

如果您目标是iOS 8及以上版本,则可以使用SDK框架目标。将VK-ios-sdk.xcodeproj作为子项目添加到您的项目中。在Xcode中打开您的项目,切换到通用选项卡,找到嵌入的二进制文件部分,点击添加项目(加号),最后从VK-ios-sdk项目中选择VKSdkFramework.framework并导入主头文件。

#import <VKSdkFramework/VKSdkFramework.h>

使用SDK

SDK初始化

  1. 将此代码放在应用程序委托方法中
//iOS 9 workflow
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options {
    [VKSdk processOpenURL:url fromApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey]];
    return YES;
}

//iOS 8 and lower
-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
    [VKSdk processOpenURL:url fromApplication:sourceApplication];
    return YES;
}

注意:如果您已经添加了FaceBook SDK并且以下任一方法返回[FBSDKDelegate ...],您可以处理它

-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {

    [[FBSDKApplicationDelegate sharedInstance] application:application openURL:url sourceApplication:sourceApplication annotation:annotation];
    [VKSdk processOpenURL:url fromApplication:sourceApplication];
    return YES;
}
  1. 使用您的APP_ID初始化VK SDK以用于任何委托
VKSdk *sdkInstance = [VKSdk initializeWithAppId:YOUR_APP_ID];

从版本1.3开始,有两种委托类型可用:通用委托和UI委托。您可以按需注册多个通用委托,但UI委托只能有一个。在SDK初始化之后,应分别注册委托

[sdkInstance registerDelegate:delegate];
[sdkInstance setUiDelegate:uiDelegate];

或者

[[VKSdk initializeWithAppId:APP_ID] registerDelegate:delegate];

您可以在这里这里找到完整的VKSdkDelegateVKSdkUIDelegate协议描述

  1. 您需要检查是否有可用的会话,因此调用异步方法wakeUpSession:completeBlock:
NSArray *SCOPE = @[@"friends", @"email"];

[VKSdk wakeUpSession:SCOPE completeBlock:^(VKAuthorizationState state, NSError *error) {
    if (state == VKAuthorizationAuthorized) {
        // Authorized and ready to go
    } else if (error) {
        // Some error happened, but you may try later
    }
}];

您可以在这里找到所有可用的SCOPE权限的完整列表

检查VKAuthorizationState参数。您可以得到几种状态

  • VKAuthorizationInitialized - 表示SDK已准备好工作,您可以使用+authorize:方法来授权用户。可能旧会话已过期,我们将其清除。_这不是一个错误。_
  • VKAuthorizationAuthorized - 表示旧会话一切正常,您可以继续处理用户数据。
  • VKAuthorizationError - 表示在尝试检查授权时发生了错误。可能是互联网连接质量差。您必须稍后再试。
[VKSdk wakeUpSession:SCOPE completeBlock:^(VKAuthorizationState state, NSError *err) {
       if (state == VKAuthorizationAuthorized) {
           // authorized
       } else {
           // auth needed
       }
}];

用户授权

如果您还没有会话,您必须使用以下方法授权用户

[VKSdk authorize:scope];

您必须遵守VKSdkDelegateVKSdkUIDelegate协议,以调用正确的方法。

授权后,所有通用委托都将使用以下方法被调用

- (void)vkSdkAccessAuthorizationFinishedWithResult:(VKAuthorizationResult *)result;

VKAuthorizationResult包含一些初始信息:新的访问令牌对象、基本用户信息和错误(如果授权失败)。有关完整文档请参阅此处

API请求

VK API请求语法

以下列出了一些请求类型的示例。

  1. 普通请求
VKRequest *usersReq = [[VKApi users] get];
  1. 带有参数的请求
VKRequest *audioReq = [[VKApi audio] get:@{VK_API_OWNER_ID : @"896232"}];
  1. 带有预定最大尝试次数的请求
VKRequest *postReq = [[VKApi wall] post:@{VK_API_MESSAGE : @"Test"}];
postReq.attempts = 10;
//or infinite
//postReq.attempts = 0;

尝试10次直到成功或发生API错误

  1. 调用VK API任何方法请求
VKRequest *getWall = [VKRequest requestWithMethod:@"wall.get" andParameters:@{VK_API_OWNER_ID : @"-1"}];
  1. 上传照片到用户墙面的请求
VKRequest *request = [VKApi uploadWallPhotoRequest:[UIImage imageNamed:@"my_photo"] parameters:[VKImageParameters pngImage] userId:0 groupId:0 ];

请求触发

[audioReq executeWithResultBlock:^(VKResponse *response) {
        NSLog(@"Json result: %@", response.json);
    } errorBlock:^(NSError * error) {
    if (error.code != VK_API_ERROR) {
        [error.vkError.request repeat];
    } else {
        NSLog(@"VK error: %@", error);
    }
}];

错误处理

每个请求都可能返回等于VKSdkErrorDomain域的NSError。SDK可以返回网络错误或内部SDK错误(例如请求被取消)。类别NSError+VKError提供了一个描述错误事件的vkError属性。比较错误代码与全局常量VK_API_ERROR。如果它们相等,则表示您处理vkError属性作为API错误。否则,您应处理HTTP错误。

SDK可以处理一些错误(例如,验证码错误、验证错误)。为此将调用一个合适的ui代理方法。以下是处理验证码错误的示例

- (void)vkSdkNeedCaptchaEnter:(VKError *)captchaError
{
    VKCaptchaViewController *vc = [VKCaptchaViewController captchaControllerWithError:captchaError];
    [vc presentIn:self];
}

批量处理请求

SDK允许在一个方法调用中执行多个无关的请求(即批量请求)。

  1. 准备请求
VKRequest *request1 = [[VKApi audio] get];
request1.completeBlock = ^(VKResponse *) { ... };

VKRequest *request2 = [[VKApi users] get:@{VK_USER_IDS : @[@(1), @(6492), @(1708231)]}];
request2.completeBlock = ^(VKResponse *) { ... };
  1. 合并请求到一起
VKBatchRequest *batch = [[VKBatchRequest alloc] initWithRequests:request1, request2, nil];
  1. 触发获取到的请求
[batch executeWithResultBlock:^(NSArray *responses) {
        NSLog(@"Responses: %@", responses);
    } errorBlock:^(NSError \*error) {
        NSLog(@"Error: %@", error);
}];
  1. 每个方法的结果返回到相应的完整区块。响应数组包含请求的结果,顺序与提出顺序一致。

在分享对话框中工作

分享对话框允许您创建一个友好的对话框,直接从您的应用程序中分享文本和图片到VK。查看分享对话框使用示例

VKShareDialogController *shareDialog = [VKShareDialogController new]; //1
shareDialog.text         = @"This post created using #vksdk #ios"; //2
shareDialog.vkImages     = @[@"-10889156_348122347",@"7840938_319411365",@"-60479154_333497085"]; //3
shareDialog.shareLink    = [[VKShareLink alloc] initWithTitle:@"Super puper link, but nobody knows" link:[NSURL URLWithString:@"https://vk.com/dev/ios_sdk"]]; //4
[shareDialog setCompletionHandler:^(VKShareDialogControllerResult result) {
    [self dismissViewControllerAnimated:YES completion:nil];
}]; //5
[self presentViewController:shareDialog animated:YES completion:nil]; //6
  1. 按照常规创建一个对话框控制器实例

  2. 将一些文本信息附加到对话框中。注意,用户可以更改这些信息

  3. 附加之前上传到VK的图片。如果要让用户上传新图片,请使用uploadImages属性

  4. 在您的页面上附加链接

  5. 设置对话框完成处理程序

  6. 将对话框视图控制器呈现给您的视图控制器

在分享活动中工作

VK SDK提供了一个特殊类来处理UIActivityViewController - VKActivity

请注意,从版本2.4开始,VK App有自己的分享扩展。从版本2.5开始,它将支持特殊的URL方案以检查分享扩展是否可用。如果VK分享扩展可用,您应该调用[VKActivity vkShareExtensionEnabled]方法从活动列表中删除VKActivity

查看以下示例以了解其工作原理

NSArray *items = @[[UIImage imageNamed:@"apple"], @"Check out information about VK SDK" , [NSURL URLWithString:@"https://vk.com/dev/ios_sdk"]]; //1
UIActivityViewController *activityViewController = [[UIActivityViewController alloc]
                                                    initWithActivityItems:items
                                                    applicationActivities:@[[VKActivity new]]]; //2
[activityViewController setValue:@"VK SDK" forKey:@"subject"]; //3
[activityViewController setCompletionHandler:nil]; //4
if (VK_SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0")) {
    UIPopoverPresentationController *popover = activityViewController.popoverPresentationController;
    popover.sourceView = self.view;
    popover.sourceRect = [tableView rectForRowAtIndexPath:indexPath];
} //5
[self presentViewController:activityViewController animated:YES completion:nil]; //6

让我们一步一步地通过这个示例

  1. 准备您的分享信息 - UIImageNSStringNSURL。这种类型的信息可以通过VK进行分享

  2. 使用新的应用程序VKActivity准备UIActivityViewController

  3. activityViewController设置额外的属性

  4. activityViewController设置完成处理程序

  5. 检查您是否正在运行iOS 8或更高版本。如果用户正在使用iPad,您必须在一个浮窗中显示活动控制器,否则您将收到系统错误

  6. 以常规方式显示活动控制器