The MobileIron Platform brings together a combination of comprehensive security and Enterprise Mobility Management (EMM) tools including traditional mobile device management (MDM), mobile application management (MAM), and mobile content management (MCM) capabilities.
A customer of ours is interested in developing NativeScript apps in MobileIron platform
but MobileIron has informed him that Telerik is not a supported mobile development platform so had to discard our NativeScript project and start fresh using another product.
Goal: Investigate f we can implement the support for MobileIron and what are the requirements from MobileIron. I've notice @alexrainman had some previous experience with MobileIron - perhaps you can give us some additional information.
Ping @enchev , @atanasovg , @valentinstoychev
Related to https://github.com/NativeScript/NativeScript/issues/2576 and to https://github.com/NativeScript/NativeScript/issues/923
Want to back this issue? Post a bounty on it! We accept bounties via Bountysource.
MobileIron comes in two different flavors for each platform:
iOS: MI provides a native SDK that offers lot of advantages, one of them is being able to debug your app with MI integrated (don't know if they distribute it using cocoapods).
Android: only wrapper is available. It works but it's not 100% good. It has limitations, for example, as it's not and SDK, you cannot debug the app after being wrapped. Identify the source of crashes is a hard task. I also believe it affects the app stability and performance, at least with Xamarin apps that are memory consuming.
The best choice for Android is to support android 5.x and up and go with MobileIron "Android for Work" implementation to avoid using the wrapper (https://mobileiron.com/sites/default/files/whitepapers/files/andorid-work-security-MKT8000-v1.pdf). That's the plan we have for the first quarter of 2017.
How i can collaborate?
I will need your help in this case as some stuff needs to be done at platform specific level that i don't know how to do in {N}, like:
Android:
iOS:
All this has to happen when plugins is installed, also when the platforms is removed/added.
Also, the first http/db call the app will do to populate UI will be done after MI config is parsed.
I hope i can help!
@NickIliev i forgot to mention that to make MobileIron VPN tunneling work with {N}, supported http client handlers need to be in place:
iOS:
Android:
👍
@alexrainman for the android part - you can extend an Activity and ship it with the plugin, then users need only replace a string entry in their app/App_Resources/Android/AndroidManifest
(that can be done with a hook, although instructing users to do it manually could be the way to go)
The plugin can also declare permission dependencies in its own AndroidManifest which will be merged build-time
Thank you!
@Pip3r4o thanks for the initial tips. I will start working on this as soon as i get back home from vacations. I will start shooting you guys with questions 👍
Question: does your http client implements the required handlers on each platform? i believe ios does but not android.
@Pip3r4o @NickIliev question: if i want my class to support notify(eventData), which base class i need to extend? observable.Observable?
@Pip3r4o didn't need to extend/ship a custom activity :)
@Pip3r4o @NickIliev i believe i have a working version for Android. I will be running some tests today.
@alexrainman - please keep us posted on the progress, we will help you if there is any limitation in the framework.
@valentinstoychev i need some help here. It's related to development process. I am following same style i used to develop my carousel-view plugin but somehow it's not working.
I am putting the new plugin in a folder named "ns-appconnect" inside the "app" folder.
My index.ts looks like this:
declare module "ns-appconnect" {
export class NSAppConnect {
constructor();
requestConfig(args: any): void;
}
}
My index.android.ts looks like this:
export class NSAppConnect
{
constructor(){}
public requestConfig(args: android.content.Context): void
{
// here MobileIron intent service will be called
}
}
I can import the module like this:
import { NSAppConnect } from "ns-appconnect";
But when i try to create the object and call requestConfig:
let appConnect = new NSAppConnect();
appConnect.requestConfig(application.android.currentContext);
The app crash with this stacktrace:
An uncaught Exception occurred on "main" thread.
java.lang.RuntimeException: Unable to start activity ComponentInfo{org.nativescript.CarouselViewDemo/com.tns.NativeScriptActivity}: com.tns.NativeScriptException: Failed to find module: "ns-appconnect", relative to: app/tns_modules/
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: com.tns.NativeScriptException: Failed to find module: "ns-appconnect", ...
Which part is wrong? Also i need NSAppConnect to support event notify so i can send back parsed MobileIron configuration. Which base class my class must extend? observable.Observable?
@valentinstoychev i solved the problem using @NathanWalker plugin seed. Cannot debug but i am moving forward.
I have a problem now. I need to include IntentService in Android. I am declaring the class like this:
export class AppConnectConfigService extends android.app.IntentService
{
TAG: string = "AppConnectConfigService";
constructor()
{
super("AppConnectConfigService");
return global.__native(this);
}
onHandleIntent(intent: android.content.Intent) : void
{
}
}
I am adding the Service to plugin AndroidManifest.xml, but app is crashing with this StackTrace:
java.lang.RuntimeException: Unable to instantiate service org.nativescript.demo.AppConnectConfigService: java.lang.ClassNotFoundException: Didn't find class "org.nativescript.demo.AppConnectConfigService" on path: DexPathList[[zip file "/data/app/org.nativescript.starter-2/base.apk"],nativeLibraryDirectories=[/data/app/org.nativescript.starter-2/lib/x86, /data/app/org.nativescript.starter-2/base.apk!/lib/x86, /vendor/lib, /system/lib]]
at android.app.ActivityThread.handleCreateService(ActivityThread.java:2862)
at android.app.ActivityThread.-wrap4(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1427)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.ClassNotFoundException
Also, i have to manually include the service on the demo AndroidManifest.xml because its not getting merged from the plugin manifest. Here's the plugin manifest:
<?xml version="1.0" encoding="UTF-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<permission
android:name="com.mobileiron.CONFIG_PERMISSION"
android:protectionLevel="signature" />
<uses-permission android:name="com.mobileiron.CONFIG_PERMISSION" />
<application>
<service
android:permission="com.mobileiron.CONFIG_PERMISSION"
android:enabled="true"
android:exported="true"
android:name=".AppConnectConfigService">
<intent-filter>
<action android:name="com.mobileiron.HANDLE_CONFIG" />
</intent-filter>
</service>
</application>
</manifest>
Some help please. Thanks
@alexrainman about the IntentService issues
@JavaProxy("com.ns.mobileIron.AppConfigService")
export class AppConnectConfigService extends android.app.IntentService
{
...
}
Make sure you are using the runtime available @next if you have TypeScript 2.1+ installed, as that brought along a breaking change that has been addressed in android@next -> https://github.com/NativeScript/android-runtime/issues/651
While there is a solution to 1, the workaround for 2 would be to bring along a Java class from a native library (aar), I am not sure whether we'll be able to tackle this issue by the time of the 2.5 release as it wasn't prioritized up until now.
As for the AndroidManifest - I'll have to check it out on my end to see what's up there. I'll let you know ASAP if something comes up.
Edit: AndroidManifest won't be merged unless it's part of a native plugin. In the case where it's just dropped as a plain text file in platforms/android it won't be respected as being part of the project.
@alexrainman I can confirm that building a local aar with the IntentService implementation and an AndroidManifest works as expected and when imported as an aar will merge its manifest properly, as can be seen in platforms\android\build\intermediates\manifests\full
Let me know if you would like me to outline the steps to quickly build an aar, and how to easily import it in your plugin so that you could also test it.
@Pip3r4o i can confirm that manifest is being merged. I am testing adding JavaProxy decoration. I cannot include the IntentService in aar because i have to include some code to return the parsed MobileIron config back to {N} 👍
@Pip3r4o if i use android@next, i get this exception:
:buildMetadata
Exception in thread "main" java.lang.IllegalArgumentException: Class android.support.v7.widget.SnapHelper$2 conflict: /Users/alexrainman/Desktop/nsappconnect/demo/platforms/android/build/intermediates/transforms/dex/F0F1/debug/folders/1000/1f/main/classes.dex and /Users/alexrainman/Desktop/nsappconnect/demo/platforms/android/build/intermediates/transforms/dex/F0/debug/folders/1000/1f/main/classes.dex
at com.telerik.metadata.ClassRepo.addToCache(ClassRepo.java:21)
at com.telerik.metadata.Builder.build(Builder.java:41)
at com.telerik.metadata.Generator.main(Generator.java:44)
:buildMetadata FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':buildMetadata'.
> Process 'command '/Library/Java/JavaVirtualMachines/jdk1.8.0_112.jdk/Contents/Home/bin/java'' finished with non-zero exit value 1
It randomly works dough 👎
@alexrainman I've faced this issue after building without cleaning the platforms/android directory after removing a plugin with native dependencies (aar, or plugin from a gradle repository). A fix is available as a PR, meanwhile you can try reinstalling platform. Let me know what works and what doesn't.
@Pip3r4o reinstall android platform? doesn't work or works randomly, i tried multiple times :(
@Pip3r4o anyway, the solution i need is for the "zero argument constructor" problem. As i said, i cannot put the IntentService on a jar/aar because i need to talk back to {N} NsAppConnect class with "notify" event. If that can be done from java then let me know.
I know how to create jar/aar. I have enough experience both native Android and iOS, but i am learning {N} :)
@Pip3r4o maybe i can use something like @blagoev mentions here https://github.com/NativeScript/android-runtime/issues/250
@alexrainman how about extending IntentService in Java, call it MyIntentService and declare a public/protected constructor with no parameters, then bring that class along in NativeScript and extend it there, the constructor should no longer be an issue then.
@Pip3r4o that should work, let me try.
@Pip3r4o the service is working now and i am able to notify an event back to {N} class. Now i will have to parse a real config and see if i can send it back in the event object 👍
@Pip3r4o what {N} does on external storage when the app runs? The plugin works without wrapping the app. I am able to receive and parse config and send it back to {N}, but it crash after wrapping. I am uploading here the logs so you can take a look. I can see from permissions and from the logs that it's something related with file-system access.
UPDATE: MobileIron wrapped apps cannot access external storage without permissions, neither interact with non-managed apps.
Apps that try to read/write application directories on external storage, the [READ/WRITE]_EXTERNAL_STORAGE permission must be specified in the Android Manifest.
@alexrainman - One small clarification ; External storage
as in ANY storage or external storage as in the external SDCard if the device has one? If it is any storage I can tell you right now why it won't probably ever work.
@NathanaelA i updated the thread, my bad, i forgot part of it :)
CAN THIS BE THE CAUSE? I know {N} is not webview but just in case ...
URIs are rewritten in webviews potentially affecting Content-Security-Policies:
File:// URIs are rewritten to allow access to encrypted files. file://foo -> content://com.forgepond.0.<pkg_name>/<data>
Content:// URIs are rewritten to restrict access to apps within the container. content://foo/bar -> content://forgepond.foo/bar
I see lot of exceptions in the logs related to the app accessing the file system:
12-29 18:15:15.851: I/TNS.Native(22558): NativeScript Runtime Version 2.5.0-next-2016-12-19-1539, commit 63333d060df95fec2e5e255471dd5761191ac075
12-29 18:15:15.851: D/StaticWrappers(22558): Thread.setDefaultUncaughtExceptionHandler com.tns.NativeScriptUncaughtExceptionHandler@8bf2866
12-29 18:15:19.191: E/ExceptionHandler(22558): Unable to create application com.tns.NativeScriptApplication: com.tns.NativeScriptException:
12-29 18:15:19.191: E/ExceptionHandler(22558): com.tns.NativeScriptApplication.0onCreate(NativeScriptApplication.java:17)
12-29 18:15:19.191: E/ExceptionHandler(22558): com.tns.NativeScriptApplication.onCreate(NativeScriptApplication.java)
12-29 18:15:19.191: E/ExceptionHandler(22558): File: "/data/user/0/org.nativescript.starter/files/app/tns_modules/file-system/file-system-access.js, line: 352, column: 20
12-29 18:15:19.191: E/ExceptionHandler(22558): Frame: function:'FileSystemAccess.joinPath', file:'/data/user/0/org.nativescript.starter/files/app/tns_modules/file-system/file-system-access.js', line: 352, column: 21
12-29 18:15:19.191: E/ExceptionHandler(22558): Frame: function:'FileSystemAccess.joinPaths', file:'/data/user/0/org.nativescript.starter/files/app/tns_modules/file-system/file-system-access.js', line: 364, column: 27
12-29 18:15:19.191: E/ExceptionHandler(22558): Frame: function:'join', file:'/data/user/0/org.nativescript.starter/files/app/tns_modules/file-system/file-system.js', line: 589, column: 27
12-29 18:15:19.191: E/ExceptionHandler(22558): Frame: function:'loadCss', file:'/data/user/0/org.nativescript.starter/files/app/tns_modules/application/application-common.js', line: 45, column: 31
12-29 18:15:19.191: E/ExceptionHandler(22558): Frame: function:'loadCss', file:'/data/user/0/org.nativescript.starter/files/app/tns_modules/application/application.js', line: 241, column: 46
12-29 18:15:19.191: E/ExceptionHandler(22558): Frame: function:'start', file:'/data/user/0/org.nativescript.starter/files/app/tns_modules/application/application.js', line: 237, column: 5
12-29 18:15:19.191: E/ExceptionHandler(22558): Frame: function:'', file:'/data/user/0/org.nativescript.starter/files/app/app.js', line: 3, column: 13
12-29 18:15:19.191: E/ExceptionHandler(22558): com.tns.NativeScriptApplication.0onCreate(NativeScriptApplication.java:17)
12-29 18:15:19.191: E/ExceptionHandler(22558): com.tns.NativeScriptApplication.onCreate(NativeScriptApplication.java)
12-29 18:15:19.231: I/ActivityManager(3513): Process forgepond.org.nativescript.starter (pid 22558)(adj 0) has died(84,929)
Is the package name use to build the path? Because the app package name changes after it's being wrapped. Ex: forgepond.org.nativescript.starter
I believe, from my experience with MobileIron, the plugin is ready to go but something that {N} does is not compatible with app wrapping.
I am going to start working in the iOS version where wrapping wont be an issue as an SDK is available.
@alexrainman - I think you have the same idea -- my "guess" as to what the problem is on Android. When the app starts up it extracts a ton of stuff out into the /data/data/[MY APPLICATION FOLDER] including the entire CSS, XML, JS. This also includes both the cache folder and the code_cache folder.
In this wrapped application if it is blocking or perhaps attempting to redirect all reads and writes this might be interfering with the extraction and/or ability for the NS run times to load the data and caches in.
@NathanaelA i will dig on this a little bit more. MobileIron is not blocking anything unless its set in the global policy and that only affects external storage, which may be happening on my test server.
I believe what is broken is exactly what you are mentioning as the package name changes when the app is wrapped. If thats the case, then we can apply an easy compatibility fix on {N} core.
I am going to open a case with MobileIron on this matter.
@NathanaelA the path with the app wrapped will be something like this:
/data/data/forgepond.com.your.packagename/
And {N} is building the path without the forgepond. right? Thats why its failing.
The fix should be easy. When the app is wrapped, a system property is added whith value equal true. For compatibility, that property should be checked and the forgepond. added to the path.
Going to test it out.
@NathanaelA @NickIliev @Pip3r4o @valentinstoychev This is why it's not working. {N} is trying to copy and work from a path that doesn't includes "forgepond."
The fix will be checking for:
java.lang.System.getProperty("com.mobileiron.wrapped", "false") === "true"
If case the app is wrapped, then add "forgepond." to the path, but i don't know where to make the change.
Please help.
@NathanaelA is there any variable in {N} iOS that i can use as placeholder for CFBundleIdentifier?
I can see this on the default info.plist:
<key>CFBundleName</key>
<string>${PRODUCT_NAME}</string>
@Pip3r4o is there resources support in platforms/ios? like android res?
@Pip3r4o also a resource file needs to be converted to binary at build time. In xamarin it's like this:
plutil -convert binary1 Resources/AppConnect.plist
Where i should place it?
@alexrainman,
This is why it's not working. {N} is trying to copy and work from a path that doesn't includes "forgepond."
Is that image something you manually did to see if it would work, or is that how it wrote it and then couldn't read it?
@Pip3r4o @NathanaelA i have iOS code ready to test. I will be able to do it after getting answers to these 4 points:
plugin/platforms/ios/res/AppConnect.plist
UPDATE: from MobileIron documentation:
Optionally, you can create an AppConnect.plist file.
If your app is an in-house app, you can specify default values for: • the data loss protection policies, such as the Open In policy
• the key-value pairs for your app-specific configuration
Specifically, you can provide a special plist file called AppConnect.plist as part of your in-house app that:
• specifies whether your app should be allowed by default to copy to the iOS pasteboard, use document interaction (Open In), and print.
• specifies app-specific configuration keys and default values.
These default values are used by MobileIron Core to make it easier for the Core administrator to set up your app with the correct data loss protection policies and app-specific configurations. Your app never reads the AppConnect.plist.
So, i am going to leave it out of the plugin as it can be done in Admin website.
plutil -convert binary1 Resources/AppConnect.plist
<key>CFBundleName</key>
<string>${PRODUCT_NAME}</string>
#import <UIKit/UIKit.h>
#import "DualModeAppDelegate.h"
#import "AppConnect/AppConnect.h"
int main(int argc, char *argv[])
{
@autoreleasepool {
return UIApplicationMain(argc, argv, kACUIApplicationClassName, NSStringFromClass([DualModeAppDelegate class]));
}
}
I see yours looks completely different. Notice that the third parameter is kACUIApplicationClassName instead of nil. I guess it will be at line 35?
TNSEnableRemoteInspector(argc, argv, kACUIApplicationClassName);
Help needed.
@NathanaelA that image is actually how the app data path looks like after the app is wrapped.
@Pip3r4o @NathanaelA help me with these 2 points:
<key>CFBundleName</key>
<string>${PRODUCT_NAME}</string>
#import <UIKit/UIKit.h>
#import "DualModeAppDelegate.h"
#import "AppConnect/AppConnect.h"
int main(int argc, char *argv[])
{
@autoreleasepool {
return UIApplicationMain(argc, argv, kACUIApplicationClassName, NSStringFromClass([DualModeAppDelegate class]));
}
}
I see yours looks completely different. Notice that the third parameter is kACUIApplicationClassName instead of nil. I guess it will be at line 35?
TNSEnableRemoteInspector(argc, argv, kACUIApplicationClassName);
Thanks.
@Pip3r4o @NathanaelA i found this in some MobileIron demos:
${PRODUCT_NAME:rfc1034identifier}
Is that the answer to my question number 1? If thats the case then we only need to solve the question number 2 and we are ready to test iOS.
@Pip3r4o @NathanaelA kACUIApplicationClassName is a constant defined in AppConnect SDK:
#define kACUIApplicationClassName @"AppConnectUIApplication"
So i just need to know where to provide this in main.m or if it's possible to do it from the plugin.
@NickIliev @Pip3r4o @valentinstoychev @NathanaelA i believe i have the the plugin 90% ready both platforms. We can release the first version once we solve these:
Android:
Apply a fix to {N} core to detect if app is wrapped, adding "forgepond." to the path if true.
iOS:
How to provide the kACUIApplicationClassName parameter to main entry point at main.m .
After solving these, i will run some tests to make sure that VPN tunneling works in both platforms.
Happy new year!
@NickIliev @NathanaelA @Pip3r4o @valentinstoychev i will share what i have in a private repo.
I am having problems including AppConnect.framework with the plugin.
I even tried pulling AppConnect.a out of the framework and put headers inside include/AppConnect, deleting the framework. It compiles with no issues but the AppConnect class cannot be found. Maybe my custom typings is wrong? I don't know :)
I am sure that as we are not providing AppConnect parameter at main entry point, that could be aslo source of problems:
#import <UIKit/UIKit.h>
#import "DualModeAppDelegate.h"
#import "AppConnect/AppConnect.h"
int main(int argc, char *argv[])
{
@autoreleasepool {
//return UIApplicationMain(argc, argv, nil, NSStringFromClass([DualModeAppDelegate class]));
return UIApplicationMain(argc, argv, kACUIApplicationClassName, NSStringFromClass([DualModeAppDelegate class]));
}
}
Let me explain you guys the architecture of the plugin:
Android: context
iOS: launchOptions
application.on(application.launchEvent, function (args) {
let nsappconnect = new Nsappconnect();
nsappconnect.on("configParsed", function(eventData){
var nsconfig = <Dictionary<string>>eventData.object;
console.log(eventData.eventName + ` has been raised by Nsappconnect with alias: ${nsconfig.Item("alias")}!`);
});
if (args.android) {
// For Android applications, args.android is an android.content.Intent class.
//console.log("Launched Android application with the following intent: " + args.android + ".");
nsappconnect.requestConfig(application.android.context);
} else if (args.ios !== undefined) {
// For iOS applications, args.ios is NSDictionary (launchOptions).
//console.log("Launched iOS application with options: " + args.ios);
nsappconnect.requestConfig(args.ios);
}
});
This will create a back and fort where MobileIron AppManager app will come on top of your app, the certificates are validated and the configuration is retrieved and parsed.
Anything the UI depend on, like back-end call or loading models from local storage, are done after the "config is ready". Why?
That's why after parsing the configuration at:
Android: onHandleIntent
iOS: appConnectIsReady
I add each flag to a custom Dictionary and send it back to {N}, triggering "configParsed" event (that's why i made NSAppConnect class extend Observable, so i can use notify).
Receiving the config back in {N} means you are ready to execute the app first task and populate UI:
nsappconnect.on("configParsed", function(eventData){
var nsconfig = <Dictionary<string>>eventData.object;
console.log(eventData.eventName + ` has been raised by Nsappconnect with alias: ${nsconfig.Item("alias")}!`);
});
@alexrainman any updates to share on this plugin by any chance? We are hearing from more people who are interested in leveraging MobileIron!
@rdlauer i just added you as collaborator in the private repo of the plugin. I believe, based on my experience with the technology, the architecture of the plugin is already there.
I have two open issues that are basically the roadblocks we are facing. I think i can make iOS works out of the box if the roadblock is solved. Android? I need more collaboration to understand how the platform works to open a ticket with MobileIron support.
Maybe we can plan a GoToMeeting workshop?
Hey @alexrainman can you please give me access to your repo as well? Perhaps I can be of any assistance. Thx!
@EddyVerbruggen you are set.
Can you guys tell me if HTTP module for iOS meet these requirements?
MobileIron AppTunnel supports only NSURLConnection and NSURLSession.
Note:
• AppTunnel does not support using NSURLSession in a background session.
• You can also use networking libraries that use NSURLConnection or NSURLSession. For example, you can use AFNetworking because it uses NSURLConnection.
• AppTunnel does not support WKWebView objects.
MobileIron AppTunnel is not supported if the app:
• accesses sockets directly.
• uses APIs that access sockets directly.
MobileIron AppTunnel is not supported with the following APIs:
• Apple’s reachability APIs that detect network and host connectivity.
• CFNetwork APIs
• ASIHTTPRequest
Well well, great news. Default HTTP module doesn't works (seems not to follow MoileIron requirements, but this one does :)
https://github.com/gethuman/nativescript-https
I can reach In-Premises back-end from the internet. Also, https://github.com/gethuman/nativescript-https uses OkHttp for Android, which is supported by MobileIron (i worked with them on 2015 to provide OkHttp support :)
How are we going to handle this third-party dependency?
@alexrainman - You can just add this (ns-https) as a dependancy of your mobile iron plugin. I do this with several of my plugins. For example my ns-platforms-css; depends on ns-platforms and ns-globalevents (& maybe even ns-dom).
@NathanaelA maybe i made the wrong question :)
Are we going to depende a third party or make HTTP module MobileIron compatible?
:)
Well since MI(mobile iron) is also third party and has some wacky limitations -- I personally don't see why not... :-)
I for sure don't want them removing the background http transfers or connectivity tests because MI has some seriously stupid limitations. The majority of the users of NS have no interest in MI. So the only people _negatively_ impacted should be those who have to be (ie those who are choosing to be MI users).
@NathanaelA that was my suggestion too! I too thought that using ns-http shouldn't be an issue when brought in as once of the dependencies to wrap your app.
@NathanaelA MobileIron doesn't have any limitations in iOS when you use the SDK. Development process is like any other project and the behave is exactly the same as any other app.
Android? Well, yes, the wrapper sucks:
Just pointing some of them :)
But, not everything is bad:
Cheers!
By the way, iOS app won't be wrapped. The wrapper options still exists but with the SDK? That's not needed.
I will add ns-https as dependency of the plugin, letting know the users they have to use it for the VPN AppTunnel to work.
Thanks.
@alexrainman
Ok, I am a bit confused you just stated this:
MobileIron doesn't have any limitations in iOS when you use the SDK. Development process is like any other project and the behave is exactly the same as any other app.
But a few posts before this you posted this:
• AppTunnel does not support using NSURLSession in a background session.
• AppTunnel does not support WKWebView objects.
• Apple’s reachability APIs that detect network and host connectivity.
• CFNetwork APIs
• ASIHTTPRequest
Every single one of this is a limitation; NSURLSession not allowed to be backgrounded? Reachability API's aren't allowed, CFNetwork API's are disallowed. These are all NORMAL iOS SDK development api's and call. These aren't things that Telerik/Progress NativeScript created. If MI doesn't allow normal iOS SDK usage, then that is a limitation that MI is creating, not anyone else. So as such, if it is a limitation that MI is creating, then those wanting to use MI are those who have to make the changes to there app to make it work.
@NathanaelA those are requirements and not limitations. All them are related to AppTunnel. I am not a MobileIron engineer, but it seems their technology depends on being able to intercept the calls and route them through a VPN tunnel, and it seems all the APIs you mentioned are not supported on their VPN technology.
If you don't want to use AppTunnel VPN, which adds and extra layer of security between the client "the app" on the internet and the in-premises back-end, with MobileIron Server as middle-man, then you have to follow the requirements.
In case you don't, they have what is called "Advanced Tunnel", where all the previous mentioned APIs are supported with its disadvantages: it requires a third app installed and configured on the managed device to be able to reach the in-premises back-end:
Both AppConnect apps and standard apps can use Advanced AppTunnel. The MobileIron Core administrator configures Advanced AppTunnel, including installing MobileIron Tunnel (an iOS app) on the device.
MobileIron is for the enterprise and its a really good solution for MDM/MAM.
@NickIliev iOS version of the plugin has been released https://www.npmjs.com/package/nativescript-mobileiron-appconnect :)
@alexrainman could you please tell me what the current roadblocks are regarding Android support of the plugin? Could you use any help with it? I would be glad to assist
Most helpful comment
@NickIliev iOS version of the plugin has been released https://www.npmjs.com/package/nativescript-mobileiron-appconnect :)