如何在后台运行Cordova插件?

23

我正在基于PhoneGap(Cordova)制作应用程序。我已经进行了一些测试,最近在Xcode中看到了一条消息,上面写着“插件应使用后台线程”。那么,是否可能使Cordova插件在应用程序的后台运行?如果可以,请告诉我如何操作。谢谢!

2个回答

34

后台线程并不等同于应用程序在后台执行代码,后台线程用于在执行长时间任务时不阻塞UI。

iOS上的后台线程示例

- (void)myPluginMethod:(CDVInvokedUrlCommand*)command
    {
        // Check command.arguments here.
        [self.commandDelegate runInBackground:^{
            NSString* payload = nil;
            // Some blocking logic...
            CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:payload];
            // The sendPluginResult method is thread-safe.
            [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
        }];
    }

Android后台线程的示例

@Override
    public boolean execute(String action, JSONArray args, final CallbackContext callbackContext) throws JSONException {
        if ("beep".equals(action)) {
            final long duration = args.getLong(0);
            cordova.getThreadPool().execute(new Runnable() {
                public void run() {
                    ...
                    callbackContext.success(); // Thread-safe.
                }
            });
            return true;
        }
        return false;
    }

是的,我知道那是本地代码,必须在.m文件中。我的问题是,如果我想在后台运行特定的插件,该如何使用此函数? - developer
这不是针对特定的后台插件,而是针对您自己的插件。除非其他插件具有此代码或您衍生插件并创建带有此后台代码的自己的版本,否则无法在后台运行其他插件。 - jcesarmobile
1
我的意思是,这是在后台运行的本地代码。如果你想让你的插件在后台运行,它需要 runInBackground(iOS)或 cordova.getThreadPool().execute(new Runnable() (android) 部分。如果这个插件不是你自己的,那么作者应该添加这段代码(如果他想要的话),或者你可以 fork 这个插件并添加这些更改。 - jcesarmobile
@开发者,实际上,您可以编辑插件代码使其正常工作。但是请注意,当插件更新时,您的更改将被清除。因此,为了保存这些代码,您需要像jcesarmobile所说的那样(请求插件所有者进行更改或分支)。 - extempl
1
这个答案与问题根本不相关。 - Varun Kumar
显示剩余3条评论

0
在 Cordova Swift 中运行,您需要添加以下内容:
    commandDelegate.run(inBackground: { [self] in
        callingMethod()
    })

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接