iOS Шаблон

Шаблон бэкенда CRM приложения
iOS — Схема, API и AI руководство

Готовая к производству iOS CRM схема бэкенда и Стартовый комплект на Back4app: Контакт, Компания, Сделка, Активность, этапы воронки, ER-диаграмма, словарь данных, JSON-схема, API-площадка и однонажатийный AI агент для развертывания за минуты.

Ключевые выводы

На этой странице вы получите готовую к производству схему CRM, однонажатийный AI-подсказку и пошаговый код iOS — так вы сможете выпустить приложение CRM без создания бэкенда.

  1. Разверните за считанные минутыВставьте подсказку AI Agent и получите работающее приложение с контактами, компаниями, сделками и конвейером.
  2. Безопасно по умолчаниюACL и доступ на основе ролей, чтобы пользователи видели только свои назначенные сделки и данные.
  3. iOS-родной SDKТипизированные объекты, async/await, оффлайн-фиксация и Live Queries для обновлений конвейера.
  4. REST + GraphQLОбе API сгенерированы автоматически; фильтруйте сделки по этапу, перечисляйте активности по relatedTo.
  5. Пять классов_User (встроенный), Компания, Контакт, Сделка (конвейер), Активность (задачи/события).

Что такое шаблон бэкенда CRM приложения iOS?

Шаблон CRM Back4app предоставляет удобный для Swift бэкенд с моделями в стиле Codable для Контакта, Компании, Сделки и Активности. Используйте SDK Parse iOS с async/await, закрепляйте объекты для оффлайн-доступа и подписывайтесь на Live Queries для обновлений по воронке. Создайте нативное CRM приложение без необходимости запускать или поддерживать свой собственный бэкенд.

Лучше всего для:

Команды продажСоздатели CRMБыстрое прототипированиеПолевые представителиЗапуски MVPКоманды выбирают BaaS для CRM

Обзор

iOS CRM приложения выигрывают от типов Swift, async/await и дизайна с приоритетом оффлайн. SDK Parse iOS Back4app предлагает доступ, совместимый с Codable, к Контакту, Сделке и Активности, локальной фиксации хранилища данных и Live Queries для обновлений в реальном времени конвейера и активности.

Пять классов — _User, Company, Contact, Deal, Activity — доступны через PFQuery и PFObject. Используйте PFQuery(className: "Deal").whereKey("stage", equalTo: "qualified") и фиксируйте результаты для оффлайн; SDK обрабатывает синхронизацию, когда приложение повторно подключается.

Основные функции CRM

Swift 3 CRM бэкенд с Codable и SDK Parse: управление контактами и компаниями, воронка сделок и отслеживание активности с iOSive состоянием и __BRAND4__.

Управление контактами

Храните и управляйте контактами с именем, электронной почтой, телефоном, компанией и заметками. Идеально подходит для приложений iOS.

Управление компаниями

Отслеживайте компании по имени, веб-сайту, отрасли и адресу. Связано с контактами и сделками.

Конвейер сделок

Конвейер продаж с этапами, суммой, ожидаемой датой закрытия и назначением. Создан для бэкендов iOS.

Отслеживание активности

Записывайте звонки, электронные письма, встречи и заметки, связанные с контактами и сделками. Работает с SDK iOS.

Пользователь и разрешения

Встроенная модель пользователя и указатели для владения и назначения. ACL из коробки для iOS.

Почему стоит создать ваш бэкенд CRM iOS с Back4app?

Back4app предоставляет приложениям iOS дружелюбный к Swift SDK и поддержку оффлайн, чтобы вы могли быстро выпустить отшлифованное приложение CRM.

  • Swift и Codable: Используйте SDK Parse iOS с async/await и Codable; типобезопасные модели для Контакт, Компания, Сделка, Активность.
  • Офлайн и синхронизация: Закрепите объекты локально; запрашивайте из локального хранилища данных при отсутствии подключения и синхронизируйтесь при подключении.
  • Live Queries: Подписывайтесь на изменения Сделок и Активностей для обновлений в реальном времени в SwiftUI или UIKit.

Идеально для разработчиков iOS, создающих CRM или торговые приложения с Swift и типами значений.

Основные преимущества

Готовый к производству CRM-бэкенд, чтобы вы могли быстрее разрабатывать и сосредоточиться на своем приложении.

Разрабатывайте быстрее, без кода бэкенда

REST и API GraphQL и готовая схема — подключите свое приложение и вперед.

Безопасно по умолчанию

ACL и разрешения на уровне класса; ограничить по assignedTo и createdBy.

Поток в реальном времени

Live Queries через WebSockets для мгновенных обновлений сделок и активности.

Встроенная аутентификация

Регистрация пользователей, вход в систему и управление сессиями из коробки.

Работает в оффлайне

Локальная привязка сохраняет контакты и сделки доступными в оффлайне и синхронизирует их при повторном подключении.

Развертывание за минуты

Используйте AI Agent для создания и развертывания вашего CRM-приложения из этого шаблона.

Готовы попробовать?

Позвольте AI Agent от Back4app создать бэкенд вашего CRM-приложения, подключить фронтенд iOS и развернуть — все из одного запроса.

Бесплатно для начала — 50 запросов AI Agent в месяц, без необходимости в кредитной карте

Технический стек

Все, что поддерживает этот шаблон CRM-приложения, на одном взгляде.

Фронтенд
iOS
Бэкенд
Back4app
База данных
MongoDB
Аутентификация
Аутентификация и контроль доступа
API
REST и GraphQL
Развертывание
AI-агент / Панель управления

ER диаграмма

Диаграмма «Сущность-связь» для модели данных CRM приложения iOS.

Просмотреть источник диаграммы
Mermaid
erDiagram
    _User {
        String objectId PK
        String username
        String email
        String password
        Date createdAt
        Date updatedAt
    }

    Company {
        String objectId PK
        String name
        String website
        String industry
        String address
        String notes
        Pointer createdBy FK
        Date createdAt
        Date updatedAt
    }

    Contact {
        String objectId PK
        String name
        String email
        String phone
        Pointer company FK
        String notes
        Pointer createdBy FK
        Date createdAt
        Date updatedAt
    }

    Deal {
        String objectId PK
        String title
        Number amount
        String stage
        Pointer contact FK
        Pointer company FK
        Date expectedCloseDate
        String notes
        Pointer assignedTo FK
        Date createdAt
        Date updatedAt
    }

    Activity {
        String objectId PK
        String type
        String subject
        String description
        Date dueDate
        Date completedAt
        Pointer relatedTo FK
        Pointer createdBy FK
        Date createdAt
        Date updatedAt
    }

    Company ||--o{ Contact : "has"
    Company ||--o{ Deal : "has"
    Contact ||--o{ Deal : "has"
    _User ||--o{ Deal : "assignedTo"
    _User ||--o{ Activity : "createdBy"
    Contact ||--o{ Activity : "relatedTo"
    Deal ||--o{ Activity : "relatedTo"
    _User ||--o{ Company : "createdBy"
    _User ||--o{ Contact : "createdBy"

Поток интеграции

Последовательность Auth-to-CRUD: как ваше iOS приложение взаимодействует с Back4app — вход в систему, затем запрос контактов и сделок, обновление воронки.

Просмотреть источник диаграммы
Mermaid
sequenceDiagram
  participant User
  participant App as iOS App
  participant Back4app as Back4app Cloud

  User->>App: Login
  App->>Back4app: ParseUser.logIn(username:password:)
  Back4app-->>App: Session token
  App-->>User: Logged in

  User->>App: Load contacts and deals
  App->>Back4app: ParseQuery.find()
  Back4app-->>App: [PFObject]
  App-->>User: Show list

  User->>App: Create deal or contact
  App->>Back4app: deal.save() or contact.save()
  Back4app-->>App: Deal (objectId)
  App-->>User: Updated list

Словарь данных

Полная справка по полям для каждого класса в схеме.

ПолеТипОписаниеОбязательно
objectIdStringAuto-generated unique identifierавто
nameStringFull name of the contact
emailStringEmail address
phoneStringPhone number
companyPointer<Company>Company this contact belongs to
notesStringFree-form notes
createdByPointer<_User>User who created this contact
createdAtDateAuto-generated creation timestampавто
updatedAtDateAuto-generated last-update timestampавто

9 поля в Contact

Безопасность и разрешения

Как владение, ACL и разрешения на уровне классов защищают данные в этой схеме CRM.

ACL на уровне строк

Используйте ACL и указатели (assignedTo, createdBy), чтобы пользователи видели и редактировали только свои назначенные сделки и связанные данные.

Разрешения на уровне классов

CLP ограничивают, какие роли или пользователи могут создавать, читать, обновлять или удалять объекты на уровне класса.

Владение на основе указателей

Deal.assignedTo и Activity.createdBy ссылаются на _User; Cloud Code может обеспечивать видимость и редактирование по ролям.

Схема (JSON)

Сырая определение схемы JSON — скопируйте и используйте в вашем Back4app приложении или импортируйте через API.

JSON
{
  "classes": [
    {
      "className": "Contact",
      "fields": {
        "objectId": {
          "type": "String",
          "required": false
        },
        "name": {
          "type": "String",
          "required": true
        },
        "email": {
          "type": "String",
          "required": false
        },
        "phone": {
          "type": "String",
          "required": false
        },
        "company": {
          "type": "Pointer",
          "targetClass": "Company",
          "required": false
        },
        "notes": {
          "type": "String",
          "required": false
        },
        "createdBy": {
          "type": "Pointer",
          "targetClass": "_User",
          "required": false
        },
        "createdAt": {
          "type": "Date",
          "required": false
        },
        "updatedAt": {
          "type": "Date",
          "required": false
        }
      }
    },
    {
      "className": "Company",
      "fields": {
        "objectId": {
          "type": "String",
          "required": false
        },
        "name": {
          "type": "String",
          "required": true
        },
        "website": {
          "type": "String",
          "required": false
        },
        "industry": {
          "type": "String",
          "required": false
        },
        "address": {
          "type": "String",
          "required": false
        },
        "notes": {
          "type": "String",
          "required": false
        },
        "createdBy": {
          "type": "Pointer",
          "targetClass": "_User",
          "required": false
        },
        "createdAt": {
          "type": "Date",
          "required": false
        },
        "updatedAt": {
          "type": "Date",
          "required": false
        }
      }
    },
    {
      "className": "Deal",
      "fields": {
        "objectId": {
          "type": "String",
          "required": false
        },
        "title": {
          "type": "String",
          "required": true
        },
        "amount": {
          "type": "Number",
          "required": false
        },
        "stage": {
          "type": "String",
          "required": false
        },
        "contact": {
          "type": "Pointer",
          "targetClass": "Contact",
          "required": false
        },
        "company": {
          "type": "Pointer",
          "targetClass": "Company",
          "required": false
        },
        "expectedCloseDate": {
          "type": "Date",
          "required": false
        },
        "notes": {
          "type": "String",
          "required": false
        },
        "assignedTo": {
          "type": "Pointer",
          "targetClass": "_User",
          "required": false
        },
        "createdAt": {
          "type": "Date",
          "required": false
        },
        "updatedAt": {
          "type": "Date",
          "required": false
        }
      }
    },
    {
      "className": "Activity",
      "fields": {
        "objectId": {
          "type": "String",
          "required": false
        },
        "type": {
          "type": "String",
          "required": false
        },
        "subject": {
          "type": "String",
          "required": false
        },
        "description": {
          "type": "String",
          "required": false
        },
        "dueDate": {
          "type": "Date",
          "required": false
        },
        "completedAt": {
          "type": "Date",
          "required": false
        },
        "relatedTo": {
          "type": "Pointer",
          "required": false
        },
        "createdBy": {
          "type": "Pointer",
          "targetClass": "_User",
          "required": false
        },
        "createdAt": {
          "type": "Date",
          "required": false
        },
        "updatedAt": {
          "type": "Date",
          "required": false
        }
      }
    },
    {
      "className": "_User",
      "fields": {
        "objectId": {
          "type": "String",
          "required": false
        },
        "username": {
          "type": "String",
          "required": true
        },
        "email": {
          "type": "String",
          "required": true
        },
        "password": {
          "type": "String",
          "required": true
        },
        "createdAt": {
          "type": "Date",
          "required": false
        },
        "updatedAt": {
          "type": "Date",
          "required": false
        }
      }
    }
  ]
}

Создайте с помощью AI Agent

Используйте Back4app AI Agent, чтобы создать реальное CRM приложение из этого шаблона: он создаст фронтенд, бэкенд (эту схему, аутентификацию и API) и развернет его — без ручной настройки. Подсказка ниже описывает этот стек CRM, чтобы Агент мог сгенерировать готовое к производству приложение за один раз.

Back4app AI Agent
Готовы к созданию
Создайте приложение CRM на Back4app с этой точной схемой и поведением.

Схема:
1. _Пользователь (используйте встроенный Back4app): имя пользователя (Строка, обязательно), электронная почта (Строка, обязательно), пароль (Строка, обязательно); objectId, createdAt, updatedAt (система).
2. Компания: название (Строка, обязательно), веб-сайт (Строка), отрасль (Строка), адрес (Строка), заметки (Строка), создано (Указатель на _Пользователь); objectId, createdAt, updatedAt (система).
3. Контакт: имя (Строка, обязательно), электронная почта (Строка), телефон (Строка), компания (Указатель на Компанию), заметки (Строка), создано (Указатель на _Пользователь); objectId, createdAt, updatedAt (система).
4. Сделка: название (Строка, обязательно), сумма (Число), стадия (Строка; например, лид, квалифицированный, предложение, переговоры, выиграно, проиграно), контакт (Указатель на Контакт), компания (Указатель на Компанию), ожидаемая дата закрытия (Дата), заметки (Строка), назначено (Указатель на _Пользователь); objectId, createdAt, updatedAt (система).
5. Активность: тип (Строка; например, звонок, электронная почта, встреча, заметка), тема (Строка), описание (Строка), срок (Дата), завершено (Дата), связано с (Указатель на Контакт или Сделку), создано (Указатель на _Пользователь); objectId, createdAt, updatedAt (система).

Безопасность:
- Установите ACL, чтобы только аутентифицированные пользователи могли получать доступ к данным; используйте правила на основе ролей или владельца, где это уместно (например, назначено, создано).
- Используйте разрешения на уровне класса, чтобы только аутентифицированные пользователи могли создавать/читать/обновлять/удалять эти классы.

Аутентификация:
- Регистрация (имя пользователя, электронная почта, пароль) и вход; поддержка выхода/сессии.

Поведение:
- Полный CRUD для Компании, Контакта, Сделки и Активности.
- Список сделок с фильтром по стадии и сортировкой по ожидаемой дате закрытия или updatedAt (вид воронки).
- Список активностей по связанным с (Контакт или Сделка).
- Опционально: обновления в реальном времени Live Queries для Сделки и Активности для обновлений панели управления/воронки.
- Опционально: оффлайн-фиксация для мобильных устройств (Контакты, Сделки, Активности).

Доставка:
- Создайте приложение Back4app с вышеуказанной схемой, ACL и любым необходимым облачным кодом.
- Сгенерируйте фронтенд и подключите его к этому бэкенду; разверните, чтобы приложение работало от начала до конца.

Нажмите кнопку ниже, чтобы открыть Агента с предзаполненной подсказкой этого шаблона.

Развернуть за минуты50 бесплатных запросов / месяцКредитная карта не требуется

API Playground

Попробуйте REST и GraphQL конечные точки для схемы CRM. Ответы из приведенных выше примерных данных — учетная запись Back4app не требуется.

Загрузка песочницы…

Использует ту же схему CRM (Контакт, Компания, Сделка, Активность), что и этот шаблон.

Пошаговая интеграция iOS

Подключитесь к вашему Back4app бэкенду из приложения iOS с использованием SDK Back4app iOS.

  1. Шаг 1: Установите SDK Back4app iOS

    Добавьте SDK Back4app для вашего стека (например, npm, pubspec или менеджер пакетов).

    Swift
    // Package.swift or CocoaPods
    // SPM: .package(url: "https://github.com/parse-community/Parse-Swift", from: "4.0.0")
    // Podfile: pod 'Parse'
  2. Шаг 2: Инициализируйте Back4app в вашем приложении

    Инициализируйте SDK Back4app при запуске приложения с вашим идентификатором приложения и URL-адресом сервера.

    Swift
    Parse.initialize(
        configuration: ParseClientConfiguration {
            $0.applicationId = "YOUR_APP_ID"
            $0.clientKey = "YOUR_CLIENT_KEY"
            $0.server = "https://parseapi.back4app.com/"
        }
    )
  3. Шаг 3: Запросите контакты и сделки

    Используйте SDK для получения объектов Контакта и Сделки; фильтруйте сделки по этапу для воронки.

    Swift
    func getDeals(stage: String = "qualified") async throws -> [PFObject] {
        let query = PFQuery(className: "Deal")
        query.whereKey("stage", equalTo: stage)
        query.order(byAscending: "expectedCloseDate")
        return try await query.findObjects()
    }
    func getContacts() async throws -> [PFObject] {
        let query = PFQuery(className: "Contact")
        return try await query.findObjects()
    }
  4. Шаг 4: Создайте контакт или сделку

    Создайте новый Контакт или Сделку с обязательными полями и указателями (компания, контакт, назначено), затем сохраните.

    Swift
    func createDeal(title: String, stage: String = "lead", amount: Double? = nil) async throws {
        let deal = PFObject(className: "Deal")
        deal["title"] = title
        deal["stage"] = stage
        if let amount = amount { deal["amount"] = amount }
        try await deal.save()
    }
    func createContact(name: String, email: String? = nil, phone: String? = nil) async throws {
        let contact = PFObject(className: "Contact")
        contact["name"] = name
        if let email = email { contact["email"] = email }
        if let phone = phone { contact["phone"] = phone }
        try await contact.save()
    }
  5. Шаг 5: Обновите стадию сделки и действия

    Обновите Deal.stage при перемещении в воронке; создайте и перечислите Activity по relatedTo.

    Swift
    // Update deal stage (e.g. move in pipeline)
    func updateDealStage(objectId: String, stage: String) async throws {
        let query = PFQuery(className: "Deal")
        let deal = try await query.getObjectWithId(objectId)
        deal["stage"] = stage
        try await deal.save()
    }
    
    // Delete a deal
    func deleteDeal(objectId: String) async throws {
        let query = PFQuery(className: "Deal")
        let deal = try await query.getObjectWithId(objectId)
        try await deal.delete()
    }

Интеграция управления состоянием

Интегрируйте SDK Back4app с уровнем состояния вашего приложения (например, контекст, хранилище или сервисы) для состояния потока и контактов.

Полная модель данных

Скопируйте полную модель CRM для безопасной сериализации типов (например, класс, интерфейс или определение типа).

Swift
// Deal.swift — matches Back4app schema
struct Deal: Codable {
    var objectId: String?
    var title: String
    var amount: Double?
    var stage: String?
    var expectedCloseDate: Date?
    var contact: Pointer<ParseObject>?
    var company: Pointer<ParseObject>?
    var assignedTo: Pointer<_User>?
    var createdAt: Date?
    var updatedAt: Date?
}

func toDeal(_ obj: PFObject) -> Deal {
    Deal(
        objectId: obj.objectId,
        title: obj["title"] as? String ?? "",
        amount: obj["amount"] as? Double,
        stage: obj["stage"] as? String,
        expectedCloseDate: obj["expectedCloseDate"] as? Date,
        contact: obj["contact"] as? Pointer<ParseObject>,
        company: obj["company"] as? Pointer<ParseObject>,
        assignedTo: obj["assignedTo"] as? Pointer<_User>,
        createdAt: obj.createdAt,
        updatedAt: obj.updatedAt
    )
}

Оффлайн-ориентированный и локальный хранилище данных

Используйте pin() и unpin(), чтобы контакты и сделки были доступны в оффлайне и синхронизировались при возвращении в онлайн.

Поддерживаемые SDK включают локальное хранилище данных. Закрепите объекты Контакт, Сделка и Деятельность, чтобы сохранить их на устройстве; запрашивайте закрепленные данные в оффлайне. Когда приложение снова в сети, синхронизируйтесь с сервером.

Ниже: закрепите результаты после получения и снимите закрепление, когда больше не нужны локальные копии.

Swift
// After fetch, pin for offline
try? await PFObject.pinAll(deals)

// Query from local datastore
let query = PFQuery(className: "Deal").fromLocalDatastore()
query.whereKey("stage", equalTo: "qualified")
query.order(byAscending: "expectedCloseDate")
let localDeals = try? await query.findObjects()

// Unpin
try? await PFObject.unpinAllObjects(inBackground: "Deal")

Часто задаваемые вопросы

Распространенные вопросы о шаблоне бэкенда CRM приложения.

Что такое Back4app?
Почему использовать Back4app для приложения iOS CRM?
Как мне запросить сделки по этапу в Swift?
Поддерживает ли SDK iOS оффлайн данные CRM?

Доверяют разработчики по всему миру

Присоединяйтесь к сообществу, строящему будущее приложений

G2 Users Love Us Badge

Готовы создать свое CRM-приложение?

Начните свой проект iOS за считанные минуты. Кредитная карта не требуется.

Строить с ИИ-агентом