Guideline 1.2 User-Generated Content: τι ζητάει η Apple
Από Mehdi Azizi
Δημοσιεύτηκε στις , 10 λ.
Guideline 1.2: αν οι χρήστες σου δημοσιεύουν, χρειάζεσαι φίλτρο, αναφορά, μπλοκάρισμα, επικοινωνία και αποδεκτούς όρους. Check-list για Expo και Supabase.
Η guideline 1.2 ισχύει μόλις οι χρήστες δημοσιεύουν κάτι που βλέπουν άλλοι: ένα μήνυμα, μια φωτογραφία, μια κριτική και, κατά τη γνώμη μου, ακόμα και ένα απλό ψευδώνυμο σε μια κατάταξη. Τότε το κείμενο της Apple απαιτεί φίλτρο, δυνατότητα αναφοράς με γρήγορη απόκριση, μπλοκάρισμα και δημοσιευμένα στοιχεία επικοινωνίας. Τα μηνύματα απόρριψης προσθέτουν και πέμπτη απαίτηση: όρους χρήσης που ο χρήστης έχει αποδεχτεί και που δεν ανέχονται ούτε προσβλητικό περιεχόμενο ούτε καταχρηστικούς χρήστες.
Αυτός ο οδηγός δεν αφηγείται μια απόρριψη. Δείχνει τι έστησα στο TradaZen, την εφαρμογή μου για εξάσκηση στο trading, όταν οι κατατάξεις του άρχισαν να δείχνουν ψευδώνυμα που διάλεγαν οι παίκτες. Για τη συνολική εικόνα των λόγων απόρριψης, διάβασε καλύτερα γιατί η Apple απορρίπτει μια εφαρμογή.
Τι λέει η guideline 1.2;
Η 1.2, «User-Generated Content», βρίσκεται στην ενότητα 1, «Safety», των App Review Guidelines. Αφορά εφαρμογές με περιεχόμενο χρηστών ή υπηρεσία κοινωνικής δικτύωσης. Για να αποφευχθούν οι καταχρήσεις, αυτές οι εφαρμογές «must include» τέσσερις προστασίες:
- «A method for filtering objectionable material from being posted to the app»: ένα φίλτρο που μπλοκάρει το προσβλητικό περιεχόμενο πριν δημοσιευτεί.
- «A mechanism to report offensive content and timely responses to concerns»: έναν τρόπο να αναφέρεις ένα περιεχόμενο, και γρήγορη απόκριση στις αναφορές.
- «The ability to block abusive users from the service»: τη δυνατότητα να μπλοκάρεις έναν καταχρηστικό χρήστη.
- «Published contact information so users can easily reach you»: δημοσιευμένα στοιχεία επικοινωνίας, εύκολα να τα βρει κανείς.
Η τρέχουσα έκδοση του κειμένου, που ενημερώθηκε στις 8 Ιουνίου 2026, πάει πιο μακριά. Υπενθυμίζει ότι είναι δική σου ευθύνη να αφαιρείς το περιεχόμενο που παραβιάζει τον κανόνα, τους όρους χρήσης σου ή τους κανόνες της κοινότητάς σου. Αν η Apple βρει τέτοιο περιεχόμενο, σου ζητάει να το αφαιρέσεις και να δώσεις σχέδιο βελτίωσης, και μπορεί να αποσύρει την εφαρμογή στο μεταξύ.
Το κείμενο απαριθμεί επίσης τις εφαρμογές που δεν έχουν θέση στο App Store: αυτές που χρησιμεύουν κυρίως για πορνογραφία, για τυχαίο ή ανώνυμο chat τύπου Chatroulette, για βαθμολόγηση της εμφάνισης πραγματικών ανθρώπων, για απειλές ή παρενόχληση. Για αυτές τις χρήσεις, οι τέσσερις προστασίες δεν αρκούν. Η 1.2.1 προσθέτει κανόνες για εφαρμογές δημιουργών, κυρίως έλεγχο ηλικίας για περιεχόμενο που ξεπερνά την ηλικιακή κατάταξη της εφαρμογής.
Σε αφορά η εφαρμογή σου;
Το ερωτηματολόγιο ηλικιακής κατάταξης του App Store Connect δίνει έναν καλό ορισμό. Μιλάει για περιεχόμενο που δημιουργούν οι χρήστες όταν περιεχόμενο που δημιούργησαν χρήστες διαδίδεται ευρέως μέσα στην εφαρμογή: βίντεο, φωτογραφίες, κείμενα ή ήχος. Τα μηνύματα μεταξύ χρηστών τα αντιμετωπίζει ξεχωριστά.
| Τι βλέπουν οι άλλοι | Σε αφορά; |
|---|---|
| Μηνύματα μεταξύ μελών | Ναι |
| Δημόσιες φωτογραφίες ή κριτικές | Ναι |
| Ψευδώνυμο σε κατάταξη | Ναι, κατά τη γνώμη μου |
| Ιδιωτικές σημειώσεις | Όχι |
| Περιεχόμενο που γράφεις εσύ | Όχι |
Η Apple δεν αναφέρει τα ψευδώνυμα. Εγώ όμως τα αντιμετωπίζω ως περιεχόμενο χρηστών: οποιοσδήποτε μπορεί να διαλέξει ένα υβριστικό, και το βλέπουν άλλοι παίκτες. Αυτή την επιλογή έκανα για τις κατατάξεις του TradaZen.
Οι 5 μηχανισμοί που πρέπει να γράψεις, με Expo και Supabase
Το μήνυμα απόρριψης 1.2, όπως το δημοσίευσε ένας developer στα forums της Apple στα τέλη του 2025, απαριθμεί τα μέτρα που περιμένει η Apple. Ξεκινάει με «Require that users agree to terms (EULA)» και τελειώνει με μια απαίτηση χρόνου: να ενεργείς στις αναφορές «within 24 hours», αφαιρώντας το περιεχόμενο και αποκλείοντας τον δημιουργό του.
| Μηχανισμός | Πού τον υλοποιείς |
|---|---|
| Αποδεκτοί όροι | Οθόνη και προφίλ |
| Φίλτρο | Server, πριν την εμφάνιση |
| Αναφορά | Κουμπί και πίνακας |
| Μπλοκάρισμα | Πίνακας και κανόνας πρόσβασης |
| Δημοσιευμένη επικοινωνία | Εφαρμογή και σελίδα App Store |
Τα παραδείγματα SQL παρακάτω πρέπει να τα προσαρμόσεις στο schema σου. Βασίζονται στους κανόνες πρόσβασης ανά γραμμή του Supabase, που ισχύουν ακόμα κι αν κάποιος παρακάμψει την εφαρμογή σου.
1. Αποδεκτοί όροι χρήσης, με μηδενική ανοχή στις καταχρήσεις
Οι όροι χρήσης σου πρέπει να λένε ξεκάθαρα ότι δεν γίνεται ανεκτό ούτε προσβλητικό περιεχόμενο ούτε καταχρηστικοί χρήστες. Παράδειγμα όρου, να τον ελέγξει κάποιος ειδικός, δεν είναι νομική συμβουλή: «Δεν γίνεται ανεκτό κανένα προσβλητικό, μισαλλόδοξο, σεξουαλικό ή παρενοχλητικό περιεχόμενο. Ένα περιεχόμενο που αναφέρεται μπορεί να αφαιρεθεί και ο δημιουργός του να αποκλειστεί, χωρίς προειδοποίηση.»
Μια παθητική φράση κάτω από ένα κουμπί εγγραφής δεν αποδεικνύει τη συναίνεση: ζήτα μια ρητή κίνηση. Μια οθόνη με σύνδεσμο προς τους όρους και κουμπί «Αποδέχομαι», πριν την πρώτη δημοσίευση. Αποθήκευσε την ημερομηνία και την έκδοση που έγινε αποδεκτή στο προφίλ, και μετά απαγόρευσε τη δημοσίευση όσο λείπουν:
create policy "publier après les CGU" on public.posts
for insert to authenticated
with check (
auth.uid() = author_id
and exists (
select 1 from public.profiles p
where p.id = auth.uid() and p.cgu_acceptees_le is not null
)
);
2. Ένα φίλτρο πριν οι άλλοι δουν το περιεχόμενο
Το φίλτρο ζει στον server, γιατί ο κώδικας της εφαρμογής μπορεί να παρακαμφθεί. Ένα αντίγραφο μέσα στην εφαρμογή χρησιμεύει μόνο για να ειδοποιεί αμέσως τον χρήστη.
Στο TradaZen, μια συνάρτηση στη βάση ελέγχει κάθε ψευδώνυμο, και η εφαρμογή εφαρμόζει την ίδια λίστα για να ειδοποιεί τον παίκτη. Κρατάω τις δύο ίδιες. Στον server, ένα προσβλητικό ψευδώνυμο δεν απορρίπτεται στην εγγραφή: αντικαθίσταται από ένα ουδέτερο ψευδώνυμο στην εμφάνιση, έτσι δεν μπλοκάρεις κάποιον λόγω ψευδώς θετικού.
Τα ψευδώς θετικά έρχονται γρήγορα. Στο TradaZen, μια πρώτη έκδοση του φίλτρου λογόκρινε ονόματα όπως Dominique, Monique ή Véronique, γιατί περιέχουν κομμάτι μιας χυδαίας λέξης. Η διόρθωση: αναζήτηση ολόκληρων λέξεων, όχι κομματιών λέξεων. Και επειδή η εφαρμογή πωλείται στα ιαπωνικά και στα κινέζικα, το φίλτρο καλύπτει και αυτές τις γλώσσες.
3. Αναφορά, που διεκπεραιώνεται μέσα σε 24 ώρες
Κάθε δημοσιευμένο περιεχόμενο έχει κουμπί «Αναφορά». Στο TradaZen, ένα ψευδώνυμο που αναφέρεται στην κατάταξη της λίγκας εμφανίζεται αμέσως με ουδέτερη ετικέτα στο κινητό του ατόμου που το ανέφερε. Η αναφορά στέλνεται μετά στον server, και ξαναστέλνεται αργότερα αν το κινητό είναι εκτός σύνδεσης.
Στη βάση, ένας πίνακας αναφορών, μία μόνο ανά άτομο και ανά περιεχόμενο:
create table public.reports (
id uuid primary key default gen_random_uuid(),
reporter_id uuid not null references auth.users (id) on delete cascade,
target_id uuid not null,
reason text,
created_at timestamptz not null default now(),
unique (reporter_id, target_id)
);
alter table public.reports enable row level security;
create policy "mes signalements" on public.reports
for insert to authenticated
with check (auth.uid() = reporter_id);
Στο TradaZen, ένα ψευδώνυμο που αναφέρεται από πολλούς παίκτες αντικαθίσταται από ουδέτερο ψευδώνυμο, και οι αναφορές δεν εμφανίζονται ποτέ στο άτομο που αναφέρθηκε. Μια γενική προφύλαξη: το αναγνωριστικό που χρησιμοποιείται στην αναφορά δεν πρέπει να μπορεί να το αλλάξει ο δημιουργός του περιεχομένου, αλλιώς μπορεί να γλιτώσει την απόκρυψη.
Η αυτόματη απόκρυψη δεν αντικαθιστά τη δική σου απόφαση. Για να προλαβαίνεις τις 24 ώρες, φρόντισε να ειδοποιείσαι σε κάθε αναφορά: ένα database webhook του Supabase μπορεί να καλέσει μια συνάρτηση στον server που σου στέλνει μήνυμα. Το κλειδί που επιτρέπει την αφαίρεση περιεχομένου μένει στον server, όπως εξηγώ στο μυστικό API key σε εφαρμογή Expo.
4. Μπλοκάρισμα που λειτουργεί αμέσως
Ένας πίνακας μπλοκαρισμάτων, και μετά ένας κανόνας πρόσβασης που αφαιρεί το περιεχόμενο των μπλοκαρισμένων από το feed αυτού που μπλοκάρει:
create policy "sans les bloqués" on public.posts
for select to authenticated
using (
not exists (
select 1 from public.blocks b
where b.blocker_id = auth.uid() and b.blocked_id = posts.author_id
)
);
Στο TradaZen, προσθέτεις φίλο με έναν κωδικό, και μπορείς να τον αφαιρέσεις και να τον μπλοκάρεις. Ένας μπλοκαρισμένος φίλος εξαφανίζεται από τη λίστα, ακόμα κι αν ξαναστείλει αίτημα.
5. Δημοσιευμένα στοιχεία επικοινωνίας, εύκολα να τα βρεις
Βάλε μια διεύθυνση επικοινωνίας στις ρυθμίσεις της εφαρμογής, και ένα support URL που όντως λειτουργεί στο App Store Connect. Στο TradaZen, η διεύθυνση υποστήριξης υπάρχει στην πολιτική απορρήτου και στους όρους χρήσης. Το περιεχόμενο που πρέπει να έχουν αυτές οι σελίδες είναι στο πολιτική απορρήτου εφαρμογής.
Τελευταίο σημείο: αποφάσισε τι γίνεται το περιεχόμενο κάποιου που διαγράφει τον λογαριασμό του. Το on delete cascade παραπάνω διαγράφει τις αναφορές του μαζί με τον λογαριασμό. Η πλήρης συνταγή είναι στο διαγραφή λογαριασμού στο iOS.
Τι γράφει το TradaZen στην πολιτική του
Αυτοί οι μηχανισμοί περιγράφονται δημόσια στην πολιτική απορρήτου του TradaZen, που συμπληρώθηκε τον Σεπτέμβριο του 2026 με την έλευση των λιγκών και των φίλων: «Τα ψευδώνυμα περνούν από αυτόματο φίλτρο· μπορείς να αναφέρεις ένα ακατάλληλο ψευδώνυμο στην κατάταξη, και να αφαιρέσεις και να μπλοκάρεις έναν φίλο.» Η ίδια πολιτική διευκρινίζει ότι το e-mail και το ημερολόγιο δεν εμφανίζονται ποτέ στους άλλους παίκτες. Το πλαίσιο της εφαρμογής είναι στη μελέτη περίπτωσης TradaZen.
Τι να απαντήσεις στην Apple μετά από απόρριψη 1.2
Πες στον reviewer πού θα βρει κάθε μηχανισμό, στην απάντησή σου και στις σημειώσεις για το review. Αυτές οι λειτουργίες ζουν μέσα στην εφαρμογή: ο reviewer δοκιμάζει τον κώδικα που περιέχει το build, οπότε προγραμμάτισε νέο build. Η διαδικασία για να απαντήσεις στο App Review είναι η ίδια με τους άλλους κανόνες. Ορίστε ένα πρότυπο στα αγγλικά, να το προσαρμόσεις, κρατώντας μόνο ό,τι ισχύει στην εφαρμογή σου:
Hello,
Thank you for your review. Build X includes the precautions
listed in Guideline 1.2:
- Terms: users accept our terms, with zero tolerance for
objectionable content and abusive users, before posting.
- Filter: posts and usernames are checked on our server
before other users can see them.
- Report: tap "..." on any post, then "Report".
- Block: tap "..." on any post, then "Block user". Their
content disappears immediately.
- Reports notify us instantly; we act on them within 24 hours.
- Contact: Settings > Contact us, and our support URL.
Best regards,
Αν κάποιος μηχανισμός λείπει από το build, μια απάντηση δεν θα αρκέσει. Όπως και με τη guideline 2.1, η Apple κρίνει το build που έχει στα χέρια της.
Η check-list 1.2 πριν την υποβολή
- Έχεις καταγράψει ό,τι δημοσιεύει ένας χρήστης και βλέπουν οι άλλοι, μαζί με τα ψευδώνυμα.
- Οι όροι χρήσης σου απαγορεύουν το προσβλητικό περιεχόμενο και τις καταχρήσεις, και η εφαρμογή ζητάει ρητό «Αποδέχομαι».
- Το φίλτρο τρέχει στον server, ψάχνει ολόκληρες λέξεις και καλύπτει τις γλώσσες της σελίδας σου.
- Κάθε περιεχόμενο έχει κουμπί «Αναφορά», και κάθε αναφορά σε ειδοποιεί αμέσως.
- Ξέρεις να αφαιρείς ένα περιεχόμενο και να αποκλείεις τον δημιουργό του σε λιγότερο από 24 ώρες.
- Το μπλοκάρισμα ενός χρήστη αφαιρεί αμέσως το περιεχόμενό του.
- Μια διεύθυνση επικοινωνίας φαίνεται μέσα στην εφαρμογή, και το support URL λειτουργεί.
- Το ερωτηματολόγιο ηλικιακής κατάταξης δηλώνει το περιεχόμενο χρηστών, και τα μηνύματα αν η εφαρμογή σου έχει.
- Οι σημειώσεις για το review λένε πού θα βρεθεί κάθε μηχανισμός, με demo λογαριασμό.
Διόρθωσε την απόρριψη πριν ξαναστείλεις την εφαρμογή
Αν η εφαρμογή σου μόλις απορρίφθηκε για την 1.2, το Review Kit συγκεντρώνει ό,τι ελέγχω πριν από κάθε υποβολή, με δύο skills που ελέγχουν το project σου στο Claude Code και ετοιμάζουν την απάντησή σου αν η Apple απορρίψει. Για ανθρώπινη ματιά, κλείσε μια ώρα μαζί μου: διαβάζουμε μαζί το μήνυμα και κοιτάμε τη ροή moderation σου. Η πλήρης διαδικασία μετά από απόρριψη είναι στη σελίδα εφαρμογή που απορρίφθηκε από την Apple.
Αν ετοιμάζεις την πρώτη σου κυκλοφορία, κάνε τη δωρεάν διάγνωση: σου λέει ποιο βήμα να πιάσεις πρώτα και σου στέλνει τη checklist μου κατά των απορρίψεων της Apple.
Κανείς δεν μπορεί να εγγυηθεί ότι η Apple θα δεχτεί την εφαρμογή σου. Αυτοί οι πέντε μηχανισμοί, καλά ορατοί, βγάζουν τουλάχιστον αυτόν τον λόγο από τη λίστα.
Συχνές ερωτήσεις
Τι σημαίνει «Guideline 1.2 - Safety - User-Generated Content»;
Είναι ο τίτλος της απόρριψης στο μήνυμα της Apple. Σημαίνει ότι η εφαρμογή σου εμφανίζει περιεχόμενο που δημιούργησαν χρήστες χωρίς όλες τις προστασίες που ζητούνται: φίλτρο, αναφορά που διεκπεραιώνεται γρήγορα, μπλοκάρισμα, δημοσιευμένα στοιχεία επικοινωνίας και αποδεκτούς όρους χρήσης.
Ένα ψευδώνυμο σε κατάταξη μετράει ως περιεχόμενο χρήστη;
Το κείμενο της Apple δεν το λέει. Εγώ το αντιμετωπίζω έτσι, γιατί ένα ψευδώνυμο επιλέγεται ελεύθερα και το βλέπουν άλλοι παίκτες. Στο TradaZen, τα ψευδώνυμα των κατατάξεων περνούν από φίλτρο, μπορούν να αναφερθούν και αντικαθίστανται από ουδέτερο ψευδώνυμο αν δημιουργούν πρόβλημα.
Πρέπει πραγματικά να διεκπεραιώνεις τις αναφορές μέσα σε 24 ώρες;
Αυτό ζητάει το μήνυμα απόρριψης της Apple. Το κείμενο του κανόνα μιλάει για γρήγορες αποκρίσεις. Άρα ένα αυτόματο φίλτρο δεν αρκεί: χρειάζεται κάποιος που αφαιρεί το περιεχόμενο και αποκλείει τον δημιουργό του. Η αυτόματη απόκρυψη μετά από πολλές αναφορές σε βοηθάει να αντέξεις στο μεταξύ.
Πρέπει οι όροι χρήσης να γίνονται αποδεκτοί μέσα στην εφαρμογή;
Είναι ο πιο σίγουρος τρόπος. Το μήνυμα απόρριψης ζητάει οι χρήστες να αποδέχονται όρους που δεν ανέχονται ούτε προσβλητικό περιεχόμενο ούτε καταχρηστικούς χρήστες. Ένας σύνδεσμος στο κάτω μέρος μιας σελίδας δεν αποδεικνύει τη συναίνεση. Μια οθόνη με κουμπί «Αποδέχομαι», πριν την πρώτη δημοσίευση, δεν αφήνει αμφιβολία.
Μπορεί μια εφαρμογή ανώνυμου chat να περάσει τη guideline 1.2;
Το τρέχον κείμενο αναφέρει το τυχαίο ή ανώνυμο chat ανάμεσα στις χρήσεις που δεν έχουν θέση στο App Store. Μια εφαρμογή που χρησιμεύει κυρίως σε αυτό μπορεί να αποσυρθεί χωρίς προειδοποίηση, ακόμα και με φίλτρο, αναφορά και μπλοκάρισμα.

