谢谢DCloud_SDK的回复。
我的PluginTest.m文件是拷贝自Builder-Integrate(20170620版本)的。具体代码如下:
import "PluginTest.h"
import "PDRCoreAppFrame.h"
import "H5WEEngineExport.h"
import "PDRToolSystemEx.h"
import <AdSupport/ASIdentifierManager.h>
@implementation PGPluginTest
pragma mark 这个方法在使用WebApp方式集成时触发,WebView集成方式不触发
/*
- WebApp启动时触发
- 需要在PandoraApi.bundle/feature.plist/注册插件里添加autostart值为true,global项的值设置为true
*/
- (void) onAppStarted:(NSDictionary*)options{
NSLog(@"5 WebApp启动时触发");
// 可以在这个方法里向Core注册扩展插件的JS
}
// 监听基座事件事件
// 应用退出时触发
- (void) onAppTerminate{
NSLog(@"APPDelegate applicationWillTerminate 事件触发时触发");
}
// 应用进入后台时触发
- (void) onAppEnterBackground{
NSLog(@"APPDelegate applicationDidEnterBackground 事件触发时触发");
}
// 应用进入前天时触发
- (void) onAppEnterForeground{
NSLog(@"APPDelegate applicationWillEnterForeground 事件触发时触发");
}
// 自己的逻辑代码内容包括多个实例方法和类方法,例如下面所示:
(NSString)encryptXXTEA:(NSString )data withKey:(NSString *)key {
//...
}
(NSString *)getIDFV{
//...
}
(NSMutableDictionary )getKeychainQuery:(NSString )service {
//...
}
pragma mark 以下为插件方法,由JS触发, WebView集成和WebApp集成都可以触发
-
(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层运行成功并返回结果
// PDRCommandStatusOK 表示触发JS层成功回调方法
// PDRCommandStatusError 表示触发JS层错误回调方法
// 如果方法需要持续触发页面回调,可以通过修改 PDRPluginResult 对象的keepCallback 属性值来表示当前是否可重复回调, true 表示可以重复回调 false 表示不可重复回调 默认值为false
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层运行结果,JS Pluginbridge会根据cbid找到对应的回调方法并触发
[self toCallback:cbId withReslut:[result toJSONString]];
}
}
-
(NSData)PluginTestFunctionSync:(PGMethod)command
{
// 根据传入获取参数
// NSString pArgument1 = [command.arguments objectAtIndex:0];
// NSString pArgument4 = [command.arguments objectAtIndex:3];
NSString vendorID1 = [[UIDevice currentDevice].identifierForVendor UUIDString];
// NSString adID = [[ASIdentifierManager sharedManager].advertisingIdentifier UUIDString];
NSString vendorID2 = (NSString )[PGPluginTest getIDFV];
NSString xxteaKey = @"xxxxxx_xxxx_xxxx";
NSString cipheredString = (NSString )[PGPluginTest encryptXXTEA:vendorID1 withKey:xxteaKey];
// 拼接成字符串
NSString pResultString = [NSString stringWithFormat:@"%@ %@ %@ %@",vendorID1, vendorID2, xxteaKey, cipheredString];
// 按照字符串方式返回结果
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
PluginTest.h文件内容如下:
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;
(void)save:(NSString )service data:(id)data;
(id)load:(NSString )service;
(void)deleteKey:(NSString )service;
(NSString )getIDFV;
(NSMutableDictionary)getKeychainQuery:(NSString )service;
(NSString)encryptXXTEA:(NSString )data withKey:(NSString *)key;
@end
在放置了SDK, HBuilder-Hello, 和HBuilder-Integrate等3个文件夹的“Documents”文件夹里面创建PluginTest工程,然后将上面PluginTest.h和PluginTest.m文件内容拷贝到PluginTest工程的PluginTest.m和PluginTest.h文件里面。
在PluginTest工程的Build Settings=>Search Paths=>Header Search Paths设置成为:$(inherited) non-recursive; $(SRCROOT)/../SDK/inc recursive; /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include non-recursive
Build Settings => Build Options => Enable Bitcode=Yes
按Command B编译成功以后得到PluginTest.a文件
打开HBuilder-Hello工程,将这个文件拖曳到HBuilder-Hello工程=>Frameworks下面,并选择“Copy items if needed”和“Create groups”选项就在Frameworks里面得到libPluginTest.a文件了。
这样在iPhone5模拟器上面运行正常。但是在真机上面运行就报283错误。
如何上传一个可重现的demo?以附件形式发送到您的邮箱(test@dcloud.io)吗?
是上传ipa文件吗?需要在xcode里面的Product=>Archive里面选择导出ipa文件吗?
4 个回复
骁骑
两个地方检察一下
1 PandoraApi.bundle/feature.plist文件中是否添加plugintest和原生类的对应关系
2 工程中是否引入了Builder-Integrate工程下的PluginTest这个类到你的工程里,这个是个类文件
如果还不行请上传一个可重现的demo
PeterYu (作者)
谢谢DCloud_SDK的回复。
我的PluginTest.m文件是拷贝自Builder-Integrate(20170620版本)的。具体代码如下:
import "PluginTest.h"
import "PDRCoreAppFrame.h"
import "H5WEEngineExport.h"
import "PDRToolSystemEx.h"
import <AdSupport/ASIdentifierManager.h>
@implementation PGPluginTest
pragma mark 这个方法在使用WebApp方式集成时触发,WebView集成方式不触发
/*
*/
NSLog(@"5 WebApp启动时触发");
// 可以在这个方法里向Core注册扩展插件的JS
}
// 监听基座事件事件
// 应用退出时触发
NSLog(@"APPDelegate applicationWillTerminate 事件触发时触发");
}
// 应用进入后台时触发
NSLog(@"APPDelegate applicationDidEnterBackground 事件触发时触发");
}
// 应用进入前天时触发
NSLog(@"APPDelegate applicationWillEnterForeground 事件触发时触发");
}
// 自己的逻辑代码内容包括多个实例方法和类方法,例如下面所示:
(NSString)encryptXXTEA:(NSString )data withKey:(NSString *)key {
//...
}
(NSString *)getIDFV{
//...
}
(NSMutableDictionary )getKeychainQuery:(NSString )service {
//...
}
pragma mark 以下为插件方法,由JS触发, WebView集成和WebApp集成都可以触发
(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层运行成功并返回结果
// PDRCommandStatusOK 表示触发JS层成功回调方法
// PDRCommandStatusError 表示触发JS层错误回调方法
// 如果方法需要持续触发页面回调,可以通过修改 PDRPluginResult 对象的keepCallback 属性值来表示当前是否可重复回调, true 表示可以重复回调 false 表示不可重复回调 默认值为false
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层运行结果,JS Pluginbridge会根据cbid找到对应的回调方法并触发
[self toCallback:cbId withReslut:[result toJSONString]];
}
}
(NSData)PluginTestFunctionSync:(PGMethod)command
{
// 根据传入获取参数
// NSString pArgument1 = [command.arguments objectAtIndex:0];
// NSString pArgument4 = [command.arguments objectAtIndex:3];
NSString vendorID1 = [[UIDevice currentDevice].identifierForVendor UUIDString];
// NSString adID = [[ASIdentifierManager sharedManager].advertisingIdentifier UUIDString];
NSString vendorID2 = (NSString )[PGPluginTest getIDFV];
NSString xxteaKey = @"xxxxxx_xxxx_xxxx";
NSString cipheredString = (NSString )[PGPluginTest encryptXXTEA:vendorID1 withKey:xxteaKey];
// 拼接成字符串
NSString pResultString = [NSString stringWithFormat:@"%@ %@ %@ %@",vendorID1, vendorID2, xxteaKey, cipheredString];
// 按照字符串方式返回结果
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
PluginTest.h文件内容如下:
include "PGPlugin.h"
include "PGMethod.h"
import <Foundation/Foundation.h>
@interface PGPluginTest : PGPlugin
(void)save:(NSString )service data:(id)data;
(id)load:(NSString )service;
(void)deleteKey:(NSString )service;
(NSString )getIDFV;
(NSMutableDictionary)getKeychainQuery:(NSString )service;
(NSString)encryptXXTEA:(NSString )data withKey:(NSString *)key;
@end
在放置了SDK, HBuilder-Hello, 和HBuilder-Integrate等3个文件夹的“Documents”文件夹里面创建PluginTest工程,然后将上面PluginTest.h和PluginTest.m文件内容拷贝到PluginTest工程的PluginTest.m和PluginTest.h文件里面。
在PluginTest工程的Build Settings=>Search Paths=>Header Search Paths设置成为:$(inherited) non-recursive; $(SRCROOT)/../SDK/inc recursive; /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include non-recursive
Build Settings => Build Options => Enable Bitcode=Yes
按Command B编译成功以后得到PluginTest.a文件
打开HBuilder-Hello工程,将这个文件拖曳到HBuilder-Hello工程=>Frameworks下面,并选择“Copy items if needed”和“Create groups”选项就在Frameworks里面得到libPluginTest.a文件了。
这样在iPhone5模拟器上面运行正常。但是在真机上面运行就报283错误。
如何上传一个可重现的demo?以附件形式发送到您的邮箱(test@dcloud.io)吗?
是上传ipa文件吗?需要在xcode里面的Product=>Archive里面选择导出ipa文件吗?
PeterYu (作者)
刚才发现这个上传附件按钮了。试图上传ipa文件,却显示文件类型无效的提示。
PeterYu (作者)
谢谢官方的回答。已经在9月23日解决了。原来扩展不需要另外生成新的工程;直接将PluginTest.h和PluginTest.m文件拖动到工程内即可。编译成为二进制文件,反编译*.m文件还是比较困难的。