2013-10-05 3 views
1

Кто-нибудь смог получить плагин ApplicationPreferences (https://github.com/phonegap/phonegap-plugins/tree/master/iOS/ApplicationPreferences) для работы с новым плагином api для телефонного разговора? Я установил плагин старый способ и продолжать получать следующее сообщение об ошибке:Phonegap 3.0 iOS7 ApplicationPreferences Плагин

ERROR: Method 'getSetting:' not defined in Plugin 'applicationPreferences' 
  1. Я проверил, чтобы убедиться, что .js файл включаются
  2. Я проверил, чтобы убедиться, .h & .m файлов включены

ответ

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.

Это дополнение к размещению файлов, показанных выше, в нужном месте.

Смежные вопросы