2013-10-05 4 views
1

Quelqu'un at-il pu obtenir le plugin ApplicationPreferences (https://github.com/phonegap/phonegap-plugins/tree/master/iOS/ApplicationPreferences) pour utiliser le nouveau plugin api pour phonegap? J'ai installé le plugin à l'ancienne et continue à obtenir l'erreur suivante:Phonegap 3.0 iOS7 ApplicationPreferences Plugin

ERROR: Method 'getSetting:' not defined in Plugin 'applicationPreferences' 
  1. J'ai vérifié pour vous assurer que le fichier .js est inclus
  2. Je vérifia le .h & fichiers .m sont inclus

Répondre

3

Je voulais aussi utiliser ce plugin avec Phonegap 3/iOS7, donc je l'ai mis à jour. Vous pouvez télécharger mon projet de test Phonegap 3 contenant le plugin mis à jour from here.

Voici le code:

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 

Exemple d'utilisation

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

Cela a fonctionné. Merci! –

0

j'ai pu obtenir ce travail. (Merci, Dpa99c!) Si vous rencontrez des difficultés, rappelez-vous que vous avez encore besoin de faire la configuration comme l'ancienne version (Cordova/PhoneGap 2. *). Autrement dit, vous devez ajouter un fichier Settings.bundle à votre projet et le modifier en conséquence. Et, vous devez ajouter:

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

à votre config.xml.

Ceci est en plus de mettre les fichiers ci-dessus au bon endroit.