无法插入片刻 - Google Plus API

时间:2014-06-05 13:27:05

标签: ios api post google-api google-plus

我有一个iOS应用程序,通过OAuth 2.0对Google Plus API进行身份验证。我遇到的问题是,即使我完全按照Google文档操作,我也无法发布。这是我的POST请求:

NSString *gp_moment = [NSString stringWithFormat:@"https://www.googleapis.com/plus/v1/people/me/moments/vault?access_token=%@", token_gplus];
        NSString *urlString = gp_moment;

        NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
        [request setURL:[NSURL URLWithString:urlString]];
        [request setHTTPMethod:@"POST"];

        // Set the header - Content-Type.
        NSDictionary *the_header = @{@"Content-type" : @"application/json",
                                     @"userId" : @"me",
                                     @"collection" : @"vault",
                                     @"requestvisibleactions" : @"http://schemas.google.com/AddActivity"};

        [request setAllHTTPHeaderFields:the_header];

        // Set the metadata for the GP Moment (eg: name). -  request_visible_actions

        NSDictionary *metadata = @{@"target" : @{
                                           @"id" : @"replacewithuniqueidforaddtarget",
                                           @"image" : @"http://www.google.com/s2/static/images/GoogleyEyes.png",
                                           @"type": @"http://schema.org/CreativeWork",
                                           @"description" : @"test_desc",
                                           @"name" : @"TESTNAME",
                                           },
                                   @"type" : @"http://schemas.google.com/AddActivity"};

        // Convert metadata into JSON format and submit.
        NSError *jError = nil;
        NSData *jsonData = [NSJSONSerialization dataWithJSONObject:metadata options:NSJSONWritingPrettyPrinted error:&jError];
        [request setHTTPBody:jsonData];

        NSHTTPURLResponse *response = nil;
        NSError *error = nil;

        NSData *returnedData;
        returnedData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
        NSDictionary *headers = [response allHeaderFields];

        NSLog(@"DATA: %@", [[NSString alloc] initWithData:returnedData encoding:NSASCIIStringEncoding]);
        NSLog(@"%@", headers);
        NSLog(@"%@", response);
        NSLog(@"%@", error);

更新 - 我如何获得OAUTH

我使用Google提供的GTMOAuth2 iOS库获取令牌。它有4个主要类我正在使用:

The GTMOAuth2 Library files

这是我从类到ViewController实现的代码:

-(GTMOAuth2Authentication *)begin_authorization {

// Set the token URL to the token endpoint.
NSURL *tokenURL;

// Set a bogus redirect URI. It won't actually be used as the redirect will
// be intercepted by the OAuth library and handled in the app.
NSString *redirectURI;

GTMOAuth2Authentication *auth;
tokenURL = [NSURL URLWithString:@"https://accounts.google.com/o/oauth2/token"];
redirectURI = @"http://localhost:3000/oauth/callback/";

    auth = [GTMOAuth2Authentication authenticationWithServiceProvider:@"GooglePlus" tokenURL:tokenURL redirectURI:redirectURI clientID:kMyClientID_gplus clientSecret:kMyClientSecret_gplus];
[auth setScope:@"https://www.googleapis.com/auth/plus.login"];

// Set the appropriate token type.
[auth setTokenType:@"Bearer"];

return auth;
}

-(void)authorize:(NSString *)service {
    GTMOAuth2Authentication *auth = [self begin_authorization];

// Prepare the Authorization URL. We will pass in the name of the service
// that we wish to authorize with.
NSURL *authURL;
authURL = [NSURL URLWithString:[NSString stringWithFormat:@"https://accounts.google.com/o/oauth2/auth/"]];

NSString *keyname;
keyname = [NSString stringWithFormat:@"GooglePlus"];

// Display the authentication view
GTMOAuth2ViewControllerTouch *viewController;
viewController = [[GTMOAuth2ViewControllerTouch alloc] initWithAuthentication:auth authorizationURL:authURL keychainItemName:keyname delegate:self finishedSelector:@selector(viewController:finishedWithAuth:error:)];

[viewController setBrowserCookiesURL:[NSURL URLWithString:@"https://accounts.google.com/o/oauth2/auth/"]];

// Push the authentication view to our navigation controller instance
[[self navigationController] pushViewController:viewController animated:YES];
}

-(void)viewController:(GTMOAuth2ViewControllerTouch *)viewController finishedWithAuth:(GTMOAuth2Authentication *)auth error:(NSError *)error {

if (error != nil) {
    // Authentication failed
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Authorization Failed" message:[error localizedDescription] delegate:self cancelButtonTitle:@"Dismiss" otherButtonTitles:nil];
    [alertView show];
}

else {
    // Authentication succeeded
    // Assign the access token to the instance property for later use

    account_check = auth.accessToken;
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:account_check forKey:@"gp_token"];
    [defaults synchronize];
}
}

在GTMOAuth2SignIn.m文件中,我还设置了offline_access和" requestvisisbleactions"像这样的参数:

NSMutableDictionary *paramsDict = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                                 @"code", @"response_type",
                                 clientID, @"client_id",
                                 scope, @"scope", // scope may be nil
                                 @"force", @"approval_prompt",
                                 @"offline", @"access_type",
                                 @"http://schemas.google.com/AddActivity", @"requestvisibleactions",
                                 nil];

更新 - 2

我尝试查看所有Google Plus文档以及查看" requestvisisbleactions"之间的差异。和" request_visisble_actions"仍然没有任何作用。有谁知道出了什么问题?

更新 - 3 - 我仍然遇到的错误

我一直在从Google Plus API中收到此错误。我只是不知道为什么......:

{
"error": {
  "errors": [
   {
    "domain": "global",
    "reason": "unauthorized",
    "message": "Unauthorized"
   }
  ],
  "code": 401,
  "message": "Unauthorized"
 }
}

1 个答案:

答案 0 :(得分:4)

我相信您需要使用request_visible_actions。因此您的参数可能设置为

NSMutableDictionary *paramsDict = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                                   @"code", @"response_type",
                                   clientID, @"client_id",
                                   scope, @"scope", // scope may be nil
                                   @"force", @"approval_prompt",
                                   @"offline", @"access_type",
                                   @"http://schemas.google.com/AddActivity", @"request_visible_actions",
                                   nil];