3

我一直在使用以下SDK来执行LinkedIn到iOS的集成以及从iDevices共享文章。IOSLinkedInAPI:无法与LinkedIn API共享文章

SDK可以在这里找到:https://github.com/jeyben/IOSLinkedInAPI

在这段代码中,我找不到合适的示例代码,但是,但是我已经写了一些代码,通过它后可以共享。这里是我的代码:

在代码中,我只有一个viewcontroller,其中我只有两个按钮,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提供其他选项。

+0

同样的问题任何解决方案 – mychar

+0

你有没有想过这个? – user3344977

+0

我已经停止了这个项目:( –

回答

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。

+0

不起作用... –

0

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

。如果我有单独的类数据对象,并具有属性名称“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); 
    }]; 
} 

,现在当我们有机会分享任何文本或网址则该方法是: -

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