Deploy ionic2 mobile application as a Web application - ionic-framework

I want to provide different CSS for ionic2 mobile and web. For example: list differs in width and height for mobile and web application, list font and alignment is different for mobile and web. Please let me know how to achieve this for ionic2 mobile application.
Thanks,

you can achieve that by injecting Platform from ionic-angular and then using ngClass and a boolean flag to assign an appropiate class for each platform.
import { Platform } from 'ionic-angular';
isMobile: boolean;
constructor(platform: Platform) {
platform.ready().then(() => this.isMobile = platform.is('mobile'));
}
and on the html:
<div [ngClass]="{'mobile-css': isMobile, 'web-css': !isMobile}"> </div>

Related

Flutter Web: Correct way of keeping user logged in/Remember me functionality

I am working on a web app in which, I want to keep user logged in during page refresh or even if the tab is no longer exist just like youtube/gmail web app. How to create that ???
In flutter mobile for android/ios we can used shared preferences which uses shared preferences for android and NSUserDefaults for ios to make that functionality. But in the case of Flutter web we can't store user creds into local/ session storage or even in cookies.
I recently started using flutter web so, please guide me on the right path, any link to good resources is much appreciated.
Edited: You can use hivedb packages from pub.dev for safe and high speed storage supporting on web also:
import 'package:hive/hive.dart';
import 'dart:convert';
void main() async {
//Hive.init('somePath') -> not needed in browser
var box = await Hive.openBox('testBox');
box.put('user', json.encode(User(name:'john',password:'pass')));
print('Name: ${box.get('user')}');
}
https://pub.dev/packages/hive
https://docs.hivedb.dev/#/

How to launch external opened app using custom URL scheme from Ionic App?

I want to launch opened app B externally from ionic app A using custom URL scheme.
Solutions Tried
Plugin In App Browser, is able to launch external app in the ionic app itself instead of launching the opened external app.
const target = '_system';
let url = 'abc123://abc.com/mobile/details/' + Id;
const options: InAppBrowserOptions = {
zoom: 'no',
location: 'no',
hidden: 'yes'
};
this.loadingProvider.dismiss();
this.inAppBrowserRef = this.inAppBrowser.create(url, target, options);
Plugin App Launcher. For android, it is able to launch external app but use package name instead of custom URL scheme
I use an anchor tag in my template, and set target="_blank". This is from an Ionic 5 app, but I've only tested in the full iOS build, I don't have an Android one yet. I'm also using Capacitor, but I don't think that changes the browser behavior.
<a [href]="website" target="_blank">{{ website }}</a>
The target="_blank" causes it to open the URL in the main os browser. The main browser should then handle your custom link.
If you have custom URL to open use
window.open('Your URL','_system');
in your code. This can be work in both platform Android and ios Perfectly.

Ionic 4 read SMS plugin for OTP Verification

I am developing the ionic4 app, to auto verification or whenever I will get SMS my app has to read that message. for this I used 'Cordova plugin add Cordova-plugin-SMS' but it is not working. i declared 'declare var window: any; and declare var SMS: any;' nothing has worked. it showing "java.lang.ClassNotFoundException: com.rjfun.cordova.sms.SMSPlugin" in Android, in the web while developing it showing " TypeError: Cannot read property 'listSMS' of undefined". can any one help me to solve this issue
There is one plugin which could solve your problem. Named cordova-plugin-sms-receive.
This will help to read sms when any phone received and you can do whatever you want.
https://www.npmjs.com/package/cordova-plugin-sms-receive
That plugin enables sending an SMS from the app, not receiving an SMS.
To get data from an SMS to your app, you could pass it as args using deeplinks. This would required the user to tap a link in the SMS. I am not aware of a way to have SMS data fed to your app automatically, and I would think it is not possible as it would be a security risk.
A custom URL scheme is the simplest way to do that (e.g. mycoolapp://some-path?p1=data1&p2=data2.
App Links (Android > 6.0) and Universal Links (iOS > 9.0) are more powerful but may be unnecessary and are not as well supported. It really depends on your use case.
Ionic has a community maintained plugin for this which I use and does the job, albeit with a workaround needed here and there. Branch.io's plugin is also an option but I haven't used it.
very nice question ... you need to use cordova plugin for that. Below are the
First you need to install Android Permission Ionic Native Plugin.
run these two commands first to install Android Permission Plugin.
ionic cordova plugin add cordova-plugin-android-permissions
npm install #ionic-native/android-permissions
Add android-permissions to your app's Module.
import { AndroidPermissions} from '#ionic-native/android-permissions';
#NgModule({
providers: [
AndroidPermissions
]
})
export class AppModule { }
Check permissions on page
import { AndroidPermissions } from '#ionic-native/android-permissions';
export class HomePage {
constructor(public androidPermissions: AndroidPermissions) { }
ionViewWillEnter()
{
this.androidPermissions.checkPermission(this.androidPermissions.PERMISSION.READ_SMS).then(
success => console.log('Permission granted'),
err => this.androidPermissions.requestPermission(this.androidPermissions.PERMISSION.READ_SMS)
);
this.androidPermissions.requestPermissions([this.androidPermissions.PERMISSION.READ_SMS]);
}
}
After allowing Read SMS permission now you need to install cordova-plugin-sms. Run this command for install it.
ionic cordova plugin add cordova-sms-plugin
npm install #ionic-native/sms
and in your page while reading SMS -
place this in top before declare class
declare var SMS:any;
place below inside class
ionViewDidEnter()
{
this.platform.ready().then((readySource) => {
if(SMS) SMS.startWatch(()=>{
console.log('watching started');
}, Error=>{
console.log('failed to start watching');
});
document.addEventListener('onSMSArrive', (e:any)=>{
var sms = e.data;
console.log(sms);
});
});
}
You can use this Ionic/Cordova plugin for Auto OTP verification and this will not ask the user for SMS read Permissions.
Plugin: https://github.com/hanatharesh2712/ionic-native-sms-retriever-plugin-master
Demo App: https://github.com/hanatharesh2712/sms-plugin-test

Send user to page on mobile app when clicking email link

I have just started an Ionic 2 mobile app.
I am setting up an update password process where a user can enter their email, click a "send password update email" button which then emails them a link. They can click that link which takes them to a page where they can update their password.
How do I send them a link in their email that when clicked on will open up the app and take them to a specific page?
Even more complicated is that I have a web app also. So if I'm sending them an email, should I show update password on website and update password on mobile app links? Or should I just add a link to the website?
In order to open the mobile app from a link, you need to integrate a cordova plugin called cordova-plugin-customurlscheme. With this plugin you can register a custom url "protocol" that is unique to your app (eg. myAwesomeApp://register?token=123). After installing the plugin with your custom url, clicking on any link starting with myAwesomeApp:// will open your app and also trigger a function hooked on the window object called handleOpenUrl which accepts the url as param. Inside there you can do your routing, depending on the url param.
let self = this;
(<any>window).handleOpenURL = function handleOpenURL(url) {
setTimeout(() => {
if (url && url.indexOf('\register') !== -1) {
let token = URLHelper.getParameterByName(url, 'token');
self.setAsRoot(ConfirmEmailPage, { activationToken: token });
}
}, 0);
};
As for dealing with your web app, what you could do is the following (this is what I am currently doing):
Host online a page (say www.myAwesomeWebsite.com/register?token=123) that checks to see if the user is coming from a mobile device (iOS or Android more specifically). If so on page load redirect them to your myAwesomeApp://register?token=123 link and have a button saying install app from app store with a link to your mobile app. If the user has the app, the app will be opened by the redirect, if they don't they will get an alert saying link cannot be found or sth and after clicking ok they will see the install App from app store button. If the user is not coming from a mobile device, just redirect them to your web app myAwesomeWebApp.com/register?token=123.
Another option is to use a third party service for deep linking like branch
Hope that helps.
EDIT: Since I posted this answer Ionic team has come with their own plugin for deep linking that kind of simplifies some of the hooking up inside your app. Their detailed blog post can be found here. In essence you install their plugin:
cordova plugin add ionic-plugin-deeplinks --variable URL_SCHEME=ionichats --variable DEEPLINK_SCHEME=https --variable DEEPLINK_HOST=ionic-hats.com
and then hook to it like so:
import {Component, ViewChild} from '#angular/core';
import {Platform, Nav, ionicBootstrap} from 'ionic-angular';
import {Deeplinks} from 'ionic-native';
import {AboutPage} from './pages/about/about';
import {HatDetailPage} from './pages/hat/hat';
#Component({
template: '<ion-nav [root]="rootPage"></ion-nav>',
})
class MyApp {
#ViewChild(Nav) nav:Nav;
constructor(private _platform: Platform) {}
ngAfterViewInit() {
this._platform.ready().then(() => {
Deeplinks.routeWithNavController(this.nav, {
'/about-us': AboutPage,
'/hats/:hatId': HatDetailPage
});
});
}
});
ionicBootstrap(MyApp);
Note that although this improves the plugin interfacing a bit, it does not change the fact that you have to use some other mechanism to handle deep links in conjunction with your web app.

how to stay in the webview with intel-sdk crosswalk?

I have below code to open a new browser window which is external URL other than the my applcation
<button id="button" onclick="window.location='http://www.google.com';">click</button>
Problem is: How can I stay within the browser when I open an http url ?
I crosswalk version10, -latest intel-xdk -
function onDeviceReady() {
if( navigator.splashscreen && navigator.splashscreen.hide ) { // Cordova hide splashscreen detected, use it
navigator.splashscreen.hide() ;
alert("Device is ready !");
var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
alert("Started");
}
}
document.addEventListener("deviceready", onDeviceReady, false) ; // ignored by "Standard HTML5 web app"
</script>
I have the first alert "Device is ready");
but it never navigates to apache.org and I never got the second alert !
I added in App Browser (0.5.4) into Cordova included plugins.
In general, it is best to use the inAppBrowser plugin when trying to open URLs within a Cordova app (you are building Cordova apps with the Intel XDK). There are several open options associated with that plugin and it will give you the control you need.