Zusammenfassung iOSDev

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 26

iOS App Development

Zusammenfassung
Functions
- Functions are full etched citizens
- May be returned by functions
- May be passes as parameter to functions

Closures
- Superset of functions
- Do not require a name
- Can access all elements of enclosing scope (variables, …)
Example:

Classes vs Structs
- Very similar concepts in Swift, they support
- Properties
- Methods
- Initializers
- …
- But
- Classes are passed by reference while structures are passed by value
- Structures do not support inheritance
- Structures do not support dynamic type checking
- Structures do not support de-initializers
- An object of a class may be shared by multiple references

Seite 1 von 26
fl
Protocols & Extensions
- Protocol
- Similiar to an interface in other languages

- Extensions
- Extends existing elements with new functionality
- Can extend classes, structs, simple datatypes, …
- Can be used to add protocol conformance to existing classes
- Cannot add additional storage

Error Handling
- Errors are normally de ned as an enum:
- A method can only throw an Error, If it is de ned as throws
- An Error can be raised using the throw clause

Error Handling - Catching Errors


- Methods able to throw errors must be called using a try syntax
- When using try, the errors must be handled!

Seite 2 von 26
fi
fi
iOS Architecture
- iOS = Mobile OS from Apple for
- iPhone
- iPad
- iPod touch
- Based on macOS
- Unix based
- Kernel (Mach kernel)
- Base libraries
- UI library (Cocoa Touch) based on macOS UI
library (Cocoa)

Cocoa Touch Layer High Level Features


- App extensions
- Hando
- Document picker
- AirDrop
- TextKit
- UIKit Dynamics
- Multitasking
- Auto layout
- Storyboards
- UI state preservation
- Push noti cation service
- Local noti cations
- Gesture recognizers
- Standard system view controllers

Cocoa Touch
- Most important framework is the UIKit framework
- Basic app management
- User interface management
- View controller model
- Standard system views and controls
- Support for touch- and motion-based events
- Multitasking support
- Support for text and web content
- Cut, copy and paste support
- Animation support
- Support for Apple Push Noti cation service
- Local noti cation scheduling and delivery
- Support for sharing content through email, Twitter, Facebook, …
- Device-speci c features:
- Built-In camera (where present)
- The user’s photo library
- Device name and model information
- Battery state information
- Proximity sensor information
- Remote control information from attached headsets
- …

Seite 3 von 26
ff
fi
fi
fi
fi
fi
Media Layer
- Graphics technologies
- OpenGL ES framework
- Metal framework
- Audio technologies
- High level frameworks (player functionality)
- Low level frameworks (more sophisticated APIs)
- Video technologies
- Supports di erent abstraction levels
- AirPlay
- Stream audio and video to Apple TV or third party speakers
- Gaming technologies
- SceneKit framework
- SpriteKit framework
- Game controller framework

Core Services Layer


- Peer-To-Peer services
- iCloud storage
- Block objects
- Data protection
- File-sharing support
- Grand central dispatch
- In-App purchase
- SQLite
- XML support

Most important: Core foundation framework

- Collection data types (arrays, sets, …)


- Bundles
- String management
- Date and time management
- Raw data block management
- Preferences management
- URL and stream manipulation
- Threads and run loops
- Port and socket communication

Seite 4 von 26
ff
Core OS Layer
- Kernel
- Based on mach kernel
- Manages:
- Virtual memory
- Thread
- File system
- Network
- IPC
- Drivers
- Interface between hardware and system frameworks
- Low-level UNIX interfaces
- Restricted access for security reasons!
- Contains libraries for
- Concurrency
- Networking
- File-system access
- Standard I/O
- Bonjour and DNS services
- Locale information
- Memory allocation
- Math computations

UI Kit (kommt eher weniger)


- Good integration with other frameworks
- OpenGLES via GLKit, Core Animation, Sprite Kit,…
- MVC-based
- UIViewController, UIView, Storyboards
- Library of visual elements
- Label, Button
- Using
- Constraints & autolayout
- Stackviews

Model View Controller (MVC)


- Model
- Contains the application data
- Logic and computation for manipulating the data
- View
- The part of an application the user can see
- Knows how to draw itself
- Responds to user actions
- Decoupled from the model
- Controller
- Intermediary between one or more view objects and
one or more model object
Seite 5 von 26
- Model:
- Is not allowed to access controller
- Is not allowed to know it
- Controller:
- May access view (outlets)
- Wiring using interface builder (storyboard)
- View is not allowed to access controller
- Generic view classes do not know the controller

Multiple Dialogs
- Each dialog is implemented with its own MVC
- A UINavigationCtroller controller is used to transition between MVC
- Use a segue to transition from one MVC to another
- Show segue for normal navigation
- ShowDetail segue for master detail navigation
- Segue can be triggered directly from elements (storyboard) or from code

SwiftUI
- new Layer for iOS, macOS
- Uses declarative Swift syntax
- Combines view and view logic into a single le
- MVC pattern no longer used
- Instead: Separation of Concerns
- A view is understood as function of its state
- Views are implemented as Swift structs
- Value types
- Very light-weight implementation
- E ciently supports deep and wide view hierarchies
- Use modi ers to customize views ( „.padding“ for example)

Multiple Dialogs
- Based on NavigationView container
- Responsible for managing the navigation stack & bar
- View modi er .navigationBarTitle(…) can be used to set page title
- NavigationLink used to specify destination of the navigation and to display navigation element

Data handling
- Concept single source of truth
- Data is not duplicated between views anymore, but shared
- Dynamic data
- Can automatically handled by the View lifecycle, using @State properties
- Static data
- Is stored in standard properties
- And passed using the initializer

Seite 6 von 26
ffi
fi
fi
fi
Data Flow

Application Lifecycle
- Not running
- App has not been yet launched or
was terminated by the system

- Inactive
- App is running but does not
receive events
- May execute code
- Normally brief, transitional state
- Active
- Normal state for foreground apps
- Receiving input events
- Background
- App is executing code in the
background
- Normally brief, transitional state
- App may register for extra time in
this state

- Suspend
- App is in background no code is
executed
- App is still in memory

Application Delegate
- Application delegate is informed before the most of these state change:
- Delegate pattern
- App can therefor react appropriately

Seite 7 von 26
ScenePhase in SwiftUI
- Indicates the scene operational state
- Three possible states:
- Active
- Inactive
- Background
- Can be used to tie code execution to operational state
- Cleanup, when entering background for example

Controller Lifecycle
- Additionally to the application state, each controller has its own state
- Controller class will be informed by calling the appropriate methods
- Additional lifecycle method:
- viewDidLoad

Reference Counting
- iOS does not use a garbage collector but reference counting
- Reference count (retain count)
- Each new reference increases the count by one
- Each un-assignment of a reference decreases it by one
- When count reaches 0 object is deallocated
- Comparable to C++ std::shared_ptr and std::weak_ptr
- Problem: Reference cycle!

Seite 8 von 26
Automatic Reference Counting (ARC)
- Swift uses automatic reference counting (ARC)
- Handled automatically
- No code for allocating and releasing of objects required
- Keyword strong and weak to identify the pointer type when creating properties

Background Execution
1. ) Background Threading

- Grand Central Dispatch is used for background thread handling


- Uses queues to handle work
- Dispatching work to another queue
- DispatchQueue.global(qos: .background).async {}
- DispatchQueue.main.async {}
- UI updated only allowed on the main thread

Seite 9 von 26
Swift UI Data Flow

External Data
- State can be bound ($property) to @Binding properties
- Output value of a sub view
- Data can automatically publish changes (@Published) from ObservableObjects
- Can either be forwarded between views using bindings, or
- Data must be declared as @StateObject/@ObservedObject
- Automatically available to all views using the environment
- Accessed using @EnvironmentObject
- Must be initialized upstream in the view hierarchy using .environmentObject(…)
- UI will automatically update to changes

Integrate Model Data


- Use @ObservedObject, @StateObject or @EnvironmentObject
- Observed Objects
- Track changes
- Instance not owned -> Some other view must own object
- May lead to repeated heap allocations (for each render pass a new object!)
- StateObject
- Owned by the view
- Created just before rst rendering (just before the body)
- Tied to the View lifecycle
- EnvironmentObject
- ViewModi er and PropertyWrapper
- ViewModi er: In Parent View to create/declare object
- PropertyWrapper: Access in child views

Seite 10 von 26
fi
fi
fi
Data Management
- Who owns the data?
- Life data to a common ancestor
- Use StateObject
- Consider placing global data in App
- Where to put the data?
- App -> App wide data
- Scene -> To the „window“, two open instances on iPad -> Each window has own state
- View -> Only current view has the data

ObservableObject
- Protocol
- Only available for classes
- Part of the model
- Exporting data to the view
- Glue logic between data model and view

Web Access

Seite 11 von 26
HTTP Connection in iOS
- Use URLSession.shared.dataTask(with: url) {…} for creating an async task for loading data
- Pass a closure to the task:
- Executed on background thread
- {data, response, error in … }
- Process the result or the error in the closure
- Start the task with task.resume()
- Update the UI when loading has nished
- Caution: Closure is on the background thread
- Recall dispatching back to MainThread!

HTTP/HTTPS
- Only https is supported by iOS
- HTTP connections are prohibited
- But can be activated temporarily (mostly for development)
- Entry in Info.plist of the app
- Accept into the AppStore only
- If su ciently justi ed and
- Privacy concerns are cleared
- HTTP connections to localhost (the phone itself) are allowed
- For development: Running webserver on the Mac is accessible

JSON parsing in Swift


- 1.) Use JSONSerialization.jsonObject to convert JSON into swift data types
- Returns type any
- Casting with:
- If let … as? …
- Guard let … as? …
- Handle errors if cast fails

2.) Or Use try JSONDecoder().decode(DATA_TYPE.self, from: jsonData)


- Returns exactly the given datatype
- Datatype must be implement the decodable protocol
- Supports extracting only a subset of items
- Normally requires same name for swift properties and json keys
- Key names may be changed using custom key mappings
- Enum CodingKeys: String, CodingKey {}
- Normally requires same structure of Swift class de nitions and JSON data
- Datatype may implement custom key handling to atten the structure
- Init(from decoder: Decoder) throws {}

Seite 12 von 26
ffi
fi
fi
fl
fi
Lists: Overview
- Display a structured and scrollable list of items
- UIKit vs SwiftUI
- UIKit: UITableView (Imperative)
- SwiftUI: List (Declarative)
- To display items in more than one dimension use Collection view (UIKit) or Grid (SwiftUI)
UIKit (imperative way):
- De ne what data to display
- Add table view
- Add cells to table view
- Add elements and constraints to cell
- Connect outlets
- Register cells
- Implement and connect delegates
SwiftUI (declarative way):
- De ne the data and declare what you want to display

UITableView (UIKit)
- Compared to SwiftUI more complex to use and get familiar with
- Construction
- Each list contains one or more sections
- Each section contains one or more rows
- A row represents an item

UITableView (UIKit): Implementation


- Two ways of using a UITableView are available
- Using UITableView in a UIViewController
- Using UITableViewController
- UITableViewController: UIViewController (Inheritance)
- Includes UITableView and additional features like pull-to-refresh
- Uses delegates for interactions and data
- UITableViewDataSource
- Manage data and provide cells
- UITableViewDelegate:
- Manage selections (User touches a cell)
- Con gure headers and footers
- Deleting and reordering cells
- Handle actions (e.g. Swipes)

SwiftUI: Overview and Implementation


- List is a container that represents rows in a single column
- Easy to use
- Implemenation
- Add a List to your body
- Add an array of items to your list
- Each item in the array will be displayed in a View

Seite 13 von 26
fi
fi
fi
FileSystem
- Create, read and write les and folders in the le system
- FileManager is a high-level API to access Apple File System
- Possible usages
- Save photos/ les temp for uploading
- Store les for the user

FileSystem: FileManager
- Use the method url(for: …, in …, appropriateFor: …, create: …) to request appropriate directory
- Set for: to documentDirectory for user created les
- Append le name to the URL
- Example:
- Let leManager = FileManager.default
- Let documetDir = try leManager.url(for . docDirectory, in: .userDomainMask, appropriateFor:
nil, create:false)
- Several formats possible:
- Plain text, custom binary format, json encoding/decoding

Dependency Management
- Swift Package Manager by Apple
- Create or include package dependencies
- Integrated in Xcode
- Usage:
- Share code between your projects
- Integrate third-party code into your project
- Alternative solutions from third-parties:
- Carthage
- CocoaPods
SwiftPackageManager:

- How to add and use package?


- Select project
- Select package dependencies
- Add desired package via URL (GitHub, local, gitlab)
- Import package to you desired les and use it

PropertyWrappers
- Encapsulates code for typical usage patterns
- We already know:
- @State
- @Published
- @EnvironmentObject
- …
- Support for custom wrappers
- Creates 2 properties
- The wrapper itself: $name
- Access property to the contents: name

Seite 14 von 26
fi
fi
fi
fi
fi
fi
fi
fi
fi
Combine Framework
- Declarative framework for processing values over time
- 3 key concepts:
- Publisher: publishes values
- Subscriber: subscribes to value updates
- Operatores: react on upstream publisher values and republish them
- Prede nes publisher for many async Swift interfaces:
- URLSession
- Noti cationCenter
- …

Concept

Protocol De nition

Timing

Seite 15 von 26
fi
fi
fi
Can be implemented directly and using chained syntax

Cancellable
- Operations can canceled
- By calling cancel on the cancellable
- If the cancellable gets out of scope (is destroyed)
- Long running task which are no longer required are therefore canceled automatically
- For example: if view is no longer used and destroyed

Additional Operators

FailureHandling
- Several options to handle failure states using di erent operators
- Examples:
- assertNoFailure
- Catch
- atMap - may use catch for erroneous tokens, but continues to listen to upstream

UserDefaults
- Application settings can be stored within user defaults database
- Key/value pair store
- Supported by the class UserDefaults
- Supports multiple datatypes
- String
Seite 16 von 26
fl
ff
- Integer
- Bool
- Array
- Dictionary
- …

- Reading a value:
- Let myBool = UserDefaults.standard.bool(forKey: „key1“)
- Let myString = UserDefaults.standard.String(forKey: „key2“)
- Setting a value:
- UserDefaults.standard.set(false, forKey: „key1“)
- Setting default values
- UserDefaults.standard.register(defaults: [„key1“ : false, „key2“: „Hello World“])
- Defaults are not persisted
- Must be set on each app launch

UserDefaults: UI
- iOS uses a system wide settings dialog
- App settings can be con gured using a settings bundle
- All settings are registered within this bundle

UserDefaults - React to changes


- Uses the default Noti cationCenter for updates
- Classic approach
- Register your class/ViewController for updates

- And create a corresponding handler method

- Unregister updates when your class/ViewController is destroyed

UserDefaults - React to changes


- Combine framework
- Use a class property to hold the subscription
- Register the subscription
Seite 17 von 26
fi
fi
UserDefaults - Property Wrapper
- User defaults can be combined with property wrappers
- Encapsulate access code in the property wrapper
- Further automation
- Add an observable object holding computed properties (using the property wrappers) to the
application’s user defaults
- Translate UserDefaults noti cation to object update messages

Web Images
- Download the data from the web using an URLSession
- Initialize an UIImage with the data
- Set the ImageView’s image property to the new Image
- Attention:
- Keep threading in mind
- Especially for table views: What happens, if cell is reused before the image was fully loaded?

Web Images - SwiftUI


- Same basic approach
- Download the data from the web using URLSession
- Initialize an UIImage with the data
- But:
- Notify the Image view using ObservableObject instead of setting image directly to the view
Still:
- Keep threading in mind

CoreData Basics
- Apples ORM system
- Integrated with apple platforms
- iOS
- macOS
- …
- Graphical creation and representation of the data model
- Change tracking
- Consistency of relationships among objects
- Lazy loading of objects
- Copy-on-write data sharing to reduce overhead
- Automatic property validation
- Sophisticated query compilation
- Instead of SQL complex queries may be created using NSPredicate

Seite 18 von 26
fi
CoreData Stack

Initialization (Autogenerated)
- > The code for this will get autogenerated

Managed Object Model


- Graphically created
- Representation of the database schema
- Supports wide range of options
- Attributes
- Relations
- Constraints

Code generation
- CoreData can automatically generate the entities as
- Classes
- Extension to existing classes
- Or manual code creation be selected
- Class with same name as the entity must be created
- Must inherit from NSManagedObject
- Implement all attributes with the corresponding datatypes
- Mark the attributes @NSManaged

Main Context
- Created automatically for applications with CoreData support
- Using your App (depending on the selected lifecycle type)
- Saving changes to the database

Entities in Code
- Query:
- Let taskList = try context.fetch(Task.fetchRequest())
- Returns all tasks from the database
Seite 19 von 26
- New:
- Let newTask = Task(context: context)
- Creation must be saved to become permanent
- May be deleted before it is saved
- Delete:
- Context.delete(task)
- Deletion must be saved to become permanent

UIKit Update - Automatic


- Use NSFetchedResultsController to manage CoreData results
- Fetch operation is performed using an NSFetchedResultsController instance
- Implement its delegate protocol to react on data changes
- Delegate methods are automatically called on data update
- Works very well with UITableViews
- Extra work required for other presentation options

UIKit Update - Manually


- After the data was updated, manually trigger reloading of data in your model
- context.fetch()
- Use the same mechanisms (NSNotifcaitionCenter for example) to inform UI
- Often easier when updating existing applications

Update Existing Application (UIKit AppDelegate Lifecycle)


1.) Create the managed object model
2.) Change your AppDelegate class

3.) Create the managed object model(Modelname)


4.) Create new le and struct PersistenceController

Core Data & Swift UI


- Keep the ManagedObjectContext in the SwiftUI environment
- Use a FetchRequest to retrieve data
- Bind the result to UI elements (a List, e.g.)
- Data will automatically be kept up to date
- For other operations (insert, delete, …) use the managed objects and the
ManagedObjectContext within your Swift code as described before

Seite 20 von 26
fi
Concurrency
- A context may only be used on the thread it was created
- Use context.performAndWait{} to send work to the right thread and wait for the result
- Use context.perform {} to send to the right thread but do not wait for the result
- Use persistentContainer.performBackgroundTask { context in } to perform work in a
background thread but do not wait for the result (a new NSMangedObjectTask is created)
- An application may have multiple contexts on multiple threads
- Be careful when deleting items
- May lead to problems, if still referenced on another context!

Background Operations
- Mobile applications should always present up to date data
- No user interaction should be required
- Background loading
- Speci c app feature requires it
- Available APIs
- Background fetch (deprecated since iOS 14.0)
- Background Tasks (iOS 13.0+)
Overview:

- Background state only transitional


- Shortly after entering the state, iOS suspends the app
- However, options for the background exception exist
- Managed by the system
- Only well-de ned operation patterns allowed
- Supported background operations
- Finish tasks started in the foreground
- Location updates
- Music playback
- Fetching data updates…
Fallback:
Background operations are not guaranteed
- Possible reasons:
- Low power mode enabled by the user
- Background operations disabled by the User in app settings
- Fallback solution is required
- Record the last time data was successfully fetched
- Trigger a fetch in the foreground, if interval too long
New Background API:

- Was introduced with iOS 14.0


- Supports background app refresh and background processing workloads
- Not supported in the simulator

Background Tasks: Usage


- Application must enable the Background Modes capability
- Application must register the task name in its Info.plist le
- Use BGTaskScheduler.shared.register(){} to create new workload
Seite 21 von 26
fi
fi
fi
- Use BGTaskScheduler.shared.submit(): to schedule workload -> is a sync call. Make sure to call
it on the background thread, if the call is time sensitive
- Your task must handle expiration and completion to ensure App is kept running, otherwise it will
be killed by the system

User Noti cations


- Easy way to inform user on new and interesting information
- New Email
- New Message
- Noti es the user outside of the application
- Will pop up on the top of the screen
- New API since iOS 10.0

User Noti cations: Usage


- Create an UNMutableNoti cationContent object with contents of the noti cation
- Create noti cation trigger
- Wrap them in a UNNoti cationRequest
- Each noti cation requires a unique id or will cancel the previous one
- Add noti cation request to the UNUserNoti cationCenter

User Noti cations: Permission and Presentation


- Permission:
- Permission for sending noti cations is required
- Request permission from UNUserNoti cationCenter
- Presenting a noti cation
- The application can in uence the presentation of the noti cation
- Must register itself as delegate of the UNUserNoti cationCenter
- Application can handle noti cation touches using the delegate methods

Apple Maps and Core Location


Apple Maps:

- Use MapKit Framework by Apple to integrate maps into your app


- Graphical integration of Apple Maps
- Available since iOS 3.0
- Add annotations and overlays
- LookAround capabilities to explore locations
- Respond to user interactions
- Text completion for searching points of interest

Integration of Apple Maps:

- For routing functionality the maps capability need to be enabled


- Easy integration with SwiftUI
- Import MapKit
- Add MKCoordinateRegion with center (lat + long) and span (zoom level)
- Use Map(coordinateRegion: $region)“ in your view body

Seite 22 von 26
fi
fi
fi
fi
fi
fi
fi
fi
fl
fi
fi
fi
fi
fi
fi
fi
fi
fi
Core Location: Overview
- The framework to show the geographic location and orientation of a device
- Available since iOS 2.0
- Uses date from all available components on the device
- Wi-Fi, GPS, Bluetooth, magnetometer, barometer and cellular hardware

Core Location: CLLocationManager


- Delivery of location-related events
- Capability of CLLocationManager
- Track changes of current location
- Track heading changes of compass
- Monitor regions of interest and generate events when someone enters or leaves
- Report nearby bluetooth beacons

Core Location: CLLocationManagerDelegate


- Receive events from location-manager
- Assign the delegate to your CLLocationManager
- Listens to
- Responding to authorization changes
- Receiving location updates
- Receiving region-related updates
- Receiving beacon-related updates

Core Location: CoreLocationUI


- Streamline access to user location data through a secure UI
- Interacts securely with Core Location
- Provides LocationButton
- One-Time authorization to fetch user location
- Standard Design for familiarity and trust

Core Location: CoreLocationUI - Integration


- Add „LocationButton“ to request location from CLLocationManager in your view body
- Map updates automatically by using the same CLLocationManager

iOS App Store Review Process


- In order to publish your app in the Apple App Store you have to meet some minimum
requirements de ned by Apple
- Are enforced through the App Store Review Process
Steps:

1.) Join Apple Developer Program


- Costs 99$ per year
- is required to submit an app
- gives access to beta software Xcode previews, iOS/macOS previews
- lets you use TestFlight for distributing beta builds

Seite 23 von 26
fi
- lets you use features that require apple’s involvement (In-App purchases, iCloud, Push
Noti cations,…)

2.) Finish the app:


- Make the app look complete
- No missing screens or dead buttons
- No placeholder or TODOs
- Take apples interface design guidelines into account

Test your app thoroughly


- Test it with di erent screen sizes
- Test it with bad internet connection
- Test it on real devices
- Test it in the release con g
- Let other people test your app

3.) Register a bundle identi er


- For each app you want to distribute, make sure you have registered a unique bundle
identi er at the Apple Developer Portal

- Register an App ID in the Identi ers section on https://developer.apple.com/

4.) Create the App Record


- The remaining information will be provided via a new App Store record

- Provide Basic information:


- Platform (iOS)
- App name
- Primary language
- Associated bundle identi er
- Unique SKU

5.) Provide App Information and Pricing Details

App Store info:


- Localized name in AppStore
- A link to a website that describes privacy policy
- App category
- Age rating
- pricing and availability
- app privacy information

6.) Provide version-speci c information

- This has to be provided with each new version of your app and is also called metadata
- Language
- Promotional screenshots and videos for the app store, app icon
- Description and promo text
- Keywords
- Support information
- Release settings
- Specials information for the reviewer (e.g. credentials for a test account)
If reviewer detects issues with provided metadata, your app will receive a „metadata reject“
-> Screenshots have wrong format
-> privacy URL not working
-> provided test account not working

-> You have to x provided data and re-start review process

Seite 24 von 26
fi
fi
fi
ff
fi
fi
fi
fi
fi
7.) Upload your build to App Store Connect

- Can be done via Xcode


- Make sure version on project matches version in App Store Connect
- Increase build number with each upload
- Ensure, you have a valid distribution certi cate and selected the correct team for signing the
app
- As build targets select „Generic iOS Device“. This will create an intermediate build for all
supported device types
- Archive your app to create the app bundle
8.) Submit for review

- Select this processed build in the version speci c information screen


- Click „Submit for Review“
- Provide information regarding encryption usage and advertising
- You will be noti ed when the reviewing stars and when it has nished

Guidelines
- Review process does not end with app submission
- App might be rejected for not complying to the App Store Review Guidelines
- App gets removed as soon as the rst issue arises!
- Reserve enough time to x all issues, can also appeal a rejection if you think it was rejected
by mistake

App Store Rejection types:


- „Rejected“ -> Issues with submitted app build. A review message will detail the issues. You
need to x those issues and upload a new build, reply to the review message and restart the
review

- „Metadata rejected“ -> Issues with the app information (metadata) provided in App Store
Connect. The review message will detail the issues. Fix metadata issues and reply to message
+ restart review

- Developer rejected: You can cancel submission by yourself if you identi ed an issue and start
the review after xing it.

Common reasons for rejections


- Crashes and bugs
- Misleading permission requests
- You request for certain permissions but do not provide a proper explanation why these are
required
- Only request permission when actually required
- Incomplete or wrong metadata and misleading advertisement
- Provided information in app store description has issues (dead links, misleading screenshots,
…)

- Web clippings:
- Pure container apps (apps that just embed a website into a web view) will be rejected as its
contents and functionality may change completely after the review process.
- Also a substandard UI issue, as the app might now comply to the expected look and feel

Seite 25 von 26
fi
fi
fi
fi
fi
fi
fi
fi
fi
- Repeated submission of similar apps, or not enough lasting value
- Apple wont approve the 4th reskin of the same app under a di erent name

Further Critical Review Elements


- Apps for the „Kids“ category
- You need to proved a special measurements when linking outside the app
- Additional requirements for privacy apply:
- Not third-party analytics
- No third-party ads
- No advertising identi er
- Additional reviewing time for checking age appropriateness
- In App purchases:
- All digital goods that can be bought within the app must bee purchased via in-app purchases
through Apple’s app store.

Seite 26 von 26
fi
ff

You might also like