I am trying to write a UI test for our app's IAP using a sandbox account. However, when trying to tap this purchase button, the test is unable to find this element:screenshot of in-app-purchase prompt
I've tried targeting this element by its button name and label name with no success. During the UI recording, when tapping this button, Xcode freezes completely and I am forced to shut Xcode down. I've also tried debugging at this step and when I print out "app.debugDescription" in the console, this button nor any of the other elements in this purchase drawer is returned.
Failing line of code:
app.buttons["Purchase"].tap()
Error message:
No matches found for Elements matching predicate '"Purchase" IN identifiers'
Xcode Version: 13.2.1
iOS Version tested (real iPhone device): 15.3.1
Previously, Apple has not permitted any testing of IAP at all. Recently they introduced testing to the StoreKit framework, but it's at the unit testing level; I wouldn't be surprised if they're programmatically blocking access to automation for security reasons.
If this were to work you'd need to find the bundle identifier of the application that's "running" (the StoreKit window) and interact with that. I unfortunately don't have an application available (one with a purchase available) to allow me to look into this for you.
A forced tap on the coordinates (I always add a few pixels to the x and y for reliability) should work. Never ideal, but might be your only hope.
Another option would be to set the auto-accept alerts capability? It might work. capabilities.SetCapability("autoDismissAlerts", true)
Related
I developed an app and already tested it in Xcode and on my physical iPhone device.
After a lot of testing on my iPhone the app quits after starting.
I guess this is because of an empty array, but I am not sure.
Is there a possibility to read the console of my already built app on my iPhone? Because when I am testing the app on Xcode everything works fine - I guess the error occurs in only very specific cases...
I don't want to build the app again on my physical device, because I am pretty sure everything works fine then and I won't be able to recreate the exact situation.
So I would like to connect the phone to my macbook and run the app on my phone in Xcode without rebuilding it first.
Any ideas?
Connect your phone to your system and open Xcode.
The Window menu in Xcode Select Device and Simulators from the
Window menu.
Select your device from the left panel.
The toggle logs button Make sure that the logs are expanded. If they
are not, press the small up arrow in the bottom left corner of the
main pane.
Click the Save Console button (at the bottom right) to save the log
information within the console.
If you use a free Apple Developer account it is normal, it has not crashed.. it simply refuse to run.
Apple has imposed 'new' limitations on the 'free' provisioning profiles, whit this limitations you can run the app on a physical device for 7 days, then you must recreate a new profile with a new deploy on the device.
Even without XCode you can get the logs by using iOS Console which is free and works exactly as XCode's console.
As for starting the app again without rebuilding from XCode, you can use ⌃⌘R to speed up your tests.
A colleague of mine has installed a beta app of mine a year ago on his iphone with the use of testflight. Now he cannot delete the app anymore.
The normal move of the icon for deinstallation is simply ignored.
How to delete/uninstall an app after testing?
I'm an React Native dev who's more used to Android, so I also had trouble with this.
Turns out I was deep pressing (force pressing?) the icon instead of long pressing. You have to make sure you're only pressing lightly in order to make the 'x' icon appear, otherwise you get a menu of options like 'Send Feedback'.
This is slightly going off of guess work but will explain as best as I can.
I assume that when you launched the app you did so via iTunes Connect and inside the TestFlight tab?
If so then the TestFlight build should have an expiration date next to it of when the app will stop working. If that doesn't exist the other thing to check is the 'All Testers'tab, move the mouse of the right hand side of the person's name and remove them. That might force the app to delete.
Short of that, the only other thing I can suggest is to meet with the client and try and press and hold on the app and see what happens. You could also go onto the TestFlight app on their device and see what the information says in there.
I hope that helps!
I'm a free developer and I use my swift application on my iPhone 7. I'm using Swift 3 and iOS 10.
So the problem is, sometimes (like 2 of 10 times) when I start the app, iOS freezes like 5 seconds before my app actualy comes to the screen. In this time I only see the app icon is in the highlighted state. This only happens with my own app, not with other apps.
My app also does nothing special on startup and this only happens on the real device, the debugger in Xcode always starts immediately.
So is this a normal behavior? And does it work properly when I decide to put it on the App Store?
Thanks in advance.
I have had this happen to me before. No, this does not happen when it is put out on the App Store. One way to get around this is to use TestFlight. You can upload your archive to apple and select on the 'TestFlight' tab of your app. Click on internal testing and then click on your email and the version of the app you want to test. You should then get an email on your Apple ID telling you to test the app, and it will let you download it. Good question :)
To test the same version which would have been uploaded to the store quickly, change the build configuration to release. To do so, click on your app's name (top left), press edit schema, click the build configuration dropdown, also deselect debug executable. (make sure to turn it back when you're going to debug, or create a new schema with the above settings to let you switch quickly in the future)
You might also try using instruments, that lag on startup might happen if you're trying to load many things in memory on your initial view controller's viewDidLoad or app delegate's didFinishLaunchingWithOptions load, especially when trying to load big files such as images, videos or large plists. You might want to try using instruments (the time profiler instrument specifically) in order to check it out.
I am developing a helper for an automated testing suite. There is a requirement to kill/reset the application being tested, so the app can be started again "fresh".
I know killing an app is against Apple guidelines; there are many questions here about that with sensible answers ("don't do that!"), but this is a different scenario; and the app will never be on the App Store (as it has been instrumented for testing purposes).
Currently, our helper calls "exit(0)" from within the app to terminate it. This works fine, but the app icon is left in the recently used apps list (double click home button).
I need a way to programatically remove the icon from the list (or, terminate the app in such a way the icon does not remain). Or maybe a way of refreshing this list somehow. The only way I have found so far is to uninstall the app and install it again.
This must work on the device (as well as the simulator). I can use solutions that make use of USB-only functionality (e.g. provided by libimobiledevice and friends), or calling a function inside the app, or a Private API call. Assume the device has a development profile on it. Jailbreaking is not an option.
Note : I don't want to submit this app to app store.
What i want to achieve :
I want simple app with one view having two button Lock and Unlock.
Lock - This button will lock device. Only this app's screen will show nothing else will be accessible even after restart same screen will show up. Home button, gestures will get disabled similar to single app mode.
Unlock - This will unlock device and switch to normal behaviour of device.
iOS :
I want this for iOS 4.3 and above.
I have checked following solutions, but these don't match my requirements
Configuration profile
Lock-down iPhone/iPod/iPad so it can only run one app
But it is manual (reboot device, open app which you want to run in single app mode). I want to do it programmatically the way i mentioned above through my app.
Guided access (iOS 6 and above)
How to lock down user to Single App mode in iOS 6, Programmatically?
I want it do for all os and programatically.
Is there any way to do this ? As i don't wan't to submit it to app store is there any private api, some hack for springboard to achieve this ?
Thanks in advance !!
As I know in iOS 7 there is a new feature which allow to do exactly what you want.
However, it's only applicable for iOS 7 (and I believe it's only applicable to a supervised devices).
1) You will need to install restriction configuration profile with autonomousSingleAppModePermittedAppIDs key (take a look here)
This is one time step and a user will need to manually accept this configuration profile.
There is another option to use MDM to install it silently, but it could be an overkill for you.
2) You should use API:
UIAccessibilityRequestGuidedAccessSession (to lock/unlock)
It is defined here
3) And most beautility part. All of it is officially document. So, you can even submit it to AppStore.
P.S. Why do you care about 4.3 or 5? They have tiny market share by now. Most likely even iOS 6 has below 20% market share already.
Update 1
Potentially, you can try to use API which sends clicks and keys (search for GSEvent in iPhone-privateapi tag). May be using these API's you can do triple home to toggle accessibility on and off.
If this work, I think you should be able to cover iOS 6. I am not sure whether both this API and triple home click were available prior that.
It looks like this private API is unaccessible anymore in iOS 7. So, probably you can ignore this idea.
Just wanted to write on this even though this is old as i needed to implement a similar solution and i got it working. The steps for me as follows and a note here is that this involves MDM and other specific steps.
My requirement was as follows. Each of the iPad at different locations has a set of apps installed.For ease of it lets assume each Dept. has their own apps. Participants open a app related to their dept. to take a test, the APP automatically Locks the iPad to single-app Mode and at the end of the test, it will unlock it self.
Supervise the iPad/iphone using the Apple Configurator.
Install the MDM related files ( Each MDM has its own set of instructions, usually involves downloading a profile).
Every MDM has a option of Single APP Mode or MultipleAppMode. Select the second option and add the app IDs to the list. (A single APP mode works pretty well with MDM's but i did not want the app to be locked to a single APP all the time).
I used the UIAccessibilityRequestGuidedAccessSession api to lock unlock the device from single app mode.
http://bobxcode.blogspot.com/2015/12/programmatically-implement-single-app.html
Thanks,
Bob
In MDM configuration, There is an option
autonomousSingleAppModePermittedAppIDs
Optional. Supervised only. If present, allows apps
identified by the bundle IDs listed in the array to
autonomously enter Single App Mode.
Availability: Available only in iOS 7.0 and later.
But this needs Supervised Device mode.