How to write plugin in Construct 3 using native frameworks (android / ios)?
Steps to make plugin (Addon) Construct 3:
- Create a Basic Addon with the necessary functions that the Construct 3 side will call. (Here will call the external plugin generated from the Cordova plugin)
- Config so when exporting proj to Cordova will automatically add the Cordova plugin.
- Create plugin on Cordova side to communicate with native frameworks (android & ios)
- While creating a plugin, create proj Cordova to test functions running in native (android / ios)
- After the functions work, run on proj Cordova exported from plugin Construct 3.
LIBRARY STRUCTURE TO CREATE PLUGIN IS NTN?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <span class="token comment">-- _config.yml</span> <span class="token comment">-- package.json</span> <span class="token comment">-- plugin.xml</span> <span class="token comment">-- scripts</span> <span class="token comment">-- after_prepare.js</span> <span class="token comment">-- ios</span> <span class="token comment">-- after_plugin_install.js</span> <span class="token comment">-- before_plugin_install.js</span> <span class="token comment">-- before_plugin_uninstall.js</span> <span class="token comment">-- helper.js</span> <span class="token comment">-- lib</span> <span class="token comment">-- utilities.js</span> <span class="token comment">-- types</span> <span class="token comment">-- www</span> <span class="token comment">-- firebase.js</span> |
Android:
1 2 3 4 5 6 7 8 9 10 11 12 | <span class="token comment">-- src</span> <span class="token comment">-- android</span> <span class="token comment">-- build.gradle</span> <span class="token comment">-- color.xml</span> <span class="token comment">-- cordova-plugin-firebase-strings.xml</span> <span class="token comment">-- FirebasePlugin.java</span> <span class="token comment">-- FirebasePluginMessageReceiver.java</span> <span class="token comment">-- FirebasePluginMessageReceiverManager.java</span> <span class="token comment">-- FirebasePluginMessagingService.java</span> <span class="token comment">-- JavaScriptException.java</span> <span class="token comment">-- OnNotificationOpenReceiver.java</span> |
HOW TO OVERRIDE CONFIG: BY CODE JS FROM CONFIG.XML Add permission to mainifest file:
1 2 3 4 | <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> config-file</span> <span class="token attr-name">target</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> AndroidManifest.xml <span class="token punctuation">"</span></span> <span class="token attr-name">parent</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> /* <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> uses-permission</span> <span class="token attr-name"><span class="token namespace">android:</span> name</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> android.permission.READ_CONTACTS <span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> config-file</span> <span class="token punctuation">></span></span> |
Turn on and off runtime permissions:
1 2 | cordova <span class="token punctuation">.</span> <span class="token function">requestPermission</span> <span class="token punctuation">(</span> <span class="token class-name">CordovaPlugin</span> plugin <span class="token punctuation">,</span> <span class="token class-name"><span class="token keyword">int</span></span> requestCode <span class="token punctuation">,</span> <span class="token class-name">String</span> permission <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
An example with the Permission READ CONTACTS is as follows:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> <span class="token class-name">String</span> READ <span class="token operator">=</span> <span class="token class-name">Manifest</span> <span class="token punctuation">.</span> permission <span class="token punctuation">.</span> READ_CONTACTS <span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> <span class="token keyword">int</span> SEARCH_REQ_CODE <span class="token operator">=</span> <span class="token number">0</span> <span class="token punctuation">;</span> <span class="token comment">// Khi thực hiện code logic cần permission thì check:</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> cordova <span class="token punctuation">.</span> <span class="token function">hasPermission</span> <span class="token punctuation">(</span> READ <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">search</span> <span class="token punctuation">(</span> executeArgs <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token function">getReadPermission</span> <span class="token punctuation">(</span> SEARCH_REQ_CODE <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// Code để xin cấp quyền permission như sau:</span> <span class="token keyword">protected</span> <span class="token keyword">void</span> <span class="token function">getReadPermission</span> <span class="token punctuation">(</span> <span class="token keyword">int</span> requestCode <span class="token punctuation">)</span> <span class="token punctuation">{</span> cordova <span class="token punctuation">.</span> <span class="token function">requestPermission</span> <span class="token punctuation">(</span> <span class="token keyword">this</span> <span class="token punctuation">,</span> requestCode <span class="token punctuation">,</span> READ <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> |
After the user grants permisson permission, there will be a return callback & each Cordova plugin must implement it:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">onRequestPermissionResult</span> <span class="token punctuation">(</span> <span class="token keyword">int</span> requestCode <span class="token punctuation">,</span> String <span class="token punctuation">[</span> <span class="token punctuation">]</span> permissions <span class="token punctuation">,</span> <span class="token keyword">int</span> <span class="token punctuation">[</span> <span class="token punctuation">]</span> grantResults <span class="token punctuation">)</span> throws JSONException <span class="token punctuation">{</span> <span class="token keyword">for</span> <span class="token punctuation">(</span> <span class="token keyword">int</span> r <span class="token operator">:</span> grantResults <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> r <span class="token operator">==</span> PackageManager <span class="token punctuation">.</span> PERMISSION_DENIED <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span> <span class="token punctuation">.</span> callbackContext <span class="token punctuation">.</span> <span class="token function">sendPluginResult</span> <span class="token punctuation">(</span> <span class="token keyword">new</span> <span class="token function">PluginResult</span> <span class="token punctuation">(</span> PluginResult <span class="token punctuation">.</span> Status <span class="token punctuation">.</span> ERROR <span class="token punctuation">,</span> PERMISSION_DENIED_ERROR <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">switch</span> <span class="token punctuation">(</span> requestCode <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">case</span> SEARCH_REQ_CODE <span class="token operator">:</span> <span class="token function">search</span> <span class="token punctuation">(</span> executeArgs <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">break</span> <span class="token punctuation">;</span> <span class="token keyword">case</span> SAVE_REQ_CODE <span class="token operator">:</span> <span class="token function">save</span> <span class="token punctuation">(</span> executeArgs <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">break</span> <span class="token punctuation">;</span> <span class="token keyword">case</span> REMOVE_REQ_CODE <span class="token operator">:</span> <span class="token function">remove</span> <span class="token punctuation">(</span> executeArgs <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">break</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
You can apply for a permission for 1 group permission:
1 2 | String <span class="token punctuation">[</span> <span class="token punctuation">]</span> permissions <span class="token operator">=</span> <span class="token punctuation">{</span> Manifest <span class="token punctuation">.</span> permission <span class="token punctuation">.</span> <span class="token constant">ACCESS_COARSE_LOCATION</span> <span class="token punctuation">,</span> Manifest <span class="token punctuation">.</span> permission <span class="token punctuation">.</span> <span class="token constant">ACCESS_FINE_LOCATION</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> |
Then will send a request to grant group permission as follows:
1 2 | cordova <span class="token punctuation">.</span> <span class="token function">requestPermissions</span> <span class="token punctuation">(</span> <span class="token keyword">this</span> <span class="token punctuation">,</span> <span class="token number">0</span> <span class="token punctuation">,</span> permissions <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
How to add the Framework to work in the codorva. (Firebase Plugin Research)
Directly through the framework to bundled library:
1 2 3 4 5 6 7 8 9 10 11 12 | <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> platform</span> <span class="token attr-name">name</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> android <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> ... <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> config-file</span> <span class="token attr-name">parent</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> /* <span class="token punctuation">"</span></span> <span class="token attr-name">target</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> res/xml/config.xml <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> feature</span> <span class="token attr-name">name</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> FirebasePlugin <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> param</span> <span class="token attr-name">name</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> android-package <span class="token punctuation">"</span></span> <span class="token attr-name">value</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> org.apache.cordova.firebase.FirebasePlugin <span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> feature</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> config-file</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> config-file</span> <span class="token attr-name">parent</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> /* <span class="token punctuation">"</span></span> <span class="token attr-name">target</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> AndroidManifest.xml <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> config-file</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> source-file</span> <span class="token attr-name">src</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> src/android/FirebasePlugin.java <span class="token punctuation">"</span></span> <span class="token attr-name">target-dir</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> src/cordova-plugin-firebase/FirebasePlugin <span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> framework</span> <span class="token attr-name">src</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> com.google.firebase:firebase-messaging:9.0.+ <span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span> ... <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> platform</span> <span class="token punctuation">></span></span> |
Or, configure the framework through custom .gradle
file as follows:
1 2 | <span class="token operator"><</span> framework src <span class="token operator">=</span> <span class="token string">"relative/path/rules.gradle"</span> custom <span class="token operator">=</span> <span class="token string">"true"</span> <span class="token keyword">type</span> <span class="token operator">=</span> <span class="token string">"gradleReference"</span> <span class="token operator">/</span> <span class="token operator">></span> |
See more here: link: cordova.apache.org/docs/en/latest/plugin_ref/spec.html#framework
Plugin Research in Construct3:
Attention when working with addon:
- property variable: https://www.construct.net/en/make-games/manuals/addon-sdk/reference/pluginproperty
In developer mode:
see also: https://www.construct.net/en/make-games/manuals/addon-sdk/guide/enabling-developer-mode
Open settings Click on Settings located at the top 10 times Scroll down to the bottom advance list and select enable developer. Restarting construct 3 is ok
Instructions to work with debug mode
See also: (http local: https://www.construct.net/en/make-games/manuals/addon-sdk/guide/using-developer-mode ) Purpose to test faster.
Steps to be taken:
- Enable debug mode as above
- Create a web local server:
- create at localhost and the port should be from: 49152-65535
- The local web service must have access to all addon files with CORS (Cross-Origin-Resource-Sharing) enabled for Construct3 to load it.
- add HTTP header to server response:
Access-Control-Allow-Origin: *
- if using NginX:
add_header Access-Control-Allow-Origin *;
- add HTTP header to server response:
- Check to clear the cache on the local server to always get the latest addon.
- After the config server is finished: update the content on the host according to the c3addon directory structure: see also: https://www.construct.net/en/make-games/manuals/addon-sdk/guide/c3addon-file
- For example, with the following link: http: // localhost: 65432 / myaddon / addon.json
Note: Chrome may block access to localhost since it treats it as mixed content from editor.construct.net (which is on a secure origin). You can work around this by running a secure server on localhost instead, using a self-signed certificate.
- Update the addon.json file to get the complete file list
- Normally the files are extracted from .c3addon, Construct3 can recognize the files in it
- When loading via web service, you need to reconfigure so you need to update addon.json. See here: https://www.construct.net/en/make-games/manuals/addon-sdk/guide/addon-metadata
- file-list can be retained during release mode.
- Click on add dev addon and type the local host address.
http://localhost:65432/myaddon/addon.json
- Click on add dev addon and type the local host address.
- When you want to test the latest addon feature again, just reload construct 3
Structure of the c3addon plugin folder:
- c2runtime / – subfolder for Construct 2 runtime files. Usually only contains file: runtime.js. For construct 2.
- c3runtime / – subfolder for Construct 3 executable files for the addon.
- lang / en-US.json – delicious language to display in the addon.
- aces.json – JSON to define actions, conditions & expressions.
- addon.json – JSON data file: contains the meta data of the addon.
- icon.svg – addon icon.
- plugin.js or behavior.js – class that represents the plugin or behavior
- type.js – represents type objects in plugin / bahavior
- instance.js – class representing plugin / behavior (instance)
Note about files:
- aces.json: many important parts: https://www.construct.net/en/make-games/manuals/addon-sdk/guide/defining-aces
Note the plugin code:
- unified use
.
or string to access the json object. such as:
1 2 3 4 | <span class="token keyword">const</span> obj <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> obj <span class="token punctuation">.</span> myproperty <span class="token operator">=</span> <span class="token number">1</span> <span class="token punctuation">;</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> obj <span class="token punctuation">[</span> <span class="token string">"myproperty"</span> <span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// This case is wrong after minification , nen dung obj.myproperty luon</span> |
- In case of calling to external API, the function must be kept intact, be minified so we will use string to not change the function. eg
1 2 | api["myFunctionCall"](); // gọi như thế này. |
- Use this way to access the global variable:
1 2 | <span class="token keyword">self</span> <span class="token punctuation">[</span> <span class="token string">"MyGlobalAPI"</span> <span class="token punctuation">]</span> |
- When construct3 crashes by the tool, use SAFEMODE to remove the tool: go to link: editor.construct.net/?safe-mode
Plugins in-depth:
NGINX
- on mac nginx is stored in:
/usr/local/cellar/nginx
- command to run nginx:
launchctl load /usr/local/cellar/nginx/1.19.1/homebrew.mxcl.nginx.plist
- stop nginx command:
launchctl unload /usr/local/cellar/nginx/1.19.1/homebrew.mxcl.nginx.plist
- nginx runs default at:
http://127.0.0.1:8080
Add configs in -> / usr / local / etc / nginx / servers / Default config -> /usr/local/etc/nginx/nginx.conf Logs will be in -> / usr / local / var / log / nginx / Default webroot is -> / usr / local / var / www / Default listen address -> http: // localhost: 8080 Disable Cache nginx: http://ubiq.co/tech-blog/disable-nginx-cache/
https://cordova.apache.org/docs/en/latest/plugin_ref/plugman.html
Create the Cordova plugin:
Create plugin
1 2 | plugman create --name pluginName --plugin_id pluginID --plugin_version <span class="token number">0.0</span> .1 |
To install proj cordova, add package.json:
1 2 | plugman createpackagejson <span class="token operator">/</span> path <span class="token operator">/</span> to <span class="token operator">/</span> your <span class="token operator">/</span> plugin |
Tao proj cordova de test:
- npm install -g cordova
- cordova create hello com.example.hello HelloWorld
- Add platform can: android / ios
cordova platform add android
- Add platform can: android / ios
- Check back:
cordova platform ls
- Check back:
- Check the security requirements to build platform day: cordova requirements
- Build du an:
cordova build
or follow the platformcordova build android
..
- Build du an:
- test on emu:
cordova emulate android
orcordova run android
- test on emu:
- Add plugin:
cordova plugin search camera
: search out the plugin! To add & save into package.json use thecordova plugin add cordova-plugin-camera
- Add plugin:
Test on Android:
- Run the android emulator:
Users/quile/Library/Android/sdk/emulator/emulator -list-avds
after checking the device list, use the user to run/Users/quile/Library/Android/sdk/emulator/emulator -avd Pixel_2_API_29 -netdelay none -netspeed full
- Run the android emulator:
Check if the plugin & project test is ok:
plugman install --platform ios --project /path/to/my/project/www --plugin /path/to/my/plugin
-> error
install plugin after finish on proj cordova:
cordova plugin add cordova-plugin-camera
Most important
- Overview of the Plugin in cordova https://cordova.apache.org/docs/en/latest/guide/hybrid/plugins/index.html
- Android Plugin: https://cordova.apache.org/docs/en/latest/guide/hybrid/plugins/index.html
Take care when I proj with cordova:
There are 2 ways to create proj:
- Create proj with cross-platform: cordova cli … can not use plugman
- Create a separate proj to implement SDK & debug, specializing in each platform. Use plugman cli to create proj …
How to add params to Action in Plugin Construct 3
- the aces.json file defines the param in the action:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | ... <span class="token property">"action"</span> <span class="token operator">:</span> <span class="token punctuation">[</span> ... <span class="token punctuation">{</span> <span class="token property">"id"</span> <span class="token operator">:</span> <span class="token string">"do-action"</span> <span class="token punctuation">,</span> <span class="token property">"scriptName"</span> <span class="token operator">:</span> <span class="token string">"Action"</span> <span class="token punctuation">,</span> <span class="token property">"highlight"</span> <span class="token operator">:</span> <span class="token boolean">false</span> <span class="token punctuation">,</span> <span class="token property">"params"</span> <span class="token operator">:</span> <span class="token punctuation">[</span> <span class="token punctuation">{</span> <span class="token property">"id"</span> <span class="token operator">:</span> <span class="token string">"number"</span> <span class="token punctuation">,</span> <span class="token property">"type"</span> <span class="token operator">:</span> <span class="token string">"number"</span> <span class="token punctuation">}</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token punctuation">]</span> ... |
- Lang file configuration: note that display-text: is configured as below to not have error when adding param number.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | ... <span class="token property">"actions"</span> <span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token property">"do-action"</span> <span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token property">"list-name"</span> <span class="token operator">:</span> <span class="token string">"Do Action"</span> <span class="token punctuation">,</span> <span class="token property">"display-text"</span> <span class="token operator">:</span> <span class="token string">"[i]{0}[/i] is a large number"</span> <span class="token punctuation">,</span> <span class="token property">"description"</span> <span class="token operator">:</span> <span class="token string">"Do Action ABCD"</span> <span class="token punctuation">,</span> <span class="token property">"params"</span> <span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token property">"number"</span> <span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token property">"name"</span> <span class="token operator">:</span> <span class="token string">"Number"</span> <span class="token punctuation">,</span> <span class="token property">"desc"</span> <span class="token operator">:</span> <span class="token string">"The number to double."</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> ... |
- c3runtime folder file: actions.js
1 2 3 4 5 6 7 8 | <span class="token function">Action</span> <span class="token punctuation">(</span> number <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">alert</span> <span class="token punctuation">(</span> <span class="token string">"Call Do Action Function = "</span> <span class="token operator">+</span> number <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> |
How to export build from Construct 3 via Cordova project with Cordova SDK:
Configure Addon (Plugin) in Construct 3 as follows:
In the plugin.js: add file as follows
1 2 3 4 5 6 7 8 9 | <span class="token selector">//constructor() constructor()</span> <span class="token punctuation">{</span> <span class="token selector">... this._info.AddCordovaPluginReference(</span> <span class="token punctuation">{</span> <span class="token property">id</span> <span class="token punctuation">:</span> <span class="token string">"cordova-plugin-device"</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> ... <span class="token punctuation">}</span> |
Where cordova-plugin-device
is the name of the plugin that cordova support.
Below we will use the cordova-plugin-gameanalytics
to demo code implement logic for action.js
Define the necessary actions according to the instructions of the cordova plugin, and in the action code will call the cordova plugin as follows:
actions.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <span class="token comment">//Cần hàm khởi tạo sdk</span> <span class="token function">init</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token keyword">typeof</span> window <span class="token punctuation">[</span> <span class="token string">"GameAnalytics"</span> <span class="token punctuation">]</span> <span class="token punctuation">[</span> <span class="token string">"initialize"</span> <span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token string">"function"</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> ga <span class="token operator">=</span> window <span class="token punctuation">[</span> <span class="token string">"GameAnalytics"</span> <span class="token punctuation">]</span> <span class="token comment">// lúc này có thể sử dụng được biến ga...</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token keyword">typeof</span> window <span class="token punctuation">[</span> <span class="token string">"gameanalytics"</span> <span class="token punctuation">]</span> <span class="token punctuation">[</span> <span class="token string">"GameAnalytics"</span> <span class="token punctuation">]</span> <span class="token operator">!=</span> <span class="token string">"undefined"</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> ga <span class="token operator">=</span> window <span class="token punctuation">[</span> <span class="token string">"gameanalytics"</span> <span class="token punctuation">]</span> <span class="token punctuation">[</span> <span class="token string">"GameAnalytics"</span> <span class="token punctuation">]</span> <span class="token punctuation">;</span> <span class="token comment">//...</span> ga <span class="token punctuation">[</span> <span class="token string">"initialize"</span> <span class="token punctuation">]</span> <span class="token punctuation">(</span> <span class="token keyword">this</span> <span class="token punctuation">.</span> _gameKeyBrowser <span class="token punctuation">,</span> <span class="token keyword">this</span> <span class="token punctuation">.</span> _secretKeyBrowser <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">"initialize: GameAnalytics object not found"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
Functions called from external api are minified, so they must be called via: ga["function"](var1,var2)
Steps to run proj in Cordova form after exporting from Construct 3:
Once the proj is built in the form of cordova, run the command:
1 2 | cordova prepare |
This command is used to initialize & download the necessary sdk cordova according to the configuration from Construct3.
1 2 | cordova requirements |
Check the tools to get ready to build android / ios.
1 2 3 4 5 | cordova build android // hoặc cordova build ios |
To build on each platform.
More info: https://blog.quilv.com/blog