錯誤代碼
if ([defaults objectForKey:@"username"] != nil) {
// 這裡意圖:沒有用戶名才顯示登入頁
LoginViewController *login = ...;
[self presentViewController:login ...];
} else {
NSString *saved = [defaults stringForKey:@"username"];
NSLog(@"Username found: %@", saved); // 輸出 Username found: (null)
}
問題
objectForKey: 回傳 nil 表示鍵不存在
- 但
stringForKey: 鍵不存在也回傳 nil,NSLog 印出 (null)
- 邏輯判斷 寫反了:有值時應進入 else 顯示主頁,無值時進入 if 顯示登入
修正
if ([defaults objectForKey:@"username"] == nil) {
// 無用戶名 → 顯示登入
LoginViewController *login = ...;
[self presentViewController:login animated:YES completion:nil];
} else {
// 有用戶名 → 正常流程
NSString *saved = [defaults stringForKey:@"username"];
NSLog(@"Username found: %@", saved);
}
最佳實踐
// 封裝工具方法
- (BOOL)isLoggedIn {
return [defaults objectForKey:@"username"] != nil;
}
- (NSString *)currentUsername {
return [defaults stringForKey:@"username"];
}
補充
NSUserDefaults 現在建議用 UserDefaults.standard (Swift) 或 [NSUserDefaults standardUserDefaults]
- 敏感資料(Token、密碼)請用
Keychain 儲存