我正在开发一个iOS应用程序,该应用程序使用户可以访问他们的OneDrive / SkyDrive,但遇到了一个非常烦人的问题:
用户第一次将应用程序链接到其OneDrive时,一切都会按预期进行:
很好
但是,如果应用程序关闭,并且您尝试再次访问OneDrive,而不是直接跳到#3并能够访问OneDrive,则它们将在步骤2停止(按预期,跳过了步骤1),并且它们必须再次同意才能让该应用访问其信息。
该代码直接取自在线文档中的iOS示例(基于在Stack Overflow上找到的示例进行了一些细微修改),但是,这里需要进行检查:
- (void) onedriveInitWithDelegate:(id)theDelegate {
self.onedriveClient = [[LiveConnectClient alloc] initWithClientId:MY_CLIENT_ID
delegate:theDelegate
userState:@"initialize"];
}
然后,theDelegate实现:
- (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.");
}
}
}
我以为状态值可能会提供一个线索,也许我可以避免登录调用,但是当我在调用initWithClientId之后进入authCompleted时,它始终为零/未定义。 (会话始终为零。)
我是否缺少范围? 是否有其他电话而不是直接登录电话? 还是比这更复杂? 我已经看到了与OAuth2登录相关的“刷新令牌”的参考,但是我无法找到任何有关在这种情况下如何使用它们的具体示例。
非常感谢任何帮助和/或见解。
DIZ
好吧,事实证明,答案很简单。 我只需要在初始登录操作期间将“ wl.offline_access”范围添加到我的范围列表中。 在这个范围内,文档并没有真正暗示这种类型的行为,但是,这确实帮了我大忙。
添加了此新作用域之后,对应用程序的后续调用将不再显示“同意授予应用程序这些权限”对话框,而我可以直接浏览OneDrive。
(信用证到期日:在Microsoft论坛上的Stephane Cavin给了我解决该问题的提示。详细信息在这里:
DIZ