iOS OneDrive(skydrive)应用程序每次运行时都会显示权限对话框

我正在开发一个iOS应用程序,让用户访问他们的OneDrive / SkyDrive,我遇到了一个非常恼人的问题:

用户第一次将应用程序链接到他们的OneDrive,一切都按预期进行:

  1. 他们必须input用户名和密码
  2. 然后他们必须同意让应用访问他们的信息
  3. 然后他们开始浏览他们的OneDrive

这很好。

但是,如果应用程序closures,并且您尝试再次访问OneDrive,而不是直接跳到#3,并且能够访问OneDrive,则会在步骤#2停止(按预期跳过步骤1),并且必须再次同意让应用访问他们的信息。

该代码直接从在线文档中的iOS示例中获取(根据堆栈溢出在此处find的示例稍作修改),但这里是用于检查的:

- (void) onedriveInitWithDelegate:(id)theDelegate { self.onedriveClient = [[LiveConnectClient alloc] initWithClientId:MY_CLIENT_ID delegate:theDelegate userState:@"initialize"]; } 

然后,Delegate实现这个:

 - (void)authCompleted:(LiveConnectSessionStatus) status session:(LiveConnectSession *) session userState:(id) userState { NSLog(@"Status: %u", status); if ([userState isEqual:@"initialize"]) { NSLog( @"authCompleted - Initialized."); if (session == nil) { [self.onedriveClient login:self scopes:[NSArray arrayWithObjects:@"wl.basic", @"wl.signin", @"wl.skydrive_update", nil] delegate:self userState:@"signin"]; } } if ([userState isEqual:@"signin"]) { if (session != nil) { NSLog( @"authCompleted - Signed in."); } } } 

我认为,也许状态值可能会给出一个线索,也许我可以避免login调用,但是当我调用initWithClientId后authCompleted时总是为零/未定义。 (会话总是零)。

是否有我失踪的范围? 有没有不同的电话,而不是一个直接的login电话? 还是比这更复杂? 我已经看到了与OAuth2login有关的“刷新令牌”的引用,但是我一直没有find在这种情况下如何使用它们的具体例子。

任何帮助和/或见解非常感谢。

DIZ

那么,事实certificate,答案很简单。 我只需要在初始login操作期间将“wl.offline_access”作用域添加到作用域列表中。 这个文档并没有真正暗示这种范围的行为,但是,这对我来说是个诀窍。

随着这个新的范围添加,应用程序的后续调用不再提出“同意给应用程序这些权限”对话框,我可以直接浏览OneDrive。

(信贷到期:Stephane Cavin在微软论坛上给了我这个工作所需要的提示。Gory的细节在这里:

http://social.msdn.microsoft.com/Forums/en-US/8c5c7a99-7e49-401d-8616-d568eea3cef1/ios-onedrive-skydrive-app-displays-permissions-dialog-every-time-it-runs?论坛= onedriveapi )

DIZ