1、做一个Root.plist 文件,文件格式如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>StringsTable</key>
<string>Root</string>
<key>Title</key>
<string></string>
<key>PreferenceSpecifiers</key>
<array>
<dict>
<key>Type</key>
<string>PSTextFieldSpecifier</string>
<key>Title</key>
<string>偏好1</string>
<key>Key</key>
<string>param1</string>
<key>KeyboardType</key>
<string>NumberPad</string>
</dict>
<dict>
<key>Type</key>
<string>PSTextFieldSpecifier</string>
<key>Title</key>
<string>偏好2</string>
<key>Key</key>
<string>param2</string>
<key>KeyboardType</key>
<string>Alphabet</string>
</dict>
<dict>
<key>Type</key>
<string>PSGroupSpecifier</string>
<key>Title</key>
<string>Group</string>
</dict>
<dict>
<key>Type</key>
<string>PSToggleSwitchSpecifier</string>
<key>Title</key>
<string>偏好3</string>
<key>Key</key>
<string>param3</string>
<key>DefaultValue</key>
<integer>0</integer>
</dict>
</array>
</dict>
</plist>
2、在用delphi 10.1 berlin创建的工程下新建一个文件夹重命名为Settings.bundle,把第一步创建的文件Root.plist 文件拷贝到该文件夹中。
3、点击delphi 10.1 berlin 菜单中 Project --> deployment,在这里填加文件 Root.plist ,Remote Path改为 .\Settings.bundle\ ,编译程序看一下效果吧,这时ios设置里已经能看到该项目生成偏好设置了,等有时间把图片传上来
4、代码实现读取偏好设置,先创建一个单元my.iOS.NSUserDefaults.pas
unit my.iOS.NSUserDefaults;
interface
uses
System.Classes,
System.TypInfo,
{$IFDEF IOS}
iOSapi.Foundation,
Macapi.ObjectiveC,
Macapi.ObjCRuntime,
Macapi.Helpers,
{$ENDIF}
FMX.StdCtrls;
type
TMyUserDefaults = class;
// ------------------------------------------------------------------------------
{$IFDEF IOS}
IMyNSNotificationCenterHandler = interface(NSObject)
['{70CD840A-7F21-4CB6-99F4-EA45EAE2A48C}']
procedure defaultsChanged(notification: NSNotification); cdecl;
end;
// ------------------------------------------------------------------------------
TMyNSNotificationCenterHandler = class(TOCLocal)
private
FMyUserDefaults: TMyUserDefaults;
protected
function GetObjectiveCClass: PTypeInfo; override;
public
constructor create(ADPFUserDefaults: TMyUserDefaults);
procedure defaultsChanged(notification: NSNotification); cdecl;
end;
{$ENDIF}
TMyUserDefaultsChanged = procedure(sender: TObject) of object;
[ComponentPlatformsAttribute(PidWin32 or pidiOSDevice32 or pidiOSDevice64 or
PidiOSSimulator)]
TMyUserDefaults = class(TComponent)
private
FOnUserDefaultsChanged: TMyUserDefaultsChanged;
{$IFDEF IOS}
FMyNSNotificationCenterHandler: TMyNSNotificationCenterHandler;
{$ENDIF}
protected
public
{$IFDEF IOS}
procedure Loaded; override;
function GetBooleanValue(key: string): boolean;
function GetDoubleValue(key: string): double;
function GetInt64Value(key: string): nativeuint;
function GetSingleValue(key: string): single;
function GetStringValue(key: string;
const DefaultValue: string = ''): string;
function GetStringArrayValue(key: string): TArray<string>;
procedure SetBooleanValue(key: string; value: boolean);
procedure SetDoubleValue(key: string; value: double);
procedure SetInt64Value(key: string; value: nativeuint);
procedure SetSingleValue(key: string; value: single);
procedure SetStringValue(key: string; value: string);
procedure SetStringArrayValue(key: string; values: TArray<string>);
function synchronize: boolean;
{$ENDIF}
constructor create(AOwner: TComponent); override;
destructor Destroy; override;
published
property OnUserDefaultsChanged: TMyUserDefaultsChanged
read FOnUserDefaultsChanged write FOnUserDefaultsChanged;
end;
// ------------------------------------------------------------------------------
implementation
// ------------------------------------------------------------------------------
{ TMyUserDefaults }
// ------------------------------------------------------------------------------
constructor TMyUserDefaults.create(AOwner: TComponent);
begin
inherited create(AOwner);
{$IFDEF IOS}
FMyNSNotificationCenterHandler :=
TMyNSNotificationCenterHandler.create(Self);
TNSNotificationCenter.Wrap(TNSNotificationCenter.OCClass.defaultCenter)
.addObserver(FMyNSNotificationCenterHandler.GetObjectID,
sel_getUid('defaultsChanged:'),
(StrToNSStr('NSUserDefaultsDidChangeNotification') as ILocalObject)
.GetObjectID, nil);
{$ENDIF}
end;
// ------------------------------------------------------------------------------
destructor TMyUserDefaults.Destroy;
begin
{$IFDEF IOS}
TNSNotificationCenter.Wrap(TNSNotificationCenter.OCClass.defaultCenter)
.removeObserver(FMyNSNotificationCenterHandler.GetObjectID);
FMyNSNotificationCenterHandler.DisposeOf;
{$ENDIF}
inherited;
end;
// ------------------------------------------------------------------------------
{$IFDEF IOS}
procedure TMyUserDefaults.Loaded;
begin
inherited;
end;
// ------------------------------------------------------------------------------
function TMyUserDefaults.GetBooleanValue(key: string): boolean;
var
UDefaults: NSUserDefaults;
begin
Result := False;
if key = '' then
exit;
UDefaults := TNSUserDefaults.Wrap
(TNSUserDefaults.OCClass.standardUserDefaults);
Result := UDefaults.boolForKey(StrToNSStr(key));
end;
// ------------------------------------------------------------------------------
function TMyUserDefaults.GetDoubleValue(key: string): double;
var
UDefaults: NSUserDefaults;
begin
Result := 0;
if key = '' then
exit;
UDefaults := TNSUserDefaults.Wrap
(TNSUserDefaults.OCClass.standardUserDefaults);
Result := UDefaults.doubleForKey(StrToNSStr(key));
end;
// ------------------------------------------------------------------------------
function TMyUserDefaults.GetInt64Value(key: string): nativeuint;
var
UDefaults: NSUserDefaults;
begin
Result := 0;
if key = '' then
exit;
UDefaults := TNSUserDefaults.Wrap
(TNSUserDefaults.OCClass.standardUserDefaults);
Result := UDefaults.integerForKey(StrToNSStr(key));
end;
// ------------------------------------------------------------------------------
function TMyUserDefaults.GetSingleValue(key: string): single;
var
UDefaults: NSUserDefaults;
begin
Result := 0;
if key = '' then
exit;
UDefaults := TNSUserDefaults.Wrap
(TNSUserDefaults.OCClass.standardUserDefaults);
Result := UDefaults.floatForKey(StrToNSStr(key));
end;
// ------------------------------------------------------------------------------
function TMyUserDefaults.GetStringValue(key: string;
const DefaultValue: string = ''): string;
var
UDefaults: NSUserDefaults;
nStr: NSString;
begin
if key = '' then
exit;
Result := DefaultValue;
UDefaults := TNSUserDefaults.Wrap
(TNSUserDefaults.OCClass.standardUserDefaults);
nStr := UDefaults.stringForKey(StrToNSStr(key));
if Assigned(nStr) then
Result := UTF8ToString(nStr.UTF8String);
end;
// ------------------------------------------------------------------------------
procedure TMyUserDefaults.SetBooleanValue(key: string; value: boolean);
var
UDefaults: NSUserDefaults;
begin
if key = '' then
exit;
UDefaults := TNSUserDefaults.Wrap
(TNSUserDefaults.OCClass.standardUserDefaults);
UDefaults.setBool(value, StrToNSStr(key));
end;
// ------------------------------------------------------------------------------
procedure TMyUserDefaults.SetDoubleValue(key: string; value: double);
var
UDefaults: NSUserDefaults;
begin
if key = '' then
exit;
UDefaults := TNSUserDefaults.Wrap
(TNSUserDefaults.OCClass.standardUserDefaults);
UDefaults.setDouble(value, StrToNSStr(key));
end;
// ------------------------------------------------------------------------------
procedure TMyUserDefaults.SetInt64Value(key: string; value: nativeuint);
var
UDefaults: NSUserDefaults;
begin
if key = '' then
exit;
UDefaults := TNSUserDefaults.Wrap
(TNSUserDefaults.OCClass.standardUserDefaults);
UDefaults.setInteger(value, StrToNSStr(key));
end;
// ------------------------------------------------------------------------------
procedure TMyUserDefaults.SetSingleValue(key: string; value: single);
var
UDefaults: NSUserDefaults;
begin
if key = '' then
exit;
UDefaults := TNSUserDefaults.Wrap
(TNSUserDefaults.OCClass.standardUserDefaults);
UDefaults.setFloat(value, StrToNSStr(key));
end;
// ------------------------------------------------------------------------------
procedure TMyUserDefaults.SetStringArrayValue(key: string;
values: TArray<string>);
var
UDefaults: NSUserDefaults;
vls: NSMutableArray;
i: Integer;
begin
if key = '' then
exit;
UDefaults := TNSUserDefaults.Wrap
(TNSUserDefaults.OCClass.standardUserDefaults);
vls := TNSMutableArray.create;
for i := 0 to high(values) do
vls.addObject((StrToNSStr(values[i]) as ILocalObject).GetObjectID);
UDefaults.setObject((vls as ILocalObject).GetObjectID, StrToNSStr(key));
vls.release;
end;
// ------------------------------------------------------------------------------
procedure TMyUserDefaults.SetStringValue(key, value: string);
var
UDefaults: NSUserDefaults;
begin
if key = '' then
exit;
UDefaults := TNSUserDefaults.Wrap
(TNSUserDefaults.OCClass.standardUserDefaults);
UDefaults.setObject((StrToNSStr(value) as ILocalObject).GetObjectID,
StrToNSStr(key));
end;
// ------------------------------------------------------------------------------
function TMyUserDefaults.synchronize: boolean;
var
UDefaults: NSUserDefaults;
begin
try
UDefaults := TNSUserDefaults.Wrap
(TNSUserDefaults.OCClass.standardUserDefaults);
Result := UDefaults.synchronize;
except
Result := False;
end;
end;
// ------------------------------------------------------------------------------
function TMyUserDefaults.GetStringArrayValue(key: string): TArray<string>;
var
UDefaults: NSUserDefaults;
ar: NSArray;
i: Integer;
begin
if key = '' then
exit;
UDefaults := TNSUserDefaults.Wrap
(TNSUserDefaults.OCClass.standardUserDefaults);
ar := UDefaults.stringArrayForKey(StrToNSStr(key));
SetLength(Result, ar.count);
if ar.count = 0 then
exit;
for i := 0 to ar.count - 1 do
Result[i] := UTF8ToString(TNSString.Wrap(ar.objectAtIndex(i)).UTF8String);
end;
// ------------------------------------------------------------------------------
{ TMyNSNotificationCenterHandler }
constructor TMyNSNotificationCenterHandler.create(ADPFUserDefaults
: TMyUserDefaults);
begin
inherited create;
FMyUserDefaults := ADPFUserDefaults;
end;
// ------------------------------------------------------------------------------
function TMyNSNotificationCenterHandler.GetObjectiveCClass: PTypeInfo;
begin
Result := TypeInfo(IMyNSNotificationCenterHandler);
end;
// ------------------------------------------------------------------------------
procedure TMyNSNotificationCenterHandler.defaultsChanged
(notification: NSNotification);
begin
if Assigned(FMyUserDefaults.FOnUserDefaultsChanged) then
FMyUserDefaults.FOnUserDefaultsChanged(FMyUserDefaults);
end;
// ------------------------------------------------------------------------------
{$ENDIF}
end.
5、工程实例代码实现,把 my.iOS.NSUserDefaults文件填加到工程中
unit Unit1;interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, my.iOS.NSUserDefaults,
FMX.StdCtrls, FMX.Edit, FMX.Controls.Presentation;
type
TForm1 = class(TForm)
edt1: TEdit;
edt2: TEdit;
swtch1: TSwitch;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
UserDefaults: TMyUserDefaults;
procedure UserDefaultsChanged(sender: TObject);
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.fmx}
procedure TForm1.FormCreate(Sender: TObject);
begin
UserDefaults := TMyUserDefaults.Create(nil);
UserDefaults.OnUserDefaultsChanged := UserDefaultsChanged;
UserDefaultsChanged(nil);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
FreeAndNil(UserDefaults);
end;
procedure TForm1.UserDefaultsChanged(sender: TObject);
begin
edt1.Text := UserDefaults.GetStringValue('param1', '');
edt2.Text := UserDefaults.GetStringValue('param2', '');
swtch1.IsChecked := UserDefaults.GetBooleanValue('param3');
end;
end.