我正在尝试初始化安全存储插件。当此失败时,表示用户没有安全的锁屏设置。使用github页面我正在尝试重新创建提供的示例:
var ss;
var _init = function () {
ss = new cordova.plugins.SecureStorage(
function () {
console.log('OK');
},
function () {
navigator.notification.alert(
'Please enable the screen lock on your device. This app cannot operate securely without it.',
function () {
ss.secureDevice(
function () {
_init();
},
function () {
_init();
}
);
},
'Screen lock is disabled'
);
},
'my_app');
};
_init();
这是我的尝试:
private createSecureStorage() {
this.secureStorageAPI.create(this.storeName).then(
(storage: SecureStorageObject) => {
this.secureStorage = storage;
}).catch(
(error) => {
this.dialogs.alert( 'Please enable the screen lock on your device. This app cannot operate securely without it.').then(
() => {
// Alert Dismissed, should open the secure lockscreen settings here
this.secureStorage.secureDevice().then(
() => {
// Try again
this.createSecureStorage();
}
).catch( () => {
// Try again
this.createSecureStorage();
})
} )
} );
}
我遇到的问题是,当secureStorageApi.create调用失败时,secureStorage将是未定义的,因此我无法使用它来调用callSecvice()。
非常感谢任何帮助。
答案 0 :(得分:6)
对于现在需要这项工作的每个人,请修改:
node_modules \ @离子天然\安全存储\ index.js
它应该是这样的:
var __extends = (this && this.__extends) || (function () {
var extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
import { Injectable } from '@angular/core';
import { CordovaInstance, Plugin, CordovaCheck, IonicNativePlugin } from '@ionic-native/core';
/**
* @hidden
*/
var SecureStorageObject = (function () {
function SecureStorageObject(_objectInstance) {
this._objectInstance = _objectInstance;
}
/**
* Gets a stored item
* @param key {string}
* @returns {Promise<string>}
*/
SecureStorageObject.prototype.get = function (key) { return; };
/**
* Stores a value
* @param key {string}
* @param value {string}
* @returns {Promise<any>}
*/
SecureStorageObject.prototype.set = function (key, value) { return; };
/**
* Removes a single stored item
* @param key {string}
* @returns {Promise<string>} returns a promise that resolves with the key that was removed
*/
SecureStorageObject.prototype.remove = function (key) { return; };
/**
* Get all references from the storage.
* @returns {Promise<string[]>} returns a promise that resolves with array of keys storage
*/
SecureStorageObject.prototype.keys = function () { return; };
/**
* Clear all references from the storage.
* @returns {Promise<any>}
*/
SecureStorageObject.prototype.clear = function () { return; };
return SecureStorageObject;
}());
/**
* @hidden
*/
var SecureDeviceObject = (function () {
function SecureDeviceObject(_objectInstance) {
this._objectInstance = _objectInstance;
}
/**
* Brings up the screen-lock settings
* @returns {Promise<any>}
*/
SecureStorageObject.prototype.secureDevice = function () { return; };
return SecureDeviceObject;
}());
export { SecureStorageObject, SecureDeviceObject };
__decorate([
CordovaInstance({
callbackOrder: 'reverse'
}),
__metadata("design:type", Function),
__metadata("design:paramtypes", [String]),
__metadata("design:returntype", Promise)
], SecureStorageObject.prototype, "get", null);
__decorate([
CordovaInstance({
callbackOrder: 'reverse'
}),
__metadata("design:type", Function),
__metadata("design:paramtypes", [String, String]),
__metadata("design:returntype", Promise)
], SecureStorageObject.prototype, "set", null);
__decorate([
CordovaInstance({
callbackOrder: 'reverse'
}),
__metadata("design:type", Function),
__metadata("design:paramtypes", [String]),
__metadata("design:returntype", Promise)
], SecureStorageObject.prototype, "remove", null);
__decorate([
CordovaInstance({
callbackOrder: 'reverse'
}),
__metadata("design:type", Function),
__metadata("design:paramtypes", []),
__metadata("design:returntype", Promise)
], SecureStorageObject.prototype, "keys", null);
__decorate([
CordovaInstance({
callbackOrder: 'reverse'
}),
__metadata("design:type", Function),
__metadata("design:paramtypes", []),
__metadata("design:returntype", Promise)
], SecureStorageObject.prototype, "clear", null);
__decorate([
CordovaInstance(),
__metadata("design:type", Function),
__metadata("design:paramtypes", []),
__metadata("design:returntype", Promise)
], SecureDeviceObject.prototype, "secureDevice", null);
/**
* @name Secure Storage
* @description
* This plugin gets, sets and removes key,value pairs from a device's secure storage.
*
* Requires Cordova plugin: `cordova-plugin-secure-storage`. For more info, please see the [Cordova Secure Storage docs](https://github.com/Crypho/cordova-plugin-secure-storage).
*
* The browser platform is supported as a mock only. Key/values are stored unencrypted in localStorage.
*
* @usage
*
* ```typescript
* import { SecureStorage, SecureStorageObject } from '@ionic-native/secure-storage';
*
* constructor(private secureStorage: SecureStorage) { }
*
* ...
*
* this.secureStorage.create('my_store_name')
* .then((storage: SecureStorageObject) => {
*
* storage.get('key')
* .then(
* data => console.log(data),
* error => console.log(error)
* );
*
* storage.set('key', 'value')
* .then(
* data => console.log(data),
* error => console.log(error)
* );
*
* storage.remove('key')
* .then(
* data => console.log(data),
* error => console.log(error)
* );
*
* });
*
*
* ```
* @classes
* SecureStorageObject
*/
var SecureStorage = SecureStorage_1 = (function (_super) {
__extends(SecureStorage, _super);
function SecureStorage() {
return _super !== null && _super.apply(this, arguments) || this;
}
/**
* Creates a namespaced storage.
* @param store {string}
* @returns {Promise<SecureStorageObject>}
*/
SecureStorage.prototype.create = function (store) {
return new Promise(function (res, rej) {
var instance = new (SecureStorage_1.getPlugin())(
function () {
res(new SecureStorageObject(instance));
},
function () {
rej(new SecureDeviceObject(instance));
},
store);
});
};
return SecureStorage;
}(IonicNativePlugin));
SecureStorage.decorators = [
{ type: Injectable },
];
/** @nocollapse */
SecureStorage.ctorParameters = function () { return []; };
__decorate([
CordovaCheck(),
__metadata("design:type", Function),
__metadata("design:paramtypes", [String]),
__metadata("design:returntype", Promise)
], SecureStorage.prototype, "create", null);
SecureStorage = SecureStorage_1 = __decorate([
Plugin({
pluginName: 'SecureStorage',
plugin: 'cordova-plugin-secure-storage',
pluginRef: 'cordova.plugins.SecureStorage',
repo: 'https://github.com/Crypho/cordova-plugin-secure-storage',
platforms: ['Android', 'Browser', 'iOS', 'Windows']
})
], SecureStorage);
export { SecureStorage };
var SecureStorage_1;
//# sourceMappingURL=index.js.map
然后你就可以使用:
private createSecureStorage() {
this.secureStorageAPI.create(this.storeName).then(
(storage: SecureStorageObject) => {
console.log("secure");
this.secureStorage = storage;
}).catch(
(secureDeviceObject) => {
this.dialogs.alert( 'Please enable the screen lock on your device. This app cannot operate securely without it.').then(
() => {
// Alert Dismissed, should open the secure lockscreen settings here
secureDeviceObject.secureDevice().then(
() => {
// Try again
console.log("Success");
this.createSecureStorage();
} ).catch( () => {
// Try again
console.log(" Error ")
this.createSecureStorage();
})
} );
} );
}
我所做的是将secureDevice函数移动到一个名为SecureDeviceObject的新对象并更改装饰器。通过这样做,你不能使用这个对象来尝试调用get和set函数等。
这是新对象:
var SecureDeviceObject = (function () {
function SecureDeviceObject(_objectInstance) {
this._objectInstance = _objectInstance;
}
/**
* Brings up the screen-lock settings
* @returns {Promise<any>}
*/
SecureStorageObject.prototype.secureDevice = function () { return; };
return SecureDeviceObject;
}());
然后我改变了decorater:
__decorate([
CordovaInstance(),
__metadata("design:type", Function),
__metadata("design:paramtypes", []),
__metadata("design:returntype", Promise)
], SecureDeviceObject.prototype, "secureDevice", null);
最后一项更改是使拒绝承诺返回secureDeviceObject:
SecureStorage.prototype.create = function (store) {
return new Promise(function (res, rej) {
var instance = new (SecureStorage_1.getPlugin())(
function () {
res(new SecureStorageObject(instance));
},
function () {
rej(new SecureDeviceObject(instance));
},
store);
});
};
我认为这不是最好的解决办法,但这是我能做的最好的事情:D 在Android 4上测试到8个。正在研究所有这些!
希望它可以帮助某人:)
感谢@JudgeFudge指出我正确的方向
答案 1 :(得分:2)
此问题已作为问题进行跟踪,请参阅:https://github.com/ionic-team/ionic-native/issues/1944。
如果您需要快速解决方案,可以尝试以下步骤之一:
1)降级Ionic SecureStorage插件,可能在以前的版本中不会出现此问题。
2)尝试自己解决问题。您可以在此处找到node_modules文件夹中的源代码(如果您需要帮助,我可以尝试稍后查看):
node_modules \科尔多瓦-插件安全存储\ SRC \机器人\ SecureStorage.java node_modules \科尔多瓦-插件安全存储\ SRC \ IOS \ SecureStorage.m
答案 2 :(得分:1)
Here我发送了一个修复该错误的请求。
这里:
create(store: string): Promise<SecureStorageObject> {
return getPromise<SecureStorageObject>((res: Function, rej: Function) => {
const instance = new (SecureStorage.getPlugin())(
() => res(new SecureStorageObject(instance)),
rej,
store
);
});
}
简单地更改拒绝回调:
() => rej(new SecureStorageObject(instance)),
在ionic-native/src/@ionic-native/plugins/secure-storage/index.ts
内
然后:
npm install
npm run build
,最后复制在您的npm_modules文件夹中编译的插件:
cp -r ionic-native/dist/@ionic-native/plugins/secure-storage/ /your_project/node_modules/@ionic-native/
更新:
他们合并了PR。
如何使用它:
{ this.storage = await this.secureStorage.create('my_storage'); } catch (e) { await e.secureDevice(); }