Adding real-time collaboration to an app - ios

I'm creating a scoreboard app and I'd like to add some collaboration functionality. All I need is for users to be able to add other users, and that lets them work on the same scoreboard. Would adding the Real-Time Match Game Center feature to my app give me this functionality, or is there a better way to go about it? I've read up a bit on the Game Center Programming Guide, but I hesitate going that route because I want users to be able to add people who aren't on Game Center (without the collaboration feature), and aside from that all the user's saved data is stored locally on the device and I'm not sure how that would be affected.

You should use something like SocketIO, there's a very good swift library.
From their web page:
Socket.IO enables real-time bidirectional event-based communication.
SocketIO leaves an open connection so you can send messages to the server, and the server will broadcast to any other user... SocketIO works great with chats and I think is the perfect solution for what you want to do, also SocketIO supports multiple users connected to the "same channel"

Related

How would I go about building and hosting my own backend for an iOS application?

As a preface: I want to do this as a learning exercise. I'm not trying to produce a commercially viable app.
What are the layers/abstractions of an iOS application that is connected to a custom, self hosted backend? What technologies are needed to build this stack?
This post has helped my understanding a bit. I'm currently using Firebase as my backend but have found its NoSQL structure wrong for my app. The data I'm storing is relational, so I think an SQL database storing JSON would work better. The data is modeling Vehicles shared between Users.
From my research, the Realm Platform looks like a good choice. Am I understanding the technologies correctly here? Does this sentence make sense?
General functionality:
Sign Up and Login of users
Upload/download vehicle data
Some server side logic
Pushing data updates to users in real time
So would the stack look like the following?
User Front End: iOS app written in Swift
Database: Realm Database (SQL)
Server: Realm Object Server
I'm really looking for an overview of the general architecture. I don't know anything about that, so I'm sure I have failed to provide many details that are necessary for a thorough answer.
I apologize if this question is redundant; most answers I've seen for similar questions typically end with "just use AWS, Firebase, etc".
Thanks!
For a start you want to build your own backend and you should create your own API's that your IOS application will connect to. in short this is called REST api
https://www.sitepoint.com/developers-rest-api/
you will need to use many more technologies more than just a server like Apache
once you create your backend API you will need to connect it to the IOS app which can be done using NSURLSession builtin framework form Apple or Alamofire which is based on NSURLSession but its easer to use if you are learning
you will need to learn how to do an http/https request to understand how the request is made
check this
https://medium.com/#MuraliKathir/build-a-simple-api-search-with-alamofire-and-swiftyjson-80286e833315
Now to Realm. Realm is a local database that will be inside of your IOS app which helps you save data downloaded online or even user generated
https://realm.io/docs/swift/latest/#queries

Building an IOS app just using a Webpage

I'm new to IOS development and wanted to make an app for learning purposes. My idea is that I have a Single Webpage that has a live count of how many people are in the gyms on my University's Campus.
How can I pull data from that webpage and show it on my app with a little bit of arithmetic such as :
Database how many people are usually in the gym at a particular time and then give predictions.
let users chose a preferential gym and give them notifications based on their regular check in times
if the rate of entry in the gym is high, then notify users to avoid going then. and vice-versa.
I don't want answer to all the above, but if you could give me a heading, that would be awesome!
EDIT 1:
The webpage looks like this : https://studentaffairs.psu.edu/CurrentFitnessAttendance/
Your question is too vague for a specific answer.
You need a back-end API into your web page. It could be as simples as a PHP or Python script that responds to http get requests and returns JSON data with the statistics you want. You'd then write your app to issue the appropriate query, parse the response, and display the results to your users.
Notifications would be more complicated. You'd probably need to set up remote notifications, which would require support on the server side and registering with Apple' remote notification service.

Inviting event attendees programatically on iOS 10

I've been using Stackoverflow for about 5 years now, and haven't felt the need to ask a single question yet, I've always found the answer i needed through previous threads. That just changed and I have a question that I really can't figure out. And it sounds so easy to do.
So the question is; how do you invite attendees, or reply/decline to calendar events on iOS under iOS 10? And please, no we don't want to bring up an EKEventViewController. We'd like to do this in our own UI. Under iOS 9 this was possible through just forcing EKAttendees objects in to the EKParticipants array with setValueForKey:. But under iOS 10 this produces an error saying 'Attendees can't be modified'.
I have used a Technical Support credit with Apple and got the reply that this was not possible. It is not possible using their APIs.
The closest to an answer i've got is to use IMIP (https://www.rfc-editor.org/rfc/rfc6047#section-2.2.1). If that's the way to go, could someone help me along on how to actually set that up? I'm not well versed in back-end development, I'm all front-end so I wouldn't really know where to start.
There also seems to be some CalDav servers on GitHub (https://github.com/mozilla-b2g/caldav) but I'm not sure how good they are, or exactly what you need to set one up.
So basically, is there anyone who could give a childs explanation to just how the heck we can send nice invites to calendar events. And if there are different solutions for Google, Apple accounts (obviously under the hood, but implementation-wise) that would be very helpful to know to.
Is this something that requires a ton of implementation on our own servers or is there some reliable service to use? That would be ideal. Maybe you should build one and you got at least one customer here :-)
Appreciate any help!
You cannot modify attendees using EventKit, but Apple already told you that:
I have used a Technical Support credit with Apple and got the reply that this was not possible. It is not possible using their APIs.
The hack with accessing the internal objects using KVC was, well, a hack and not documented API. No surprise they killed that.
So how do calendar invites work. That in itself is a very complex topic (consider delegation, resource booking like rooms, etc etc). There is a whole consortium which works on that (CalConnect), they also have a broad overview: Introduction to Internet Calendaring and Scheduling.
If you are serious into scheduling/calendaring software, it may make a lot of sense to join CalConnect for their interop events etc.
But you wanted a 'childs explanation'. I can't give that, but a short overview.
iTIP
iTIP is a standard which defines how scheduling messages flow, e.g. that you send a message to your attendee, your attendee responds back with accept/decline, what happens if a meeting is cancelled and all that.
It does NOT however specify how those messages are transferred. It is just a model on how the message flow works between the organiser and the participants.
Most 'big' calendaring systems (Exchange, Google, CalDAV servers like iCloud) use iTIP or at least something very similar.
iMIP
iMIP is a standard which defines on how to exchange iTIP messages using email. Say if you invite someone using iMIP, you'll send him a special email message with the iCalendar payload containing the invite. If your attendee accepts, his client will send back another iCalendar payload via email containing that.
iMIP is supported by a lot of systems and was, for a long time, pretty much the only way to exchange invitations between different systems (say Outlook and Lotus Notes).
However: the iOS email client does NOT support iMIP (unlike macOS or Outlook). So if someone sends you an iMIP invite to your iOS device, you won't be able to respond to that. (reality is more complex, but basically it is like that)
CalDAV
CalDAV is a set of standards around calendars stored on a server. Many many servers support CalDAV. E.g. iCloud uses CalDAV. Yahoo, Google, etc all support CalDAV. The important exception is Exchange, which doesn't support it.
In its basic setup CalDAV just acts as a store. You can use HTTP to store (PUT) and retrieve (GET, etc) events and todos using the iCalendar format.
In addition many CalDAV servers (e.g. iCloud) do 'server side scheduling'. That is, if you store an event to the server which is a meeting (has attendee properties), the server will fan out the invitations. Either internally if the attendees live on the same server, or again using iMIP.
Exchange
Exchange supports iMIP but not CalDAV. You usually access it using one of its own web service APIs, e.g. ActiveSync or Exchange Web Services. I'm no expert on them, but I'm sure that they allow you to create invites. Exchange&Outlook have an iTIP like invite flow.
etc
Is this something that requires a ton of implementation on our own servers or is there some reliable service to use?
This really depends on your requirements and needs. Do you need to process replies or just send out generic events?
If you want to host a calendar store, it probably makes sense to use an existing CalDAV server.
Calendar invitations are a very complex topic and you need to be very specific on your actual requirements to find a solution. In general interoperable invitations in 2017 are still, lets say 'difficult'.
P.S.: Since you've been using StackOverflow for about 5 years now, you should know that this question is too broad for this thing.

Using Google Maps to store custom set of locations (iOS Google Maps SDK)

Create mobile application, which gives the user ability to look for certain places (payment terminals) nearby and to add new ones. Of course user will have ability to edit places, change some of their meta-info fields, add photos, etc.
I can understand, how to implement such things at the mobile device side(i mean interface and model), but can't imagine, what i have to do at the "google-side" to store locations and get them to device.
I'm looking through developers.google.com for appropriate service, but google have so much different "Maps" services and their variety makes me disappointed, which one can give me necessary instruments.
I'm sorry, if my question is too stupid but i can't realize how to implement such functionality.
If anybody ever made such applications, please help me to find, at least, the service, which can help me to implement such functionality. Sample code at github will be the great!
You're looking to build a "back-end" or a database to store the locations that you are interested in. This means that you will save them on a server, that you will access through requests over the internet from your iPhone.
For a really simple back-end to set up, check out Parse that is very simple to implement.

iOS XMPP Framework blocking/privacy options?

I am developing a XMPP based chat client for iOS. One of the requirements is the ability to "block" users. The XMPP specifications have a few options (XEP-0016, XEP-0191) however I have yet to be able to find any extensions for the XMPP Framework that are already available? It seems like this would be a pretty basic feature? I could always go the easy route and just save a list of blocked JIDs locally and filter out incoming messages, however it will not transfer between devices this way. The other option is to write an extension, which might be out of the budget/time frame requirements. Am I missing something here? Is there a built in way to do this or an extension already out there?
It may be a basic feature, but no one that has needed it has contributed an implementation to the project.

Resources