DCloud_App_Array
DCloud_App_Array
  • 发布:2014-09-25 19:48
  • 更新:2019-07-11 10:39
  • 阅读:85278

IOS平台第三方插件开发指导

分类:HTML5+

欢迎有原生开发能力的朋友入群一起交流学习(入群请提供注册邮箱):
DCloud原生开发者群:
1群:256775471(已满)
2群:814228233

技术架构

HTML5+ 基座扩展采用三层结构,JS层、PluginBridge层和Native层。 三层功能分别是:
JS层: 在Webview页面调用,触发Native层代码,获取执行结果。
PluginBridge层: 将JS层请求进行处理,触发Native层扩展插件代码。
Native层: 插件扩展的平台原生代码,负责执行业务逻辑并执行结果返回到请求页面。


开发者在开发扩展插件时需要为扩展插件编写对应的JS API,JS API将在HTML页面中触发调用对应Native扩展方法的请求,并负责接收运行结果。

开发者在编写扩展插件的JS时需要调用Javascript Plugin Bridge的API用来完成对Native层代码的调用和运行结果的返回。在实际应用中,开发者可以根据扩展方法的实际需求不同,将插件的扩展方法设置为同步执行或异步执行。

同步执行的扩展方法会阻塞当前JS代码的执行,直到Native层插件扩展方法执行完毕。异步扩展方法不会阻塞当前JS代码的执行,使用者需要设置回调方法接收Native层返回的执行结果,开发者需要在插件中调用 Native plugin brigde的方法将执行结果返回到请求页面。

扩展插件工作流程:

插件异步扩展方法:

异步方法的执行不会阻塞当前JS的运行,方法的执行结果会通过回调的方式返回给调用者。

插件同步扩展方法:

同步方法的执行会阻塞当前JS的运行,方法执行完成后可直接获取执行的结果。

扩展插件JS API 编写

开发者在实现JS层API时首先要定义一个插件类别名,并需要在IOS工程的PandoraApi.bundle\feature.plist文件中声明插件类别名和Native层扩展插件类的对应关系

JS扩展方法的实现

同步返回JS扩展方法实现
在实现同步扩展方法时,开发者需要调用JS Plugin Bridge的window.plus.bridge.execSync()
方法,该方法可同步获取Native插件返回的运行结果。

void plus.bridge.execSync( String service, String action, Array<String> args );  

service: 插件类别名
action: 调用Native层插件方法名称。
args: 参数列表。

异步返回JS扩展方法实现
在实现异步扩展方法时,开发者需要调用JS Plugin Bridge的plus.bridge.exec()方法,该方法会通知Native层插件执行指定方法,运行结果会通过回调的方式通知JS层

void plus.bridge.exec( String service, String action, Array<String> args );  

service: 插件类别名
action: 调用Native层插件方法名称。
args: 参数列表。

扩展插件JS API代码示例:

document.addEventListener( "plusready",  function()  
{  
// 声明的JS“扩展插件别名”  
    var _BARCODE = 'plugintest',  
        B = window.plus.bridge;  
    var plugintest =   
{  
// 声明异步返回方法  
        PluginTestFunction : function (Argus1, Argus2, Argus3, Argus4, successCallback, errorCallback )   
        {  
            var success = typeof successCallback !== 'function' ? null : function(args)   
            {  
                successCallback(args);  
            },  
            fail = typeof errorCallback !== 'function' ? null : function(code)   
            {  
                errorCallback(code);  
            };  
            callbackID = B.callbackId(success, fail);  
// 通知Native层plugintest扩展插件运行”PluginTestFunction”方法  
            return B.exec(_BARCODE, "PluginTestFunction", [callbackID, Argus1, Argus2, Argus3, Argus4]);  
        },  
        PluginTestFunctionArrayArgu : function (Argus, successCallback, errorCallback )   
        {  
            var success = typeof successCallback !== 'function' ? null : function(args)   
            {  
                successCallback(args);  
            },  
            fail = typeof errorCallback !== 'function' ? null : function(code)   
            {  
                errorCallback(code);  
            };  
            callbackID = B.callbackId(success, fail);  
            return B.exec(_BARCODE, "PluginTestFunctionArrayArgu", [callbackID, Argus]);  
        },        
        // 声明同步返回方法  
        PluginTestFunctionSync : function (Argus1, Argus2, Argus3, Argus4)   
        {              
            // 通知Native层plugintest扩展插件运行“PluginTestFunctionSync”方法并同步返回结果                         
            return B.execSync(_BARCODE, "PluginTestFunctionSync", [Argus1, Argus2, Argus3, Argus4]);  
        },  
        PluginTestFunctionSyncArrayArgu : function (Argus)   
        {                                     
            return B.execSync(_BARCODE, "PluginTestFunctionSyncArrayArgu", [Argus]);  
        }  
    };  
    window.plus.plugintest = plugintest;  
}, true );  

HTML使用示例

<!DOCTYPE HTML>  
<html>  
    <head>  
        <meta charset="utf-8"/>  
        <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, user-scalable=no"/>  
        <meta name="HandheldFriendly" content="true"/>  
        <meta name="MobileOptimized" content="320"/>  
        <title>H5Plugin</title>  
        <script type="text/javascript" src="./js/common.js"></script>  
        <script type="text/javascript" src="./js/test.js"></script>  
        <script type="text/javascript">  

        function pluginShow() {  
            plus.plugintest.PluginTestFunction("Html5","Plus","AsyncFunction","MultiArgument!", function( result ) {alert( result[0]  + "_" + result[1]  + "_" + result[2]  + "_" + result[3] );},function(result){alert(result)});  
        }  

        function pluginShowArrayArgu() {  
            plus.plugintest.PluginTestFunctionArrayArgu( ["Html5","Plus","AsyncFunction","ArrayArgument!"], function( result ) {alert( result );},function(result){alert(result)});  
        }  

        function pluginGetString()  
        {  
            alert(plus.plugintest.PluginTestFunctionSync("Html5","Plus","SyncFunction","MultiArgument!"));  
        }  

        function pluginGetStringArrayArgu()  
        {  
            var Argus = plus.plugintest.PluginTestFunctionSyncArrayArgu(["Html5","Plus","SyncFunction","ArrayArgument!"]);  
            alert( Argus.RetArgu1 + "_" +  Argus.RetArgu2 + "_" + Argus.RetArgu3  + "_" + Argus.RetArgu4 );  
        }  

        </script>  
        <link rel="stylesheet" href="./css/common.css" type="text/css" charset="utf-8"/>  
    </head>  
    <body>  
        <header>  
            <div class="nvbt" onclick="back();"><div class="iback"></div></div>  
            <div class="nvtt">PluginTest</div>  
        </header>  
        <div id="dcontent" class="dcontent">  
            <br/>  
             <div class="button" onclick="pluginShow()">PluginTestFunction()</div>  
            <div class="button" onclick="pluginShowArrayArgu()">PluginTestFunctionArrayArgu()</div>  
            <div class="button" onclick="pluginGetString()">PluginTestFunctionSync()</div>  
            <div class="button" onclick="pluginGetStringArrayArgu()">PluginTestFunctionSyncArrayArgu()</div>      
            <br/>  
        </div>  
    </body>  
</html>  

IOS平台第三方插件开发指导

准备:

首先需下载H5+ 的IOS平台离线打包SDK(下载地址:http://ask.dcloud.net.cn/article/103
在MAC平台解压后打开HBuilder-plugin工程。

开发步骤

一 创建插件类

开发者新创建的类需要继承“PGPlugin”类实现第三方插件扩展。

  1. 创建一个继承自“PGPlugin”类的Objective-c类
  2. 在源文件中引入头文件“PGPlugin.h”和“PGMethod.h”

二 编写插件的方法

开发者可根据需求,在JS层通过调用不同的JS Plugin Bridge方法,将扩展方法定义为同步执行或异步执行。
同步执行的方法会阻塞当前JS代码的执行,并同步获取Native层扩展方法返回的运行结果。
异步执行方法不会阻塞当前JS代码的执行,需要开发者用回调的方式接收Native层的执行结果。
但需要注意,在调用plus.bridge.exec或plus.bridge.execSync方法时,传入的第一个参数是插件的别名,开发者需要声明别名和Native代码类名的对应关系。传入的第二个参数(调用插件的方法名),需要和要调用的扩展插件的方法名一致,否则无法通过JS调用到Native层扩展类方法。

异步方法:

开发者在编写异步方法时可通过PGPlugin类的回调方法将Native扩展方法运行结果返回到调用页面。使用方法如下
Native层代码实现

- (void)PluginTestFunctionArrayArgu:(PGMethod*)commands  
{  
    if ( commands ) {  

        // CallBackid 异步方法的回调id,H5+ 会根据回调ID通知JS层运行结果成功或者失败  
        NSString* cbId = [commands.arguments objectAtIndex:0];  

        // 用户的参数会在第二个参数传回,可以按照Array方式传入,  
        NSArray* pArray = [commands.arguments objectAtIndex:1];  

        // 如果使用Array方式传递参数  
        NSString* pResultString = [NSString stringWithFormat:@"%@ %@ %@ %@",[pArray objectAtIndex:0], [pArray objectAtIndex:1], [pArray objectAtIndex:2], [pArray objectAtIndex:3]];  

        // 运行Native代码结果和预期相同,调用回调通知JS层运行成功并返回结果  
        PDRPluginResult *result = [PDRPluginResult resultWithStatus:PDRCommandStatusOK messageAsString:pResultString];  

        // 如果Native代码运行结果和预期不同,需要通过回调通知JS层出现错误,并返回错误提示  
        //PDRPluginResult *result = [PDRPluginResult resultWithStatus:PDRCommandStatusError messageAsString:@"惨了! 出错了! 咋(wu)整(liao)"];  

        // 通知JS层Native层运行结果,JS Pluginbridge会根据cbid找到对应的回调方法并触发  
        [self toCallback:cbId withReslut:[result toJSONString]];  
    }  
}  

JS 层代码实现

        PluginTestFunction : function (Argus1, Argus2, Argus3, Argus4, successCallback, errorCallback )   
        {  
            var success = typeof successCallback !== 'function' ? null : function(args)   
            {  
                successCallback(args);  
            },  
            fail = typeof errorCallback !== 'function' ? null : function(code)   
            {  
                errorCallback(code);  
            };  
// 将两个callback方法进行封装,并生成一个CallbackID传递给Native层  
            callbackID = B.callbackId(success, fail);  
// 通知Native层plugintest扩展插件运行”PluginTestFunction”方法  
            return B.exec(_BARCODE, "PluginTestFunction", [callbackID, Argus1, Argus2, Argus3, Argus4]);  
        },  
同步方法:

同步扩展方法可通过返回值的方式,将Native层扩展插件的运行结果返回给调用该方法的HTML页面。同步方法返回值类型为NSData,传入参数为PGMethod类型。在返回结果较复杂时建议用户使用JSON格式的字符串。

- (NSData*)PluginTestFunctionSync:(PGMethod*)command  
{  
    // 根据传入获取参数  
    NSString* pArgument1 = [command.arguments objectAtIndex:0];  
    NSString* pArgument2 = [command.arguments objectAtIndex:1];  
    NSString* pArgument3 = [command.arguments objectAtIndex:2];  
    NSString* pArgument4 = [command.arguments objectAtIndex:3];  

    // 拼接成字符串  
    NSString* pResultString = [NSString stringWithFormat:@"%@ %@ %@ %@", pArgument1, pArgument2, pArgument3, pArgument4];  

    // 按照字符串方式返回结果  
    return [self resultWithString: pResultString];  
}  

三 关联JS插件名和原生类

开发者在编写扩展插件时需要在JS层定义一个扩展插件的别名,并需要在改方法被调用之前,在H5+基座中注册项两者之间的对应关系。否则5+SDK无法准确的找到Native层的扩展插件。

5+ SDK 提供了两种注册对应关系的方式。
在plist文件中声明对应关系

在编写JS时同时需要修改PandoraAPI.bundle中feature.plist文件,在其中添加JS插件别名和Native插件类的对应关系,SDK基座会根据对应关系查找并生成相应的Native对象并执行对应的方法。

调用PDRCore的接口声明对应关系

开发者还可以通过调用PDRCore提供的设置接口来声明对应关系,该接口不但可以设置JS别名和Native扩展类名之间的关系,还可以注册扩展插件的JS层代码。该声明方法通常在PDRCore初始化后调用。开发者也可以自行决定声明的时机,但是必须在调用该扩展方法的html页面加载之前执行声明。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions  
{  
    PDRCore* core = [PDRCore Instance];  
    // Override point for customization after application launch.  

    //添加一个自定义插件  
    NSError *error = nil;  
    NSString *JSPath = [[NSBundle mainBundle] pathForResource:@"Pandora/apps/H5Plugin/www/js/test-inner" ofType:@"js"];  
    NSString *logPluginJS = [NSString stringWithContentsOfFile:JSPath  
                                                      encoding:NSUTF8StringEncoding  
                                                         error:&error];  

    [core regPluginWithName:@"plugintest" impClassName:@"PGPluginTest" type:PDRExendPluginTypeFrame javaScript:logPluginJS];  

    return YES;  
}                                                                   

四 代码实例

PluginTest.h

//  
//  PluginTest.h  
//  HBuilder-Hello  
//  
//  Created by Mac Pro on 14-9-3.  
//  Copyright (c) 2014年 DCloud. All rights reserved.  
//  

#include "PGPlugin.h"  
#include "PGMethod.h"  
#import <Foundation/Foundation.h>  

@interface PGPluginTest : PGPlugin  

- (void)PluginTestFunction:(PGMethod*)command;  
- (void)PluginTestFunctionArrayArgu:(PGMethod*)command;  

- (NSData*)PluginTestFunctionSync:(PGMethod*)command;  
- (NSData*)PluginTestFunctionSyncArrayArgu:(PGMethod*)command;  
@end  

PluginTest.m

//  
//  PluginTest.m  
//  HBuilder-Hello  
//  
//  Created by Mac Pro on 14-9-3.  
//  Copyright (c) 2014年 DCloud. All rights reserved.  
//  

#import "PluginTest.h"  
@implementation PGPluginTest  

- (void)PluginTestFunction:(PGMethod*)commands  
{  
    if ( commands ) {  

        // CallBackid 异步方法的回调id,H5+ 会根据回调ID通知JS层运行结果成功或者失败  
        NSString* cbId = [commands.arguments objectAtIndex:0];  

        // 用户的参数会在第二个参数传回  
        NSString* pArgument1 = [commands.arguments objectAtIndex:1];  
        NSString* pArgument2 = [commands.arguments objectAtIndex:2];  
        NSString* pArgument3 = [commands.arguments objectAtIndex:3];  
        NSString* pArgument4 = [commands.arguments objectAtIndex:4];  

        // 如果使用Array方式传递参数  
        NSArray* pResultString = [NSArray arrayWithObjects:pArgument1, pArgument2, pArgument3, pArgument4, nil];  

        // 运行Native代码结果和预期相同,调用回调通知JS层运行成功并返回结果  
        PDRPluginResult *result = [PDRPluginResult resultWithStatus:PDRCommandStatusOK messageAsArray: pResultString];  

        // 如果Native代码运行结果和预期不同,需要通过回调通知JS层出现错误,并返回错误提示  
        //PDRPluginResult *result = [PDRPluginResult resultWithStatus:PDRCommandStatusError messageAsString:@"惨了! 出错了! 咋(wu)整(liao)"];  

        // 通知JS层Native层运行正确结果  
        [self toCallback:cbId withReslut:[result toJSONString]];  
    }  
}  

- (void)PluginTestFunctionArrayArgu:(PGMethod*)commands  
{  
    if ( commands ) {  

        // CallBackid 异步方法的回调id,H5+ 会根据回调ID通知JS层运行结果成功或者失败  
        NSString* cbId = [commands.arguments objectAtIndex:0];  

        // 用户的参数会在第二个参数传回,可以按照Array方式传入,  
        NSArray* pArray = [commands.arguments objectAtIndex:1];  

        // 如果使用Array方式传递参数  
        NSString* pResultString = [NSString stringWithFormat:@"%@ %@ %@ %@",[pArray objectAtIndex:0], [pArray objectAtIndex:1], [pArray objectAtIndex:2], [pArray objectAtIndex:3]];  

        // 运行Native代码结果和预期相同,调用回调通知JS层运行成功并返回结果  
        PDRPluginResult *result = [PDRPluginResult resultWithStatus:PDRCommandStatusOK messageAsString:pResultString];  

        // 如果Native代码运行结果和预期不同,需要通过回调通知JS层出现错误,并返回错误提示  
        //PDRPluginResult *result = [PDRPluginResult resultWithStatus:PDRCommandStatusError messageAsString:@"惨了! 出错了! 咋(wu)整(liao)"];  

        // 通知JS层Native层运行结果  
        [self toCallback:cbId withReslut:[result toJSONString]];  
    }  
}  

- (NSData*)PluginTestFunctionSync:(PGMethod*)command  
{  
    // 根据传入获取参数  
    NSString* pArgument1 = [command.arguments objectAtIndex:0];  
    NSString* pArgument2 = [command.arguments objectAtIndex:1];  
    NSString* pArgument3 = [command.arguments objectAtIndex:2];  
    NSString* pArgument4 = [command.arguments objectAtIndex:3];  

    // 拼接成字符串  
    NSString* pResultString = [NSString stringWithFormat:@"%@ %@ %@ %@", pArgument1, pArgument2, pArgument3, pArgument4];  

    // 按照字符串方式返回结果  
    return [self resultWithString: pResultString];  
}  

- (NSData*)PluginTestFunctionSyncArrayArgu:(PGMethod*)command  
{  
    // 根据传入参数获取一个Array,可以从中获取参数  
    NSArray* pArray = [command.arguments objectAtIndex:0];  

    // 创建一个作为返回值的NSDictionary  
    NSDictionary* pResultDic = [NSDictionary dictionaryWithObjects:pArray forKeys:[NSArray arrayWithObjects:@"RetArgu1",@"RetArgu2",@"RetArgu3", @"RetArgu4", nil]];  

    // 返回类型为JSON,JS层在取值是需要按照JSON进行获取  
    return [self resultWithJSON: pResultDic];  
}  

@end  

iOS平台插件开发API:

PDRPlugin

扩展插件的基类,开发者编写的插件需要继承自此类。

常用方法:
(void)toCallback:(NSString *)callbackId withReslut:(NSString *)message  

调用JS层回调函数。

扩展API原型
同步方法:

开发者需要实现同步方法需要实现此方法,如有JS层需要返回值,需要从方法的返回值返回。

(NSData*)syncMethodName:(PGMethod *)command  
异步方法:

开发者需要实现的异步方法需要实现此方法,如有JS层需要通知运行结果和返回值可以调用 “toCallback”方法通知JS层运行结果。

(void)asyncMethodName:(PGMethod *)command  
同步方法返回值处理方法:
(NSData* ) resultWithInt:(int)value  
(NSData* ) resultWithJSON:(int)value  

PDRMethod

扩展插件方法传入的参数,扩展插件定义的方法需要使用此类传入参数  

属性:
NSArray* arguments 字符串数组,根据JS层参数的传入顺序获取传递的参数。

PDRPluginResult

扩展插件的异步调用方法返回值处理类,开发者可使用此类快速将要返回的结果格式化。
返回值类型:
boolea类型: resultWithStatus:OK messageAsInt:1 );
Number类型: resultWithStatus:OK messageAsInt:99 );
String类型: resultWithStatus:OK messageAsString:@"hello" );
数组类型: resultWithStatus:OK messageAsArray:[@"123",@"456",nill] );
JSON类型: resultWithStatus:OK messageAsDictionary:{@"name":@"value"} );
示例:

PDRPluginResult *result = [PDRPluginResult resultWithStatus:PDRCommandStatusOK messageAsString:@"123123"];  
[self toCallback:cbId withReslut:[result toJSONString]];  

PDRCore

HTML5+基座的管理类,可以用来设置下载目录,文档目录,和添加扩展插件的关联
常用方法:

- (int)regPluginWithName:(NSString*)pluginName  impClassName:(NSString*)impClassName  
                    type:(PDRExendPluginType)pluginType  javaScript:(NSString*)javaScript;  

参数说明:
pluginName: 插件名称JS文件中定义的名字
impClassName: 插件对应的实现类名
pluginType: 插件类型
javaScript js: 实现 为javascript文本

术语字典

JS Plugin Bridge: H5+ Plugin Bridge层JS部分API,用户通过调用相应的API触发Native层扩展插件相应方法的调用。
Native Plugin Bridge: H5+ Plugin Bridge层Native部分API,开发者通过实现接口类方法,实现由JS层触发Native层扩展插件逻辑。开发者调用API实现Native扩展方法运行结果得返回。
Native层插件:开发者使用原生语言实现的5+扩展插件,可被JS层通知调用。
插件类别名:JS层字符串,用来声明JS方法和Native层插件的对应关系

Android平台开发第三方插件请参考

Android平台第三方插件开发指导

5 关注 分享
可怜的光头强 黄小昆 五块钱的果汁 小码哥 Neil_HL

要回复文章请先登录注册

416905402@qq.com

416905402@qq.com

ios的sdk包里面没有HBuilder-plugin哇
2019-07-11 10:39
zgy

zgy

只能jS调原生? JS调原生还需要搞这么复杂吗,垃圾
2019-05-21 14:50
1498522607@qq.com

1498522607@qq.com

官方的DEMO能跑起来么?我跑了都没发现调用PluginTest里面的方法
2019-05-15 14:23
569249460@qq.com

569249460@qq.com

回复 SDK_骁骑:
插件首先要集成PGPlugin类, 请问这句话具体到代码上是什么形式呢?看不太明白哈,麻烦您了
2018-09-27 10:28
cloudkg@163.com

cloudkg@163.com

自定义继承PGPlugin类中定义了一个@property (nonatomic,strong) NSMutableDictionary *callbackIds;用来存着pcbid,使用的时候一直闪退。大致是undefine .symbol$CoreLocation..怎么解决吗
2018-09-04 10:42
喵喵喵007

喵喵喵007

回复 lk@4spc.us:
请问您解决了吗?我现在也遇到这个问题了
2018-08-10 22:47
lk@4spc.us

lk@4spc.us

Swift的类能找到但是一直提示方法不存在, 怎么破?? 错误信息:ERROR: Method 'test:' not defined in Plugin 'xxx'
2018-05-06 18:44
505744817@qq.com

505744817@qq.com

回复 黄小昆:
这位兄弟,这么怎么解决的、???我也是报这个
2018-05-02 16:21
1667430788@qq.com

1667430788@qq.com

这文档写的~~~~ 没什么人用是有道理的
2018-04-24 17:41
_UIButton_

_UIButton_

Hbuilder项目集成阿里云推送有做过的吗?ios
2018-01-31 11:09
SDK_骁骑

SDK_骁骑

回复 ccjuice:
扩展插件的同步方法和异步方法的参数和返回值是固定的这个需要注意下,如果还不行你可以上传下你插件的原生代码,js代码 和festure.plist文件我帮你看下
2017-10-23 17:19
ccjuice

ccjuice

回复 SDK_骁骑:
安卓可以,ios调用三方插件方法失败,manifest里的配置和方法接口名称等的对应都注意了,传递的参数时array类型还是字符串类型也注意了,请问还有别的方面的问题没有。
2017-10-22 15:48
SDK_骁骑

SDK_骁骑

回复 deqiutseng:
插件首先要集成PGPlugin类,
继承方法后可以在插件的方法里通过self.rootViewController获取到当前5+运行的viewcontroller
2017-10-20 15:55
chendalinsky@qq.com

chendalinsky@qq.com

回复 deqiutseng:
同问
2017-10-19 02:49
deqiutseng

deqiutseng

在iOS 项目 HBuilder-Integrate 基础上增加了第三方SDK的插件,第三方SDK的插件是使用原生 UIViewController的展现方式。现需要在插件Native方法中进行 pushViewController 或 presentViewController 到 第三方SDK的插件UI 改怎么做呢?查了http://www.dcloud.io/docs/sdk/ios/index.html SDK相关的方档也没有相关的接口
2017-09-06 14:23
oml@qq.com

oml@qq.com

回复 leotsai:
不是的,是XCODE的NATIVE->调用H5->回调NATIVE的函数,方式,不是大家理解的插件化概念,所以叫基座
2017-08-02 11:54
782231328@qq.com

782231328@qq.com

回复 黄小昆:
请问后来是如何解决这个问题的?
2017-06-01 13:48
823750071@qq.com

823750071@qq.com

HBuilder-plugin SDK 包里没有这个工程呢?
2017-05-05 16:28
chuyin

chuyin

插件按照你们的示例写好了权限描述"Geolocation": { "description": "访问位置信息" },可是呢用你们的在线云打包,生成的iOS中的iofo.plist文件权限说明里边NSLocationWhenInUseUsageDescription描述说明,根本不是这个描述,描述仅仅成了一个location英文单词,怎么回事?
2017-04-15 09:17
SDK_骁骑

SDK_骁骑

回复 leotsai:
这个库文件是要编译到原生工程里的不是放到www目录下,扩展插件暂时只能使用本地打包
2017-02-04 15:23
leotsai

leotsai

我把这篇文章看了几遍,有几个问题。
1. 我编写完插件后,是不是在xcode下编译产生一个库文件,然后需要把这个库文件放在我的www项目中的某个文件下面,然后在APP启动的时候,plus会根据反射机制找到我的自定义插件,同时跟JavaScript中的函数关联。也就是说插件写完之后,就不再需要在xcode下写代码了?
2017-01-24 10:33
SDK_骁骑

SDK_骁骑

可以多次回调 IOS PDRPluginResul有keepcallback属性,设置为true可以多次回调
android的JSUtil.execCallback(IWebview pWebViewImpl, java.lang.String pCallbackId, JSONArray pMessage, int pStatus, boolean pKeepCallback)最后一个参数表示是否可以多次回调
http://www.dcloud.io/docs/sdk/android/
2016-12-27 12:09
飛錛

飛錛

回复 SDK_骁骑:
toCallback的回调,能多次调用么? 安卓版的可以设置多次回调
2016-12-27 11:22
飛錛

飛錛

回复 骇浪:
请问你有没有这个方法?能否求教下如何解决
2016-12-27 11:21
Arliang

Arliang

回复 505008972@qq.com:
http://ask.dcloud.net.cn/article/103

ios-20161212-swift中的PandoraApi.bundle包有错,需要用obj-c版的替换一下

还有一个坑就是:message不能是String

```
let resultInt32 = PDRPluginResult(status: PDRCommandStatusOK, messageAs: 123 as Int32)
let resultString = PDRPluginResult(status: PDRCommandStatusOK, messageAs: "123 as Int32")
let resultDouble = PDRPluginResult(status: PDRCommandStatusOK, messageAs: 123 as Double)
let resultDic = PDRPluginResult(status: PDRCommandStatusOK, messageAs: ["A": "B"])

resultInt32.toJSONString() "{\"status\":1,\"message\":123,\"keepCallback\":false}"
resultString.toJSONString() (null)
resultDouble.toJSONString() "{\"status\":1,\"message\":123,\"keepCallback\":false}"
resultDic.toJSONString() "{\"status\":1,\"message\":{\"status\":1},\"keepCallback\":false}"
```
2016-12-17 21:17
li73035@163.com

li73035@163.com

回复 SDK_骁骑:
明白了,谢谢您的帮助
2016-09-13 14:06
SDK_骁骑

SDK_骁骑

回复 li73035@163.com:
需要把5+的SDK集成到你现有的原生工程里,然后将前端开发的资源也集成到你原生的工程里
具体的步骤可以参考SDK里带的白皮书
2016-09-13 12:06
li73035@163.com

li73035@163.com

开发的项目直接放到下载SDK实例里面,然后打包就可以吗?还是iOS需要创建新的项目,把SDK集成到里面,然后把前端开发的资源也集成进来,在打包?
2016-09-13 10:05
七月羽歌

七月羽歌

没mac
2016-07-26 10:05
Lessy

Lessy

请求来一个swift的, oc不怎么懂啊
2016-04-21 18:59
骇浪

骇浪

toCallback的回调,能多次调用么? 安卓版的可以设置多次回调
2016-03-16 17:13
hum

hum

不支持swift,就是耍流氓。
2016-03-15 10:52
黄小昆

黄小昆

万份感谢DCloud_HB_骁骑 盐罐里的糖 第一步终于迈出去了
2016-02-19 15:55
黄小昆

黄小昆

按照上面的写了 跑的时候报了打包时未添加plugin test模块 请问是什么问题啊 ?
2016-02-19 10:57
inu1255

inu1255

写得没条理,好在有代码
2016-01-14 19:41
liting

liting

可以使用swift吗?有demo吗?
2015-11-26 15:15
落幕青

落幕青

已经成功集成了,非常感谢盐罐里的糖->http://lmq4930.blog.51cto.com/3208925/1713378
2015-11-17 10:37
SDK_骁骑

SDK_骁骑

回复 _Zoe:
需要注意一下几个地方,也可以在safari里调试页面查看下JS代码是否有不对的地方
1 JS插件名和原生类的对应是否已经配置到plist里
2 扩展插件的调用是否在JS层的plusready事件以后调用的
2015-11-10 14:45
_Zoe

_Zoe

按教程配置了,始终没有调起Native层执行是怎么回事,哪儿还需要配置吗?
2015-11-09 11:33
执着追求

执着追求

求Swift版本 新学的开发都是基于Swift的 期待下
2015-10-03 22:15
飞忘录

飞忘录

无需编程、无需设计、无需开发、无需外包,任何人都可以通过叮当创意生成自己的原生APP
2015-04-17 15:33
lou

lou

开发插件:文档上要添加一个自定义插件,示例又不需要,大哥们,要闹哪样啊
2015-04-16 16:23
rlee

rlee

新人一个,期待在swift下使用示例,只是不想学OC
2015-03-24 14:14
水中鱼

水中鱼

文档内容和IOS平台离线打包SDK对应的代码并不一致,怎么办,以哪个为准?请帮忙提供最新的文档或离线打包SDK例程
2014-10-13 22:00