Technology Blogs by SAP
Learn how to extend and personalize SAP applications. Follow the SAP technology blog for insights into SAP BTP, ABAP, SAP Analytics Cloud, SAP HANA, and more.
cancel
Showing results for 
Search instead for 
Did you mean: 
LudoNoens
Product and Topic Expert
Product and Topic Expert
Updated 3 March 2021: added steps to avoid CORS issues on iOS

Updated 5 January 2021: updated as the Neo trial landscape is no longer available

Updated 24 March 2020: added information regarding multiple offline stores

Updated 21 February 2020: as the old Mobile Services sample OData service has been deprecated, I've updated the destination configuration.

 

Important note: although hybrid apps are a valid way to implement offline apps, we strongly recommend using more modern mobile technologies instead. 
When you start developing a new mobile app, we strongly recommend that you consider developing this with either MDK (Mobile Development Kit) for cross platform applications, or our native SDKs (SAP Cloud Platform SDK for iOS or SAP Cloud Platform SDK for Android).

 

A new milestone and a bit of background


As a Product Owner, it is always good to see your product reach a new milestone. Last week, you’ve seen the announcement of Hybrid Application Toolkit release 1805 in Britt’s blog. In this release, we’ve made some fundamental changes in the way we build hybrid apps in the cloud from SAP Web IDE.

It is not my intention to repeat Britt’s blog; but let me just highlight the most important part of this release: Developers have a lot more control on what is packaged into a hybrid app. This opens the door to more possibilities and allows developers to more easily resolve challenges by themselves.

One of the hot topics we did not completely cover in this release is the ability to create offline apps. Many developers have been asking for this. In December 2017, I’ve announced our plans to ‘end-of-maintenance’ the HAT local add-on. We have provided you one offline specific template in SAP Web IDE (with that I mean the Eclipse Orion based version) that could only be used in conjunction with the HAT local add-on. The template is not available in SAP Web IDE Full-Stack. Meanwhile, our colleagues from SAP Web IDE have shut down the old SAP Web IDE and you are advised to migrate projects to the Full-Stack version. So how do you build offline hybrid apps in SAP Web IDE Full-Stack, if we don’t provide the template anymore?

Before answering, let’s look back into the history of this toolkit. When we started, we had no cloud build feature. Instead, we were relying on the locally installed tools for developing Cordova apps. There were templates in Web IDE that kept evolving over time. At some point we’ve decided to grab a snapshot of a UI5 Master Detail template and adapt it to support offline. This template was shipped with HAT, the Web IDE plugin. We then tried to keep up with changes in the original template. At some point, the original template was replaced with a Fiori Master-Detail Application template. We did not further update our offline template, unless really needed.

Although we could have created new mobile specific templates in HAT, we actually wanted the opposite: any template should by default support mobile; hence there should not be mobile variants at all. The functionality we’ve provided last year was actually doing this. When the HAT plugin in Web IDE was active, a newly created project was automatically enabled for mobile. We were adding some magic in the background to make this happen. However, although we’ve tried to make it easier, in reality things got a lot more difficult (especially troubleshooting).

We do not plan to provide you an offline template in SAP Web IDE Full-Stack. The main reason is that every app is unique and requires specific customization around the topic of offline. It is very difficult to provide you this as part of a one-fits-all template. Instead, we will give you guidelines on how to implement offline functionality in your app and provide you with an example below.

Creating an offline app based on the Fiori CRUD Master-Detail template


Prerequisites


Before we start creating the example app, let us first ensure we can access the Mobile Service Sample Service from SAP Web IDE. In your SAP Cloud Platform cockpit, go to Connectivity > Destinations and create a new destination as shown below. Make sure you add the additional properties as indicated. The url is not completely visible is the screenshot. Please enter https://hcpms-<your account number>trial.hanatrial.ondemand.com/mobileservices/origin/hcpms/ESPM.svc/v2. I was using a trial account for this blog post. However, the Neo trial landscape is no longer available. Please adapt the url for your productive environment.



After saving the destination settings, it can take up to a few minutes to have the new destination active.

Update 21/02/2020: for Authentication, please use App2AppSSO.

Now let’s start creating the app from scratch in SAP Web IDE Full-Stack. You can find this version of SAP Web IDE in your SAP Cloud Platform cockpit’s services list:



Although not required at this point, please make sure you have activated Hybrid Application Toolkit. Once you are in SAP Web IDE Full-Stack, go to the preferences and ensure the feature Hybrid App Toolkit is activated. Don't forget to save your selection and reload SAP Web IDE.



You will use the Cloud Build feature based on Mobile Services. Customers who have access a productive environment could see the following in the Hybrid Application Toolkit preferences (depending on your subscription):



If you don't see the Cloud Build Service mentioned in the preference, you will be using Mobile Services by default. If you do see the radio buttons, please ensure the radio button regarding Cloud Build Service is enabled for Mobile Services (not the deprecated one for SAP Fiori).

Creating a new project from a template


In SAP Web IDE, please select File > New > Project from Template. To avoid possible issues with the latest innovation version, I have selected a CRUD Master-Detail template based on SAPUI5 version 1.52. Feel free to use a different version.



In the next step, fill in the details.



In this example I am using the Mobile Service Sample Service to consume OData from a Service URL. We have exposed this service to SAP Web IDE through the destination we have created earlier.



In the Template Customization step, I have selected the following:



Once finished, you can run the application from SAP Web IDE in your web browser. It will show you the data from the data source (read) and you can create new entries (create), change it (update) and remove entries (delete). Also referred to as "CRUD".

Mobile enable the project


Right-click on your project to bring up the context menu and select Mobile > Enable as Hybrid Mobile Project.



This step will add a ‘mobile’ folder to your project, containing some source files only relevant for when your app runs on a device or emulator (as Packaged app, or Developer Companion app).



Take note that during the cloud build process, the contents of the webapp folder and the mobile folder will be merged into the www folder of your Cordova project. The index.html file in the mobile folder will replace the one in your webapp project (if your project has one).

We’ve decided to use this approach, so you can still deploy the webapp to SAP Cloud Platform.

Creating a hybrid app from this project


You can create a Packaged app based on this project by selecting in the context menu: Mobile > Build Packaged App.



In the first step of the build wizard, you can change the app’s name as visible on your device’s home page. You can also select an app icon and images for the splash screen.



In the next step, you indicate for which platform you want to build your app. You'll need to provide a valid the signing profile. For Android devices, you can simply generate one on our service. The provisioning profile for iOS is a bit more tricky. I recommend creating a wildcard App ID on developer.apple.com and include that in the profile which allows you to install the application on your device. Note that this is wildcard App ID is only for development; not for production. You'll then need to export your certificate and provisioning profile and import it here.

Currently, we only have two UI5 versions to select from. We will gradually add more versions.



At this point you can hit the Build button. Once the Cloud Build Service is finished generating your app, a QR code and hyperlink will be displayed, so you can download the app onto your device.



During this build process, Hybrid Application Toolkit will automatically create a new application on Mobile Service, and also create the related Cloud Platform destination for you.

Adding Cordova plugins (optional)


Although not related to the offline topic, I have received several queries on how to add Cordova plugins. So let's quickly discuss this.

In case you want to make use of one or more of the more than 2300 publicly available Cordova plugins in your project, open the context menu and choose Mobile > Select Cordova plugins. You can browse and search for plugins. Once you are done, make sure to save your selection.



When you trigger a new build, the plugins will automatically be added in your Cordova app.

Note that there is a tab called "Default (34)", which does not allow you to make a selection. It merely lists down the plugins we add to your app by default. You'll notice most of the Kapsel plugins are listed there. You don't need to select them. They will be part of your app by default.

Adding the offline capabilities


Before we discuss the offline capabilities, I want to highlight one thing regarding Developer Companion: since this type of app is typically an online app, we cannot use Developer Companion for developing offline apps. Offline will only work for Packaged Apps.

Users who have already created offline apps before using our cloud build service are probably familiar with the way to add the Kapsel Offline OData plugin to the project. This is actually triggered by adding a “sap.mobile” section that defines ‘stores’ in the project’s manifest.json. We have kept this in the new delivery, so that existing projects can more easily transition. The content of this section is actually not important anymore. What matters is that this section is there. Before the HAT 1805 release, the content was used in the build process. As long as you specify the bare minimum, you are fine:
	},
"sap.mobile": {
"definingRequests": {},
"stores": [
]



As a result, your Packaged app built with Cloud Build Service includes the SAP Kapsel Offline OData plugin. Now we need to add some more code to make use of this.

Initializing the offline store


The file mobile/hybrid/sap-mobile-hybrid.js contains most of the bootstrap code for the hybrid app. You are free to make changes here. We are going to add a function to create and open the offline store that will be used to store the data relevant for the app on the device.
    openStore: function() {
console.log("In openStore");
jQuery.sap.require("sap.ui.thirdparty.datajs"); //Required when using SAPUI5 and the Kapsel Offline Store
var properties = {
"name": "store_mainService",
"host": sap.hybrid.kapsel.appContext.registrationContext.serverHost,
"port": sap.hybrid.kapsel.appContext.registrationContext.serverPort,
"https": sap.hybrid.kapsel.appContext.registrationContext.https,
"serviceRoot": fiori_client_appConfig.appID + "_" + mobile_appRoutes[0].destination,

"definingRequests": {
"supplierset": "/Suppliers?$expand=Products"
}
};

store = sap.OData.createOfflineStore(properties);

var openStoreSuccessCallback = function() {
console.log("In openStoreSuccessCallback");
sap.OData.applyHttpClient(); //Offline OData calls can now be made against datajs.
sap.Xhook.disable(); // temporary workaround to ensure the offline app can work in WKWebView
sap.hybrid.startApp();
}

var openStoreErrorCallback = function(error) {
console.log("In openStoreErrorCallback");
alert("An error occurred" + JSON.stringify(error));
}

store.open(openStoreSuccessCallback, openStoreErrorCallback);
},

An important piece to mention here is the serviceRoot specified in the properties. The serviceRoot is basically the location where the offline store will fetch its data, indirectly through Mobile Service. In this particular example I am using the Mobile Service Sample Service; but I could easily change this to use a different destination. The Cloud Platform destination used here was automatically generated by HAT, after triggering the build previously. Also note that the above code assumes one single data source and hence, one single offline store. If your app needs to consume data from multiple sources, you’ll need to open multiple offline stores here.

Updated 19 March 2020: the switch to WKWebView as mentioned in this blog post requires an additional temporary workaround. This is the call to disable Xhook.

In the same file, the appLogon function needs to be adjusted a little bit. Once the logon is done, we call the newly added openStore function, instead of the startApp function.
		if ('serverHost' in context && 'serverPort' in context && 'https' in context) {
// start SCPms logon
sap.hybrid.kapsel.doLogonInit(context, appConfig.appID, sap.hybrid.openStore);

Modification of the datasource uri in the manifest file is no longer required. You can use the same project for running it as online as well as standalone offline app. For existing projects that were mobile enabled, it is advised to remove the 'mobile' folder from the project (you might want to save a copy) and re-enable for mobile. New projects will automatically get the latest code needed when the project is enabled for mobile.

Avoid cross origin (CORS) issues on iOS


With the introduction of iOS 14, the security aspects were further enhanced. To avoid having your application running into cross origin issues, we need to change the settings in the SAP Mobile Services cockpit for Cross Domain Access. This is especially relevant if your app is using the User API (we had a few users facing this).

Please refer to the screenshot below. Please open the SAP BTP Mobile Services Admin Cockpit. Go to Settings -> Security -> Cross Domain Access. Set Origin field to “<AdminAPI>,null”.



Read-only offline app.


Trigger a new cloud build and download your app on your device. After the authentication screen and passcode screen, the screen will go blank for a while. We should actually show something here, so the end-user knows what is happening. This is an improvement to be added later. At this point, the offline store is being synchronised with the backend database. Once this is done, the UI will show up and display the data (this can take around 15 seconds).

You can put your device into airplane mode and continue accessing the data.

Congrats! You’ve built an offline app.

It is nice to be able to Read data when offline, but how about Create, Update and Delete?


The application template is actually already allowing modifications, removal and adding new data entries. But how do we handle this when the device is not connected to the network? The data is simply stored in the on-device offline store. When network connectivity returns, we can synchronise the changes between backend database and on-device store.

To get the latest changes from the backend, we use the refresh function. To upload locally made changes to the backend, we use the flush function.

For the refresh, the most obvious way of implementing this, is as part of the pull-to-refresh. The flush should be triggered once the network connection is back. But for the sake of this demo and making it easier to test, I’ll just add two buttons to the footer bar: a Refresh and a Flush button.

Let’s open the file webapp/view/Master.view.xml and add the following buttons in the customFooterContent.
	<semantic:customFooterContent>
<Button text="Refresh" width="80px" id="__button1" press="onRefreshButton"/>
<Button text="Flush" width="70px" id="__button0" press="onFlushButton"/>
</semantic:customFooterContent>



Now open the file webapp/controller/Master.controller.js and add the following code for handling the button press:
		onRefreshButton: function() {
if (typeof sap.hybrid !== 'undefined') {
sap.hybrid.refreshStore();
}
},

onFlushButton: function() {
if (typeof sap.hybrid !== 'undefined') {
sap.hybrid.flushStore();
}
},

I have added the type check to make sure these calls are only done for a hybrid app. The web app should not call these functions.



We will add the functions called in the file mobile/hybrid/sap-mobile-hybrid.js
	refreshStore: function() {
console.log("Offline events: refreshStore");
if (!store) {
console.log("The store must be open before it can be refreshed");
return;
}
store.refresh(sap.hybrid.refreshStoreCallback, sap.hybrid.errorCallback, null, sap.hybrid.progressCallback);
},

refreshStoreCallback: function() {
console.log("Offline events: refreshStoreCallback");
},

flushStore: function() {
console.log("Offline events: flushStore");
if (!store) {
console.log("The store must be open before it can be flushed");
return;
}
store.flush(sap.hybrid.flushStoreCallback, sap.hybrid.errorCallback, null, sap.hybrid.progressCallback);
},

flushStoreCallback: function() {
console.log("Offline events: flushStoreCallback");
},

errorCallback: function(error) {
console.log("Offline events: errorCallback");
alert("An error occurred: " + JSON.stringify(error));
},

progressCallback: function(progressStatus) {
// console.log("Offline events: progressCallback");

var status = progressStatus.progressState;
var lead = "unknown";
if (status === sap.OfflineStore.ProgressState.STORE_DOWNLOADING) {
lead = "Downloading ";
} else if (status === sap.OfflineStore.ProgressState.REFRESH) {
lead = "Refreshing ";
} else if (status === sap.OfflineStore.ProgressState.FLUSH_REQUEST_QUEUE) {
lead = "Flushing ";
} else if (status === sap.OfflineStore.ProgressState.DONE) {
lead = "Complete ";
} else {
alert("Unknown status in progressCallback");
}
console.log(lead + "Sent: " + progressStatus.bytesSent + " Received: " + progressStatus.bytesRecv + " File Size: " +
progressStatus.fileSize );
},

The refresh and flush functions are asynchronous and will take some time. For demo purposes, I’ve kept the implementation rather simple and added some console logging to have an idea of what is going on. For your enterprise mobile applications, you should implement a way to inform the user about progress and update the UI when needed.

After saving all your code changes, please trigger another cloud build. The result will be an app that allows you to work with your data in online, as well as offline mode. You trigger a refresh to update the on-device store. You can flush the changes made in the on-device store to the data service.

What about data conflicts?


There is one important aspect that I will not discuss in this blog: data conflicts. How do you handle errors when data on the service has changed, while your device was offline, and your user also made changes on the same data?

I think this topic is worth a separate blog post.

Using multiple stores or multiple data sources


Over the past months we have received queries from several users asking about the use of multiple data sources. Customers can have heterogeneous landscapes where data is stored in various systems. When you are building a mobile app that is supposed to work in all kinds of network conditions, you have to use an offline store. Your app might need data from multiple systems. Every data source requires its own offline store. So if you are using data from 'X' number of data sources in your app, you'll need to initialise and open 'X' number of offline stores.

I have seen customers using one single offline store, while their application needs data from multiple sources. To prevent errors in retrieving data, there were various checks in the code to ensure the device was having a network connection. This approach is not recommended. Instead, you should add additional stores. This could require a different way of exposing the data as well.

You might be asking, "Is there a limit to the size or amount of stores ?". The answer simply depends on the amount of storage available on the device. You can have 'N' number of stores, as long as the size of the total storage space required doesn't exceed the storage space on device. The question will be: how much storage space do my target devices have available at a minimum, so my app can work well on all those devices ? In other words and as a practical example: I can have 64GB available on my device, but my colleague has only 2GB free. The answer will be 'less than 2GB' in that case.

In the example code shown above, I've created one 'openStore' function, with a specific serviceRoot and definingRequests, and callback functions for success and failure. You can add more 'openStore' functions where needed. You will also need to implement flush (if required) and refresh functions for each of the stores created. The key will be the serviceRoot and definingRequests. This is where most developers struggle. If the path doesn't match, the initialisation will fail. Please check the troubleshooting section below to resolve this.

Take note that once you add the additional data source to the manifest.json file, the UI5 application will try to fetch metadata from this source when the app initialises; no matter whether there is a network or not; and this could trigger an authentication flow, which you might want to avoid under bad network conditions.

Conclusion


With this blog post I’ve shown you how to create an offline app in SAP Web IDE Full-Stack. The example code provided is very basic. There is surely room for improvement to get this to production level apps. My goal was to show you the basics here, to get you started quickly. I hope this blog post is useful to you and I encourage you to try it out yourself.

Our online documentation is here.

Troubleshooting


After providing support to several users, I'm adding this section to help you in resolving issues you might be facing.

  • You can test the URL used for OData access in the Mobile Service admin cockpit. Select the application and go to Connectivity. Make sure you can Ping the destination. Use the OData application destination test (the icon on the left side of Ping). Specify the relative path as used by your app and click next. You should be able to view data available in the service. If this is not working, then your app will not be able to retrieve data either. Resolve this first before continuing to debug your app.

  • When the offline store is initialised on your device, it will be based on the serviceRoot provided. If you want to make changes to the serviceRoot, you have to delete the existing offline store from your device. Otherwise it will still exist when you restart the app, using the serviceRoot it was initialised with. On iOS, you can remove the store by deleting the app. On Android, removing the app is not sufficient. You also need to clear the app data and cache.

  • A common issue for several users is that the initialisation of the offline store fails. In the example code I am using an alert to indicate this. In case of doubts, you can put a breakpoint on the success callback and error callback to see what is happening.

  • In the file mobile/index.html there is some code to adjust your app's XMLHttpRequests to use URLs that work locally. Please check whether the URL used matches with the serviceRoot you've defined. If the path doesn't match, the app will not use the on-device store.

  • The offline store communicates with Mobile Service over a dedicated channel called Mobilink. You won't be seeing data exchange in the (web) app's logs, as this is handled via native code. Using the Trace functionality in Mobile Service admin cockpit (see Analytics), you will be able to generate a HAR file and get detailed information about the communication between the client app and Mobile Service AND ALSO between Mobile Service and your backend. Check for error messages in the traces to understand why there are failures happening.


Reporting issues


Although I have verified and tested the above flow several times and received confirmation from several users that this works, the results for you might be different. This might be due to interruptions in service availability or changes on the various systems involved. Also take note that I have not tested other scenarios (e.g. on-premise, with Cloud Connector) myself.

For users who are trying to add offline capability to their own app and it fails: please try reproducing exactly the same as described above. Once you have this working, it will be a good reference for your  own application. Adding offline capabilities to a hybrid app is not trivial.

In case you are running into issues, please raise a (BCP) ticket for component CA-WDE-MOB. You can also comment down below, but take note that I will not be monitoring this blog very frequently.

Also, please check my latest blog post "What's new with Hybrid Application Toolkit in 2019" for the latest updates, tips and tricks, ways to resolve issues.

If you found this posting useful, please let me know by hitting the like button.

Thank you!
426 Comments
former_member239819
Participant
0 Kudos
Hi Ludo.

By default, requests are 'batched' which is causing memory errors on the Samsung Galaxy J5 (and J3) Android phones.

Turning off batching ("useBatch": false in Manifest.json) causes other issues with speed and oData call execution, so this isn't an option.

End result is we really need to get this working using batching.  Can you recommend any optimisation? I have setup the Client Indexes.
LudoNoens
Product and Topic Expert
Product and Topic Expert
0 Kudos
Hi Adam,

I would consider the devices you've mentioned as low end. Memory resources are pretty limited on these devices.

Only other thing we can think of is to optimise the app to deal with paging if it’s not already.  If it does do paging then you'll need to make it more aggressive.

You can create the offline store with the pageSize option.  This should restrict the max entities that can be returned in a single read request.

https://help.sap.com/doc/acbf025f18854e63a7f3bf20038356c8/3.1/en-US/api/sap.OfflineStore.html

 

Also on individual requests you can use $top and $skip

https://www.odata.org/documentation/odata-version-2-0/uri-conventions/

 

Hope this helps.

Regards,
Ludo
former_member239819
Participant
0 Kudos
Thanks Ludo.

 

There isn't a huge volume of data so I don't think it's data related., Basically, we have 48 'questions' with 3-5 'answers' for each.

 

 

 
former_member239819
Participant
0 Kudos
Hi Ludo. A PageSize of 10 did indeed resolve the issue of speed/crashing. However, we can't use this as we need all of the data.

 

Do you have any other suggestions?
0 Kudos
Hi Ludo,

 

After building the app, why it is having file size around 100 MP. iIt's just the template I'm having in the project(I don't have any additional code)?
LudoNoens
Product and Topic Expert
Product and Topic Expert
0 Kudos

Hi Jithin,

This is because we need to package a large amount of UI5 libraries into the packaged app.

Regards,
Ludo

0 Kudos
Hi Ludo,

Is there any way, we can reduce the app size? (Only build the required libraries instead of bundling all)

 
jmalla
Contributor
0 Kudos
Hi Ludo,

Nice blog.  I went though this and did the build for Android.

However, for our client, we are trying to build offline Hybrid applications for Windows platform.  I am able to get some of the offline examples working for Windows and debug them through Visual Studio 2017.  I am working on the offline example - Getting Started with Kapsel – Part 10 — Offline OData(SP13+)

From your example, since we do not have the Windows build service available through cloud build, do you have the steps on how I can bring this project into a Cordova windows project and run this.  I am able to create the Cordova windows project, add Cordova and Kapsel plugins, and debug.  In Daniel's blog, i just need to add the corresponding plug-ins and then replace the default Cordova generated index.html with the one he had written.

With your example, if I just export the project from WebIDE and then bring this folders and files into the Cordova Windows project, I am not sure exactly how this will work.  Do I keep the mobile/hybrid folders as you have in the project or do I need to blend them with the web app folder?

In your article, you state:
Take note that during the cloud build process, the contents of the webapp folder and the mobile folder will be merged into the www folder of your Cordova project. The index.html file in the mobile folder will replace the one in your webapp project (if your project has one).

Can you please provide some guidance on the steps to go from your example to doing a build on Visual Studio 2017 for Windows?

Thanks,

Jay

 

 

 

 
LudoNoens
Product and Topic Expert
Product and Topic Expert
Hi Jay,

We will basically merge the mobile folder into the webapp folder during the build process. This will obviously not happen when you export the project from SAP Web IDE. If you want to do this manually:

  1. copy webapp folder contents into Cordova www folder.

  2. copy mobile folder contents into Cordova www folder, overwriting existing files from step 1.


I think the easiest way to get what you need, is to perform a cloud build for Android, with the build option "Save Xcode/Android Studio project". Once this is done, you will be able to download the complete project onto your windows machine. This project will contain the merged folders.

I am not sure whether you could add the Windows platform directly in the Cordova project by using the Cordova CLI tools, but it is worth a try.

You might need to adapt the index.html and other files for the Windows target. I don't have instructions for that.

Hope this helps,
Ludo
jmalla
Contributor
0 Kudos
Hi Ludo,

I downloaded the project from WebIDE and trying to bring the files into the Cordova project.

But I am not sure where to get these files you have referenced - appConfig.js and appRoutes.js - since I am not using the Cloud Build serve.

 
	<!-- initialize bootstrap -->
<script type="text/javascript" src="hybrid/sap-mobile-hybrid.js"></script>
<script type="text/javascript" src="hybrid/logon.js"></script>

<!-- app configuration info files are added during cloud build -->
<script type="text/javascript" src="appConfig.js"></script>
<script type="text/javascript" src="appRoutes.js"></script>

<script type="text/javascript" src="cordova.js" onload="sap.hybrid.setCordova();"></script>

<script type="text/javascript">
(function() {
var remoteBase = fiori_client_appConfig.fioriURL; // not use fioriclient plugin but borrow some of its configuration format
if (remoteBase.charAt(remoteBase.length - 1) === '/') {
remoteBase = remoteBase.substring(0, remoteBase.length - 1); // remove trailing slash
fiori_client_appConfig.fioriURL = remoteBase;
}

 

I am getting the error:

SCRIPT5009: Unhandled exception at line 42, column 3 in ms-appx-web://com.sap.webide.x30eab3620cc54629bd808de0ffd6e721/www/index.html 0x800a1391 - JavaScript runtime error: 'fiori_client_appConfig' is not defined

Where does this variable get referenced?

 

Thanks,

Jay

 

 

 
jmalla
Contributor
0 Kudos
Hi Ludo - I just saw your comment after I posted a comment below.  I will try the steps you have mentioned.  I will take the Android studio project and then download that and then see how that has been done.

What I had done is merge the contents manually and then point the start to be the index.html from the mobile folder which now is under the www folder.  I also brought in the resources folder that has the SAP UI5 sap m and ui folders.

I am not sure where fiori_client_appConfig is defined.  I do not have the appConfig.js and appRoutes.js in the exported WebIDE project.

Thanks,

Jay

 
LudoNoens
Product and Topic Expert
Product and Topic Expert
0 Kudos
Yes, that is another reason for advising you to download the complete project from our build service. Those missing files are generated and will be part of the final project.

Cheers,
Ludo
LudoNoens
Product and Topic Expert
Product and Topic Expert
0 Kudos
Hi Jithin,

Unfortunately, we don't provide a way to limit the amount of libraries included in the cloud build service. What is included is already a subset tailored for mobile.

You could manually strip out the libraries you deem not required by downloading the Xcode/Android Project locally. But this is tricky, because you might not know the dependencies. If you leave out too much, the mobile app will fail at runtime (and this can be very hard to debug).

Regards,
Ludo
jmalla
Contributor
0 Kudos
Hi Ludo,

I downloaded the Android build project and copied the files over.  What is strange is that I am now getting an error:

SCRIPT5022: Unhandled exception at line 1360, column 9 in ms-appx-web://com.sap.webide.x30eab3620cc54629bd808de0ffd6e721/www/cordova.js 0x800a139e - JavaScript runtime error: Module cordova-plugin-network-information.network does not exist. cordova.js (1360,9)

 

I had already added the cordova-plugin-network-information.network in the project using the cordova CLI:

cordova plugin add cordova-plugin-network-information

So I am not sure why it's erroring out.  Should I just copy all of the plugins from the SAP Built project into my Cordova project or should I add them one by one with the CLI.





 



 

I am not sure why the code is not finding this plugin.

Regards,

Jay

 

 
jmalla
Contributor
0 Kudos

Hi Ludo,

I copied the resources folder from platforms\android\app\src\main\assets\www\resources which has all of the sap ui5 libraries and also the plugins from platforms\android\app\src\main\assets\www\plugins so I am no longer getting the issues with missing js files and plugins.

I can step through the call to sap.hybrid.bootStrap();  But the application just exits without going into the first page of the application.  I am not sure why.  I do see an error - "Can’t load the ActiveX plug-in that has the class ID '{D27CDB6E-AE6D-11CF-96B8-444553540000}'. Apps can't load ActiveX controls." that happens before.

So the sap-mobile-hybrid.js never goes into the actual application.

 

Regards,

Jay

 

former_member586089
Discoverer
0 Kudos
Hi Angel,

Even I'm also facing the same issue. How did you resolve the above issue?

 

Regards,

Linga
former_member211078
Participant
0 Kudos
Hi Dominik,

Try to use 2nd scenario. In your frontend system, open the odata service in SICF. Under the logon data tab, mark the checkbox - Use all logon procedures. Clear data of your app on device & check again. You should be able to resolve the error.

I used this way to solve mine.

--

Vineet
krish96
Explorer
0 Kudos
Hi Ludo,

store.open() function control enters success callback function, but the store is not getting created, the app opens  fine, but the busy dialog keeps running with user interface opened  ( tried keeping it for more than 20 minutes, no help  ) . And major doubt is with "store" variable, you have not declared "store" variable, I declared it just as a local variable, does that have anything to do here? Because rest of the lines of code remain the same as yours.

 

Thank you,

Shree Krishna
LudoNoens
Product and Topic Expert
Product and Topic Expert
0 Kudos
Hi Shree,

This sample code is not perfect, but I did validate this multiple times and various users have confirmed this was working fine.

Please see the troubleshooting sections for directions on how to analyse potential issues. I suggest capturing a trace at Mobile Services cockpit to see why the store is not getting created.

Thanks,
Ludo
krish96
Explorer
0 Kudos
Hi Ludo,

I figured out the problem, the problem is with the Regular Expressions within startApp() function, like you mentioned in the blog

"In the file mobile/index.html there is some code to adjust your app’s XMLHttpRequests to use URLs that work locally. Please check whether the URL used matches with the serviceRoot you’ve defined. If the path doesn’t match, the app will not use the on-device store."

can you please help me out what is happening in the regular expressions out there in that function.

Regular expression will not match my appId.

My appId looks like this : com.sap.webide.x4b530a7020154b4ea11037a6c5416c69

 

Thank you,

Shree Krishna
former_member607642
Discoverer
0 Kudos
Hi Ludo,

Thanks for the wonderful blog.I was able to successfully build an offline application. However, what I have noticed is that some entities in the metadata are not loaded when opening the app first time.As a result, create and read are not working for those missing entities while it works fine for the ones which gets loaded. The application works fine on web browser however not working on mobile both in online and offline mode.

Could you please help and suggest what could be the issue possibly.Have a demo lined up this week.
0 Kudos
Hi E V,

you need to change in file manifest.js your templateid to CRUD or Master-Detail
former_member609456
Discoverer
0 Kudos
Hi Ludo,
As far as I know, we should be able to see the config.xml file in the SAP Web IDE by now. Unfortunately it is still not visible in my project. Could this be because I am using a trial account?
LudoNoens
Product and Topic Expert
Product and Topic Expert
0 Kudos
Hi Mathias,

Please check the HAT extension version available in SAP Web IDE on your trial account. It should be version 1.32.1. If not, then try to clear your browser's cache and reload.

See my recent blog for more details.

Thanks,
Ludo
LudoNoens
Product and Topic Expert
Product and Topic Expert
0 Kudos
I think we handled most queries via email.

Thanks,
Ludo
martinkoch
Active Participant
0 Kudos
Dear Ludo

thanks for the great post!

We got everything working, but when trying to connect to an OnPremise ABAP System we get an error:
Failed to load resource: net::ERR_FILE_NOT_FOUND

logger.js:775 error sending ping request{"errorCode":-121,"description":"ERROR whitelist rejection: url='https://mobile-xxx.hana.ondemand.com:443/odata/applications/v1/com.sap.webide.xxxxxxyyyyyy"}

 

We also tried to change the projects config.xml

<access origin="*"/> to the SCPms URL.

 

Thanks fpr your help!

BR,

Martin
dominickeller
Explorer
0 Kudos
Hi Sumanth,

Could you please describe how you have changed your Bundle ID? Do we have to change it in the config.xml file?

Thanks for your help.

Dominic
former_member211078
Participant
Hi Angel,

I have the same CRUD template but still I am facing the undefined error. Please suggest any other alternative ?

"sourceTemplate": {
"id": "html5projecttemplates.2masterdetailcrud",
"version": "1.40.12"
}

--

Vineet
former_member211078
Participant
Hi All,

I resolved the issue. Basically this error can be removed by adding the kapsel plugin of odata.

--

Regards,

Vineet
Nicole
Explorer
0 Kudos
Dear Ludo,

I followed your tutorial exactly. But when I tried to change the sap-mobile-hybrid.js I got problems with already existing variables....

For example fiori_client_appConfig and console are not defined. Do I have to define them or was there an error with generation of the file?

Greetings Nicole
LudoNoens
Product and Topic Expert
Product and Topic Expert
0 Kudos
Hi Nicole,

I believe you can ignore those errors.

Cheers,
Ludo
LudoNoens
Product and Topic Expert
Product and Topic Expert
Hi Martin,

I suspect a wrong configuration somewhere...

Are you able to access your on-premise data in Mobile Services admin cockpit?

First of all, try to ping the destination. If that works, try testing the OData source to see whether you can pull information.

Thanks,
Ludo
Nicole
Explorer
0 Kudos
Thank you very much. It worked indeed. This is a really very helpful blog.
martinkoch
Active Participant
Hi Ludo

the problem was solved by a new build of the application.

Thanks for your help!

Best Regards,

Martin
former_member586089
Discoverer
0 Kudos
Thanks for the reply, Angel. will try to change the manifest.
0 Kudos

Hi Ludo!

Great blog, your app works fine, but I have a question.

In your app you also get an error called “[ODataMetadata] initial load of metadata failed -“. Why does this error occur and why are we able to work with the app, if the metadata couldn’t be loaded?

Regards,

Daniel

0 Kudos
Hi Luis,

I was also able to replicate the example given by Ludo. But while i am trying to use my own oData i am facing issue like my destination with own oData is not displaying in the Service URL list.

Can you help me on this how you created destination for your own oData ? This will be very helpful to me.

Thank you,

Satya
0 Kudos
Hi Ludo,

Nice blog.

I was also able to replicate the example given by you. But while i am trying to use my own oData service, i am facing issue like my destination with own oData is not displaying in the Service URL list.

Can you help me on this how you created destination for your own oData ? This will be very helpful to me.

Thank you,

Satya
LudoNoens
Product and Topic Expert
Product and Topic Expert
0 Kudos
Hi Satya,

This tutorial https://developers.sap.com/tutorials/cp-webide-create-crud-app-template.html should help.

Cheers,
Ludo
BrendanFarthing
Participant
0 Kudos

Hi lnoens,

I’d just like to check if it’s still the case that SAP do not plan to support the ability to add custom Cordova plugins (those not available in the official Cordova public repository)? We use Fiori Mobile, where this is obviously possible, and this is the key thing stopping our company from moving from Fiori Mobile to Mobile Services.

Some companies will not put their Cordova plugins in the public repository but instead wish to provide them directly to paying customers only. In our case we have Cordova plugins for specialised mobile device hardware that is connected to mobile devices running our Fiori apps via custom Fiori Clients.

I understand that we could achieve this by then using a local development environment on our developers PC’s, but this then defeats the key benefit of SAP Cloud mobile build functionality, especially where we have developers who we dont want or need to be deeply skilled Cordova developers (big additional cost to our company). It’s disappointing to us that you offered this in Fiori Mobile, but take it away when enhancing Mobile Services and pointing customers in the direction of using Mobile Services.

One other question, as Fiori Mobile is now deprecated, can you let me know how long this will continue to be fully supported by SAP? Because it does not suit our company to move away from Fiori Mobile (due to lack of custom Cordova plugins and lack of “Mobile Place” functionality in Mobile Services), we need to stay on it, as long as we are fully supported.

Thank you,

Brendan Farthing

LudoNoens
Product and Topic Expert
Product and Topic Expert
0 Kudos
Hi Brendan,

Thanks for bringing this up. We are taking this request into consideration and discussing an approach that would allow you to add custom plugins with minimal effort from our side.

I cannot comment on the timeline for Fiori Mobile at this point. For now, you will continue to receive support.

Thanks,
Ludo
0 Kudos

Hi Ludo,

 

I am having a problem.  When i start my app in mode offline. Which shows a screen in blank.

Could you help me with this problem, please?

Regards,

Angel

LudoNoens
Product and Topic Expert
Product and Topic Expert
0 Kudos
Hi Angel,

Please raise a support ticket for component CA-WDE-MOB.

Include in the ticket:

  • do you see this behaviour only in offline mode?

  • which version of Ui5 are you using?

  • iOS and/or Android


Thanks,
Ludo
0 Kudos
Hi Ludo,

 

My app is in productive environment. When I execute method refresh. That returns error.

 

LudoNoens
Product and Topic Expert
Product and Topic Expert
0 Kudos
Hi Angel,

Please raise a support ticket for component CA-WDE-MOB.

Offline functionality spans a wide range of SAP SDKs and services, created by various teams within SAP. I cannot answer you based on the error in the screenshot. What I do advise is to make use of the logs and tracing features in SAP Mobile Services (see Analytics) to identify the cause of the error.

Thanks,
Ludo
0 Kudos
Hi lnoens!

I got transferred to your blog from another blog on building UI5 offline apps.  But I see an update, that you suggest using Mobile Kit or native CP SDKs. The first question here is:

Are there some LH courses or any other guides on that?

the second question is, or more like a precision information - the HAT toolkit in webIDE and subsequent packaging is currently the only option if OS (desktop-Windows and mobile devices - iOS&Android) wide application needed, right? or is there something new as well?

 

Thanks a million,

Shanir
LudoNoens
Product and Topic Expert
Product and Topic Expert
0 Kudos
Hi Shanir,

For Mobile Development Kit and other options, there is currently a free to access openSAP course running: https://open.sap.com/courses/mobile3

Hope this helps and sorry for the late response.

Cheers,
Ludo
0 Kudos
Hi
did you find any solution? I'm stuck with same

 
0 Kudos
any solution for above?

 
0 Kudos
Getting stuck with same issue ? any solutions please?