2013-10-05 60 views

回答

3

我也想用Phonegap 3/iOS7這個插件,所以我更新了它。您可以下載我的Phonegap 3測試項目,其中包含更新後的插件from here

下面的代碼:

applicationPreferences.js

cordova.define("applicationPreferences", function(require, exports, module) { 
    var exec = require('cordova/exec'); 

    var ApplicationPreferences = function() {}; 


    ApplicationPreferences.prototype.get = function(key, successFn, errorFn) { 
     exec(successFn, errorFn, 'applicationPreferences', 'getSetting', [key]); 
    } 

     ApplicationPreferences.prototype.set = function(key,value, successFn, errorFn) { 
      exec(successFn, errorFn, 'applicationPreferences', 'setSetting', [key,value]); 
     } 

    var applicationPreferences = new ApplicationPreferences(); 
    module.exports = applicationPreferences; 
}); 

applicationPreferences.h

#import <Foundation/Foundation.h> 

#import <Cordova/CDVPlugin.h> 

@interface applicationPreferences : CDVPlugin 
{ 

} 

- (void) getSetting:(CDVInvokedUrlCommand*)command; 
- (void) setSetting:(CDVInvokedUrlCommand*)command; 
- (NSString*) getSettingFromBundle:(NSString*)settingName; 


@end 

applicationPreferences.m

#import "applicationPreferences.h" 


@implementation applicationPreferences 



- (void)getSetting:(CDVInvokedUrlCommand*)command; 
{ 
    NSString* jsString; 


     NSString *settingsName = [command.arguments objectAtIndex:0]; 
     CDVPluginResult* result = nil; 

     @try 
     { 
      //At the moment we only return strings 
      //bool: true = 1, false=0 
      NSString *returnVar = [[NSUserDefaults standardUserDefaults] stringForKey:settingsName]; 
      if(returnVar == nil) 
      { 
       returnVar = [self getSettingFromBundle:settingsName]; //Parsing Root.plist 

       if (returnVar == nil) 
        @throw [NSException exceptionWithName:nil reason:@"Key not found" userInfo:nil];; 
      } 
      result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:returnVar]; 
      jsString = [result toSuccessCallbackString:command.callbackId]; 
     } 
     @catch (NSException * e) 
     { 
      result = [CDVPluginResult resultWithStatus:CDVCommandStatus_NO_RESULT messageAsString:[e reason]]; 
      jsString = [result toErrorCallbackString:command.callbackId]; 
     } 
     @finally 
     { 
      [self writeJavascript:jsString]; //Write back to JS 
     } 
} 

- (void)setSetting:(CDVInvokedUrlCommand*)command; 
{ 
    NSString* jsString; 
    CDVPluginResult* result; 

    NSString *settingsName = [command.arguments objectAtIndex:0]; 
    NSString *settingsValue = [command.arguments objectAtIndex:1]; 


    @try 
    { 
     [[NSUserDefaults standardUserDefaults] setValue:settingsValue forKey:settingsName]; 
     result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK]; 
     jsString = [result toSuccessCallbackString:command.callbackId]; 

    } 
    @catch (NSException * e) 
    { 
     result = [CDVPluginResult resultWithStatus:CDVCommandStatus_NO_RESULT messageAsString:[e reason]]; 
     jsString = [result toErrorCallbackString:command.callbackId]; 
    } 
    @finally 
    { 
     [self writeJavascript:jsString]; //Write back to JS 
    } 
} 
/* 
    Parsing the Root.plist for the key, because there is a bug/feature in Settings.bundle 
    So if the user haven't entered the Settings for the app, the default values aren't accessible through NSUserDefaults. 
*/ 


- (NSString*)getSettingFromBundle:(NSString*)settingsName 
{ 
    NSString *pathStr = [[NSBundle mainBundle] bundlePath]; 
    NSString *settingsBundlePath = [pathStr stringByAppendingPathComponent:@"Settings.bundle"]; 
    NSString *finalPath = [settingsBundlePath stringByAppendingPathComponent:@"Root.plist"]; 

    NSDictionary *settingsDict = [NSDictionary dictionaryWithContentsOfFile:finalPath]; 
    NSArray *prefSpecifierArray = [settingsDict objectForKey:@"PreferenceSpecifiers"]; 
    NSDictionary *prefItem; 
    for (prefItem in prefSpecifierArray) 
    { 
     if ([[prefItem objectForKey:@"Key"] isEqualToString:settingsName]) 
      return [prefItem objectForKey:@"DefaultValue"]; 
    } 
    return nil; 

} 
@end 

用法示例

cordova.require("applicationPreferences").set("foo", "bar", 
     function() { 
     alert("Successfully set preference 'foo' with value 'bar'"); 
     }, 
     function (error) { 
     alert("Failed to set preference 'foo' with value 'bar' - error:" + error); 
     } 
); 

cordova.require("applicationPreferences").get("foo", 
     function (value) { 
     alert("Successful get of preference 'foo' with value '"+value+"'"); 
     }, 
     function (error) { 
     alert("Failed to get value for preference 'foo' - error:" + error); 
     } 
); 
+0

工作。謝謝! –

0

我能得到這個工作。 (謝謝,Dpa99c!)如果您遇到困難,請記住您仍然需要執行「舊」(Cordova/PhoneGap 2. *)版本的設置。也就是說,您需要將一個Settings.bundle添加到您的項目並相應地進行編輯。並且,您需要添加:

<feature name="applicationPreferences"> 
    <param name="ios-package" value="applicationPreferences" /> 
</feature> 

到您的config.xml。

這是除了將上面顯示的文件放在正確的位置。