Why Mobile App Maintenance Service Is Important in 2022

If you anticipate the mobile app to boost retention, you must provide enough maintenance services to assure peak functioning. Furthermore, you must regularly release new features to keep ahead of the competition and actively encourage customers to utilize your app. This post will go over the significance of mobile app maintenance.

https://multiqos.com/top-reasons-why-mobile-app-maintenance-service-is-important/

#appmaintence #mobileappmaintenance #mobileapp #appdevelopment #mobileappdevelopment #appdeveloper 

What is GEEK

Buddha Community

Why Mobile App Maintenance Service Is Important in 2022
Rahim Makhani

Rahim Makhani

1621312845

Improve your mobile app with Mobile App Maintenance

Mobile apps play a vital role in today’s mobile phone industry. Without any mobile app, our smartphones will become useless. With the development of mobile apps, its maintenance is also important to run your mobile app in a better way.

To maintain the applications, mobile app maintenance services have to take care of all the aspects regarding the app. To keep your mobile app more advanced its maintenance is required.

If you want to maintain your mobile app you can select our company, Nevina Infotech, which will give you the best maintenance service for your mobile app. We have dedicated mobile app developers that will help you to fulfill your requirements.

#mobile app maintenance #android app maintenance #mobile app maintenance services #app maintenance companies #mobile app maintenance services #mobile app maintenance and support

Rahim Makhani

Rahim Makhani

1622605776

Get a Bug free and user-friendly mobile app with mobile app Maintenance

We all know the importance of mobile apps in today’s era and the changes mobile apps have made in our lives. With the help of mobile applications, our life has become so easy and fast. We can do anything with just one click.

Mobile app maintenance is also required along with using it. If your mobile app is not maintained properly it can create a bug and the performance of your mobile app can decrease in the long term so it is important to maintain your mobile app as well.

Nevina Infotech is the leading mobile app development company that can help you to get a bug-free and user-friendly mobile app and will also provide mobile app maintenance. As we have the best team of developers that can develop your app as per your requirement.

#mobile app maintenance #mobile app maintenance services #mobile application maintenance and support #app maintenance companies #mobile app maintenance costs #mobile app maintenance services

Rahim Makhani

Rahim Makhani

1618890335

Maintain your mobile app for a smoother user experience

Smartphones are an important part of our lives nowadays and there are many mobile app development companies that are developing mobile apps. With the development of mobile apps, their maintenance is also important because if it is not maintained it will not work properly after the long term.

Mobile app maintenance refers to the whole process of maintaining the mobile app and making sure that it is working properly or not and also staying updated for new versions and much more.

Nevina Infotech can help you to maintain your mobile app as we have trained mobile app developers who can help you to maintain your mobile app and if there is any bug in your app we can also help you to remove it. We can help you to maintain and run your mobile app smoothly.

#mobile app maintenance #mobile app maintenance services #mobile application maintenance and support #app maintenance companies #mobile app maintenance costs #mobile app maintenance services

Jamel  O'Reilly

Jamel O'Reilly

1662142380

SOAPEngine: Access Web Services using A Your IOS App, Mac OS X App

This generic SOAP client allows you to access web services using a your iOS app, Mac OS X app and Apple TV app.

With this Framework you can create iPhone, iPad, Mac OS X and AppleTv apps that supports SOAP Client Protocol. This framework able executes methods at remote web services with SOAP standard protocol.

SDK 1.x vs SDK 2.x

We are in the process of releasing our next major SDK - SDK 2.x. Publishers who use SDK 1.x should continue to use it unless instructed otherwise. Please make sure you indicate the latest SDK 1.x version when using Cocoapods.

Features


  • Support both 2001 (v1.1) and 2003 (v1.2) XML schema.
  • Support array, array of structs, dictionary and sets.
  • Support for user-defined object with serialization of complex data types and array of complex data types, even embedded multilevel structures.
  • Supports ASMX Services, WCF Services (SVC) and now also the WSDL definitions.
  • Supports Basic, Digest and NTLM Authentication, WS-Security, Client side Certificate and custom security header.
  • Supports iOS Social Account to send OAuth2.0 token on the request.
  • AES256 or 3DES Encrypt/Decrypt data without SSL security.
  • An example of service and how to use it is included in source code.

Requirements for iOS


  • iOS 8.0 and later
  • Xcode 8.0 or later
  • Security.framework
  • Accounts.framework
  • Foundation.framework
  • UIKit.framework
  • libxml2.dylib

Requirements for Mac OS X


  • OS X 10.9 and later
  • Xcode 8.0 or later
  • Security.framework
  • Accounts.framework
  • Foundation.framework
  • AppKit.framework
  • Cocoa.framework
  • libxml2.dylib

Requirements for Apple TV


  • iOS 9.0 and later
  • Xcode 8.0 or later
  • Security.framework
  • Foundation.framework
  • UIKit.framework
  • libxml2.dylib

Limitations


Known issues


Swift 4: the library is currently written in Objective-C and when you import the swift library you will get build errors like this The use of Swift 3 @objc inference in Swift 4 mode is deprecated.

For silent this warning is need sets Swift 3 @objc Inference to default value in the the Build settings of target. but It's not all; the classes used to create requests must be declared with @objcMembers and NSObject, eg:

the declaration of MyClass must become :

@objcMembers class MyClass: NSObject { ... }
class MyClass { ... }

let param = MyClass()
// ...
// ...
let soap = SOAPEngine()
soap.setValue(param, forKey: "myKey")
// ...
// ...

Security for Xcode 8.x or later


From the new Xcode 8 is required an additional setting for the apps, if this setting does not exist you will see a log message like this:

App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file.

To resolve this, add few keys in info.plist, the steps are:

  1. Open info.plist file of your project.
  2. Add a Key called NSAppTransportSecurity as a Dictionary.
  3. Add a Subkey called NSAllowsArbitraryLoads as Boolean and set its value to YES as like following image.

NSAppTransportSecurity

ref link: http://stackoverflow.com/a/32631185/4069848

How to use


with Delegates :

    #import <SOAPEngine64/SOAPEngine.h>

    // standard soap service (.asmx)
    SOAPEngine *soap = [[SOAPEngine alloc] init];
    soap.userAgent = @"SOAPEngine";
    soap.delegate = self; // use SOAPEngineDelegate

    // each single value
    [soap setValue:@"my-value1" forKey:@"Param1"];
    [soap setIntegerValue:1234 forKey:@"Param2"];
    // service url without ?WSDL, and you can search the soapAction in the WSDL
    [soap requestURL:@"http://www.my-web.com/my-service.asmx" 
          soapAction:@"http://www.my-web.com/My-Method-name"];
 
    #pragma mark - SOAPEngine Delegates

    - (void)soapEngine:(SOAPEngine *)soapEngine didFinishLoading:(NSString *)stringXML {

            NSDictionary *result = [soapEngine dictionaryValue];
            // read data from a dataset table
            NSArray *list = [result valueForKeyPath:@"NewDataSet.Table"];
    }

with Block programming :

    #import <SOAPEngine64/SOAPEngine.h>
    
    // TODO: your user object
    MyClass myObject = [[MyClass alloc] init];
    
    SOAPEngine *soap = [[SOAPEngine alloc] init];
    soap.userAgent = @"SOAPEngine";
    soap.version = VERSION_WCF_1_1; // WCF service (.svc)
    
    // service url without ?WSDL, and you can search the soapAction in the WSDL
    [soap requestURL:@"http://www.my-web.com/my-service.svc"
          soapAction:@"http://www.my-web.com/my-interface/my-method"
               value:myObject
            completeWithDictionary:^(NSInteger statusCode, NSDictionary *dict) {
                NSLog(@"%@", dict);
            } failWithError:^(NSError *error) {
                NSLog(@"%@", error);
            }];

directly from WSDL (not recommended is slow) :

    #import <SOAPEngine64/SOAPEngine.h>
    
    // TODO: your user object
    MyClass myObject = [[MyClass alloc] init];
    
    SOAPEngine *soap = [[SOAPEngine alloc] init];
    soap.userAgent = @"SOAPEngine";
    
    // service url with WSDL, and operation (method name) without tempuri
    [soap requestWSDL:@"http://www.my-web.com/my-service.amsx?wsdl"
            operation:@"my-method-name"
                value:myObject
            completeWithDictionary:^(NSInteger statusCode, NSDictionary *dict) {

              NSLog(@"Result: %@", dict);

            } failWithError:^(NSError *error) {

                NSLog(@"%@", error);
            }];

with Notifications :

    #import <SOAPEngine64/SOAPEngine.h>

    // TODO: your user object
    MyClass myObject = [[MyClass alloc] init];
    
    SOAPEngine *soap = [[SOAPEngine alloc] init];
    soap.userAgent = @"SOAPEngine";
    soap.version = VERSION_WCF_1_1; // WCF service (.svc)
        
    [[NSNotificationCenter defaultCenter] 
                addObserver:self 
                   selector:@selector(soapEngineDidFinishLoading:) 
                       name:SOAPEngineDidFinishLoadingNotification 
                     object:nil];
    
    // service url without ?WSDL, and you can search the soapAction in the WSDL
    [soap requestURL:@"http://www.my-web.com/my-service.svc" 
          soapAction:@"http://www.my-web.com/my-interface/my-method"
                 value:myObject];
    
    #pragma mark - SOAPEngine Notifications
    
    - (void)soapEngineDidFinishLoading:(NSNotification*)notification
    {
        SOAPEngine *engine = notification.object; // SOAPEngine object
        NSDictionary *result = [engine dictionaryValue];
        NSLog(@"%@", result);
    }

Synchronous request :

    #import <SOAPEngine64/SOAPEngine.h>
    
    NSError *error = nil;
    SOAPEngine *soap = [[SOAPEngine alloc] init];
    soap.responseHeader = YES; // use only for non standard MS-SOAP service like PHP
    NSDictionary *dict = [soap syncRequestURL:@"http://www.my-web.com/my-service.amsx" 
                            soapAction:@"http://tempuri.org/my-method" error:&error];
    NSLog(@"error: %@, result: %@", error, dict)

Swift 3 language :

        var soap = SOAPEngine()
        soap.userAgent = "SOAPEngine"
        soap.actionNamespaceSlash = true
        soap.version = VERSION_1_1
        soap.responseHeader = true // use only for non standard MS-SOAP service
        
        soap.setValue("param-value", forKey: "param-name")
        soap.requestURL("http://www.my-web.com/my-service.asmx",
            soapAction: "http://www.my-web.com/My-Method-name",
            completeWithDictionary: { (statusCode : Int, 
                                 dict : [AnyHashable : Any]?) -> Void in
                
                var result:Dictionary = dict! as Dictionary
                print(result)
                
            }) { (error : Error?) -> Void in
                
                print(error)
        }

settings for SOAP Authentication :

    #import <SOAPEngine64/SOAPEngine.h>

    SOAPEngine *soap = [[SOAPEngine alloc] init];
    soap.userAgent = @"SOAPEngine";
    
    // authorization
    soap.authorizationMethod = SOAP_AUTH_BASIC; // basic auth
    soap.username = @"my-username";
    soap.password = @"my-password";
    
    // TODO: your code here...
    

settings for Social OAuth2.0 token :

    #import <SOAPEngine64/SOAPEngine.h>
    #import <Accounts/Accounts.h>

    SOAPEngine *soap = [[SOAPEngine alloc] init];
    soap.userAgent = @"SOAPEngine";
    
    // token authorization
    soap.authorizationMethod = SOAP_AUTH_SOCIAL;
    soap.apiKey = @"1234567890"; // your apikey https://dev.twitter.com/
    soap.socialName = ACAccountTypeIdentifierTwitter;
    
    // TODO: your code here...
    

Encryption/Decryption data without SSL/HTTPS :

    #import <SOAPEngine64/SOAPEngine.h>

    SOAPEngine *soap = [[SOAPEngine alloc] init];
    soap.userAgent = @"SOAPEngine";
    soap.encryptionType = SOAP_ENCRYPT_AES256; // or SOAP_ENCRYPT_3DES
    soap.encryptionPassword = @"my-password";

    // TODO: your code here...
    

Params with Attributes :

    // book
    NSMutableDictionary *book = [NSMutableDictionary dictionaryWithObject:@"Genesis" forKey:@"name"];
    // chapter
    NSDictionary *attr = @{@"order": @"asc"};
    NSDictionary *child = [soap dictionaryForKey:@"chapter" value:@"1" attributes:attr];
    [book addEntriesFromDictionary:child]; // add chapter to book
    // book attributes
    [soap setValue:book forKey:@"Book" attributes:@{@"rack": @"2"}];

it builds a request like this:

    <Book rack="2">
        <name>Genesis</name>
        <chapter order="asc">1</chapter>
    </Book>

PAYPAL example with certificate :

    SOAPEngine *soap = [[SOAPEngine alloc] init];

    // PAYPAL associates a set of API credentials with a specific PayPal account
    // you can generate credentials from this https://developer.paypal.com/docs/classic/api/apiCredentials/
    // and convert to a p12 from terminal use :
    // openssl pkcs12 -export -in cert_key_pem.txt -inkey cert_key_pem.txt -out paypal_cert.p12
    soap.authorizationMethod = SOAP_AUTH_PAYPAL;
    soap.username = @"support_api1.your-username";
    soap.password = @"your-api-password";
    soap.clientCerficateName = @"paypal_cert.p12";
    soap.clientCertificatePassword = @"certificate-password";
    soap.responseHeader = YES;
    // use paypal for urn:ebay:api:PayPalAPI namespace
    [soap setValue:@"0" forKey:@"paypal:ReturnAllCurrencies"];
    // use paypal1 for urn:ebay:apis:eBLBaseComponents namespace
    [soap setValue:@"119.0" forKey:@"paypal1:Version"]; // ns:Version in WSDL file
    // certificate : https://api.paypal.com/2.0/ sandbox https://api.sandbox.paypal.com/2.0/
    // signature : https://api-3t.paypal.com/2.0/ sandbox https://api-3t.sandbox.paypal.com/2.0/
    [soap requestURL:@"https://api.paypal.com/2.0/"
          soapAction:@"GetBalance" completeWithDictionary:^(NSInteger statusCode, NSDictionary *dict) {
          
        NSLog(@"Result: %@", dict);
        
    } failWithError:^(NSError *error) {
    
        NSLog(@"%@", error);
    }];
              

Magento 2 login example :

    SOAPEngine *soap = [[SOAPEngine alloc] init];
    soap.selfSigned = YES; // only for invalid https certificates
    soap.responseHeader = YES;
    soap.actionNamespaceSlash = NO;
    soap.envelope = @"xmlns:urn=\"urn:Magento\"";
    [soap setValue:@"your-username" forKey:@"username"];
    [soap setValue:@"your-apykey" forKey:@"apiKey"];
    [soap requestURL:@"https://your-magentohost/api/v2_soap/"
          soapAction:@"urn:Mage_Api_Model_Server_V2_HandlerAction#login"
completeWithDictionary:^(NSInteger statusCode, NSDictionary *dict)
    {
        NSLog(@"Login return: %@", [soap stringValue]);
        
    } failWithError:^(NSError *error) {
        
        NSLog(@"%@", error);
    }];

Upload file :

    SOAPEngine *soap = [[SOAPEngine alloc] init];

    // read local file
    NSData *data = [NSData dataWithContentsOfFile:@"my_video.mp4"];

    // send file data
    [soap setValue:data forKey:@"video"];
    [soap requestURL:@"http://www.my-web.com/my-service.asmx"
          soapAction:@"http://www.my-web.com/UploadFile"
          completeWithDictionary:^(NSInteger statusCode, NSDictionary *dict) {
              
              NSLog(@"Result: %@", dict);
              
          } failWithError:^(NSError *error) {
    
              NSLog(@"%@", error);
          }];
              

Download file :

    SOAPEngine *soap = [[SOAPEngine alloc] init];

    // send filename to remote webservice
    [soap setValue:"my_video.mp4" forKey:@"filename"];
    [soap requestURL:@"http://www.my-web.com/my-service.asmx"
          soapAction:@"http://www.my-web.com/DownloadFile"
          completeWithDictionary:^(NSInteger statusCode, NSDictionary *dict) {
            
            // local writable directory
            NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
            NSString *filePath = [[paths firstObject] stringByAppendingPathComponent:@"my_video.mp4"];

            // the service returns file data in the tag named video
            NSData *data = dict[@"video"];
            [data writeToFile:@"my_video.mp4" atomically:YES];
              
          } failWithError:^(NSError *error) {
    
              NSLog(@"%@", error);
          }];
              

Optimizations


First of all, if you note a slowdown in the response of the request, try to change the value of the property named actionNamespaceSlash. After, when using the method named requestWSDL three steps are performed :

  1. retrieve the WSDL with an http request.
  2. processing to identify the soapAction.
  3. calls the method with an http request.

this is not optimized, very slow, instead you can use the optimization below :

  1. retrieving manually the SOAPAction directly from WSDL (once with your favorite browser).
  2. use the method named requestURL instead of requestWSDL without WSDL extension.

Install in your apps


Swift Package Manager

SOAPEngine is available as a Swift package. The repository URL is valid for adding the package in your app through the Xcode.

Author: priore
Source Code: https://github.com/priore/SOAPEngine
License: View license

#ios #swift 

黎 飞

黎 飞

1656984600

如何将函数从 C++ 导出到 React Native

今天,我继续分享我在 Native Module 和 C++ 方面的经验。

由于我们将看到很多为移动平台编写的 C/C++ 库,因此我们需要将它们实现到我们的 iOS 或 React Native 应用程序中。这就是为什么我想写一篇关于如何将一个函数从 C++ 导出到 React Native 的文章,它易于理解并且为初学者节省了时间。我将从一个新的 react native 应用程序开始

1.新建一个react native app,打开你的终端运行

npx react-native init NativeModules

2. 打开 Xcode 并导航到 NativeModules/ios/NativeModule.xcworkspace

3. 在 C++ 端工作

创建一个新的 C++ 文件并命名Cpp_to_RN.cpp

当我们创建一个新的 C++ 文件时,Xcode 会Cpp_to_RN.hpp 为我们创建一个头文件

首先,打开“ Cpp_to_RN.hpp文件,并创建一个包含没有主体的函数的类。

#ifndef Cpp_to_RN_hpp
#define Cpp_to_RN_hpp#include <stdio.h>
#include <string>class Cpp_to_RN {
public:
    std::string sayHello();
};#endif /* Cpp_to_RN_hpp */

然后打开Cpp_to_RN.cpp文件,写一个简单的函数“ sayHello()

#include "Cpp_to_RN.hpp"
std::string Cpp_to_RN::sayHello(){
    return "Hello from CPP";
}

4. 处理包装 C++ 文件。

包装 C++ 文件并将它们导出到 IOS (swift) 端

一个。创建一个Objective C文件并命名Cpp_to_RN.m

重命名Cpp_to_RN.m Cpp_to_RN.mm

湾。打开WrapCpp_to_RN.mm 文件并编写将包装sayHelloC++ 文件中的函数的正文内容。

#import <Foundation/Foundation.h>
#import "WrapCpp_to_RN.h"
#import "Cpp_to_RN.hpp"@implementation WrapCpp_to_RN- (NSString *) sayHello {
  Cpp_to_RN fromCPP;
    std::string helloWorldMessage = fromCPP.sayHello();
    return [NSString
            stringWithCString:helloWorldMessage.c_str()
            encoding:NSUTF8StringEncoding];
}
@end

C。创建头文件并命名WrapCpp_to_RN.h

将函数导出wrapSayHello到 Swift 文件

#import <Foundation/Foundation.h>
@interface WrapCpp_to_RN : NSObject
- (NSString *) wrapSayHello;
@end

5. 在 iOS (Swift) 端工作

将 C++ 函数导出到 React Native

一个。创建一个 Swift 文件并命名SendCpp_to_RN.swift

注意:Xcode 会要求我们为我们创建一个NativeModules-Bridging-Header.h文件。

创建一个类SendCpp_to_RN并将其声明为NSObject

#import <Foundation/Foundation.h>
@interface WrapCpp_to_RN : NSObject
- (NSString *) wrapSayHello;
@end

编写一个函数requiresMainQueueSetup()来防止我们运行应用程序时出现警告

#import <Foundation/Foundation.h>
@interface WrapCpp_to_RN : NSObject
- (NSString *) wrapSayHello;
@end

编写一个函数来包装WrapCpp_to_RN()fromWrapCpp_to_RN.mm

import Foundation@objc(SendCpp_to_RN)
class SendCpp_to_RN : NSObject {
    
  @objc static func requiresMainQueueSetup() -> Bool {
        return false
    }
  
  @objc func fromCpp(_ successCallback: RCTResponseSenderBlock) -> Void {
    successCallback([NSNull(), WrapCpp_to_RN().wrapSayHello() as Any])
    }}

湾。将 Swift 文件中的包装函数导出到 React Native

创建一个 Objective C 文件以导出 Swift 类及其函数,使用Callback

#import <React/RCTBridgeModule.h>
#import <Foundation/Foundation.h>
#import "UIKit/UIKit.h"
@interface RCT_EXTERN_MODULE(SendCpp_to_RN, NSObject)RCT_EXTERN_METHOD(fromCpp:(RCTResponseSenderBlock)successCallback)@end

C。将 Swift 连接到 React Native,打开NativeModules-Bridging-Header.h 文件

#import <React/RCTBridgeModule.h>#import <React/RCTViewManager.h>#import "WrapCpp_to_RN.h"

6. 在 React Native 方面工作

调用 Swift 类及其函数

import React from 'react';
import {StyleSheet, Text, View, NativeModules, Button} from 'react-native';const App = () => {
  const onPress = () => {
    const {SendCpp_to_RN} = NativeModules;
    SendCpp_to_RN.fromCpp((_err, res) => console.log(res));
  };
  return (
    <View style={styles.container}>
      <Text> Practice !</Text>
      <Button title="C++ to React Native" color="#841584" onPress={onPress} />
    </View>
  );
};
const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
  },
});
export default App;

我们完成了,只需运行应用程序

react-native run-ios

或者只需单击 Xcode 上的“运行”按钮,看看我们做了什么。

希望我的文章对您有所帮助,感谢您的阅读时间。

 来源:https ://betterprogramming.pub/native-modules-export-c-function-to-react-native-for-beginners-77e89934b210

#cpp #cplusplus #react