Monday, July 27, 2015

Using CFNETWORK_DIAGNOSTICS for network log for iOS

CFNetwork has built-in support to log network activity for iOS device by setting the environment variable CFNETWORK_DIAGNOSTICS.

The CFNETWORK_DIAGNOSTICS can be set to the following values:

    1: Enables internal CFNetwork event and url logging

    2: Adds information about http header and how CFNetwork decides to make and re-use TCP sockets

    3: Adds decrypted bytes in and out of network connection.

Following the below steps to use this feature
1. Enable the feature with one of the following options

   option 1: call setenv method in xcode project's main method
   int main(int argc, char * argv[]) {
       setenv("CFNETWORK_DIAGNOSTICS", "3", 1);
          @autoreleasepool {
               return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
       }
  }

  option 2: set the environment var in project scheme as 


2. build and run the project on device, make the server request to be tested

3. from xcode device tab, export the application container. Then show the package content of the downloaded container from Finder, and the log file will be in the folder of
/AppData/Library/Logs/CrashReporter.

  


Wednesday, July 1, 2015

SAP UI5: bootstrap with sap-ui-core.js and debug tip

sap-ui-core.js
SAP UI5 is started by loading the bootstrap js file sap-ui-core.js. The UI5 document has a tutorial to create a simple app at
https://openui5.hana.ondemand.com/#docs/guide/5b9a170d9f6a4d5784e8ab2ded3d8517.html

<script src="resources/sap-ui-core.js" id="sap-ui-bootstrap" data-sap-ui-libs="sap.m" data-sap-ui-theme="sap_bluecrystal"</script>

The important thing is data-sap-ui-libs, which tells sap-ui-core.js to load additional UI5 libraries to be used by the application. for example, if you want to create a button from sap.ui.commons library (not sap.m library) using the below code, but does not include "sap.ui.commons" in the library collection, then the call will fail:
btn = new sap.ui.commons.Button(...)
Internally, sap-ui-core.js just calls jquery.sap.require() to load each library specified in this property.

However,  UI5 document does not clearly indicate how it organizes the UI5 library or give a clarr library list for the library information

Debug tips:
0. on Windows, click CTRL+SHIFT+ALT+S to open UI5 diagnostic window

1. As ui5 loads view.js at runtime by xhr request, instead of using the <script> tag, so it cannot attach desktop browser as debugger to those js file. in order to debug the js view code, one option is pre-loading the js file explicitly in html file, and then the file will be ready for debugging as regular js file. In this case, the xhr loader will check and skip the already loaded file.

2. Changing sap-ui-core.js to sap-ui-core-dbg.js in bootstrap script element or setting parameter "sap-ui-debug=true" in the query string will load debug version of sap-ui-core-dbg.js. The first method is recommended as it can be used to debug sap-ui-core functions. it can also be set at bootstrap script tag as
sap-ui-debug="true"
Note, you can also directly load sap-ui-core-dbg.js in bootstrap ui5 script, as that will show the parameter name properly in javascript debugger variable window.

3. Set log level to debug in configuration object to get detailed log
<script src="resources/sap-ui-core.js" id="sap-ui-bootstrap" data-sap-ui-libs="sap.m" data-sap-ui-theme="sap_bluecrystal" data-sap-ui-config="logLevel:'DEBUG'"</script>

4. By default, all ui5 libraries are loaded synchronously, to load them asynchronously, set  data-sap-ui-preload="sync" in bootstrap script, and then listen for UI5 core's attachInitEvent

<script src="resources/sap-ui-core-dbg.js"
id="sap-ui-bootstrap"
data-sap-ui-config="theme:'sap_bluecrystal',
                    libs:'sap.m',
                    logLevel:'DEBUG',
                    preload:'async'">
</script>
<!-- only load the mobile lib "sap.m" and the "sap_bluecrystal" theme -->

5. click  CTRL + ALT + SHIFT + P to show UI5 technical information dialog box, including setting debug source, and check ui5 version. CTRL + ALT + SHIFT + S to show diagnostic dialog, to see UI5 tree control, property window and binding

Key methods
The bootstrap process uses few key methods in sap-ui-core.js:

sap.ui.define 
Defines a Javascript module with its name, its dependencies and a module value or factory.

sap.ui.require
Resolves one or more module dependencies synchronous (for single parameter) or asynchronously (for callback method)

sap.ui.getCore
Retrieve the SAPUI5 Core instance for the current window.


Get UI5 Version

To check UI5 version from ABAP system, send request to 

http://<HOST>:<port>/sap/public/bc/ui5_ui5/ 
for example:
https://ldai1uia.wdf.sap.corp:44300/sap/public/bc/ui5_ui5 
or 
https://ldai1uia.wdf.sap.corp:44300/sap/public/bc/ui5_ui5/index.html