# Creating a staging iOS C+ - Thurs, Fri 21st-22nd Jan, 2020
### Staging app
An interesting thing I worked on was creating a process for us to do staging test builds for our iOS app.
This is useful for things like testing push notifications, where it is useful to have an entirely different app build with a different push notification ID to make sure we never inadvertently send incorrect notifications to prod devices.
The way I did this was create a seperate app in App Store Connct, with a different Bundle ID, then have a new Fastlane lane that modified Connect+'s bundle ID to match and changed the provisioning profile before building and pushing to "that" app's TestFlight.
In `Appfile`:
```ruby=
for_platform :ios do
for_lane :staging do
app_identifier 'my-app-test'
end
end
```
In `Fastfile`:
```ruby=
get_provisioning_profile(
output_path: "./builds",
provisioning_name: "my-app-test AppStore", # use test profile
filename: "provisioning.mobileprovision", # Rename the local provisioning profile
api_key: api_key
)
```
https://docs.fastlane.tools/actions/upload_to_testflight/
https://docs.fastlane.tools/advanced/Appfile/#appfile
https://docs.fastlane.tools/actions/update_app_identifier/
### TextInput performance improvements with debouncing
We had some issues where a lot of text entry was causing the app to lag a lot. The solution was to debounce the Formik state update:
```typescript=
const { callback: debouncedSetFormikFieldCallback } = useDebouncedCallback(() => {
handleChange('message')(textValue)
}, 500)
const handleTextChange = (text: string) => {
setTextValue(text)
debouncedSetFormikFieldCallback()
}
```
###### tags: `programmingjournal` `2021` `fastlane` `debounce` `staging`