我正在开发一个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
答案 0 :(得分:3)
嗯,事实证明答案很简单。我只需要添加" wl.offline_access"范围到初始登录操作期间的范围列表。对于这个范围,文档并没有真正暗示这种行为,但是,这对我有用。
添加了这个新范围后,应用程序的后续调用不再提示"同意为应用程序提供这些权限"对话框,我可以直接浏览OneDrive。
(感谢它的到期:Stephane Cavin在微软论坛上给了我一些提示,我需要解决这个问题.Gory的详细信息在这里:
DIZ