App Store will not call. Or how I made my application, but it will not get to users

Once I thought that in order to run my application it is enough to write code. A little later, I learned that it was a good idea to supplement the code with a design. Later, I realized that it was necessary to look for an audience and promote your product to it. But all this may be superfluous if you do not follow the guidelines. Below I will talk about my first experience of self-development and why my application will not see users. 3r3128.
 3r3154.
App Store will not call. Or how I made my application, but it will not get to users
 3r3154.
To begin with, I’ll make a reservation that I’ve been developing applications for about five years and this is not my first application at all, but the first one is completely independent in which I have gone from idea to implementation. It turned out that the last year I did not write the code at all, but was the product manager. It seemed to me that I would never write code again, that it was too boring. But never began to break down in six months, when it became interesting to me to understand data science and python. And finally broke in a year when I really wanted to do something with my hands and my application began to appear.
3r3128.
 3r3154.
The application in the first version was called TinderCall. It helps to escape from boring dates or meetings. I found myself in such an awkward situation several times that the easiest thing for me was to write to a friend: “Dial me soon,” and wait. I decided that it could be automated a little, and call myself. It also looked like a great way to work with CallKit and PushKit. The very idea of ​​the application came to me from reading one blog in an instagram, in which the author talks about how she goes on dates (the instagram also has a use). There, many girls faced a similar situation. A little later, the application was called "KateCall" or "Kate, call." The name appeared in a conversation with a friend, who was also very keen on the idea and said that she usually asks Katya to do it: “Katya, call me”. It seems to me a beautiful play on words. 3r3128.
 3r3154.
Then I began to look, and what is already on this subject. Found several similar applications. No wonder, the idea is on the surface. For all of them it was clear that this is someone's first application. Without design, and with the need to keep the application open for the call to come. I decided it was worth doing one more thing. Only it will be more beautiful and functional. Anyway, I wanted to stretch the programming muscle. 3r3128.
 3r3154.
The functionality was determined as simple as possible: the ability to select the name of the caller and the time through which the call will occur. At first, I decided that I would do the design myself, because it is simple: the favorite color of people is blue, the grid of elements is ? and besides, I taught xCode for designers. But when I made it, I realized that I would better turn to my designer friends. 3r3128.
 3r3154.
3r3334. 3r3128.
 3r3154.
I liked the design version much more, and I started to implement it. Total development took 35 days from project creation to clicking on the Submit button. 17 komitov and about 40 hours, including writing code, reading and fighting bugs. The largest number of komits was made by me on Thursdays. 3r3128.
 3r3154. 3r3342.
For those who are interested to know the details and limitations of working with CallKit and VoIP-guns, welcome here 3r344.
Project code is available here is . 3r3128.
 3r3154.
With CallKit, you can make calls as believable as possible. 3r3128.
 3r3154.
 3r3154. 3r3144. The standard call screen is 3r3145.  3r3154. 3r3144. melody and contacts correspond to the real 3r3145.  3r3154. 3r3144. The call is shown in the call book. 3r3145.  3r3154.
 3r3154.
There are several nuances. Firstly, it is impossible to transfer any picture to the standard call screen. Secondly, the call screen behaves differently depending on whether the application is open or not. So, if the call is in the application, then after answering you need to show the conversation screen yourself. And if you answer on a locked screen, a standard conversation screen will appear. Third, CallKit cannot be used in China. 3r3128.
 3r3154.
The second technical point is connected with the push. The timer did not suit me, because for him you need to keep the application constantly open. I thought in the direction of local push, but they do not guarantee that the application will be awakened. It turned out that there is a separate type of push for VoIP. They have a whole list of great properties:
 3r3154.
 3r3154. 3r3144. The application automatically starts when you receive a push, even if it was closed. 3r3145.  3r3154. 3r3144. no permission is required from the user to use this type of push. 3r3145.  3r3154. 3r3144. after receiving the push is immediately processed by the application. 3r3145.  3r3154.
 3r3154.
But they can only be used if there is a call functionality. Separate middleware to get this push did not want to write, as it turned out, it was not necessary. Library OneSignal allows you to send any kind of remote-push from the application on a schedule. I honestly can’t imagine a situation where VoIP pushes may still be needed on a schedule, but there is an opportunity to send them. For OneSignal, you must use a separate voip-push certificate. You can get it in the same place as usual. 3r3128.
 3r3154.
When the main functionality was completed, I decided that this was not enough. I wanted to make a clearer screen with call waiting time, and then more information about me and feedback, add taptic, add voice choices, add I was able to stop after the first revision and decided that knowing the AppStore and their number of restrictions, it is worth sending them application as it is, and then finish the nice little things. And not lost. 3r3128.
 3r3154.
3r3105. 3r3128.
 3r3154.
My application was rejected by two points: 3r3-3112. ??? Apps that enable anonymous or prank phone calls or SMS /MMS messaging will be rejected
(Applications that allow anonymous or point guard calls, sms, mms will be rejected), and
??? Your app contains features that mimic the iOS call interface or behavior
(The application mimics the standard call mechanism). So existing applications most likely did not use CallKit, not because they did not guess, but because it is impossible. 3r3128.
 3r3154.
Unfortunately, the dialogue with the publication service did not lead to anything. Fake calls in no way can be combined with CallKit and VoIP push. Arguments that this was done not for fun, but for good work, did not help. 3r3128.
 3r3154.
I have already planned how I will promote my application on ProductHunt and other platforms, I will begin to communicate with users, I will become a real start-up. But for this you need to trim the functionality to the level of those applications that already exist. I still don’t really like this idea, and I think I’ll just leave my code on gitHub, but forget about the app, it has already brought experience. 3r3128.
 3r3154.
The next time I publish my apps, I'm
Required
:
 3r3154.
 3r3154. 3r3144. I run at least a search for
guides 3r3133. Publish to AppStore
 3r3154. 3r3144. I will publish the application as soon as possible
 3r3154. 3r3144. I wondered why there is no such functionality in the existing products on the market, and I will even more carefully go over the guides. 3r3145.  3r3154. 3r3144. I will not joke with Apple. 3r3145.  3r3154. 3r3147.
3r3154. 3r3154. 3r3154. 3r3152. ! function (e) {function t (t, n) {if (! (n in e)) {for (var r, a = e.document, i = a.scripts, o = i.length; o-- ;) if (-1! == i[o].src.indexOf (t)) {r = i[o]; break} if (! r) {r = a.createElement ("script"), r.type = "text /jаvascript", r.async =! ? r.defer =! ? r.src = t, r.charset = "UTF-8"; var d = function () {var e = a.getElementsByTagName ("script")[0]; e.parentNode.insertBefore (r, e)}; "[object Opera]" == e.opera? a.addEventListener? a.addEventListener ("DOMContentLoaded", d,! 1): e.attachEvent ("onload", d ): d ()}}} t ("//mediator.mail.ru/script/2820404/"""_mediator") () ();
3r3154.
+ 0 -

Add comment