我认为我的问题并不难解决。我一定错过了什么。我允许我的用户使用Facebook登录,因此在应用程序设置中,我可以选择使用开/关切换从Facebook注销。 Root.plist
Settings.bundle
中的<dict>
<key>PreferenceSpecifiers</key>
<array>
<dict>
<key>Title</key>
<string></string>
<key>Type</key>
<string>PSGroupSpecifier</string>
</dict>
<dict>
<key>DefaultValue</key>
<false/>
<key>Key</key>
<string>facebookLogoutTriggered</string>
<key>Title</key>
<string>Logout Facebook</string>
<key>Type</key>
<string>PSToggleSwitchSpecifier</string>
</dict>
</array>
<key>StringsTable</key>
<string>Root</string>
</dict>
如下所示:
NSUserDefault
所以基本上我所追求的功能是,如果用户将开关切换到ON,他应该从Facebook注销。在他退出后,开关应切换回OFF。所以我希望OFF成为开关的默认值。
由于布尔值默认为NO(OFF)我认为我不需要使用registerDefaults:
的{{1}}
所以我检查applicationWillEnterForeground:
是否用户通过选中此选项将应用设置中的开关设置为开启:
// Check if the user wants to logout from Facebook
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
BOOL facebookLogoutTriggered = [defaults boolForKey:@"facebookLogoutTriggered"];
// Set "Logout Facebook" setting to OFF (NO)
[defaults setBool:NO forKey:@"facebookLogoutTriggered"];
[defaults synchronize];
但由于某种原因,这段代码似乎不起作用。它大部分时间都有效(检查后关闭开关)。但有时候,在登录Facebook之后,由于某种原因,它会将开关设置为开启。登录Facebook后运行的代码如下:
#pragma mark - FBSessionDelegate Methods
- (void)fbDidLogin {
DLog(@"User logged in to Facebook.");
AppDelegate *appDelegate = (AppDelegate *) [[UIApplication sharedApplication] delegate];
// Save accesstoken and expirationdate
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:[appDelegate.facebook accessToken] forKey:@"FBAccessTokenKey"];
[defaults setObject:[appDelegate.facebook expirationDate] forKey:@"FBExpirationDateKey"];
[defaults synchronize];
DLog(@"defaults %@", [defaults objectForKey:@"facebookLogoutTriggered"]);
}
现在试图解决这个问题6个小时,但实际上还没有进一步。
答案 0 :(得分:2)
出于某种原因,似乎在用户设置了应用程序设置后我必须执行[[NSUserDefaults standardUserDefaults] synchronize];
。我认为您必须在将值保存到-synchronize
后直接致电NSUserDefaults
,但显然您必须在检索NSUserDefaults
之后直接调用它,如果用户设置了应用程序设置中的首选项(Settings.bundle)。
所以不要这样做:
// Check if the user wants to logout from Facebook
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
BOOL facebookLogoutTriggered = [defaults boolForKey:@"facebookLogoutTriggered"];
// Set "Logout Facebook" setting to OFF (NO)
[defaults setBool:NO forKey:@"facebookLogoutTriggered"];
[defaults synchronize];
我现在这样做:
// Check if the user wants to logout from Facebook
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
// Make SURE we get the updated data from the Application Settings
[defaults synchronize];
BOOL facebookLogoutTriggered = [defaults boolForKey:@"facebookLogoutTriggered"];
// Set "Logout Facebook" setting to OFF (NO)
[defaults setBool:NO forKey:@"facebookLogoutTriggered"];
[defaults synchronize];