Question

I am trying to integrate SkyDrive in my iOS application and the following is the code where I have written the login authentication code. The client ID provided here is the one assigned for the application at the developer site. But the authentication always fails. Any idea what is the error ?

static NSString * const CLIENT_ID = @"00000000XXXXXXXXX";

@implementation PSMainViewController
@synthesize appLogo;
@synthesize userInfoLabel;
@synthesize signInButton;
@synthesize viewPhotosButton;
@synthesize userImage;
@synthesize liveClient;
@synthesize currentModal;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{

    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
        _scopes = [NSArray arrayWithObjects:
                   @"wl.signin",
                   @"wl.basic",
                   @"wl.skydrive",
                   @"wl.offline_access", nil];
        liveClient = [[LiveConnectClient alloc] initWithClientId:CLIENT_ID
                                                          scopes:_scopes
                                                        delegate:self];
    }
    return self;
}

- (void)didReceiveMemoryWarning
{
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}

#pragma mark - View lifecycle

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

    self.appLogo.image = [UIImage imageNamed:@"skydrive.jpeg"];
    [self updateUI];
}

- (void)viewDidUnload
{
    [self setAppLogo:nil];
    [self setUserInfoLabel:nil];
    [self setUserImage:nil];
    [self setSignInButton:nil];
    [self setViewPhotosButton:nil];
    [super viewDidUnload];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

- (IBAction)signinButtonClicked:(id)sender {
    if (self.liveClient.session == nil)
    {
        [self.liveClient login:self
                        scopes:_scopes
                      delegate:self];
    }
    else
    {
        [self.liveClient logoutWithDelegate:self
                                  userState:@"logout"];
    }
}

- (IBAction)viewPhotoButtonClicked:(id)sender {

    // Create a Navigation controller
    PSSkyPhotoViewer *aPhotoViewer = [[PSSkyPhotoViewer alloc] initWithNibName:@"PSSkyPhotoViewer" bundle:nil];
    aPhotoViewer.parentVC = self;

    self.currentModal = [[UINavigationController alloc] initWithRootViewController:aPhotoViewer];
    [self presentModalViewController:self.currentModal animated:YES];
}

- (void) modalCompleted:(id)sender
{
    [self dismissModalViewControllerAnimated:YES];
    self.currentModal = nil;
}


#pragma mark LiveAuthDelegate

- (void) updateUI {
    LiveConnectSession *session = self.liveClient.session;
    if (session == nil) {
        [self.signInButton setTitle:@"Sign in" forState:UIControlStateNormal];
        self.viewPhotosButton.hidden = YES;
        self.userInfoLabel.text = @"Sign in with a Microsoft account before you can view your SkyDrive photos.";
        self.userImage.image = nil;
    }
    else {
        [self.signInButton setTitle:@"Sign out" forState:UIControlStateNormal];
        self.viewPhotosButton.hidden = NO;
        self.userInfoLabel.text = @"";

        [self.liveClient getWithPath:@"me" delegate:self userState:@"me"];
        [self.liveClient getWithPath:@"me/picture" delegate:self userState:@"me-picture"];
    }
}

- (void) authCompleted: (LiveConnectSessionStatus) status
               session: (LiveConnectSession *) session
             userState: (id) userState {
    [self updateUI];
}

- (void) authFailed: (NSError *) error
          userState: (id)userState {
    // Handle error here
}

#pragma mark LiveOperationDelegate

- (void) liveOperationSucceeded:(LiveOperation *)operation {
    if ([operation.userState isEqual:@"me"]) {
        NSDictionary *result = operation.result;
        id name = [result objectForKey:@"name"];

        self.userInfoLabel.text = (name != nil)? name : @"";
    }

    if ([operation.userState isEqual:@"me-picture"]) {
        NSString *location = [operation.result objectForKey:@"location"];
        if (location) {
            NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:location]];
            self.userImage.image = [UIImage imageWithData:data];
        }
    }
}

- (void) liveOperationFailed:(NSError *)error operation:(LiveOperation *)operation
{
    // Handle error here.
}
@end
Was it helpful?

Solution

May be you are not providing the redirect url in case of a desktop application.But if it's the mobile application the you have to check the "Mobile or Desktop client app: " as yes in the api settings

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top