Skip to content

FAQ ANDROID

1. Perguntas frequentemente feitas ao integrar

1.1 Qual é a configuração mínima de ambiente necessária para integrar o SDK?

R: A integração SDK requer Android SDK versão 19 (Android 4.4) E acima.

1.2 Quais são as etapas de integração de especificação?

A: Por favor, consulte o SDK integration documentation

1.3 Preciso configurar regras de ofuscação para integrar -se ao SDK?

R: é necessária a configuração e as regras de confusão são as segue.

bash
-keep class com.finogeeks.** {*;}

1.4 Quais são os parâmetros que devem ser configurados ao inicializar o SDK?

R: Pelo menos chave SDK, SDK Secret, endereço do servidor, interface do servidor Solicitar o prefixo de roteamento, o método de criptografia precisa ser passado quando Inicializando o SDK e os parâmetros de configuração são passados ​​em através do FinAppConfig Instância. Antes do verso 2.13.102 , O SDK só suporta a configuração de uma mensagem de servidor e só podia abrir applets em um único ambiente, como segue.

java
FinAppConfig config = new FinAppConfig.Builder()
 .setSdkKey(BuildConfig.SDK_KEY) // SDK Key, issued by the platform after the successful addition of a collaborative application
 .setSdkSecret(BuildConfig.APP_SECRET) // SDK Secret, issued by the platform after adding a successful collaborative application
 .setApiUrl(BuildConfig.API_URL) // Server address
 .setApiPrefix(BuildConfig.API_PREFIX) // Server interface request routing prefix
 .setEncryptionType(ENCRYPTION_TYPE_SM) // encryption method, national:SM, md5: MD5
 .build();

Inscreva -se no projeto DEEPL. Visite www.deepl.com/profors Mais informações. Da versão 2.13.102 Em diante, ele suporta a configuração de Múltiplas informações do servidor, alivando a abertura simultânea de Appletos em diferentes ambientes, como segue.

java
// Collection of server information
List< FinStoreConfig> storeConfigs = new ArrayList<>();
// Information on Server 1
FinStoreConfig storeConfig1 = new FinStoreConfig(
  "SDK Key Information" , // SDK Key
  "SDK Secret information" , // SDK Secret
  "Address of server 1" , // Server address
  "Server 1's data upload server address" , // the address of the data upload server
  "/api/v1/mop/" , // Server interface request routing prefix
  "" ,
  "encryption method"  // encryption method, national:SM, md5: MD5
);
storeConfigs.add(storeConfig1);
// Information on Server 2
FinStoreConfig storeConfig2 = new FinStoreConfig(
  "SDK Key Information" , // SDK Key
  "SDK Secret information" , // SDK Secret
  "Address of server 2" , // Server address
  "Server 2's data upload server address" , // the address of the data upload server
  "/api/v1/mop/" , // Server interface request routing prefix
  "" ,
  "encryption method"  // encryption method, national:SM, md5: MD5
);
storeConfigs.add(storeConfig2);
FinAppConfig config = new FinAppConfig.Builder()
 .setFinStoreConfigs(storeConfigs) // A collection of server information
 .build();

1.5 Quais parâmetros estão opcionalmente configurados ao inicializar o SDK?

R: Além dos parâmetros mandáticos mencionados acima, todos os outros Os parâmetros são configurados contabilidade para sua própria escolha, principalmente Incluindo configuração da interface do usuário e configuração da regra de liberação de escala de cinza. A configuração da interface do usuário é a seguinte.

java
// UI configuration
FinAppConfig.UIConfig uiConfig = new FinAppConfig.UIConfig();
// Whether to hide the top right corner close button
uiConfig.setHideNavigationBarCloseButton(false);
// Whether to hide the  "Forward"  button in the  "More"  menu
uiConfig.setHideForwardMenu(false);
// Whether to hide  "Feedback & Complaints"  in the More menu
uiConfig.setHideFeedbackAndComplaints(false);
// Whether to hide the  "Back to Home"  button in the navigation bar
uiConfig.setHideBackHome(false);
// Whether the back button is always displayed when the navigation bar is the default navigation bar
uiConfig.setAlwaysShowBackInDefaultNavigationBar(false);
// Navigation bar title text style
uiConfig.setNavigationBarTitleTextAppearance(R.style.TextAppearance_AppCompat);
// Gravity of the navigation bar title relative to the parent control
uiConfig.setNavigationBarTitleTextLayoutGravity(Gravity.CENTER);
// Whether to clear the background of the navigation buttons in the navigation bar
uiConfig.setClearNavigationBarNavButtonBackground(true);
//  "More"  menu style
uiConfig.setMoreMenuStyle(UIConfig.MORE_MENU_DEFAULT);
// Capsule button configuration
uiConfig.setCapsuleConfig(new CapsuleConfig());

As extensões de relatórios de dados da APM são as seguintes.

java
// APM data reporting extended information
Map< String, Object> apmExtendInfo = new HashMap<>();
apmExtendInfo.put( "key1" ,  "value1" );
apmExtendInfo.put( "key2" ,  "value2" );

Os parâmetros opcionais são passados ​​para o SDK via FinAppConfig
Instância junto com os parâmetros mandáticos da seguinte forma.

java
// UI configuration
FinAppConfig.UIConfig uiConfig = new FinAppConfig.UIConfig();
// Whether to hide the top right corner close button
uiConfig.setHideNavigationBarCloseButton(false);
// Whether to hide the  "Forward"  button in the  "More"  menu
uiConfig.setHideForwardMenu(false);
// Whether to hide the  "Settings"  button in the  "More"  menu
uiConfig.setHideSettingMenu(false);
// Whether to hide  "Feedback & Complaints"  in the More menu
uiConfig.setHideFeedbackAndComplaints(false);
// Whether to hide the  "Back to Home"  button in the navigation bar
uiConfig.setHideBackHome(false);
// Whether the back button is always displayed when the navigation bar is the default navigation bar
uiConfig.setAlwaysShowBackInDefaultNavigationBar(false);
// Navigation bar title text style
uiConfig.setNavigationBarTitleTextAppearance(R.style.TextAppearance_AppCompat);
// Gravity of the navigation bar title relative to the parent control
uiConfig.setNavigationBarTitleTextLayoutGravity(Gravity.CENTER);
// Whether to clear the background of the navigation buttons in the navigation bar
uiConfig.setClearNavigationBarNavButtonBackground(true);
//  "More"  menu style
uiConfig.setMoreMenuStyle(UIConfig.MORE_MENU_DEFAULT);
// Capsule button configuration
uiConfig.setCapsuleConfig(new CapsuleConfig());
// APM data reporting extended information
Map< String, Object> apmExtendInfo = new HashMap<>();
apmExtendInfo.put( "key1" ,  "value1" );
apmExtendInfo.put( "key2" ,  "value2" );
// Domains where cookies need to be removed
List< String> needToRemoveCookiesDomains = new ArrayList<>();
needToRemoveCookiesDomains.add( "https://aaa.bbb.ccc" );
FinAppConfig config = new FinAppConfig.Builder()
 .setSdkKey(BuildConfig.SDK_KEY) // SDK Key, issued by the platform after the successful addition of a collaborative application
 .setSdkSecret(BuildConfig.APP_SECRET) // SDK Secret, issued by the platform after adding a successful collaborative application
 .setApiUrl(BuildConfig.API_URL) // Server address
 .setApiPrefix(BuildConfig.API_PREFIX) // Server interface request routing prefix
 .setDebugMode(BuildConfig.DEBUG) // Whether the application is currently in Debug mode
 .setUiConfig(uiConfig) // UI configuration
 .setApmExtendInfo(apmExtendInfo) // APM data upload extension information 
 .setEncryptionType(ENCRYPTION_TYPE_SM) // encryption method, national:SM, md5: MD5
 .setDisableRequestPermissions(true) // disable requesting runtime permissions, not by default
 .setAppletAutoAuthorize(false) // whether to enable automatic granting of applet Scope permissions, not enabled by default
 .setNeedToRemoveCookiesDomains(needToRemoveCookiesDomains) // Domains from which cookies need to be removed
 .setDisableTbs(true) // whether to disable the Tbs SDK, not by default
 .setCustomWebViewUserAgent( "aaa/111; bbb" ) // Custom WebView UserAgent
 .setAppletIntervalUpdateLimit(6) // Timed batch update of the number of applets
 .setForegroundServiceConfig(new FinAppConfig.ForegroundServiceConfig(true, R.drawable.ic_launcher,  "applet is running" ,  "" )) // Whether to launch foreground services when the applet is running in the foreground
 .setBindAppletWithMainProcess(true) // The applet is bound to the app process, the app is killed, whether the applet is closed simultaneously, default is false
 .setWebViewMixedContentMode(MIXED_CONTENT_ALWAYS_ALLOW) // Set WebView mixed content mode
 .setAppletText( "X app" ) // Replace the  "applet"  text in the SDK with  "X app" 
 .setEnableApmDataCompression(true) // whether to compress data when reporting data, default is no compression
 .setDisableGetSuperviseInfo(true) // Whether to disable calls to the applet API for getting supervise information, default no
 .setUserId( "UserId" ) // Set the user ID
 .build();

1.6 Existe algo em particular que precisava ao inicializar o SDK?

R: O SDK é implementado usando um multi-Mecanismo de processo, com cada Applet em execução em um processo de seção, ou seja, um applet corresponde a Um processo. Ao inicializar o SDK, um ponto a ser observado em particular é que o processo de applet não precisa executar nenhuma iniciativa Operações quando é criado, evento se a inicialização do applet O SDK não é realizado no processo de applet. Por exemplo, se o aplicativo usa algum terceiro-Bibliotecas de festas isso Precisa ser inicializado quando o aplicativo é iniciado, então quando o A inicialização é realizada em Application , Apenas o processo atual Precisa inicializar o terceiro-Bibliotecas de festas se for o host Processo, o processo de applet não precisa inicializar Bibliotecas. Antes, antes de inicializar o SDK, certifique -se de determinar qual Processar o processo atual é, se for um processo de applet e não Precisa lidar com cruzamento-Chamada de processo Interfaces ou register api in applet process , Nenhuma ação será tomada :.

java
/**
 * Application of {@link android.app.}
 */
public class AppletApplication extends MultiDexApplication {
 
 @Override
 public void onCreate() {
 super.onCreate();
 // The code to determine if it is an applet process is placed at the top
 if (FinAppClient.INSTANCE.isFinAppProcess(this)) {
 return;
 }
 // Other codes to follow
 ................................................
 ................................................
 }
}

1.7 Como resolvo um problema de conflito de dependência ao integrar?

Um terceiro-Bibliotecas de festas em que o Applet Android SDK confia

groovy
// appcompat-v7
implementation  "com.android.support:appcompat-v7:23.0.0" 

// support-v4
implementation  "com.android.support:support-v4:23.0.0" 

// Recyclerview
implementation  "com.android.support:recyclerview-v7:23.2.0" 

// Kotlin
implementation  "org.jetbrains.kotlin:kotlin-stdlib:1.3.61" 

// Gson
implementation  "com.google.code.gson:gson:2.2.2" 

// zxing
implementation  "com.google.zxing:core:3.3.0" 
implementation  "com.google.zxing:android-core:3.3.0" 

// SdkCore
implementation  "com.finogeeks.finochat.sdk:sdkcore:2.15.1"

As dependências do SDK são gerenciadas usando o gradle. Quando o aplicativo e o SDK Dependendo da biblioteca de notícias, a gradle manipulará o Conflito e use a biblioteca com o número da versão superior. Se uma biblioteca no aplicativo que depende do SDK através de um pacote JAR Ou o código -fonte entra em conflito com o SDK, você pode excluir o SDK Dependência usando o commit exclude. Para exmple.

groovy
implementation('com.finogeeks.lib:finapplet:2.21.1') {
 exclude group:  "com.tecent.smtt" 
}

Também é aconselhável usar o gradle para gerenciar dependências

1.7.1 E se eu estivesse uma classe duplicada em Zxing: Android-Essencial?

SDK usa o zxing: Android-Biblioteca principal, porque o zxing-Android-Biblioteca incorporada duplica o nome da classe Cameraconfiguraturatils Android-Núcleo, alguns nós podem ter um conflito de nome de classe após o zxing-Android-Biblioteca incorporada. Alguns usuários podem experimentar o nome da classe Conflitos após o usuário zxing-Android-Biblioteca incorporada. Nesse caso, as dependências podem ser removidas com o commit exclui Para exmple.

groovy
implementation('com.finogeeks.lib:finapplet:2.21.1') {
 exclude group:  "com.google.zxing"  , module:  "android-core" 
}

2. Perguntas frequentemente feitas ao usar

2.1 Como faço para iniciar o applet?

  1. Se o applet for iniciado com os parâmetros de início, é iniciado por chamando o startApplet(context: Context, appId: String) Método de o IAppletApiManager Interface, como segue.
java
FinAppClient.INSTANCE.getAppletApiManager().startApplet(context, 
 "appId" );

2.Se o applet for iniciado com os parâmetros de início, ele é iniciado por chamando ostartApplet(context: Context, appId: String, startParams: Map<String, String>) Método do IAppletApiManager interface.a segue.

java
Map< String, String> params = new HashMap<>();
// path is the path to the applet page
params.put( "path" ,  "/pages/index/index" );
// query is the start parameter, with the content 
 "key1=value1&key2=value2 ..."  in the form of
params.put( "query" ,  "aaa=test&bbb=123" );
FinAppClient.INSTANCE.getAppletApiManager().startApplet(this, 
 "appId" , params);

2.2 Após o lançamento de vários applets no aplicativo HST, por que vejo várias tarefas de applet, além do aplicativo host dentro da recente lista de tarefas OnRoid?

R: Becae o Android Applet SDK é implementado usando um multi-Processo Mecanismo, o aplicativo host é um processo e cada applet também é div Diferentes processos serão exibidos seccionados, então você verá Vários applets sendo abertos. Este também é o caso dos applets mainstream, como o Phiz Applet para Android e Applet Smart Baidu para Android.

2.3 As extensões de aplicação? Por exemplo, é possível que os applets ligue para as interfaces na Internet aditinta pelo SDK? Se sim, como seria implementado?

R: O SDK permite registrar uma interface de applet personalizada, que é a palavra como o estado dentro do SDK e pode ser chamado por O applet. As etapas para conseguir isso são as seguintes. 1.Implem a interface de applet personalizada.
IApi Declara os dois A maioria dos métodos principais que a interface do applet precisa implementar, a saber, apis(); einvoke(String event, JSONObject param, ICallback callback);, com o seguinte código.

java
/**
 * :: API interface for the applet, which is required to implement the 
API for the corresponding function
 */
public interface IApi extends ILifecycle {

 /**
 * @return An array of names of callable APIs
 */
 String[] apis();

 /**
 * This method is triggered when an API call is received, in which specific business logic is implemented
 *
 * @param event event name, i.e.API name
 * @param param Parameters
 * @param callback Callback interface
 */
 void invoke(String event, JSONObject param, ICallback callback);
}

Implementar uma interface personalizada requer a criação de uma classe e ter Essa classe herda de AbsApi Uma subclasse de IApi E então substituindo o apis() Método e o invoke() Método. apis()
Retorna uma variedade de nomes de todo o amigo que pode ser chamado, por, por, por, Implementação apis() Para declarar todas as APIs que precisam ser Implementd. invoke() Será acionado quando o applet chamar o Appi, onde o evento é o nome da API, param é o parâmetro correspondente ao API e retorno de chamada é usado para ligar de volta os dados para o applet após o A lógica de chamada é executada. Para Exmple, personalizamos uma interface de applet para um salto de página simples Função com o código seguinte.

java
/**
 * Custom applet interface for a simple page jump
 */
public class ApiOpenPage extends AbsApi {

 private static final String API_NAME_OPEN_PAGE =  "openPage" ;
 private Context mContext;
 public ApiOpenPage(Context context) {
 mContext = context;
 }
 /**
 * @return An array of names of callable APIs
 */
 @Override
 public String[] apis() {
 return new String[]{API_NAME_OPEN_PAGE};
 }
 /**
 * This method is triggered when an API call is received, in which 
specific business logic is implemented
 *
 * @param event event name, i.e.the name of the API
 * @param param Parameters
 * @param callback Callback interface
 */
 @Override
 public void invoke(String event, JSONObject param, ICallback 
callback) {
 if (API_NAME_OPEN_PAGE.equals(event)) {
 String url = param.optString( "url" );
 if (! TextUtils.isEmpty(url)) {
 Intent intent = new Intent();
 intent.setClass(mContext, SecondActivity.class);
 if (! (mContext instanceof Activity)) {
 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 }
 mContext.startActivity(intent);
 callback.onSuccess(null);
 } else {
 callback.onFail();
 }
 }
 }
}
  1. Registre a interface de applet personalizada.
    O registro é alcançado chamando o registerApi Método do IExtensionApiManager interface. como segue.
java
FinAppClient.INSTANCE.getExtensionApiManager().registerApi(new 
ApiOpenPage(context));

Se você precisar registrar mais do que a interface por vez, você pode ligar registerApis , passando em uma coleção de interfaces como argumento. Depois de registrar a interface de applet personalizada no SDK, você precisa Criar uma PhizClipConf.js arquivo no diário raiz do applet Projetar e configurar a interface personalizada correspondente em PhizClipConf.js .Nemplo de configuração é a seguinte.

javascript
module.exports = {
 extApi:[
 {
 name: 'openPage', // extension interface name
 params: { // extend the interface parameters, you can list 
only the required parameters
 url: '',
 title: '',
 description: ''
 }
 }
 ]
}
  1. Ligue para as APIs individuais nas interfaces registradas no applet.

2.4 Uma página da web pode ligar para o código nativo quando o applet carregar uma página da web?

R: O código nativo pode ser chamado com as páginas da web do applet, E o JSSDK comprove uma série de interfaces que permitem o código nativo Ser Calom com Inn, Páginas da Web.

2.5 A interface JSSSK suporta extensões? Ou seja, é possível para um applet chamar sua própria interface fornecida em uma página da web, além do estado ver t

R: O suporte à interface JSSDK é estendido.SDK permite o registro de interfaces JSSDK personalizadas, após o registro o JSSDK personalizado Interfaces são as interfaces de estado fornecidas dentro JSSDK e pode ser chamado por applets nas páginas da web. As etapas para conseguir isso são as seguintes. 1.Implem a interface JSSDK CUSLY.
Esta etapa é a mesma como implementação de uma interface de applet personalizada, por herança AbsApi e substituindo o apis() Método e invoke() Método para implementar o Interface JSSDK personalizada. 1.Retistem a interface JSSDK personalizada.
O registro é alcançado chamando o registerApi Método do IExtensionWebApiManager interface. como segue.

java
FinAppClient.INSTANCE.getExtensionWebApiManager().registerApi(new 
ApiOpenPage(context));

Se você precisar registrar mais do que a interface por vez, você pode ligar registerApis , passando em uma coleção de interfaces como argumento. Para detalhes, você pode verificar Register applet WebView component API Então então

2.6 Depois de pular para outras páginas do aplicativo host no invoke() Método da interface personalizada e realizar uma série de operações, pressionando o sistema Retton a retornar ao applet, ele acaba retornando à página no aplicativo H ost, onde o applet foi lançado, por quê?

1.Restão. A etapa de pular para outras páginas do aplicativo host inicia o Atividade através da instância de contexto no aplicativo host e não Pressione a atividade em uma nova pilha de tarefas. O Applet SDK Android é um multi-Arquitetura de processo, o applet e o aplicativo host está em diferentes processos, e as pilhas de tarefas que eles estão naturalmente diferentes. Quando o applet pula para o aplicativo host Página, a página recém -aberta é adicionada à pilha de tarefas original do Host app. Quando retornar da página, a lógica executada é aparecer A página na pilha de tarefas original no aplicativo nativo, então você verá As páginas do aplicativo nativo estão fechadas uma a uma e finalmente retornam Para a página em que o aplicativo nativo lança o applet e não Retornar ao applet. 2. Soluções. Opção 1 (Recomdydded):
Pule para outras páginas do aplicativo host através da startActivity ordenado startActivityForResult DE ICallback Então então Esta é a solução recomendada, pois isso abre a atividade do Novo aplicativo host na pilha de tarefas onde o applet é local, e o in-empilhando e fora-O empilhamento da atividade é realizado na mesma tarefa Stack, com o processo de troca de pilha de tarefas. Uma razão mais importante é que, se você precisar iniciar a atividade por StartActivityForResult e obtenha os dados de retorno quando a página Retorna, apenas com esta solução será a interface do Cusom onActivityResult ser executado para obter os dados retonados. Exemplos do usuário deste programa.

java
@Override
public void invoke(String event, JSONObject param, ICallback callback) {
Intent intent = new Intent();
intent.setClass(mContext, SecondActivity.class);
callback.startActivityForResult(intent, 100);
}

Opção 2 (não recomendado):
se você precisar usar o contexto Instância no aplicativo host para iniciar a atividade, você precisa definir o Intent Bandeiras de "Support multi-task stack" e "Open new task stack"
para o Intent Que inicia a página nativa, para que uma nova pilha de tarefas pode ser aberto no nativo depois que a nova pilha de tarefas está aberta As páginas recém -abertas serão prensadas nesta nova pilha de tarefas, uma a uma, e quando todas as operações das páginas nativas são concluídas e Devolvido um por um, as páginas serão expulsas uma a uma deste novo Pilha de tarefas, e quando todas as páginas desta nova pilha de tarefas são ejetadas, Ele retornará à pilha de tarefas do processo de applet.

Naí invoke() Método da interface personalizada, se você Precisa pular para outras páginas do aplicativo nativo para executar Certas ações e esperam retornar ao applet quando o nativo As páginas são fechadas, então é recomendável adicionar os dois Intent.FLAG_ACTIVITY_MULTIPLE_TASK ' and Flag_Activity_New_Taskto the Intenção` object when executing the jump, as follows.

java
Intent intent = new Intent();
intent.setClass(context, SecondActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent); // context is the Context instance in the host App

With this solution, if the Activity is started via startActivityForResult, the custom interface's OnactivityResult estar doente Não ser chamado quando a página se reter, para que não seja recompanhada.

2.7 Posso ligar para as funções JS em uma página da web no código nativo?

R: O SDK suporta funções nativas chamando JS. A chamada pode ser alcançado chamando o callJS Método do IAppletApiManager
Interface, como segue.

java
JSONObject funcParams = new JSONObject();
try {
 funcParams.put( "param1" ,  "value1" );
 funcParams.put( "param2" ,  "value2" );
 FinAppClient.INSTANCE.getAppletApiManager().callJS(
  "appId" ,
  "funcName" ,
 funcParams.toString(),
 -1,
 new FinCallback< String>() {
 @Override
 public void onSuccess(String result) {
 Log.d(TAG,  "callJS onSuccess : "  + result);
 }
 @Override
 public void onError(int code, String error) {
 Log.d(TAG,  "callJS onError : "  + code +  ", "  + 
error);
 }
 @Override
 public void onProgress(int status, String info) {
 }
 });
} catch (JSONException e) {
 e.printStackTrace();
}

2.8 Como defino a animação de transição de uma atividade em um applet?

R: Defina a animação de transição da atividade no applet por chamando o setActivityTransitionAnim Método do IAppletApiManager Interface, como segue.

java
FinAppClient.INSTANCE.getAppletApiManager().
setActivityTransitionAnim(SlideFromRightToLeftAnim.INSTANCE);

Atualmente, cinco tipos de animação estão disponíveis para configuração. 1.Noneanim: Sem animação.

  1. Slidefromleftorighightanim: animação deslizante- deixou para dentro, para a direita.
  2. SlidefromrightToleftanim: Slide Animation- À direita, deixado de fora. 1.SlideFromtoptottotomanIm: Slide Animation- Cubra, de baixo para fora. 1.SlideFombotTomtotoPanim: Slide Animation- De baixo para dentro, de cima para fora.

2.9 Como compartilhar um applet com uma plataforma que a suporta, como o Phiz?

R: Para implementar a função de compartilhamento de applet, a idéia geral é Primeiro obtenha as informações relevantes necessárias para compartilhar o applet, depois Converta as informações obtidas nos parâmetros do compartilhamento Interface e, finalmente, chame a interface de compartilhamento para compartilhar o applet para a plataforma correspondente. Existem duas imagens principais Opções. 1.Implem o shareAppMessage method do applet abstrato Interface de retorno de chamada comercial IAppletHandler e passar o IAppletHandler Instância no SDK.

Quando você clicar "Forward" no applet mais menu, o shareAppMessage Método do IAppletHandler Instância será Chamado. Uma vez que os parâmetros são obtidos, o terceiro-Party Sharing SDK Pode ser chamado para ativar o compartilhamento.

O shareAppMessage O método é o seguinte.

kotlin
/**
* Forwarding applets
*
* @param appInfo applet information, a string of json containing 
information such as applet id, applet name, applet icon, user id, and 
the content of the data forwarded.
* The content of [appInfo] is in the following format.
* {
*  "appTitle" :  "Vantaa Applet" ,
*  "appAvatar" : 
"https:\/\/www.finogeeks.club\/statics\/images\/swan_mini\/swan_logo.pn
g",
*  "appId" :  "5df36b3f687c5c00013e9fd1" ,
*  "appType" :  "trial" ,
*  "userId" :  "finogeeks" ,
*  "cryptInfo" : 
"SFODj9IW1ENO8OA0El8P79aMuxB1DJvfKenZd7hrnemVCNcJ+Uj9PzkRkf/Pu5nMz0cGjj
0Ne4fcchBRCmJO+ 
As0XFqMrOclsqrXaogsaUPq2jJKCCao03vI8rkHilrWxSDdzopz1ifJCgFC9d6v29m9jU29
wTxlHsQUtKsk/wz0BROa+aDGWh0rKvUEPgo8mB+40/ 
zZFNsRZ0PjsQsi7GdLg8p4igKyRYtRgOxUq37wgDU4Ymn/yeXvOv7KrzUT",
*  "params" : {
*  "title" : "apt-test-tweet-Interface-test-released-dynamics! 
@#$%......&*(",
*  "desc" :  "Service Experts by Your Side" ,
*  "imageUrl" : "finfile:\/\/tmp_fc15edd8-2ff6-4c54-9ee9-
fe5ee034033d1576550313667.png",
*  "path" : "pages\/tweet\/tweet-detail.html?fcid=%40staff_staff1%3A000000.finogeeks.com&timelineId=db0c
2098-031e-41c4-b9c6- 87a5bbcf681d&shareId=3dfa2f78-19fc-42fc-b3a9-
4779a6dac654",
*  "appInfo" : {
*  "weixin" : {
*  "path" : "\/studio\/pages\/tweet\/tweet-detail" ,
*  "query" : {
*  "fcid" : "@staff_staff1:000000.finogeeks.com" ,
*  "timelineId" :  "db0c2098-031e-41c4-b9c6-87a5bbcf681d" 
* }
* }
* }
* }
* }
* Description of the fields in [appInfo].
* appId applet ID
* appTitle applet name
* appAvatar applet avatar
* appType applet type, where trial means experience, temporary 
means temporary, review means review, release means online and 
development means development
* userId User ID
* cryptInfo Applet encryption information
* other parameters attached to params, passed by the applet itself
*
* @param bitmap The applet cover image.If the 
[appInfo].params.imageUrl field is a link address of http, https, then 
the applet cover image
* Just take the image corresponding to [appInfo].params.imageUrl, 
otherwise the cover image of the applet is taken as [bitmap].
* @param callback Callback for forwarding applet results.
*/
fun shareAppMessage(appInfo: String, bitmap: Bitmap?, callback: 
IAppletCallback)

Uma instância de IAppletHandler é passado ligando para o setAppletHandler(appletHandler: IAppletHandler) Método do IAppletApiManager do seguinte modo.

java
FinAppClient.INSTANCE.getAppletApiManager().setAppletHandler(new 
IAppletHandler() {
@Override
public void shareAppMessage(@NotNull String appInfo,
@org.jetbrains.annotations.Nullable 
Bitmap bitmap,
@NotNull IAppletCallback callback) {
// Implementing the logic of the sharing applet
...........................................................
.
............................................................
}
});

2.Mplementado através de uma interface personalizada. Recebe os parâmetros Passado pelo applet no invoke Método da interface personalizada, e então ligue para o terceiro-Party Compartilhando SDK para implementar o compartilhamento de applet.

2.10 Como posso injetar meus próprios itens de menu no "More" cardápio?

R: Como na interface de retorno de chamada de negócios abstratos IAppletHandler ,, O injeção do menu Itms no "More" Menu também é implementado através IAppletHandler , onde IAppletHandler Vai ligar de volta para o Aplicativo de host O método de interface getRegisteredMoreMenuItems e O método da interface onRegisteredMenuItemClicked para o injeção menu itms.method getRegisteredMoreMenuItems e a interface Método onRegisteredMoreMenuItemClicked Para injetar o menu ITMS para O aplicativo host, que implementará a lógica de negócios específica. getRegisteredMoreMenuItems e onRegisteredMoreMenuItemClicked ser do seguinte modo.

kotlin
/**
 * Get the registered  "More"  menu item
 *
 * @param appId applet ID
 * @return registered  "More"  menu item
 */
fun getRegisteredMoreMenuItems(appId: String): List<MoreMenuItem>?

/**
 * The  "More"  menu item of the registration is clicked
 *
 * @param appId applet ID
 * @param path applet page path
 * @param menuItemId The ID of the clicked menu item
 * @param appInfo applet information, a string of json containing 
information such as applet id, applet name, applet icon, user id, and 
the content of the data forwarded.
 * The content of [appInfo] is in the following format.
 * {
 *  "appTitle" :  "Vantaa Applet" ,
 *  "appAvatar" : 
"https:\/\/www.finogeeks.club\/statics\/images\/swan_mini\/swan_logo.pn
g",
 *  "appId" :  "5df36b3f687c5c00013e9fd1" ,
 *  "appType" :  "trial" ,
 *  "userId" :  "finogeeks" ,
 *  "cryptInfo" : 
"SFODj9IW1ENO8OA0El8P79aMuxB1DJvfKenZd7hrnemVCNcJ+Uj9PzkRkf/Pu5nMz0cGjj
0Ne4fcchBRCmJO+ 
As0XFqMrOclsqrXaogsaUPq2jJKCCao03vI8rkHilrWxSDdzopz1ifJCgFC9d6v29m9jU29
wTxlHsQUtKsk/wz0BROa+aDGWh0rKvUEPgo8mB+40/ 
zZFNsRZ0PjsQsi7GdLg8p4igKyRYtRgOxUq37wgDU4Ymn/yeXvOv7KrzUT",
 *  "params" : {
 *  "title" : "apt-test-tweet-Interface-test-released-dynamics! 
@#$%......&*(",
 *  "desc" :  "Service Experts by Your Side" ,
 *  "imageUrl" : "finfile:\/\/tmp_fc15edd8-2ff6-4c54-9ee9-
fe5ee034033d1576550313667.png",
 *  "path" : "pages\/tweet\/tweet-detail.html?fcid=%40staff_staff1%3A000000.finogeeks.com&timelineId=db0c
2098-031e-41c4-b9c6- 87a5bbcf681d&shareId=3dfa2f78-19fc-42fc-b3a9-
4779a6dac654",
 *  "appInfo" : {
 *  "weixin" : {
 *  "path" : "\/studio\/pages\/tweet\/tweet-detail" ,
 *  "query" : {
 *  "fcid" : "@staff_staff1:000000.finogeeks.com" ,
 *  "timelineId" :  "db0c2098-031e-41c4-b9c6-87a5bbcf681d" 
 * }
 * }
 * }
 * }
 * }
 * Description of the fields in [appInfo].
 * appId applet ID
 * appTitle applet name
 * appAvatar applet avatar
 * appType applet type, where trial means experience, temporary means 
temporary, review means review, release means online and development 
means development
 * userId User ID
 * cryptInfo Applet encryption information
 * other parameters attached to params, passed by the applet itself
 *
 * @param bitmap The applet cover image.If the 
[appInfo].params.imageUrl field is a link address of http, https, then 
the applet cover image
 * Just take the image corresponding to [appInfo].params.imageUrl, 
otherwise the cover image of the applet is taken as [bitmap].
 * @param callback The result callback.
 */
fun onRegisteredMoreMenuItemClicked(appId: String, path: String, 
menuItemId: String, appInfo: String?, bitmap: Bitmap?, callback: 
IAppletCallback)

Similaly, o It IAppletHandler A instância precisa ser passado por chamando o setAppletHandler(appletHandler: IAppletHandler) Método de o IAppletApiManager Então então O getRegisteredMoreMenuItems Método e o onRegisteredMoreMenuItemClicked O método é implementado da seguinte maneira.

java
/**
 * {@link IAppletHandler} implementation class, used to implement some 
business scenarios, such as registering  "more"  menu items, forwarding 
applets, etc.
 */
public class AppletHandler implements IAppletHandler {

 @NonNull
 private Context mContext;
 
 private AppletHandler() {
 }
 public AppletHandler(@NonNull Context context) {
 this.mContext = context;
 }
 @Nullable
 @Override
 public List< MoreMenuItem> getRegisteredMoreMenuItems(@NotNull 
String appId) {
 List< MoreMenuItem> items = new ArrayList<>();
 MoreMenuItem item0 = new MoreMenuItem( "WXShareAPPFriends" , 
 "Phiz Good Friends" , MoreMenuType.ON_MINI_PROGRAM);
 items.add(item0);
 MoreMenuItem item1 = new MoreMenuItem( "WXShareAPPMoments" , 
 "Phiz Friends" , MoreMenuType.ON_MINI_PROGRAM, true);
 items.add(item1);
 MoreMenuItem item2 = new MoreMenuItem( "ShareSinaWeibo" , "Sina Weibo
", MoreMenuType.ON_MINI_PROGRAM);
 items.add(item2);
 MoreMenuItem item3 = new MoreMenuItem( "ShareQQFriends" ,  "QQ" , 
MoreMenuType.ON_MINI_PROGRAM);
 items.add(item3);
 MoreMenuItem item4 = new MoreMenuItem( "ShareDingDing" , 
 "Dingding" , MoreMenuType.ON_MINI_PROGRAM);
 items.add(item4);
 MoreMenuItem item5 = new MoreMenuItem( "ShareLinks" , "Title 
subject to backend configuration", MoreMenuType.ON_MINI_PROGRAM);
 items.add(item5);
 MoreMenuItem item6 = new MoreMenuItem( "SharePicture" , 
 "SharePicture" , MoreMenuType.ON_MINI_PROGRAM);
 items.add(item6);
 MoreMenuItem item7 = new MoreMenuItem( "Restart" ,  "Restart" , 
MoreMenuType.COMMON);
 items.add(item7);
 MoreMenuItem item8 = new MoreMenuItem( "Desktop" ,  "Desktop" , 
MoreMenuType.COMMON);
 items.add(item8);
 return items;
 }
 @Override
 public void onRegisteredMoreMenuItemClicked(@NotNull String appId, 
@NotNull String path, @NotNull String menuItemId, @Nullable String 
appInfo, @ Nullable Bitmap bitmap, @NotNull IAppletCallback callback) {
 Toast.makeText(mContext,  "applet "  + appId +  "of "  + path + 
 "page's menu"  + menuItemId +  "was clicked, appInfo : "  + appInfo + " 
bitmap : " + bitmap, Toast.LENGTH_SHORT).show();
 callback.onSuccess(null);
 }
}

MoreMenuItem é a classe de dados de entrada do menu, como segue.

kotlin
/**
 * More menu entries
 *
 * @param id Menu entry ID
 * @param title Menu entry title
 * @param image Menu entry icon address
 * @param icon The resource ID of the menu item icon
 * @param type Menu entry type
 * @param isEnable whether the menu entry is available
 */
data class MoreMenuItem(val id: String,
 val title: String,
 val image: String,
 @DrawableRes val icon: Int,
 val type: MoreMenuType = MoreMenuType.COMMON,
 val isEnable: Boolean = true) {
 /**
 * Constructing methods
 * @param id Menu entry ID
 * @param title Menu entry title
 * @param type Menu entry type [MoreMenuType.COMMON] or 
[MoreMenuType.ON_MINI_PROGRAM]
 */
 constructor(id: String, title: String, type: MoreMenuType) : 
this(id, title,  "" , -1, type, true)
}

MoreMenuType é uma classe de enumeração, como segue.

kotlin
/**
 * More menu types
 * [COMMON] is the normal menu type, no interaction with the applet is 
required
 * [ON_MINI_PROGRAM] is the type of menu that needs to interact with 
the applet, such as the share applet button, when you click the button 
to share the applet, you may need to get some data about the applet
 */
enum class MoreMenuType {
 COMMON, ON_MINI_PROGRAM
}

2.11 Como obter uma captura de tela da página atual do applet?

A: obtido chamando o captureAppletPicture Método do IAppletApiManager Interface, como segue.

java
FinAppClient.appletApiManager.captureAppletPicture( "appId" , 
object :FinCallback<Bitmap? >{
 override fun onSuccess(result: Bitmap? ) {
 Log.d(TAG, "Get screenshot of applet page successfully: 
$result")
 }
 override fun onError(code: Int, error: String? ) {
 Log.e(TAG, "Failed to get screenshot of applet page: $code, 
$error")
 }
 override fun onProgress(status: Int, info: String? ) {
 }
})

2.12 Como bloquear o "Forward" Botão no Mennu mais?

R: A inicialização do SDK é configurada através da configuração da interface do usuário itens da seguinte forma.

java
// UI configuration
FinAppConfig.UIConfig uiConfig = new FinAppConfig.UIConfig();
// Whether to hide the  "Forward"  button in the  "More"  menu
uiConfig.setHideForwardMenu(true);

2.13 Como bloquear o "Settings" Botão no Mennu mais?

A: O "Settings" O menu mostra as próprias permissões de escopo de cada applet. Você quer bloquear o "Settings" Portal, você pode configurá -lo A configuração da interface do usuário ITM ao inicializar o SDK, como segue.

java
// UI configuration
FinAppConfig.UIConfig uiConfig = new FinAppConfig.UIConfig();
// Whether to hide the  "Settings"  button in the  "More"  menu
uiConfig.setHideSettingMenu(true);

2.14 Como bloquear o "Back to Home" Botão no Mennu mais?

R: A inicialização do SDK é configurada através da configuração da interface do usuário itens da seguinte forma.

java
// UI configuration
FinAppConfig.UIConfig uiConfig = new FinAppConfig.UIConfig();
// Whether to hide the  "Back to Home"  menu entry in the  "More"  menu
uiConfig.setHideBackHome(true);

Notas. " O "Back to Home" O botão no menu mais tem depreciado desde versão 2.36.1 e Ben substituiu por um "Back to Home" Botão ligado A barra de navegação de controle.

2.15 Como bloquear o "Feedback & Complaints" portal no mais cardápio?

R: A inicialização do SDK é configurada através da configuração da interface do usuário itens da seguinte forma.

java
// UI configuration
FinAppConfig.UIConfig uiConfig = new FinAppConfig.UIConfig();
// Whether to hide  "Feedback & Complaints"  in the More menu
uiConfig.setHideFeedbackAndComplaints(true);

2.16 Como ocultar o botão Fechar na barra de navegação?

R: A inicialização do SDK é configurada através da configuração da interface do usuário itens da seguinte forma.

java
// UI configuration
FinAppConfig.UIConfig uiConfig = new FinAppConfig.UIConfig();
// Whether to hide the top right corner close button
uiConfig.setHideNavigationBarCloseButton(true);

2.17 Como posso exibir o botão de volta na página inicial também

Quando a barra de navegação é o estilo padrão? R: A inicialização do SDK é configurada através da configuração da interface do usuário itens da seguinte forma.

java
// UI configuration
FinAppConfig.UIConfig uiConfig = new FinAppConfig.UIConfig();
// Whether the back button is always displayed when the navigation bar 
is the default navigation bar
uiConfig.setAlwaysShowBackInDefaultNavigationBar(false);

2.18 Como configuro as regras públicas de escala de cinza?

R: O mesmo que a interface de retorno de chamada de negócios abstratos IAppletHandler , A injeção da configuração de liberação cinza parâmetros também é imaginado através IAppletHandler ,, IAppletHandler Enviará o método da interface getGrayAppletVersionConfigs ao aplicativo host para obter o Parâmetros de configuração de liberação cinza.getGrayAppletVersionConfigs will be called back to the host application, which will implement the specific business logic. getGrayAppletVersionConfigs` as follows.

kotlin
/**
 * Get the grey-scale release configuration parameters
 *
 * @param appId applet ID
 * @return grayscale release configuration parameters
 */
fun getGrayAppletVersionConfigs(appId: String): 
List<GrayAppletVersionConfig>?

Similarly, the Iapplethandler instance needs to be passed in by calling the SetappleThandler (Applethandler: IAPPLETHANDLER) method of the IAPPLETAPIMANAGER Então então

2.19 Como implemento uma barra de navegação personalizada?

R: Três estilos de barra de navegação estão atualmente disponíveis. 1.O estilo padrão (padrão). 1.Tetain Somente o estilo personalizado (personalizado) para o "more off" Botão.

  1. Estilo Custom (ocultar) sem o "more close" Botão e com o Barra de navegação nativa completamente escondida. Por padrão, o TI navigationStyle DE page e navigationStyle DE window No applet são inadimplentes, se os deverters precisarem Personalize o estilo da barra de navegação, eles podem fazê -lo? navigationStyle DE page ordenado window Então então

2.20 está lá.

A:: ** Support.** Se o aplicativo host quiser que todas as solicitações de permissão do SDK sejam gerenciadas por seu e não deseja que o SDK inicie solicitações onde permitir Inicializando o SDK, como segue.

java
FinAppConfig finAppConfig = new FinAppConfig.Builder()
 .setDisableRequestPermissions(true) // Disable the SDK from 
initiating runtime permission requests
 .build();

2.21 está lá.

A:: Support Então então As permissões de escopo podem ser vistas, ligadas e desligadas no applet "More" - "Settings" . Por padrão, cada applet exibirá uma caixa de diálogo ao usuário ao solicitar permissões de escopo pela primeira vez. O SDK quer permissões de escopo de concessão automática sem pop-ups Para o usuário, você pode configurar parâmetros para conseguir isso quando Inicializando o SDK, como segue.

java
FinAppConfig finAppConfig = new FinAppConfig.Builder()
 .setAppletAutoAuthorize(true) // automatically grant 
permission to Scope
 .build();

2.22 Como ajustar o estilo de texto da barra de navegação

R: A inicialização do SDK é configurada através da configuração da interface do usuário itens da seguinte forma.

java
// UI configuration
FinAppConfig.UIConfig uiConfig = new FinAppConfig.UIConfig();
// Navigation bar title text style
uiConfig.setNavigationBarTitleTextAppearance(R.style.
TextAppearance_AppCompat);

2.23 Como faço para centralizar o título da barra de navegação?

R: A inicialização do SDK é configurada através da configuração da interface do usuário itens da seguinte forma.

java
// UI configuration
FinAppConfig.UIConfig uiConfig = new FinAppConfig.UIConfig();
// Gravity of the navigation bar title relative to the parent control
uiConfig.setNavigationBarTitleTextLayoutGravity(Gravity.CENTER);

2.24 Como remover a animação em segundo plano quando o botão traseiro é pressionado na barra de navegação?

R: A inicialização do SDK é configurada através da configuração da interface do usuário itens da seguinte forma.

java
// UI configuration
FinAppConfig.UIConfig uiConfig = new FinAppConfig.UIConfig();
// Whether to clear the background of the navigation buttons in the 
navigation bar
uiConfig.setClearNavigationBarNavButtonBackground(true);

2.25 O applet suporta alternar entre telas horizontais e verticais?

A:: ** Support.** A comutação de tela supporizontal, vertical e retrato de applet supportizontal e retrato Livremente. As configurações de rotação da tela do applet podem ser configuradas globalmente em window no app.json arquivo do projeto de applet, ou Individualmente no .json arquivo de cada página.

  1. Configuração global em app.json Então então
json
{
  "window" : {
  "pageOrientation" :  "auto"  // auto: switch freely between landscape 
and portrait, portrait: portrait, landscape: landscape
 }
}
  1. Seções configuradas no .json arquivo da página.
json
{
  "pageOrientation" :  "auto"  // auto: switch freely between landscape and 
portrait, portrait: portrait, landscape: landscape
}

3.A configuração de página substituirá a mesma configuração em window DE app.json Na página atual.

2.26 Como desabilito o uso do TBS SDK?

R: Isso é conseguido configurando os parâmetros ao inicializar o SDK, como segue.

java
FinAppConfig finAppConfig = new FinAppConfig.Builder()
 .setDisableTbs(true) // Set whether to disable the Tbs SDK
 .build();

2.27 Como defino o número de atualizações de lote programadas de applets?

R: Isso é conseguido configurando os parâmetros ao inicializar o SDK, como segue.

java
FinAppConfig finAppConfig = new FinAppConfig.Builder()
 .setAppletIntervalUpdateLimit(3) // Set the number of 
scheduled batch updates to the applet
 .build();

2.28 Como defino o número de applets que podem ser abertos na hora do AAME?

R: Isso é conseguido configurando os parâmetros ao inicializar o SDK, como segue.

java
FinAppConfig finAppConfig = new FinAppConfig.Builder()
 .setMaxRunningApplet(3) // the number of applets that can be 
opened at the same time
 .build();

2.29 O applet suporta o controle sobre mostrar e ocultar o More Botão no canto superior direito?

A:: ** Support.** Isso pode ser atingido ao configurar o navigationBarHideMoreButton
Propriedade. navigationBarHideMoreButton Pode ser configurado globalmente em o window do app.json arquivo do projeto de applet, ou Individualmente no .json arquivo de cada página.

  1. Configuração global em app.json Então então
json
{
  "window" : {
  "navigationBarHideMoreButton" : true // true: hide the top-right more 
button, false: show the top-right more button, default is false.
 }
}
  1. Seções configuradas no .json arquivo da página.
json
{
  "navigationBarHideMoreButton" : true // true: hide the top-right more 
button, false: show the top-right more button, default is false.
}

2.30 Os applets podem controlar a tela e o esconderijo do botão Fechar no canto superior direito?

Você pode.configure o navigationBarHideCloseButton Propriedade para Alcançar isso. navigationBarHideCloseButton pode ser configurado globalmente Na janela do arquivo app.json do projeto de applet, ou Individualmente no .json arquivo de cada página.

  1. Configuração global em app.json Então então
json
{
  "window" : {
  "navigationBarHideCloseButton" : true // true: hide the top right 
close button, false: show the top right close button, default is false.
 }
}
  1. Seções configuradas no .json arquivo da página.
json
{
  "navigationBarHideCloseButton" : true // true: hide the top right close 
button, false: show the top right close button, default is false.
}

2.31 É suportado substituir o "applet" Texto no SDK com outro nome?

A:: ** Support.** Isso é alcançado através da configuração de inicialização do SDK Parâmetros, como segue.

java
FinAppConfig finAppConfig = new FinAppConfig.Builder()
 .setAppletText( "X app" ) // Replace the  "applet"  text in the 
SDK with  "X app" 
 .build();

2.32 Quando os dados são relatados, a compressa de dados relatada é relatada?

R: Quando os dados são relatados, o SDK não comprime os dados relatados Por padrão, se você quiser ativar a compactação, poderá fazê -lo Os parâmetros de configuração de inicialização do SDK da seguinte maneira.

java
FinAppConfig finAppConfig = new FinAppConfig.Builder()
 .setEnableApmDataCompression(true) // Set the data to be 
compressed when the data is reported
 .build();

2.33 Apoia a desativação da API Applet para obter informações regulatórias?

A:: ** Support.** O SDK por padrão permite que os applets ligue para a API Applet (GetSuperviseInfo) que obtém informações regulatórias, para desativar isso Pode ser feito através dos parâmetros de configuração de inicialização do SDK como segue.

java
FinAppConfig finAppConfig = new FinAppConfig.Builder()
 .setDisableGetSuperviseInfo(true) // Set whether to disable 
applets from calling the applet API that gets supervise information
 .build();

Quando desativado, o applet receberá umgetSuperviseInfo:fail disabled retorno de chamada quando liga getSuperviseInfoEntão então

2.34 Apoia a abertura do applet da experiência?

A:: ** Support.** A plataforma suporta a configuração das versões da experiência e Experimente membros do applet e membros com acesso à experiência São capazes de abrir a versão de experiência do applet. Etapas para usar o applet da experiência. 1.Parpiar o applet na plataforma e configurar a experiência Versão para o applet, consulte Operação do lado da empresa Diretrizes- 4.4 Depuração 2. Passe o ID do usuário ao implantar o SDK.

kotlin
val config = FinAppConfig.
 .setUserId( "User ID" )
 .build()

Somente se o ID do usuário estiver na lista de membros configurados no applet A versão de experiência do applet pode ser aberta, caso contrário, onde Applet está aberto, a primeira página dirá "No experience permission" Então então 3. Abra o applet chamando a interface fornecida pelo SDK, que, que, que, que, que é o seguinte.

kotlin
/**
 * Launch the applet
 *
 * @param context context
 * @param startAppletDecryptRequest request body
 */
fun startApplet(context: Context, startAppletDecryptRequest: 
StartAppletDecryptRequest)`

A estrutura de StartAppletDecryptRequest é o seguinte.

kotlin
/**
 * :: Launch applet request entity class
 *
 * @param info Applet encryption information
 */
data class StartAppletDecryptRequest(val info: String)

O info fieeld of StartAppletDecryptRequest reprime o Informações criptografadas do applet e corresponde ao info Fieeld no código QR da experiência do applet.so quando você abre o applet experiência, isso info fieeld of StartAppletDecryptRequest Deveria estar passou para o valor correspondente às informações arquivadas no applet Experiência Código QR. Como anemone, hee é o conteúdo da versão experimental do Código QR do Applet.

bash
https://finchat-mop.finogeeks.club/mop/scattered-page/#/sdktip?type=scanOpen&info=SFODj9IW1ENO8OA0El8P79aMuxB1DJvfKenZd7hrnemVCNcJ+Uj9PzkRkf/Pu5nMz0cGjj0Ne4fcchBRCmJO+As0XFqMrOclsqrXaogsaUPq2jJKCCao03vI8rkHilrWxSDdzopz1ifJCgFC9d6v29m9jU29wTxlHsQUtKsk/wz0BROa+aDGWh0rKvUEPgo8mB+40/zZFNsRZ0PjsQsi7GdLg8p4igKyRYtRgOxUq37wgDU4Ymn/yeXvOv7KrzUT&codeType=trial

O valor do info Fieeld deve então ser

bash
SFODj9IW1ENO8OA0El8P79aMuxB1DJvfKenZd7hrnemVCNcJ+Uj9PzkRkf/Pu5nMz0cGjj0
Ne4fcchBRCmJO+ 
As0XFqMrOclsqrXaogsaUPq2jJKCCao03vI8rkHilrWxSDdzopz1ifJCgFC9d6v29m9jU29
wTxlHsQUtKsk/wz0BROa+aDGWh0rKvUEPgo8mB+40/ 
zZFNsRZ0PjsQsi7GdLg8p4igKyRYtRgOxUq37wgDU4Ymn/yeXvOv7KrzUT

2.35 Como implementar o login de terceiros em um applet?

2.35.1 Integração do Applet SDK (Applet Vantaa Applet SDK)

Os desenvolvedores precisam primeiro para integrar o applet phizdclip sdk, consulte Philip applet Open Platform Android Integrationdocumentação, o aberto A plataforma tem uma documentação detalhada de integração do Android, aqui não está Repetido a plataforma aberta detopou a documentação no Android Integração, então eu não vou passar por isso aqui.

2.35.2 CustMising A interface do applet para ativar a authorning

Logins Para que o applet obtenha dados de aplicativos além do applet, você precisa Para registrar a interface personalizada do applet, consulte Phizdclip Applet Open Platform- Interface de applet personalizada.

Nota de dica

Os parâmetros neste exmple são deixados para o discreto do desenvolvedor no desenvolvimento real, e esse exmple é para demonnstação apenas.

  • Interface de login de login autenticado

Como esse exmple precisava para exibir a caixa de diálogo de autorização quando Login do Authorisk, precisamos obter afastamento da atividade, então nós Precisa que a API seja registrada no processo de applet para que possamos Obtenha facilmente uma instância da atividade para exibir o applet.

Java
classe pública Loginapi estende Absapi {

// Código de definição omitido

Private void showauthdialog (icallback icallback) {{
Novo alertdialog.builder (atividade)
.Settitle (Settital ( "Authorized Login" Cura
.setMessage ("Is this applet authorized to get user 
information?"Cura
.SetCancelable (false)
.SetPositivoButton ( "OK" (Diálogo, que)-"
AuthLoginonMainProcess (icallback))
.SetnegativeButton ( "Cancel" (Diálogo, que)-"
icallback.onfail ())
.mostrar ();
}

/**
* Desde as informações do usuário
Processo, ele não pode ser buscado por chamadas diretas no processo de applet
* Então use o método CallinMainProcess para chamar em todo o
Processe, obtenha as informações no processo principal e depois passe de volta
para o processo de applet
*/
{{{{{
// Cruzar-Código de chamada de processo com alcant
}

}

Cross-process api calls can be found in the documentation: applet process calls main processRegister custom api in applet process

Java
if (finappclient.instance.isfippProcess (this)) {{
// Processo de applet
initphizCliPONAPTProcess ();
} Outro {
// Código de inicialização do processo principal omitido
}
Java
/**
* :: Registre o applet no processo de applet
*/
Prive void initphizcliPONAPPPROCESS () {) {
FINAPPROCESSSCLIENT.INSTANCE.SETCALLLBACK (NOVA FINAPROCESSCLIENT.CALLBACK () {{) {{) {
@Sobrepor
Lista pública <iapi> getRegameDextensionApis (@NotNull Activity) {{
Lista <iapi> extensionApis = new ArrayList <();
extensionApis.add (new Loginapi (atividade));
Retornar extensionApis;
}

@Sobrepor
Lista pública <iapi> getRegisterExtExweBapis (@NotNull
Atividade de atividade) {
Retornar nulo;
}
});
}

At this point, the entire process of obtaining a user token from the APP via a custom Api is complete.

Note

If the product requirements do not require the display of a user authorisation prompt Dialog, it is recommended that a custom Api be registered with the main process, thus eliminating the need for the above cross-process call.

2.35.3 Customizing the applet interface to enable access to user

information

The parameters in this example will be developed by the developer in practice, and this example is for demonstration purposes only. Custom getUserProfile interface

Java
Classe pública Profileapi estende o absurio {

// Código de definição omitido

/**
* Neste Expple, o propileapi é registrado diam no
API de extensão do processo principal
* Portanto, a API é executada no processo principal e pode buscar dados
diretamente
*/
Private void getuturprofile (JsonObject jsonObject, icallback
icallback) {
// O processo de obtenção de informações do usuário é omitido
}

}

Register the api in the main process

Java
FINCallback <ject> initCallback = new Fincallback <ject> () {
@Sobrepor
public void onSuccess (resultado do objeto) {
// Registrar a API Excomedida, a API registrada aqui será
Executado no processo principal
Finappclient.instance
.GETEXTENSENSOPIMANAGER ()
.RegaMerApi (novo Profileapi ());
}

@Sobrepor
public void onError (código int, erro de string) {{

}

@Sobrepor
Public void onProgress (status int, erro de string) {

}
};
Finappclient.instance.

At this point, the entire process of the applet obtaining user information from the APP via a custom Api is complete.

2.35.4 Customizing the applet interface to check if the user token

has expired

The parameters in this example will be developed by the developer in practice, and this example is for demonstration purposes only. Custom checkSession interface for checking user token

Java
Classe pública AppletsessionApi extenso Absapi {

// Código de definição omitido

Verificação de vazio privado (JsonObject jsonObject, icallback
icallback) {
// Verifique o código do procedimento omitido
}

}

Register the api in the main process

Java
FINCallback <ject> initCallback = new Fincallback <ject> () {
@Sobrepor
public void onSuccess (resultado do objeto) {
// Registre o exagerado aqui vai
ser executado no processo principal
Finappclient.instance
.GETEXTENSENSOPIMANAGER ()
.RegaMerApi (novo Profileapi ());
Finappclient.instance
.GETEXTENSENSOPIMANAGER ()
.RegaMerApi (New AppletsessionApi ());
}

@Sobrepor
public void onError (código int, erro de string) {{

}

@Sobrepor
Public void onProgress (status int, erro de string) {

}
};
Finappclient.instance.

At this point, the entire process of checking the user token from the APP via the custom Api is complete.

2.36 Is WebRTC supported?

Support.

2.36.1 Using WebRTC in an applet-loaded H5

If you are using WebRTC directly in an H5 loaded by an applet, please refer to WebRTC FAQ

2.36.2 Using WebRTC in applets

If you are using WebRTC in an applet, you need to integrate 2.35.0- ALPHA20211023V01 and above SDK.the specific instructions are as follows.

2.36.2.1 PhizClip Android SDK version with WebRTC support
  • Core SDK: 2.35.0-alpha20211023v01
  • Extended SDK: 2.35.0-alpha20211023v01
2.36.2.2 API documentation

API documentation

2.36.3 What libraries are relied upon?

  • google-webrtc:1.0.32006

2.36.4 Incremental App volume after SDK integration

  • original size of google-webrtc library.
armeabi-v7a : 4.4 MB(.so library) + 0.9MB(jar file) = 5.3MB
arm64-v8a: 7.1MB(.so library) + 0.9MB(jar file) = 8MB
  • Up to 6.2MB increase in size after App integration with SDK

2.37 Whether to support offline applets and use local applets to

improve first load speed From version 2.35.1 onwards, sdk supports specifying the path to the local base library and applet zip when opening the applet, at which point the applet will be opened directly using the local code package to improve loading speed. Subsequent applets still get updates from the backend normally Interface definitions

 /**
 * Launch the applet
 *
 * @param context context
 * @param apiServer Server address of the application marketplace 
where the applet is hosted
 * @param appId applet id
 * @param startParams Parameters to be carried when starting the 
applet
 * @param offlineLibraryPath The offline base library path
 * @param offlineAppletPath Path to the local applet package
 */
 fun startApplet(context: Context, apiServer: String, appId: String, 
startParams: FinAppInfo.StartParams? = null, offlineLibraryPath: 
String, offlineAppletPath: String)

Example of a call

 FinAppClient.appletApiManager.startApplet(this, 
 "https://api.PhizClip.com" ,
  "617bb42f530fb30001509b27" , null,
  "$filesDir/framework-2.11.4-alpha20211101v01.zip" , 
 "$filesDir/Subpackage Jump Test-1.1.1.zip" )

2.38 Do applets support custom menus?

A: ** Support.** By implementing proxy method and overriding the `OnNavigationBarmoreButtonClicked () cardápio.

  1. Passe na instância do IAPPLETPROCESSHANDLER, chamando o IAPPLETPROCESSAPIMANAGER SepappletProcessHandler (AppletProcessHandler: IAPPLETPROCESSHANDLER) Método e implementar a exibição do menu personalizado no onNavigationBarMoreButtonClicked() Método para implementar a exibição de um menu personalizado, como segue.
java
FinAppProcessClient.INSTANCE.getAppletProcessApiManager().
setAppletProcessHandler(new IAppletProcessHandler() {
 @Override
 public boolean onNavigationBarMoreButtonClicked(@NonNull Context 
context, @NonNull String appId) {
 // Show custom menu
 ................................................
 ................................................
 return true; // return true means that the  "more"  button click 
event is handled by itself, blocking the default menu display logic.
 }
});

Nota de dica

  • A classe FINAppProcessClient precisa ser usada no processo de applet. Por favor, use o FinAppClient.INSTANCE.isFinAppProcess() Método para Determine se você está em um processo de applet
  • O método da interface IAPPLETPROCESSHANDLER é executado no applet Processo.

2.Use os métodos fornecidos pelo MoreMenuHelper classe para implementar O menu padrão do SDK ITMS. O método é definido da seguinte maneira.

kotlin
/**
 * Triggers a forwarding action, consistent with the SDK default menu 
 "forward"  behaviour, and requires forwarding logic to be handled in the 
proxy method shareAppMessage()
 */
fun invokeForwardMenuAction(context: Context)

/**
 * Feedback and Casting
 */
fun goToFeedbackPage(context: Context)

/**
 * Open the About page
 */
fun goToAboutPage(context: Context)

/**
 * Open the settings page
 */
fun goToSettingPage(context: Context)

/**
 * Turn on or off applet debugging (vConsole)
 *
 * @param enableAppletDebug true on, false off
 */
fun setEnableAppletDebug(context: Context, enableAppletDebug: Boolean)

/**
 * :: Whether applet debugging (vConsole) is turned on or off
 */
fun isEnableAppletDebug(context: Context): Boolean

/**
 * Get menu data of type [MoreMenuType.ON_MINI_PROGRAM]
 *
 * @param callback Please refer to the proxy method 
onRegisteredMoreMenuItemClicked() for the description of the parameter 
field.
 */
fun getMiniProgramTypeMenuData(
 context: Context,
 menuId: String?
 callback: (appId: String, path: String, menuItemId: String, 
appInfo: String?, bitmap: Bitmap?) -> Unit
)

/**
 * :: Check if the applet implements custom menu functionality
 * where the onShareAppMessage event is affected by whether the applet 
has called the showShareMenu/hideShareMenu API
 * If this method is called after the applet has called showShareMenu, 
the value of this event is true, regardless of whether the applet 
implements the onShareAppMessage event.
 * If this method is called after the applet has called hideShareMenu, 
the value of the event is false, regardless of whether the applet 
implements the onShareAppMessage event.
 *
 * @param callback result JSONArray element for { "eventName" : "applet 
event name ", " menuId ": " menu id ", " value ": " whether the event is 
implemented"}
 */
fun checkMenus(
 activity: FinAppHomeActivity,
 pageWebViewId: Int?
 menuIds: List<String>,
 callback: (result: JSONArray) -> Unit
)

Nota de dica

A classe Moremenuhelper precisa ser usada no processo de applet.

Exemplo.

java
public class App extends Application {

 private final Handler handler = new Handler();
 private static final String CUSTOM_MENU_ID =  "customMenu" ;
 @Override
 public void onCreate() {
 super.onCreate();
 if (! FinAppClient.INSTANCE.isFinAppProcess(this)) {
 initPhizClipOnMainProcess(); // main process
 } else {
 initPhizClipOnAppletProcess(); // applet process
 }
 }
 private void initPhizClipOnMainProcess() {
 // Initial configuration...
 FinCallback< Object> callback = new FinCallback< Object>() {
 @Override
 public void onSuccess(Object result) { // SDK initialization 
successful
 setAppletHandler();
 }

 @Override
 public void onError(int code, String error) { // SDK 
initialization failed
 Toast.makeText(App2.this,  "SDK initialization failed" , 
Toast.LENGTH_SHORT).show();
 }
 @Override
 public void onProgress(int status, String error) {
 }
 };
 // Initialize PhizClipSDK
 FinAppClient.INSTANCE.init(this, config, callback);
 }
 private void setAppletHandler() {
 FinAppClient.INSTANCE.getAppletApiManager().
setAppletHandler(new IAppletHandler() {
 /**
 * Forwarding applets
 *
 * @param appInfo applet information, a string of json 
containing information such as applet id, applet name, applet icon, 
user id, and the content of the data forwarded.
 * @param bitmap The applet cover image.If the 
[appInfo].params.imageUrl field is a link address of http, https, then 
the applet cover image
 * Just take the image corresponding to 
[appInfo].params.imageUrl, otherwise the cover image of the applet is 
taken as [bitmap].
 * @param callback Callback for forwarding applet results.
 *
 * For methodological instructions, please refer to: 
/runtime-sdk/android/android-issue.html#_2-9-%E6%80%8E%E4%B9%88%E5%88%86%E4%BA%AB%E5% 
B0%8F%E7%A8%8B%E5%BA%8F%E5%88%B0%E5%BE%AE%E4%BF%A1%E7%AD%89%E6%94%AF%E6
%8C%81%E5%B0%8F%E7%A8%8B%E5%BA%8F%E7%9A%84%E5%B9%B3%E5%8F% B0
 */
 @Override
 public void shareAppMessage(@NotNull String appInfo, 
@Nullable Bitmap bitmap, @NotNull IAppletCallback callback) {
 handler.post(new Runnable() {
 @Override
 public void run() {
 // Retweet/share...
 callback.onSuccess(null);
 }
 });
 }
 });
 }
 /**
 * Set the proxy method to be executed in the applet process
 */
 private void initPhizClipOnAppletProcess() {
 FinAppProcessClient.INSTANCE.getAppletProcessApiManager().
setAppletProcessHandler(new IAppletProcessHandler() {
 /**
 * The  "More"  button in the applet navigation bar is 
clicked
 *
 * @param appId applet ID
 * @return returns true to indicate that the button click 
event is handled by itself and no default action (popup menu) needs to 
be performed.A return of false means that the default action needs to 
be performed
 */
 @Override
 public boolean onNavigationBarMoreButtonClicked(@NotNull 
Context context, @NotNull String appId) {
 // Note: Here is the applet process
 // For sharing configurations please refer to.
 // 
/develop/api/custom-menu.html#_2-
2-%E5%88%86%E4%BA%AB%E9%85%8D%E7%BD%AE
 ArrayList< String> menuIds = new ArrayList<>();
 menuIds.add( "WXShareAPPFriends" ); // Menu configuration 
information is provided in the onShareAppMessage method of the applet
 menuIds.add( "WXShareAPPMoments" ); // Menu configuration 
information is provided in the onShareAppMessage method of the applet
 menuIds.add(CUSTOM_MENU_ID); // Menu configuration 
information is provided in the onCustomMenuButtonHandler method of the 
applet
 MoreMenuHelper.checkMenus(context, menuIds, new 
Function1< JSONArray, Unit>() {
 @Override
 public Unit invoke(JSONArray result) {
 // Note: Here is the applet process
 boolean forwardMenuEnable = false; // whether the 
forward menu is available
 boolean customMenuEnable = false; // whether the 
custom menu is available
 // Iterate through to get the status of the 
buttons available
 for (int i = 0; i < result.length(); i++) {
 JSONObject jsonObject = (JSONObject) result.
opt(i);
 if (jsonObject ! = null) {
 String eventName = jsonObject.
optString( "eventName" );
 if(eventName.
equals( "onShareAppMessage" )) { // menuId is WXShareAPPFriends or 
WXShareAPPMoments
 boolean value = jsonObject.
optBoolean( "value" );
 if (value) {
 forwardMenuEnable = true;
 }
 }
 if(eventName.
equals( "onCustomMenuButtonHandler" )) { // menuId is customMenu
 boolean value = jsonObject.
optBoolean( "value" );
 if (value) {
 customMenuEnable = true;
 }
 }
 }
 }
 showMenuDialog(context, forwardMenuEnable, 
customMenuEnable);
 return null;
 }
 });
 return true;
 }
 });
 }
 private void showMenuDialog(Context context, boolean 
forwardMenuEnable, boolean customMenuEnable) {
 String enableAppletDebug;
 if (MoreMenuHelper.isEnableAppletDebug(context)) {
 enableAppletDebug =  "Turn off debugging" ;
 } else {
 enableAppletDebug =  "Turn on debugging" ;
 }
 new MenuDialog(context)
 // Set the state of the menu buttons according to the 
method parameters, omitted here...
 .setListener(new BottomSheetListener() {
 /**
 * Menu button click events
 */
 @Override
 public void onSheetItemSelected(MenuItem item) {
 int itemId = item.getItemId();
 if (itemId == R.id.about) {
 // About page
 MoreMenuHelper.goToAboutPage(context);
 } else if (itemId == R.id.setting) {
 // Setup page
 MoreMenuHelper.goToSettingPage(context);
 } else if (itemId == R.id.feedback) {
 / / Feedback and complaints
 MoreMenuHelper.goToFeedbackPage(context);
 } else if (itemId == R.id.forward) {
 // Triggers a forwarding action, consistent 
with the SDK default menu  "forward"  behaviour, and requires forwarding 
logic to be handled within the proxy method shareAppMessage()
 // 
/runtime-sdk/android/android-issue.html#_2-9-%E6%80%8E%E4%B9%88%E5%88%86%E4%BA%AB%E5%B0%8F% 
E7%A8%8B%E5%BA%8F%E5%88%B0%E5%BE%AE%E4%BF%A1%E7%AD%89%E6%94%AF%E6%8C%81
%E5%B0%8F%E7%A8%8B%E5%BA%8F%E7%9A%84%E5%B9%B3%E5%8F%B0
 MoreMenuHelper.
invokeForwardMenuAction(context);
 } else if (itemId == R.id.customMenu) { // 
This menu requires applet information
 // Get the menu data of type 
[MoreMenuType.ON_MINI_PROGRAM]
 // Please refer to the proxy method 
onRegisteredMoreMenuItemClicked() for a description of the parameter 
fields:
 // 
/runtime-sdk/android/android-issue.html#_2-10-%E5%A6%82%E4%BD%95%E5%BE%80-%E6%9B%B4%E5%A4%9A 
-%E8%8F%9C%E5%8D%95%E4%B8%AD%E6%B3%A8%E5%85%A5%E8%87%AA%E5%B7%B1%E7%9A%
84%E8%8F%9C%E5%8D%95%E9%A1%B9
 MoreMenuHelper.
getMiniProgramTypeMenuData(context, CUSTOM_MENU_ID, new Function5< 
String, String, String, String, Bitmap, Unit>() {
 @Override
 public Unit invoke(String appId, String 
path, String menuItemId, String appInfo, Bitmap bitmap) {
 // Note: Here is the applet process
 // customMenu menu business logic...
 return null;
 }
 });
 } else {
 // Turn applet debugging (vConsole) on or off
 MoreMenuHelper.
setEnableAppletDebug(context, ! MoreMenuHelper.
isEnableAppletDebug(context));
 }
 }
 })
 .show();
 }
}

2.39 Os applets podem ser executados em uma única tarefa?

A:: ** Yes.** O SDK permite que você defina o applet para executar como uma única tarefa, ou seja, o Applet e o applet host são exibidos na mesma tarefa no Lista de tarefas recentes do sistema. O método de configuração é o seguinte. Defina o valor do isSingleTask campo do IFinAppletRequest
objetar para true Quando a interface do applet é chamada IFinAppletRequest Então então

kotlin
/**
 * Identifies if the applet is opened via a single task stack
 */
internal var isSingleTask: Boolean = false

/**
 * Set whether to open the applet via the single task stack
 */
fun setSingleTask(isSingleTask: Boolean): IFinAppletRequest {
 this.isSingleTask = isSingleTask
 return this
}

Exemplo.

java
FinAppClient.INSTANCE.getAppletApiManager().startApplet(this, 
IFinAppletRequest.Companion.fromAppId( "applet ID" ).
setSingleTask(true), null);

3. Aspectos de comissionamento

3.1 Quais ferramentas são usadas para depurar applets ao desenvolvê -las?

R: O Applet SDK Android usa o Serviço de Navegação de TBS da Tencent (x5 Kernel) e a ferramenta de depuração é TBS Studio, White pode depurar applets da mesma maneira que as páginas da web no navegador Chrome.

Nota de dica

AS 2.33.3 , O SDK substituiu o kernel x5 pelo sistema WebView.

3.2 Por que o TBS Studio não pode habilitar a depuração e continua indicando que o aplicativo de destino atual não pode ser depurado pelo TBS, verifique e faça o seguinte com certeza de que o aplicativo de destino atual?

R: Isso geralmente é porque o dispositivo é um 64-Dispositivo de processador de bits e O aplicativo não está em execução em 32-modo bit.43903 versões do Tbs sdk não fornecem 64-um pouco tão dinâmico bibliotecas, então se o dispositivo estiver Ainda correndo em 64-Modo de bit em um 64-Dispositivo de processador de bits, o tbs sdk Falhará durante a inicialização e o kernel X5 não será Com sucesso ativado. Para ativar o núcleo X5 adequadamente para dispositivos com 64-Processadores de bits, você precisa definir o seguinte no defaultConfig do build.gradle arquivo do projeto Android atual para fazer o Aplicação executada em 32-modo bit.

bash
ndk {
 // Set the supported SO library architecture
 abiFilters  "armeabi" , 'armeabi-v7a'
}

Se o erro de compilação for relatado após a configuração, isso pode ser Resolvido adicionando a configuração a seguir ao projeto gradle.properties arquivo

bash
Android.useDeprecatedNdk=true.

3.3 Por que o applet continua recebendo uma tela branca ao carregar páginas em algumas versões mais baixas dos sistemas, mas não em versões mais altas?

R: Isso geralmente CCURS porque a versão do navegador em versões inferiores do sistema também é menor e o navegador não registra o novo Recursos de sintaxe Propriy. para exmple, algumas versões do navegador foram Lançado antes do ES6 ser finalizado e lançado. Se os novos recursos do ES6 São usados ​​quando codificam e o navegador não está atualizado com o Versão, então, ao abrir uma página da web no navegador, o navegador irá Não reconhecer o código ES6 e ocorrerá um erro. Para esse tipo de poplem, geralmente é recompido que

  1. Ao codificar, use o SNTAX que seja tão compatível quanto o postible.
  2. Se você inevitavelmente precisar usar os recursos de sintaxe, tente Apresentando ferramentas de conversão de sintaxe, como Babel-Polyfill isso Converter automaticamente a nova sintaxe em uma versão inferior para que você possa Usando os novos recursos de sintaxe com ter que pensar em ambiente Compatibilidade.

3.4 Como ativar o vconsole Debuging Applets?

Se você precisar depurar seu applet usando vconsole, existem atualmente Várias maneiras de ativar o modo de depuração.

  1. setEnableAppletDebug Na configuração de inicialização do SDK é Fiel a aproveitar todos os applets para exibir vconsole.Porne Configuração para FALSE quando o aplicativo estiver ativo. (Quando definido como true, O vconsole não pode ser desligado via API dentro do applet).
  2. Quando setEnableAppletDebug Na configuração de inicialização do SDK é falso, cada applet pode ser ativado no modo de depuração de forma independente.non-versões on -line (por exemplo, experina, auditoria, desenvolvimento, visualização) podem Habilite o modo de depuração via [Ligue a Debug] no menu mais.
  3. Quando setEnableAppletDebug Na configuração de inicialização do SDK é falso, o modo de depuração é ativado independentemente ligando API (API ( pz.setEnableDebug ) Através do applet