【问题标题】:IOSLinkedInAPI: Can't share post with the LinkedIn APIIOSLinkedInAPI:无法与 LinkedIn API 共享帖子
【发布时间】:2014-07-08 14:48:52
【问题描述】:

我一直在使用以下 SDK 将 LinkedIn 集成到 iOS 并从 iDevices 分享帖子。

SDK 可在此处获得:https://github.com/jeyben/IOSLinkedInAPI

在此代码中,我找不到合适的示例代码,但是我编写了一些代码,可以通过这些代码共享帖子。这是我的代码:

在代码中,我只有一个视图控制器,其中我只使用了两个按钮,1) Linked In Account [此按钮用于显示登录控制器并让用户成功登录到帐户] 2) 共享 [允许用户在请求失败的情况下代表登录用户共享内容]

ViewController.h

#import <UIKit/UIKit.h>
#import "LIALinkedInApplication.h"
#import "LIALinkedInHttpClient.h"

@interface ViewController : UIViewController

@property (nonatomic, strong) LIALinkedInHttpClient *client;

- (IBAction) linkedInClicked:(id)sender;
- (void)requestMeWithToken:(NSString *)accessToken;

@end

ViewController.m

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    LIALinkedInApplication *application = [LIALinkedInApplication applicationWithRedirectURL:@"http://www.google.com" clientId:@"w57zqiw6cv73" clientSecret:@"Pj5MVxtkpbefau1v" state:@"something" grantedAccess:@[@"r_fullprofile", @"r_network", @"rw_nus"]];
    self.client = [LIALinkedInHttpClient clientForApplication:application presentingViewController:nil];

}

- (IBAction) linkedInClicked:(id)sender { // Login into the account
    [self.client getAuthorizationCode:^(NSString *code) {
        [self.client getAccessToken:code success:^(NSDictionary *accessTokenData) {
            NSString *accessToken = [accessTokenData objectForKey:@"access_token"];
            [self requestMeWithToken:accessToken];
        }                   failure:^(NSError *error) {
            NSLog(@"Quering accessToken failed %@", error);
        }];
    }                      cancel:^{
        NSLog(@"Authorization was cancelled by user");
    }                     failure:^(NSError *error) {
        NSLog(@"Authorization failed %@", error);
    }];
}

- (IBAction) postMessage :(id)sender { // Post via logged in account, so, first go login and then share content
    NSString *strURL = @"https://api.linkedin.com/v1/people/~/shares";

    NSMutableDictionary *contents=[[NSMutableDictionary alloc] init];
    [contents setValue:@"description goes here" forKey:@"description"];
    [contents setValue:@"www.google.com" forKey:@"submitted-url"];
    [contents setValue:@"title goes here" forKey:@"title"];

    NSMutableDictionary *visible=[[NSMutableDictionary alloc] init];
    [visible setValue:@"anyone" forKey:@"code"];

    NSMutableDictionary *updatedic=[[NSMutableDictionary alloc] init];

    [updatedic setObject:visible forKey:@"visibility"];
    [updatedic setObject:contents forKey:@"content"];
    [updatedic setValue:@"Check out the LinkedIn Share API!" forKey:@"comment"];
    //[updatedic setValue:@"json" forKey: @"x-li-format"];

    [self.client POST:strURL parameters:updatedic success:^(AFHTTPRequestOperation *operation, NSDictionary *dict) {
        NSLog(@"Successfully posted", nil);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"Failed post", nil);
    }];
}

- (void)requestMeWithToken:(NSString *)accessToken {
    [self.client GET:[NSString stringWithFormat:@"https://api.linkedin.com/v1/people/~?oauth2_access_token=%@&format=json", accessToken] parameters:nil success:^(AFHTTPRequestOperation *operation, NSDictionary *result) {
        NSLog(@"current user %@", result);
    }        failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"failed to fetch current user %@", error);
    }];
}

要使这个应用程序正常工作,请从上述 SDK 下载内容并将每个需要的文件添加到项目中。

当我尝试登录应用程序时,我收到成功消息,但之后当我尝试按照上述代码分享任何帖子时,我会失败并查看控制台是什么:

Printing description of error:
Error Domain=AFNetworkingErrorDomain Code=-1011 "Request failed: unauthorized (401)" UserInfo=0x8a6d500 {NSErrorFailingURLKey=https://api.linkedin.com/v1/people/~/shares, NSLocalizedDescription=Request failed: unauthorized (401), NSUnderlyingError=0x8ab1bd0 "Request failed: unacceptable content-type: text/xml", AFNetworkingOperationFailingURLResponseErrorKey=<NSHTTPURLResponse: 0x8a1f5f0> { URL: https://api.linkedin.com/v1/people/~/shares } { status code: 401, headers {
    Connection = "keep-alive";
    "Content-Encoding" = gzip;
    "Content-Type" = "text/xml;charset=UTF-8";
    Date = "Tue, 20 May 2014 09:38:01 GMT";
    Server = "Apache-Coyote/1.1";
    "Transfer-Encoding" = Identity;
    Vary = "*";
    "Www-Authenticate" = "OAuth realm=\"https://api.linkedin.com\"";
    "X-LI-UUID" = "wUQ+CTiK5WDItDrWLbZJFQ==";
    "X-Li-Fabric" = "PROD-ELA4";
    "X-Li-Pop" = "PROD-ELA4";
    "x-li-format" = xml;
    "x-li-request-id" = 30K08X3IL7;
} }}

我尝试在 AFNetworking、LinkedIn 授权、未经授权的访问等方面进行了很多搜索,但找不到任何相关内容。如果你们中的任何人对此有所了解或建议我为 LinkedIn iPhone SDK 提供任何其他选项,请告诉我。

【问题讨论】:

  • 同样的问题任何解决方案
  • 你有想过这个吗?
  • 我已经停止了这个项目 :(

标签: ios7 afnetworking linkedin social-networking http-status-code-401


【解决方案1】:

首先,存储通过IOSLinkdinAPI登录时的访问令牌。

例如。如果我有单例类 DataObjects 并且属性名称为“accessTokesForLinkedIn”,那么此方法的更改将是

- (IBAction) linkedInClicked:(id)sender { // Login into the account
    [self.client getAuthorizationCode:^(NSString *code) {
        [self.client getAccessToken:code success:^(NSDictionary *accessTokenData) {
            NSString *accessToken = [accessTokenData objectForKey:@"access_token"];
            [[DataObjects sharedDataObjects] setAccessTokenForLinkedIn:accessToken];
            [self requestMeWithToken:accessToken];
        }                   failure:^(NSError *error) {
            NSLog(@"Quering accessToken failed %@", error);
        }];
    }                      cancel:^{
        NSLog(@"Authorization was cancelled by user");
    }                     failure:^(NSError *error) {
        NSLog(@"Authorization failed %@", error);
    }];
}

现在,当我们必须分享任何文本或 URL 时,方法是:-

-(void)sharetoLinkedIn:(NSString *)title desc:(NSString *)description path:(NSString *)submitted_url imagePath:(NSString *)submitted_image_url postString:(NSString *)comment
{
    NSString *stringRequest = [NSString stringWithFormat:@"https://api.linkedin.com/v1/people/~/shares?oauth2_access_token=%@&format=json",[[DataObjects sharedDataObjects] accessTokenForLinkedIn]] ;

    NSDictionary *param = @{
                            @"content":@{
                                    @"title":title,
                                    @"description":description,
                                    @"submitted-url":submitted_url,
                                    @"submitted-image-url":submitted_image_url
                                    },
                            @"comment": comment,
                            @"visibility": @{
                                    @"code": @"anyone"
                                    }
                            };


    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:stringRequest]];
    [request setHTTPBody:[NSJSONSerialization dataWithJSONObject:param options:0 error:nil]];
    [request setHTTPMethod:@"POST"];
    [request setAllHTTPHeaderFields:@{@"Content-Type":@"application/json",
                                      @"x-li-format":@"json"

                                      }];

    AFHTTPRequestOperation *op = [manager HTTPRequestOperationWithRequest:request success:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSLog(@"result: %@", responseObject);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        if ([operation.responseString class] == [NSDictionary class]) {
                //[Utility showAlert:@"LinkedIn" mess:[(NSDictionary *)operation.responseString objectForKey:@"message"]];

            NSLog(@"error: %@", [(NSDictionary *)operation.responseString objectForKey:@"message"]);
        }
        NSLog(@"error: %@", error);
    }];

    [[NSOperationQueue mainQueue] addOperation:op];
}

【讨论】:

    【解决方案2】:

    您需要将请求序列化器更改为AFJSONRequestSerializer,并以驼峰式替换字典上的键。这是我分享帖子的代码:

    NSString *stringRequest = @"https://api.linkedin.com/v1/people/~/shares?oauth2_access_token=ACCESS_TOKEN&format=json";
    
    //Request parameter on a dictionary (keys in camel case)
    NSDictionary *update = [[NSDictionary alloc] initWithObjectsAndKeys:
    
                        [[NSDictionary alloc] initWithObjectsAndKeys: @"anyone",@"code",nil],  @"visibility",
                        @"comment to share", @"comment",
                        [[NSDictionary alloc] initWithObjectsAndKeys:@"description share", @"description",
                                                                     @"link_url", @"submittedUrl",
                                                                     @"title share",@"title",
                                                                     @"image_url",@"submittedImageUrl",nil],
                        @"content",nil];
    
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    AFJSONRequestSerializer *requestSerializer = [AFJSONRequestSerializer serializer];
    [requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    [requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];
    manager.requestSerializer = requestSerializer;
    
    [manager POST:stringRequest parameters:update success:^(AFHTTPRequestOperation *operation, id     responseObject) {
    NSLog(@"result: %@", responseObject);
    completionBlock(YES, responseObject, nil);
    
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    
        DDLogError([error localizedDescription]);
        completionBlock(NO, nil, error);
    }];
    

    重要提示:根据Linkedin API,字典的键是驼峰式的。

    【讨论】:

      【解决方案3】:

      https://github.com/pmilanez/MIS-Linkedin-Share

      使用这个库在linkedIn上分享,非常简单。

      【讨论】:

      • 但是这段代码使用的是旧的 oauth。你能知道使用 afnetworking 吗
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-01
      • 2021-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-13
      • 1970-01-01
      相关资源
      最近更新 更多