2009-09-16 25 views
13

tôi đang làm việc trên một ứng dụng iPhoneỨng dụng iPhone: Cách nhận giá trị mặc định từ root.plist?

Tôi đọc một chìa khóa từ root.plist như thế này:

NSString *Key1Var = [[NSUserDefaults standardUserDefaults] stringForKey:@"Key1"]; 

("Key1" là một PSMultiValueSpecifier mà một giá trị chuỗi mặc định đã được thiết lập đã có trong thư mục gốc .plist)

Điều đó hoạt động tốt, khi người dùng thực hiện cài đặt. Nhưng nếu người dùng chạy ứng dụng trước khi thực hiện bất kỳ cài đặt nào, anh ta sẽ nhận được nil cho "Key1". Trong trường hợp này, tôi đã mong đợi giá trị mặc định mà tôi đã đặt cho "Key1". những gì tôi cần làm, để người dùng không phải thực hiện cài đặt, để chạy ứng dụng lần đầu tiên?

Kính trọng, Harish

+0

thể trùng lặp của [Bạn có thể làm cho các thiết lập trong Cài đặt .bundle mặc định ngay cả khi bạn không mở Ứng dụng Cài đặt] (http://stackoverflow.com/questions/510216/can-you-make-the-settings-in-settings-bundle-default-even-if-you -dont-open-the) –

+0

Bởi 'có thể', tôi có nghĩa là 'chính xác'. –

Trả lời

13

Xem this question cho một giải pháp hoàn chỉnh.

Bạn chủ yếu muốn chạy mã này trước khi truy cập các thiết lập:

- (void)registerDefaultsFromSettingsBundle { 
    NSString *settingsBundle = [[NSBundle mainBundle] pathForResource:@"Settings" ofType:@"bundle"]; 
    if(!settingsBundle) { 
     NSLog(@"Could not find Settings.bundle"); 
     return; 
    } 

    NSDictionary *settings = [NSDictionary dictionaryWithContentsOfFile:[settingsBundle stringByAppendingPathComponent:@"Root.plist"]]; 
    NSArray *preferences = [settings objectForKey:@"PreferenceSpecifiers"]; 

    NSMutableDictionary *defaultsToRegister = [[NSMutableDictionary alloc] initWithCapacity:[preferences count]]; 
    for(NSDictionary *prefSpecification in preferences) { 
     NSString *key = [prefSpecification objectForKey:@"Key"]; 
     if(key) { 
      [defaultsToRegister setObject:[prefSpecification objectForKey:@"DefaultValue"] forKey:key]; 
     } 
    } 

    [[NSUserDefaults standardUserDefaults] registerDefaults:defaultsToRegister]; 
    [defaultsToRegister release]; 
} 

này sẽ được tải các giá trị mặc định vào đối tượng standardUserDefaults do đó bạn sẽ không còn nhận được trở lại con số không giá trị, và bạn không cần phải sao chép các cài đặt mặc định trong mã của bạn.

+0

Tôi đã gặp vấn đề tương tự và điều này làm việc cho tôi. Cảm ơn nhiều. – MaryamAyd

+0

Thật không may mã này không hoạt động trong Swift 2.2 trên Xcode 7.3, tôi nhận được lỗi về 'stringByAppendingPathComponent' không khả dụng. – Dai

3

Tôi làm điều này sớm sau khi ra mắt, trước khi tôi cố gắng để có được các thiết lập của tôi:

userDefaultsValuesPath=[[NSBundle mainBundle] pathForResource:@"UserDefaults" 
                  ofType:@"plist"]; 
    userDefaultsValuesDict=[NSDictionary dictionaryWithContentsOfFile:userDefaultsValuesPath]; 

    // set them in the standard user defaults 
    [[NSUserDefaults standardUserDefaults] registerDefaults:userDefaultsValuesDict]; 

    if (![[NSUserDefaults standardUserDefaults] synchronize]) 
     NSLog(@"not successful in writing the default prefs"); 
+0

Nhưng nếu đường dẫn của bạn là "root.plist" mặc định trong settings.bundle thì sao? – jowie

+0

Joe: Sau đó, bạn nhận được một tham chiếu đến gói đó và gửi nó '-pathForResource:'. Nếu bạn không thể làm điều đó vì bất kỳ lý do gì, bạn chỉ có thể sao chép plist vào tài nguyên của gói ứng dụng của bạn cũng như vào gói cài đặt. –

0

Trong đại biểu ứng dụng của tôi, tôi ghi đè lên các phương pháp +initialize và đăng ký ưu tiên ứng dụng mặc định mới .

Ví dụ:

+ (void) initialize { 
    if ([self class] == [MyAppDelegate class]) {   
     // initialize user defaults dictionary 
     BOOL isFirstTimeRun = YES; 
     BOOL isKeychainTurnedOn = NO; 
     BOOL isSSLTurnedOn = YES; 
     NSString *testURLString = @"http://stackoverflow.com"; 
     NSMutableDictionary *resourceDict = [NSMutableDictionary dictionary]; 
     [resourceDict setObject:[NSNumber numberWithBool:isFirstTimeRun] forKey:kIsFirstTimeRunKey]; 
     [resourceDict setObject:[NSNumber numberWithBool:isKeychainTurnedOn] forKey:kIsKeychainTurnedOnKey]; 
     [resourceDict setObject:[NSNumber numberWithBool:isSSLTurnedOn] forKey:kIsSSLTurnedOnKey]; 
     [resourceDict setObject:testURLString forKey:kTestURLString]; 
     [[NSUserDefaults standardUserDefaults] registerDefaults:resourceDict]; 
    } 
} 
+1

nếu bạn có tài nguyên settings.bundle và root.plist thực tế thì sao? – jowie

+1

@ jowie đáng buồn là điều này là cần thiết ngay cả khi bạn có một Settings.bundle và Root.plist. "Giá trị mặc định" được chỉ định sẽ bị bỏ qua cho đến khi người dùng mở ngăn Cài đặt của bạn. Sau khi cài đặt ứng dụng mới của bạn, trước khi mở cửa sổ cài đặt, tất cả các phím sẽ trở về 0 trừ khi bạn gọi 'registerDefaults' theo cách thủ công. – gmcnaughton

0
NSBundle* mainBundle = [NSBundle mainBundle];  

// Reads the value of the custom key I added to the Info.plist 
NSString *value = [mainBundle objectForInfoDictionaryKey:@"key"]; 

//Log the value 
NSLog(@"Value = %@", value); 

// Get the value for the "Bundle version" from the Info.plist 
[mainBundle objectForInfoDictionaryKey:@"CFBundleVersion"]; 

// Get the bundle identifier 
[mainBundle bundleIdentifier]; 
+1

Tại sao điều này lại bị bỏ phiếu? – rckehoe

3

Đây là mã tôi sử dụng trong iOS 7, dựa rất nhiều vào mã của Mike Weller ở trên.

Đặt phương pháp này trong AppDelegate.m của bạn:

- (void)registerDefaultsFromSettingsBundleWithPlist:(NSString *)plist { 
NSString *settingsBundle = [[NSBundle mainBundle] pathForResource:@"Settings" ofType:@"bundle"]; 
if(!settingsBundle) { 
    NSLog(@"Could not find Settings.bundle"); 
    return; 
} 
NSString *bundle = [NSString stringWithFormat:@"%@.plist",plist]; 
NSDictionary *settings = [NSDictionary dictionaryWithContentsOfFile:[settingsBundle stringByAppendingPathComponent:bundle]]; 
NSArray *preferences = [settings objectForKey:@"PreferenceSpecifiers"]; 

NSMutableDictionary *defaultsToRegister = [[NSMutableDictionary alloc] initWithCapacity:[preferences count]]; 
for(NSDictionary *prefSpecification in preferences) { 
    NSString *key = [prefSpecification objectForKey:@"Key"]; 
    if(key) { 
     [defaultsToRegister setObject:[prefSpecification objectForKey:@"DefaultValue"] forKey:key]; 
    } 
} 

[[NSUserDefaults standardUserDefaults] registerDefaults:defaultsToRegister]; 
//[defaultsToRegister release]; 
} 

Và sau đó gọi nó cho mỗi cài đặt tập tin bạn đang sử dụng (đối với các thiết lập lồng nhau), từ một số nơi đầu trong mã của bạn như didFinishLaunchingWithOptions:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
//register default settings into NSUserDefaults 
    @try { 
     [self registerDefaultsFromSettingsBundleWithPlist:@"Root"]; 
     [self registerDefaultsFromSettingsBundleWithPlist:@"Chat"]; 
     [self registerDefaultsFromSettingsBundleWithPlist:@"IVR"]; 
     [self registerDefaultsFromSettingsBundleWithPlist:@"Video"]; 
    } 
    @catch (NSException * e) { 
     NSLog(@"Exception: %@", e); 
     NSLog(@"Try adding the Default Value field to each preference item in the Settings.bundle plist files."); 
    } 
    @finally { 

    } 
    ... 
2

Tôi đã dịch giải pháp của Mike Weller vào Swift 2.0/iOS 9 và làm cho nó làm việc cho App của tôi: 3 phiên bản

func registerDefaultsFromSettingsBundle() { 
    guard let settingsBundle = NSBundle.mainBundle().URLForResource("Settings", withExtension:"bundle") else { 
     NSLog("Could not find Settings.bundle") 
     return; 
    } 

    guard let settings = NSDictionary(contentsOfURL: settingsBundle.URLByAppendingPathComponent("Root.plist")) else { 
     NSLog("Could not find Root.plist in settings bundle") 
     return 
    } 

    guard let preferences = settings.objectForKey("PreferenceSpecifiers") as? [[String: AnyObject]] else { 
     NSLog("Root.plist has invalid format") 
     return 
    } 

    var defaultsToRegister = [String: AnyObject]() 
    for var p in preferences { 
     if let k = p["Key"] as? String, v = p["DefaultValue"] { 
      NSLog("%@", "registering \(v) for key \(k)") 
      defaultsToRegister[k] = v 
     } 
    } 

    NSUserDefaults.standardUserDefaults().registerDefaults(defaultsToRegister) 
} 
1

Một Swift dựa trên Mike Weller's giải pháp ban đầu nếu có ai cần nó:

static func registerDefaultsFromSettingsBundle() { 

    guard let settingsBundle = Bundle.main.url(forResource: "Settings", withExtension: "bundle") else { 
     print("Could not find Settings.bundle") 
     return 
    } 
    guard let settings = NSDictionary(contentsOf: settingsBundle.appendingPathComponent("Root.plist")) else { 
     print("Couldn't find Root.plist in settings bundle") 
     return 
    } 

    guard let preferences = settings.object(forKey: "PreferenceSpecifiers") as? [[String: AnyObject]] else { 
     print("Root.plist has an invalid format") 
     return 
    } 

    var defaultsToRegister = [String: AnyObject]() 
    for var p in preferences { 
     if let k = p["Key"] as? String, let v = p["DefaultValue"] { 
      print("Registering " + v.debugDescription + " for key " + k) 
      defaultsToRegister[k] = v as AnyObject 
     } 
    } 

    UserDefaults.standard.register(defaults: defaultsToRegister) 
} 
Các vấn đề liên quan