AndiOSDev Deployment

Final Touches and Publication

Siamak (Ash) Ashrafi
13 min readJun 1, 2024

Section 3: Polishing & Deployment

  • App Functionality: Explore a range of frameworks to enhance your app’s capabilities in various domains like payments, sensors, and AR/VR, AI/ML.
  • Testing: Learn best practices for testing your app with Hilt Test (Android) and XCTest (iOS).
  • Deployment: Learn the ropes of publishing your app on the Google Play Store and Apple App Store.

This is the third part of a three part series:

Frameworks

Lots of magic in each phone!

Similar features in both Android and iOS

Sensor Fusion

Augmented Reality (AR) and Virtual Reality (VR): Merging the Real and Virtual in Android and iOS

The boundaries between the physical and digital world are blurring thanks to Augmented Reality (AR) and Virtual Reality (VR) technologies. Let’s delve into how Android and iOS leverage AR through ARCore and ARKit, respectively.

Augmented Reality (AR):

AR overlays digital elements onto the real world, viewed through a smartphone or tablet camera. Imagine seeing virtual furniture placed in your room or historical landmarks superimposed on real-world locations.

ARCore (Android):

  • Google’s framework for building AR experiences on Android devices.
  • Leverages computer vision and sensor fusion to track the device’s position and motion in real-time.
  • Supports features like:
  • Environmental Understanding: Analyzes real-world surfaces (planes, walls) for placing virtual objects realistically.
  • Light Estimation: Captures real-world lighting conditions for more natural-looking virtual objects.
  • Motion Tracking: Tracks device movement for accurate positioning of virtual elements.

ARKit (iOS):

  • Apple’s framework for developing AR apps on iPhones and iPads.
  • Similar to ARCore, uses computer vision and sensor data to track the device and its environment.
  • Offers functionalities like:
  • Motion Tracking: Tracks device movement for precise AR object placement.
  • Light Estimation: Estimates real-world lighting to enhance the integration of virtual objects.
  • Face Tracking: Tracks facial features for AR experiences that interact with the user’s face.
  • Object Detection and Tracking: Can detect and track real-world objects for AR interactions.

Similarities:

  • Both ARCore and ARKit provide essential tools for building AR experiences.
  • They share core functionalities like motion tracking, light estimation, and the ability to overlay virtual objects onto the real world.

Differences:

  • Platform Specificity: ARCore is for Android, while ARKit is for iOS.
  • Feature Set: ARKit offers additional features like face tracking and object detection/tracking that ARCore might not have natively (although some can be achieved through third-party libraries).
  • Development Environment: Each framework has its own APIs and development tools.

Virtual Reality (VR):

VR takes users entirely into a simulated environment, requiring a VR headset to block out the real world. VR experiences can be immersive games, educational simulations, or virtual tours.

Apple visionOS

ZoeWare — AR/VR Technology Studio:

The Future of AR/VR:

AR and VR technologies are constantly evolving, with advancements in processing power, sensors, and display technology paving the way for increasingly immersive experiences. Both ARCore and ARKit are actively developed, with new features and capabilities being added regularly.

Unveiling the Power of AI/ML on Mobile: A Look at ML Kit and Core ML

Artificial Intelligence (AI) and Machine Learning (ML) are transforming mobile app development by enabling features like image recognition, natural language processing, and on-device predictions. Here’s a comparison of two prominent frameworks: ML Kit (Android) and Core ML (iOS).

ML Kit (Android):

  • Developed by: Google
  • Focus: Provides pre-trained machine learning models and APIs that developers can easily integrate into their Android apps.
  • Key Features:
  • Vision API: Offers functionalities like object detection, landmark recognition, text recognition (OCR), and face detection.
  • Language API: Enables on-device language identification, translation, and sentiment analysis.
  • Firebase Integration: Integrates seamlessly with Firebase, Google’s mobile development platform, for cloud-based services and enhanced functionalities.

Core ML (iOS):

  • Developed by: Apple
  • Focus: Provides a framework for running pre-trained machine learning models or converting custom models into a format optimized for Apple devices.
  • Key Features:
  • Model Deployment: Supports various model formats (Core ML models, TensorFlow Lite) and allows on-device or cloud-based deployment.
  • Performance Optimization: Optimizes model execution for Apple’s hardware (CPUs, GPUs, Neural Engine) for efficient on-device inference.
  • Playgrounds Integration: Integrates with Xcode Playgrounds for interactive exploration and development of machine learning models.

Example (Core ML Image Classification):

Swift

// Load a pre-trained Core ML model
let model = try! MLModel(contentsOf: Bundle.main.url(forResource: "MyModel", withExtension: "mlmodelc")!)
// Create a vision request using the model
let visionRequest = VNCoreMLRequest(model: model) { request, error in
// Process classification results
}
// Perform inference on an image buffer
let handler = VNImageRequestHandler(cgImage: image.cgImage!, options: [:])
try! handler.perform([visionRequest])

Similarities:

  • Both ML Kit and Core ML aim to simplify the integration of machine learning capabilities into mobile apps.
  • Both offer pre-trained models for common tasks, reducing development time.
  • Both support on-device inference, enabling features to function even without an internet connection.

Differences:

  • Focus: ML Kit prioritizes ease of use with pre-built APIs, while Core ML offers more flexibility for custom model deployment and optimization.
  • Deployment Options: ML Kit relies on cloud-based models for some functionalities, while Core ML allows for both on-device and cloud-based deployment.
  • Development Environment: ML Kit integrates with Android and Firebase, while Core ML operates within the iOS ecosystem.

Choosing the Right Framework:

The choice between ML Kit and Core ML depends on your project requirements:

  • Need for Pre-built APIs: If your project requires features like object detection or text recognition, and you prefer ease of use, ML Kit might be a good fit.
  • Custom Model Integration: If you have a custom model or require more control over model deployment and optimization, Core ML offers more flexibility.
  • Development Platform: Your choice will naturally be influenced by whether you’re developing for Android (ML Kit) or iOS (Core ML).

The Future of AI/ML on Mobile

Both ML Kit and Core ML are continuously evolving, making it easier for developers to integrate AI and ML capabilities into their mobile apps. As machine learning advancements continue, we can expect even more powerful and versatile tools to emerge, pushing the boundaries of what’s possible on mobile devices.

Android:

Using AI/ML on Android

Keeping You Fit: A Look at Android’s Fitness & Health and Apple’s Health & Fitness Apps

Both Android and iOS offer built-in health and fitness functionalities to help users track their well-being. Here’s a comparison of these features:

Android Fitness & Health:

Approach: Relies on a combination of Google Fit, a centralized platform, and integration with third-party fitness apps.

Google Fit:

  • Tracks basic activities like steps, distance, and calories burned.
  • Provides goal setting, progress tracking, and insights.
  • Integrates with various wearables and fitness trackers.
  • Open platform: Third-party apps can share data with Google Fit, creating a holistic view of health and fitness.

Example (Google Fit Tracking Steps):

Open the Google Fit app and navigate to the “Steps” section. You’ll see your daily step count, progress towards your step goal, and historical data.

  • Third-Party Apps:
  • The Android ecosystem boasts a vast array of fitness apps with specialized features, from running and cycling to yoga and weight training.
  • Some apps offer unique functionalities, personalized plans, and workout routines.

Apple Health & Fitness:

Approach: Provides a more comprehensive health and fitness platform within the iOS ecosystem.

Apple Health:

  • Tracks a wider range of health metrics, including steps, distance, calories burned, sleep, heart rate, and mindfulness.
  • Offers detailed dashboards and visualizations for various health data points.
  • Integrates with Apple Watch and other Apple devices seamlessly.
  • More closed ecosystem: Primarily relies on Apple Watch and Health app data, with limited third-party app integration.

Example (Apple Health Activity Rings):

Apple Watch displays three Activity rings: Move (calories burned), Exercise (minutes of brisk activity), and Stand (hours spent standing). Closing your rings signifies achieving your daily activity goals.

Apple Fitness+ (Subscription Service):

  • Offers guided audio and video workouts led by certified trainers.
  • Provides a variety of workout types, including HIIT, yoga, strength training, and more.
  • Integrates seamlessly with Apple Watch, displaying workout metrics in real-time.

Choosing the Right Platform:

The ideal platform depends on your needs and preferences:

  • Openness and Customization: If you prefer an open platform with a wider range of third-party fitness apps and customization options, Android’s approach might be more appealing.
  • Holistic Health Focus: If you desire a comprehensive health platform that tracks a wider range of metrics beyond basic activity data, Apple Health might be a better choice.
  • Apple Watch Integration: If you own an Apple Watch and value seamless integration with fitness features, Apple Health & Fitness+ provide a compelling ecosystem.

Additional Considerations:

  • Both platforms offer APIs for developers to create custom health and fitness apps.
  • Both encourage users to connect with friends for motivation and friendly competition.
  • Privacy is a focus on both platforms, allowing users to control which data is shared.

The Future of Mobile Fitness & Health

The future of mobile fitness and health looks bright, with both Android and iOS expected to offer even more sophisticated features. We can expect advancements in areas like:

  • Machine Learning-powered insights: AI algorithms might personalize goals, recommend workouts, and identify potential health risks based on user data.
  • Advanced wearables: New sensors and capabilities in wearables might lead to more accurate and comprehensive health tracking.
  • Integration with medical services: Mobile health platforms might connect with healthcare providers, facilitating remote monitoring and personalized care plans.

Ultimately, the best platform for you depends on your specific needs and preferences. By understanding the strengths and weaknesses of both Android Fitness & Health and Apple Health & Fitness, you can make an informed decision and leverage your mobile device to reach your health and fitness goals.

Testing Android Jetpack Compose App Using Hilt

Testing is a critical aspect of developing robust and reliable applications. With the advent of Jetpack Compose, Android's modern toolkit for building native UI, and Hilt, a dependency injection library, developers can create clean, maintainable, and testable code. This article will guide you through the process of testing a Jetpack Compose app using Hilt, complete with sample code.

Introduction to Jetpack Compose and Hilt

Jetpack Compose simplifies UI development by using a declarative approach, allowing developers to describe the UI in Kotlin code. Hilt is a dependency injection library that simplifies Dagger setup for Android apps, making it easier to manage dependencies.

Combining these two tools allows developers to create modular, scalable, and testable applications. Testing these applications involves unit tests, integration tests, and UI tests to ensure all components work correctly.

Setting Up the Project

Before diving into testing, ensure your project is set up with Jetpack Compose and Hilt.

Step 1: Adding Dependencies

Add the required dependencies to your build.gradle file:

dependencies {
// Jetpack Compose
implementation "androidx.compose.ui:ui:1.2.0"
implementation "androidx.compose.material:material:1.2.0"
implementation "androidx.compose.ui:ui-tooling:1.2.0"

// Hilt
implementation "com.google.dagger:hilt-android:2.44"
kapt "com.google.dagger:hilt-compiler:2.44"

// Hilt and Jetpack Compose integration
implementation "androidx.hilt:hilt-navigation-compose:1.0.0"

// Testing
testImplementation "junit:junit:4.13.2"
androidTestImplementation "androidx.test.ext:junit:1.1.3"
androidTestImplementation "androidx.test.espresso:espresso-core:3.4.0"
androidTestImplementation "androidx.compose.ui:ui-test-junit4:1.2.0"
androidTestImplementation "com.google.dagger:hilt-android-testing:2.44"
kaptAndroidTest "com.google.dagger:hilt-compiler:2.44"
}

Step 2: Setting Up Hilt

Enable Hilt in your project by creating an Application class and annotating it with @HiltAndroidApp:

@HiltAndroidApp
class MyApplication : Application()

Step 3: Creating a Hilt Module

Create a Hilt module to provide dependencies:

@Module
@InstallIn(SingletonComponent::class)
object AppModule {

@Provides
@Singleton
fun provideSampleRepository(): SampleRepository {
return SampleRepositoryImpl()
}
}

Writing Tests

Unit Testing

Unit testing involves testing individual components in isolation. For Jetpack Compose and Hilt, you can use standard JUnit tests.

@RunWith(AndroidJUnit4::class)
@HiltAndroidTest
class SampleViewModelTest {

@get:Rule
var hiltRule = HiltAndroidRule(this)

@Inject
lateinit var sampleRepository: SampleRepository

@Before
fun init() {
hiltRule.inject()
}

@Test
fun testSampleData() {
val viewModel = SampleViewModel(sampleRepository)
val data = viewModel.sampleData.getOrAwaitValue()
assertThat(data).isEqualTo(expectedData)
}
}

Integration Testing

Integration testing ensures that various components work together as expected.

@HiltAndroidTest
@RunWith(AndroidJUnit4::class)
class SampleIntegrationTest {

@get:Rule(order = 0)
val hiltRule = HiltAndroidRule(this)

@get:Rule(order = 1)
val composeTestRule = createAndroidComposeRule<MainActivity>()

@Inject
lateinit var sampleRepository: SampleRepository

@Before
fun setUp() {
hiltRule.inject()
}

@Test
fun testSampleScreen() {
composeTestRule.setContent {
SampleAppTheme {
SampleScreen()
}
}

// Assert that the UI behaves as expected
composeTestRule.onNodeWithText("Sample Text").assertIsDisplayed()
}
}

UI Testing

UI testing involves checking that the UI components display and behave correctly.

@HiltAndroidTest
@RunWith(AndroidJUnit4::class)
class SampleUITest {

@get:Rule(order = 0)
val hiltRule = HiltAndroidRule(this)

@get:Rule(order = 1)
val composeTestRule = createAndroidComposeRule<MainActivity>()

@Before
fun setUp() {
hiltRule.inject()
}

@Test
fun testButtonClick() {
composeTestRule.setContent {
SampleAppTheme {
SampleScreen()
}
}

composeTestRule.onNodeWithText("Click Me").performClick()
composeTestRule.onNodeWithText("Button Clicked").assertIsDisplayed()
}
}

Testing Jetpack Compose applications using Hilt involves setting up dependencies, writing unit tests, integration tests, and UI tests. With the combination of Hilt for dependency injection and Jetpack Compose for UI, you can create modular and testable applications. This comprehensive guide provides a starting point to ensure your application components work correctly through thorough testing practices.

Testing SwiftUI Apps Using XCTest: A Comprehensive Guide

Testing is a crucial aspect of developing reliable and robust iOS applications. With the introduction of SwiftUI, Apple’s modern framework for building user interfaces, and XCTest, the standard framework for testing in Xcode, developers can ensure their applications are well-tested and perform as expected. This article will guide you through the process of testing a SwiftUI app using XCTest, complete with sample code.

Introduction to SwiftUI and XCTest

SwiftUI simplifies UI development by using a declarative approach, allowing developers to describe the UI in Swift code. XCTest is a framework provided by Apple that allows you to write tests for your Swift and Objective-C code, including unit tests, performance tests, and UI tests.

Combining SwiftUI with XCTest allows developers to create modular, scalable, and testable applications. Testing these applications involves writing unit tests, integration tests, and UI tests to ensure all components work correctly.

Setting Up the Project

Before diving into testing, ensure your project is set up with SwiftUI and XCTest.

Step 1: Creating a SwiftUI Project

Create a new SwiftUI project in Xcode:

  1. Open Xcode and select “Create a new Xcode project.”
  2. Choose “App” under the iOS section.
  3. Enter a product name and ensure the interface is set to SwiftUI and the lifecycle is set to SwiftUI App.
  4. Click “Next” and create your project.

Step 2: Adding Dependencies (If Needed)

For basic testing with XCTest, no additional dependencies are required. XCTest is included by default in Xcode projects.

Writing Tests

Unit Testing

Unit testing involves testing individual components in isolation. In a SwiftUI project, this typically involves testing view models and other non-UI components.

Create a new test target if one isn’t already set up:

  1. Go to your project settings.
  2. Select the project, then select the “Test” target.
  3. Add a new Swift file to this target and write your unit tests.

Here is an example of a unit test for a view model:

import XCTest
@testable import YourApp
class SampleViewModelTests: XCTestCase {

var viewModel: SampleViewModel!

override func setUp() {
super.setUp()
viewModel = SampleViewModel()
}
override func tearDown() {
viewModel = nil
super.tearDown()
}
func testSampleData() {
let expectedData = "Expected Data"
viewModel.sampleData = expectedData
XCTAssertEqual(viewModel.sampleData, expectedData)
}
}

Integration Testing

Integration testing ensures that various components work together as expected. For SwiftUI apps, this often involves testing how views interact with each other and with the view models.

import XCTest
import SwiftUI
@testable import YourApp
class SampleIntegrationTests: XCTestCase {
func testSampleView() {
let viewModel = SampleViewModel()
let sampleView = SampleView(viewModel: viewModel)
// Test initial state
XCTAssertEqual(viewModel.sampleData, "Initial Data")

// Simulate changes and test the interaction
viewModel.sampleData = "Updated Data"
XCTAssertEqual(viewModel.sampleData, "Updated Data")
}
}

UI Testing

UI testing involves checking that the UI components display and behave correctly. XCTest provides tools to simulate user interactions and verify UI state.

  1. Create a new UI test target if one isn’t already set up.
  2. Add a new Swift file to this target and write your UI tests.

Here is an example of a UI test for a SwiftUI view:

import XCTest
class SampleUITests: XCTestCase {
override func setUp() {
continueAfterFailure = false
XCUIApplication().launch()
}
func testButtonClick() {
let app = XCUIApplication()

// Find the button and simulate a tap
let button = app.buttons["Click Me"]
XCTAssertTrue(button.exists)
button.tap()

// Verify the label's text has changed
let label = app.staticTexts["Button Clicked"]
XCTAssertTrue(label.exists)
}
}

Testing SwiftUI applications using XCTest involves writing unit tests, integration tests, and UI tests. With XCTest, you can ensure your SwiftUI components work correctly both in isolation and in concert. This comprehensive guide provides a starting point to ensure your application components are thoroughly tested and reliable. By integrating these testing practices into your development workflow, you can build high-quality, maintainable SwiftUI applications.

App Stores: A Tale of Two Titans

App Stores

Google Play Store & Apple App Store

The Google Play Store and Apple App Store are the gatekeepers to a vast universe of mobile applications. Choosing the right platform to distribute your app is crucial for reaching your target audience. Here’s a breakdown of these two dominant app stores:

Market Reach:

  • Google Play Store: Reigns supreme with a wider global reach, particularly strong in emerging markets with a larger share of Android devices.
  • Apple App Store: While geographically smaller, it boasts a user base with a higher average spending power, potentially leading to greater revenue potential per user.

App Selection:

  • Google Play Store: Known for its open ecosystem, allowing for a wider variety of apps, including those developed outside of official channels.
  • Apple App Store: Maintains a stricter review process, leading to a more curated app selection with generally higher quality standards.

App Review Process:

  • Google Play Store: Generally considered faster and less stringent, with a focus on technical aspects and security.
  • Apple App Store: Renowned for its thorough review process, focusing on user experience, privacy, and adherence to Apple’s design guidelines. This can lead to longer wait times and potential app rejections.

Monetization:

  • Google Play Store: Offers a flexible revenue model with options for in-app purchases, subscriptions, and paid apps. The revenue share between developer and store is typically 70/30.
  • Apple App Store: Similar monetization options exist, but the revenue share is also 70/30 (with a lower 15% rate for the first $1 million earned annually).

Development Considerations:

  • Google Play Store: Requires development in Java or Kotlin, with a wider range of hardware and software configurations to account for.
  • Apple App Store: Development primarily in Swift, targeting a more homogenous hardware landscape with stricter design guidelines.

In conclusion, both the Google Play Store and Apple App Store offer powerful platforms for app distribution. The best choice depends on your target audience, app type, and desired revenue model.

Here are some additional factors to consider:

  • Target Market: If you aim for global reach or a budget-conscious user base, the Play Store might be ideal. For a premium app targeting a specific demographic, the App Store could be more lucrative.
  • Development Resources: Consider the development skills and resources available to your team.
  • App Approval Timeline: If a faster launch is critical, the Play Store’s review process might be advantageous.

By carefully evaluating these factors, you can choose the app store that best positions your mobile application for success.

--

--