谢谢DCloud_SDK的回复。
我的PluginTest.m文件是拷贝自Builder-Integrate(20170620版本)的。具体代码如下:
import "PluginTest.h"
import "PDRCoreAppFrame.h"
import "H5WEEngineExport.h"
import "PDRToolSystemEx.h"
import
@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];
// 用户的参数会在第二个参数传回
NSStringpArgument1 = [commands.arguments objectAtIndex:1];
NSString pArgument2 = [commands.arguments objectAtIndex:2];
NSStringpArgument3 = [commands.arguments objectAtIndex:3];
NSString pArgument4 = [commands.arguments objectAtIndex:4];
// 如果使用Array方式传递参数
NSArraypResultString = [NSArray arrayWithObjects:pArgument1, pArgument2, pArgument3, pArgument4, nil];
// 运行Native代码结果和预期相同,调用回调通知JS层运行成功并返回结果
// PDRCommandStatusOK 表示触发JS层成功回调方法
// PDRCommandStatusError 表示触发JS层错误回调方法
// 如果方法需要持续触发页面回调,可以通过修改 PDRPluginResult 对象的keepCallback 属性值来表示当前是否可重复回调, true 表示可以重复回调 false 表示不可重复回调 默认值为false
PDRPluginResultresult = [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方式传入,
NSArraypArray = [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层出现错误,并返回错误提示
//PDRPluginResultresult = [PDRPluginResult resultWithStatus:PDRCommandStatusError messageAsString:@"惨了! 出错了! 咋(wu)整(liao)"];
// 通知JS层Native层运行结果,JS Pluginbridge会根据cbid找到对应的回调方法并触发
[self toCallback:cbId withReslut:[result toJSONString]];
}
}
(NSData)PluginTestFunctionSync:(PGMethod)command
{
// 根据传入获取参数
// NSStringpArgument1 = [command.arguments objectAtIndex:0];
// NSString pArgument4 = [command.arguments objectAtIndex:3];
NSString vendorID1 = [[UIDevice currentDevice].identifierForVendor UUIDString];
// NSStringadID = [[ASIdentifierManager sharedManager].advertisingIdentifier UUIDString];
NSString vendorID2 = (NSString)[PGPluginTest getIDFV];
NSString xxteaKey = @"xxxxxx_xxxx_xxxx";
NSStringcipheredString = (NSString )[PGPluginTest encryptXXTEA:vendorID1 withKey:xxteaKey];
// 拼接成字符串
NSString pResultString = [NSString stringWithFormat:@"%@ %@ %@ %@",vendorID1, vendorID2, xxteaKey, cipheredString];
// 按照字符串方式返回结果
return [self resultWithString: pResultString];
}
(NSData)PluginTestFunctionSyncArrayArgu:(PGMethod)command
{
// 根据传入参数获取一个Array,可以从中获取参数
NSArraypArray = [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
@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文件吗?
本文介绍了在HTML5中添加自定义插件时,遇到iOS打包错误283的问题。详细展示了PluginTest.m和PluginTest.h的代码实现,包括插件方法的监听和回调。在尝试打包时,尽管模拟器运行正常,但在真机上运行报错。文章最后提出了如何创建可重现问题的demo并询问了上传ipa文件的正确步骤。
962

被折叠的 条评论
为什么被折叠?



