PeterYu
PeterYu
  • 发布:2017-09-21 12:15
  • 更新:2017-12-27 17:34
  • 阅读:4099

iOS打包时显示:HTML5+Runtime打包时未添加plugintest模块,请参考283

分类:HBuilder

你好,HBuilder:

这2天为1个问题已经花费了2天时间了。

我使用离线打包在Android上面已经成功将plugin打到离线包里面。运行正常。

但是使用同样业务逻辑代码打iOS包;在iPhone5模拟器上面运行正常,也能够从js层调用到objective-C层返回的所有输出字符串。但是无法在真机上面运行。2天来,总是显示HTML5+Runtime打包时未添加plugintest模块,请参考283。

已经尝试过的方案包括:
1、将PluginTest工程名称修改成为plugintest工程名称,这样得到的libplugintest.a文件就都是小写字母的。但是这样在真机上面还是显示283。因此这个应该是与大小写没有关系的吧?
2、检查PluginTest工程和HBuilder-Hello工程的Build Settings => Enable Bitcode => 全部设置为Yes;还是一样。
3、在HBuilder-Hello工程PandoraApi.bundle => feature.plist => Root => plugintest 设置为:class = String PGPluginTest, global = NO, autostart = NO
4、在manifest.json文件里面添加权限”plugintest”:{“description”:”H5plus Plugin Demo2”}
5、Build Settings => Other Linker Flags => 添加-libPluginTest则报错

下面官网文档阅读多次,也不知道如何解决这个问题。
IOS平台第三方插件开发指导http://ask.dcloud.net.cn/article/67
IOS平台以WebView方式集成HTML5+SDK方法http://ask.dcloud.net.cn/article/83
IOS离线打包http://ask.dcloud.net.cn/article/41

有谁知道这个是什么问题?有什么HBuilder底层逻辑在真机里面运行,但是在模拟机里面没有的吗?

今天是2017年9月21日

2017-09-21 12:15 负责人:无 分享
已邀请:
骁骑

骁骑

两个地方检察一下
1 PandoraApi.bundle/feature.plist文件中是否添加plugintest和原生类的对应关系
2 工程中是否引入了Builder-Integrate工程下的PluginTest这个类到你的工程里,这个是个类文件

如果还不行请上传一个可重现的demo

PeterYu

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集成方式不触发

/*

  • 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文件吗?

PeterYu

PeterYu (作者)

刚才发现这个上传附件按钮了。试图上传ipa文件,却显示文件类型无效的提示。

PeterYu

PeterYu (作者)

谢谢官方的回答。已经在9月23日解决了。原来扩展不需要另外生成新的工程;直接将PluginTest.h和PluginTest.m文件拖动到工程内即可。编译成为二进制文件,反编译*.m文件还是比较困难的。

该问题目前已经被锁定, 无法添加新回复