├── StipopDemo
├── fr.lproj
│ ├── LaunchScreen.strings
│ └── Main.strings
├── hi.lproj
│ ├── LaunchScreen.strings
│ └── Main.strings
├── ko.lproj
│ ├── LaunchScreen.strings
│ └── Main.strings
├── vi.lproj
│ ├── LaunchScreen.strings
│ └── Main.strings
├── zh-Hans.lproj
│ ├── LaunchScreen.strings
│ └── Main.strings
├── zh-Hant.lproj
│ ├── LaunchScreen.strings
│ └── Main.strings
├── Assets.xcassets
│ ├── Contents.json
│ ├── Colors
│ │ ├── Contents.json
│ │ ├── StipopMain.colorset
│ │ │ └── Contents.json
│ │ ├── StipopChatBackground.colorset
│ │ │ └── Contents.json
│ │ ├── Default.colorset
│ │ │ └── Contents.json
│ │ ├── DefaultReverse.colorset
│ │ │ └── Contents.json
│ │ ├── StipopTextFieldBackground.colorset
│ │ │ └── Contents.json
│ │ ├── StipopTextFieldBackgroundStroke.colorset
│ │ │ └── Contents.json
│ │ └── StipopTypingViewLayoutBackground.colorset
│ │ │ └── Contents.json
│ ├── bg.imageset
│ │ ├── bg.png
│ │ ├── bg@2x.png
│ │ ├── bg@3x.png
│ │ └── Contents.json
│ ├── icGo.imageset
│ │ ├── icGo.png
│ │ ├── icGo@2x.png
│ │ ├── icGo@3x.png
│ │ └── Contents.json
│ ├── logo.imageset
│ │ ├── logo.png
│ │ ├── logo@2x.png
│ │ ├── logo@3x.png
│ │ └── Contents.json
│ ├── AppIcon.appiconset
│ │ ├── 16.png
│ │ ├── 20.png
│ │ ├── 29.png
│ │ ├── 32.png
│ │ ├── 40.png
│ │ ├── 48.png
│ │ ├── 50.png
│ │ ├── 55.png
│ │ ├── 57.png
│ │ ├── 58.png
│ │ ├── 60.png
│ │ ├── 64.png
│ │ ├── 72.png
│ │ ├── 76.png
│ │ ├── 80.png
│ │ ├── 87.png
│ │ ├── 88.png
│ │ ├── 100.png
│ │ ├── 1024.png
│ │ ├── 114.png
│ │ ├── 120.png
│ │ ├── 128.png
│ │ ├── 144.png
│ │ ├── 152.png
│ │ ├── 167.png
│ │ ├── 172.png
│ │ ├── 180.png
│ │ ├── 196.png
│ │ ├── 216.png
│ │ ├── 256.png
│ │ ├── 512.png
│ │ └── Contents.json
│ ├── icMore.imageset
│ │ ├── icMore.png
│ │ ├── icMore@2x.png
│ │ ├── icMore@3x.png
│ │ └── Contents.json
│ ├── imgStipop.imageset
│ │ ├── imgStipop.png
│ │ ├── imgStipop@2x.png
│ │ ├── imgStipop@3x.png
│ │ └── Contents.json
│ ├── icSsvNormal.imageset
│ │ ├── icSsvNormal.png
│ │ ├── icSsvNormal@2x.png
│ │ ├── icSsvNormal@3x.png
│ │ └── Contents.json
│ ├── icSendActive.imageset
│ │ ├── icSendActive.png
│ │ ├── icSendActive@2x.png
│ │ ├── icSendActive@3x.png
│ │ └── Contents.json
│ ├── icSendNormal.imageset
│ │ ├── icSendNormal.png
│ │ ├── icSendNormal@2x.png
│ │ ├── icSendNormal@3x.png
│ │ └── Contents.json
│ ├── AccentColor.colorset
│ │ └── Contents.json
│ └── jay.imageset
│ │ ├── Contents.json
│ │ └── jay.svg
├── Enums
│ └── ColorEnum.swift
├── View
│ ├── SPDChatroomViewController
│ │ ├── Views
│ │ │ ├── SPDChatroomNavigationTitleView.swift
│ │ │ ├── SPDMyStickerChatCell.swift
│ │ │ ├── SPDCounterStickerChatCell.swift
│ │ │ ├── SPDChatroomHeaderCell.swift
│ │ │ ├── SPDCounterExecuteChatCell.swift
│ │ │ ├── SPDCounterTextChatCell.swift
│ │ │ └── SPDMyTextChatCell.swift
│ │ ├── SPDChatroomViewController.swift
│ │ └── SPDChatroomViewController.storyboard
│ └── SPDMainViewController
│ │ └── SPDMainViewController.swift
├── Model
│ └── SPChat.swift
├── StipopAuth
│ ├── DemoSAuthAPI_access_token.swift
│ ├── DemoSAuthManager.swift
│ └── DemoSAuthAPI.swift
├── Info.plist
├── Extensions
│ └── UIView+Extensions.swift
├── Base.lproj
│ ├── LaunchScreen.storyboard
│ └── Main.storyboard
├── SceneDelegate.swift
└── AppDelegate.swift
├── .swiftpm
└── xcode
│ └── package.xcworkspace
│ └── xcshareddata
│ └── IDEWorkspaceChecks.plist
├── Package.swift
├── README.kr.md
├── .gitignore
├── README.md
└── StipopDemo.xcodeproj
└── project.pbxproj
/StipopDemo/fr.lproj/LaunchScreen.strings:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/StipopDemo/hi.lproj/LaunchScreen.strings:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/StipopDemo/ko.lproj/LaunchScreen.strings:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/StipopDemo/vi.lproj/LaunchScreen.strings:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/StipopDemo/zh-Hans.lproj/LaunchScreen.strings:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/StipopDemo/zh-Hant.lproj/LaunchScreen.strings:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/Colors/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/bg.imageset/bg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stipop-development/stipop-ios-sdk/HEAD/StipopDemo/Assets.xcassets/bg.imageset/bg.png
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/bg.imageset/bg@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stipop-development/stipop-ios-sdk/HEAD/StipopDemo/Assets.xcassets/bg.imageset/bg@2x.png
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/bg.imageset/bg@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stipop-development/stipop-ios-sdk/HEAD/StipopDemo/Assets.xcassets/bg.imageset/bg@3x.png
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/icGo.imageset/icGo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stipop-development/stipop-ios-sdk/HEAD/StipopDemo/Assets.xcassets/icGo.imageset/icGo.png
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/logo.imageset/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stipop-development/stipop-ios-sdk/HEAD/StipopDemo/Assets.xcassets/logo.imageset/logo.png
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/AppIcon.appiconset/16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stipop-development/stipop-ios-sdk/HEAD/StipopDemo/Assets.xcassets/AppIcon.appiconset/16.png
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/AppIcon.appiconset/20.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stipop-development/stipop-ios-sdk/HEAD/StipopDemo/Assets.xcassets/AppIcon.appiconset/20.png
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/AppIcon.appiconset/29.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stipop-development/stipop-ios-sdk/HEAD/StipopDemo/Assets.xcassets/AppIcon.appiconset/29.png
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/AppIcon.appiconset/32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stipop-development/stipop-ios-sdk/HEAD/StipopDemo/Assets.xcassets/AppIcon.appiconset/32.png
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/AppIcon.appiconset/40.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stipop-development/stipop-ios-sdk/HEAD/StipopDemo/Assets.xcassets/AppIcon.appiconset/40.png
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/AppIcon.appiconset/48.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stipop-development/stipop-ios-sdk/HEAD/StipopDemo/Assets.xcassets/AppIcon.appiconset/48.png
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/AppIcon.appiconset/50.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stipop-development/stipop-ios-sdk/HEAD/StipopDemo/Assets.xcassets/AppIcon.appiconset/50.png
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/AppIcon.appiconset/55.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stipop-development/stipop-ios-sdk/HEAD/StipopDemo/Assets.xcassets/AppIcon.appiconset/55.png
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/AppIcon.appiconset/57.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stipop-development/stipop-ios-sdk/HEAD/StipopDemo/Assets.xcassets/AppIcon.appiconset/57.png
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/AppIcon.appiconset/58.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stipop-development/stipop-ios-sdk/HEAD/StipopDemo/Assets.xcassets/AppIcon.appiconset/58.png
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/AppIcon.appiconset/60.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stipop-development/stipop-ios-sdk/HEAD/StipopDemo/Assets.xcassets/AppIcon.appiconset/60.png
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/AppIcon.appiconset/64.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stipop-development/stipop-ios-sdk/HEAD/StipopDemo/Assets.xcassets/AppIcon.appiconset/64.png
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/AppIcon.appiconset/72.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stipop-development/stipop-ios-sdk/HEAD/StipopDemo/Assets.xcassets/AppIcon.appiconset/72.png
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/AppIcon.appiconset/76.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stipop-development/stipop-ios-sdk/HEAD/StipopDemo/Assets.xcassets/AppIcon.appiconset/76.png
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/AppIcon.appiconset/80.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stipop-development/stipop-ios-sdk/HEAD/StipopDemo/Assets.xcassets/AppIcon.appiconset/80.png
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/AppIcon.appiconset/87.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stipop-development/stipop-ios-sdk/HEAD/StipopDemo/Assets.xcassets/AppIcon.appiconset/87.png
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/AppIcon.appiconset/88.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stipop-development/stipop-ios-sdk/HEAD/StipopDemo/Assets.xcassets/AppIcon.appiconset/88.png
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/icGo.imageset/icGo@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stipop-development/stipop-ios-sdk/HEAD/StipopDemo/Assets.xcassets/icGo.imageset/icGo@2x.png
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/icGo.imageset/icGo@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stipop-development/stipop-ios-sdk/HEAD/StipopDemo/Assets.xcassets/icGo.imageset/icGo@3x.png
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/logo.imageset/logo@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stipop-development/stipop-ios-sdk/HEAD/StipopDemo/Assets.xcassets/logo.imageset/logo@2x.png
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/logo.imageset/logo@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stipop-development/stipop-ios-sdk/HEAD/StipopDemo/Assets.xcassets/logo.imageset/logo@3x.png
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/AppIcon.appiconset/100.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stipop-development/stipop-ios-sdk/HEAD/StipopDemo/Assets.xcassets/AppIcon.appiconset/100.png
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/AppIcon.appiconset/1024.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stipop-development/stipop-ios-sdk/HEAD/StipopDemo/Assets.xcassets/AppIcon.appiconset/1024.png
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/AppIcon.appiconset/114.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stipop-development/stipop-ios-sdk/HEAD/StipopDemo/Assets.xcassets/AppIcon.appiconset/114.png
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/AppIcon.appiconset/120.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stipop-development/stipop-ios-sdk/HEAD/StipopDemo/Assets.xcassets/AppIcon.appiconset/120.png
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/AppIcon.appiconset/128.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stipop-development/stipop-ios-sdk/HEAD/StipopDemo/Assets.xcassets/AppIcon.appiconset/128.png
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/AppIcon.appiconset/144.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stipop-development/stipop-ios-sdk/HEAD/StipopDemo/Assets.xcassets/AppIcon.appiconset/144.png
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/AppIcon.appiconset/152.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stipop-development/stipop-ios-sdk/HEAD/StipopDemo/Assets.xcassets/AppIcon.appiconset/152.png
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/AppIcon.appiconset/167.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stipop-development/stipop-ios-sdk/HEAD/StipopDemo/Assets.xcassets/AppIcon.appiconset/167.png
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/AppIcon.appiconset/172.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stipop-development/stipop-ios-sdk/HEAD/StipopDemo/Assets.xcassets/AppIcon.appiconset/172.png
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/AppIcon.appiconset/180.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stipop-development/stipop-ios-sdk/HEAD/StipopDemo/Assets.xcassets/AppIcon.appiconset/180.png
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/AppIcon.appiconset/196.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stipop-development/stipop-ios-sdk/HEAD/StipopDemo/Assets.xcassets/AppIcon.appiconset/196.png
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/AppIcon.appiconset/216.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stipop-development/stipop-ios-sdk/HEAD/StipopDemo/Assets.xcassets/AppIcon.appiconset/216.png
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/AppIcon.appiconset/256.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stipop-development/stipop-ios-sdk/HEAD/StipopDemo/Assets.xcassets/AppIcon.appiconset/256.png
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/AppIcon.appiconset/512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stipop-development/stipop-ios-sdk/HEAD/StipopDemo/Assets.xcassets/AppIcon.appiconset/512.png
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/icMore.imageset/icMore.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stipop-development/stipop-ios-sdk/HEAD/StipopDemo/Assets.xcassets/icMore.imageset/icMore.png
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/icMore.imageset/icMore@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stipop-development/stipop-ios-sdk/HEAD/StipopDemo/Assets.xcassets/icMore.imageset/icMore@2x.png
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/icMore.imageset/icMore@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stipop-development/stipop-ios-sdk/HEAD/StipopDemo/Assets.xcassets/icMore.imageset/icMore@3x.png
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/imgStipop.imageset/imgStipop.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stipop-development/stipop-ios-sdk/HEAD/StipopDemo/Assets.xcassets/imgStipop.imageset/imgStipop.png
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/imgStipop.imageset/imgStipop@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stipop-development/stipop-ios-sdk/HEAD/StipopDemo/Assets.xcassets/imgStipop.imageset/imgStipop@2x.png
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/imgStipop.imageset/imgStipop@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stipop-development/stipop-ios-sdk/HEAD/StipopDemo/Assets.xcassets/imgStipop.imageset/imgStipop@3x.png
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/icSsvNormal.imageset/icSsvNormal.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stipop-development/stipop-ios-sdk/HEAD/StipopDemo/Assets.xcassets/icSsvNormal.imageset/icSsvNormal.png
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/icSendActive.imageset/icSendActive.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stipop-development/stipop-ios-sdk/HEAD/StipopDemo/Assets.xcassets/icSendActive.imageset/icSendActive.png
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/icSendNormal.imageset/icSendNormal.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stipop-development/stipop-ios-sdk/HEAD/StipopDemo/Assets.xcassets/icSendNormal.imageset/icSendNormal.png
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/icSsvNormal.imageset/icSsvNormal@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stipop-development/stipop-ios-sdk/HEAD/StipopDemo/Assets.xcassets/icSsvNormal.imageset/icSsvNormal@2x.png
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/icSsvNormal.imageset/icSsvNormal@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stipop-development/stipop-ios-sdk/HEAD/StipopDemo/Assets.xcassets/icSsvNormal.imageset/icSsvNormal@3x.png
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/icSendActive.imageset/icSendActive@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stipop-development/stipop-ios-sdk/HEAD/StipopDemo/Assets.xcassets/icSendActive.imageset/icSendActive@2x.png
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/icSendActive.imageset/icSendActive@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stipop-development/stipop-ios-sdk/HEAD/StipopDemo/Assets.xcassets/icSendActive.imageset/icSendActive@3x.png
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/icSendNormal.imageset/icSendNormal@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stipop-development/stipop-ios-sdk/HEAD/StipopDemo/Assets.xcassets/icSendNormal.imageset/icSendNormal@2x.png
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/icSendNormal.imageset/icSendNormal@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stipop-development/stipop-ios-sdk/HEAD/StipopDemo/Assets.xcassets/icSendNormal.imageset/icSendNormal@3x.png
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/jay.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "jay.svg",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/StipopDemo/Enums/ColorEnum.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ColorEnum.swift
3 | // StipopDemo
4 | //
5 | // Created by kyum on 2022/06/23.
6 | //
7 |
8 | enum ColorEnum {
9 | static let StipopMain = "StipopMain"
10 | static let StipopTextFieldBackgroundStroke = "StipopTextFieldBackgroundStroke"
11 | }
12 |
--------------------------------------------------------------------------------
/.swiftpm/xcode/package.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/StipopDemo/View/SPDChatroomViewController/Views/SPDChatroomNavigationTitleView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SPDChatroomNavigationTitleView.swift
3 | // Stipop Demo
4 | //
5 | // Created by Jay Ahn on 2021/10/18.
6 | //
7 |
8 | import UIKit
9 |
10 | class SPDChatroomNavigationTitleView: UIView {
11 | override var intrinsicContentSize: CGSize {
12 | return UIView.layoutFittingExpandedSize
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/StipopDemo/Model/SPChat.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SPChat.swift
3 | // Stipop Demo
4 | //
5 | // Created by Jay Ahn on 2021/07/12.
6 | //
7 |
8 | import UIKit
9 | import Stipop
10 |
11 | enum SPDChatSender {
12 | case me
13 | case counter
14 | }
15 |
16 | enum SPDChatModel {
17 | case text(SPDChatSender, String)
18 | case sticker(SPDChatSender, String)
19 | case execution(SPDChatSender, String, (()->Void))
20 | }
21 |
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/Colors/StipopMain.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "srgb",
6 | "components" : {
7 | "alpha" : "1.000",
8 | "blue" : "0.106",
9 | "green" : "0.408",
10 | "red" : "1.000"
11 | }
12 | },
13 | "idiom" : "universal"
14 | }
15 | ],
16 | "info" : {
17 | "author" : "xcode",
18 | "version" : 1
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/Colors/StipopChatBackground.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "srgb",
6 | "components" : {
7 | "alpha" : "1.000",
8 | "blue" : "0.973",
9 | "green" : "0.973",
10 | "red" : "0.961"
11 | }
12 | },
13 | "idiom" : "universal"
14 | }
15 | ],
16 | "info" : {
17 | "author" : "xcode",
18 | "version" : 1
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/bg.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "bg.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "bg@2x.png",
10 | "idiom" : "universal",
11 | "scale" : "2x"
12 | },
13 | {
14 | "filename" : "bg@3x.png",
15 | "idiom" : "universal",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "author" : "xcode",
21 | "version" : 1
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/icGo.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "icGo.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "icGo@2x.png",
10 | "idiom" : "universal",
11 | "scale" : "2x"
12 | },
13 | {
14 | "filename" : "icGo@3x.png",
15 | "idiom" : "universal",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "author" : "xcode",
21 | "version" : 1
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/logo.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "logo.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "logo@2x.png",
10 | "idiom" : "universal",
11 | "scale" : "2x"
12 | },
13 | {
14 | "filename" : "logo@3x.png",
15 | "idiom" : "universal",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "author" : "xcode",
21 | "version" : 1
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/icMore.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "icMore.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "icMore@2x.png",
10 | "idiom" : "universal",
11 | "scale" : "2x"
12 | },
13 | {
14 | "filename" : "icMore@3x.png",
15 | "idiom" : "universal",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "author" : "xcode",
21 | "version" : 1
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/icSsvNormal.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "icSsvNormal.png",
5 | "scale" : "1x",
6 | "idiom" : "universal"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x",
11 | "filename" : "icSsvNormal@2x.png"
12 | },
13 | {
14 | "filename" : "icSsvNormal@3x.png",
15 | "scale" : "3x",
16 | "idiom" : "universal"
17 | }
18 | ],
19 | "info" : {
20 | "version" : 1,
21 | "author" : "xcode"
22 | }
23 | }
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/imgStipop.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "imgStipop.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "imgStipop@2x.png",
10 | "idiom" : "universal",
11 | "scale" : "2x"
12 | },
13 | {
14 | "filename" : "imgStipop@3x.png",
15 | "idiom" : "universal",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "author" : "xcode",
21 | "version" : 1
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/icSendNormal.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "icSendNormal.png",
5 | "scale" : "1x",
6 | "idiom" : "universal"
7 | },
8 | {
9 | "scale" : "2x",
10 | "idiom" : "universal",
11 | "filename" : "icSendNormal@2x.png"
12 | },
13 | {
14 | "scale" : "3x",
15 | "idiom" : "universal",
16 | "filename" : "icSendNormal@3x.png"
17 | }
18 | ],
19 | "info" : {
20 | "version" : 1,
21 | "author" : "xcode"
22 | }
23 | }
--------------------------------------------------------------------------------
/StipopDemo/View/SPDChatroomViewController/Views/SPDMyStickerChatCell.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SPDMyStickerChatCell.swift
3 | // Stipop Demo
4 | //
5 | // Created by Jay Ahn on 2021/10/19.
6 | //
7 |
8 | import UIKit
9 | import Stipop
10 |
11 | class SPDMyStickerChatCell: UITableViewCell {
12 |
13 | @IBOutlet weak var bubbleView: UIView!
14 | @IBOutlet weak var stickerView: SPUIStickerView!
15 |
16 | override func awakeFromNib() {
17 | super.awakeFromNib()
18 | bubbleView.layer.cornerRadius = 15
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/icSendActive.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "icSendActive.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "icSendActive@2x.png",
10 | "idiom" : "universal",
11 | "scale" : "2x"
12 | },
13 | {
14 | "filename" : "icSendActive@3x.png",
15 | "idiom" : "universal",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "author" : "xcode",
21 | "version" : 1
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/StipopDemo/View/SPDChatroomViewController/Views/SPDCounterStickerChatCell.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SPDCounterStickerChatCell.swift
3 | // Stipop Demo
4 | //
5 | // Created by Jay Ahn on 2021/10/19.
6 | //
7 |
8 | import UIKit
9 | import Stipop
10 |
11 | class SPDCounterStickerChatCell: UITableViewCell {
12 |
13 | @IBOutlet weak var bubbleView: UIView!
14 | @IBOutlet weak var stickerView: SPUIStickerView!
15 |
16 | override func awakeFromNib() {
17 | super.awakeFromNib()
18 | bubbleView.layer.cornerRadius = 15
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/StipopDemo/View/SPDChatroomViewController/Views/SPDChatroomHeaderCell.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SPDChatroomHeaderCell.swift
3 | // Stipop Demo
4 | //
5 | // Created by Jay Ahn on 2021/10/20.
6 | //
7 |
8 | import UIKit
9 |
10 | class SPDChatroomHeaderCell: UITableViewCell {
11 | @IBOutlet weak var timeLabel: UILabel!
12 |
13 | override func awakeFromNib() {
14 | super.awakeFromNib()
15 | let date = Date()
16 | let hour = Calendar.current.component(.hour, from: date)
17 | let minutes = Calendar.current.component(.minute, from: date)
18 | timeLabel.text = "\(hour):\(minutes)"
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/StipopDemo/fr.lproj/Main.strings:
--------------------------------------------------------------------------------
1 |
2 | /* Class = "UIButton"; configuration.title = "Try it now"; ObjectID = "90n-t0-huY"; */
3 | "90n-t0-huY.configuration.title" = "Try it now";
4 |
5 | /* Class = "UIButton"; normalTitle = "aaa"; ObjectID = "90n-t0-huY"; */
6 | "90n-t0-huY.normalTitle" = "aaa";
7 |
8 | /* Class = "UILabel"; text = "Welcome to Stipop Demo App :)"; ObjectID = "I02-An-xTE"; */
9 | "I02-An-xTE.text" = "Welcome to Stipop Demo App :)";
10 |
11 | /* Class = "UIButton"; configuration.title = "Go to Docs"; ObjectID = "Qyf-7R-imQ"; */
12 | "Qyf-7R-imQ.configuration.title" = "Go to Docs";
13 |
14 | /* Class = "UIButton"; normalTitle = "Button"; ObjectID = "Qyf-7R-imQ"; */
15 | "Qyf-7R-imQ.normalTitle" = "Button";
16 |
--------------------------------------------------------------------------------
/StipopDemo/hi.lproj/Main.strings:
--------------------------------------------------------------------------------
1 |
2 | /* Class = "UIButton"; configuration.title = "Try it now"; ObjectID = "90n-t0-huY"; */
3 | "90n-t0-huY.configuration.title" = "Try it now";
4 |
5 | /* Class = "UIButton"; normalTitle = "aaa"; ObjectID = "90n-t0-huY"; */
6 | "90n-t0-huY.normalTitle" = "aaa";
7 |
8 | /* Class = "UILabel"; text = "Welcome to Stipop Demo App :)"; ObjectID = "I02-An-xTE"; */
9 | "I02-An-xTE.text" = "Welcome to Stipop Demo App :)";
10 |
11 | /* Class = "UIButton"; configuration.title = "Go to Docs"; ObjectID = "Qyf-7R-imQ"; */
12 | "Qyf-7R-imQ.configuration.title" = "Go to Docs";
13 |
14 | /* Class = "UIButton"; normalTitle = "Button"; ObjectID = "Qyf-7R-imQ"; */
15 | "Qyf-7R-imQ.normalTitle" = "Button";
16 |
--------------------------------------------------------------------------------
/StipopDemo/ko.lproj/Main.strings:
--------------------------------------------------------------------------------
1 |
2 | /* Class = "UIButton"; configuration.title = "Try it now"; ObjectID = "90n-t0-huY"; */
3 | "90n-t0-huY.configuration.title" = "Try it now";
4 |
5 | /* Class = "UIButton"; normalTitle = "aaa"; ObjectID = "90n-t0-huY"; */
6 | "90n-t0-huY.normalTitle" = "aaa";
7 |
8 | /* Class = "UILabel"; text = "Welcome to Stipop Demo App :)"; ObjectID = "I02-An-xTE"; */
9 | "I02-An-xTE.text" = "Welcome to Stipop Demo App :)";
10 |
11 | /* Class = "UIButton"; configuration.title = "Go to Docs"; ObjectID = "Qyf-7R-imQ"; */
12 | "Qyf-7R-imQ.configuration.title" = "Go to Docs";
13 |
14 | /* Class = "UIButton"; normalTitle = "Button"; ObjectID = "Qyf-7R-imQ"; */
15 | "Qyf-7R-imQ.normalTitle" = "Button";
16 |
--------------------------------------------------------------------------------
/StipopDemo/vi.lproj/Main.strings:
--------------------------------------------------------------------------------
1 |
2 | /* Class = "UIButton"; configuration.title = "Try it now"; ObjectID = "90n-t0-huY"; */
3 | "90n-t0-huY.configuration.title" = "Try it now";
4 |
5 | /* Class = "UIButton"; normalTitle = "aaa"; ObjectID = "90n-t0-huY"; */
6 | "90n-t0-huY.normalTitle" = "aaa";
7 |
8 | /* Class = "UILabel"; text = "Welcome to Stipop Demo App :)"; ObjectID = "I02-An-xTE"; */
9 | "I02-An-xTE.text" = "Welcome to Stipop Demo App :)";
10 |
11 | /* Class = "UIButton"; configuration.title = "Go to Docs"; ObjectID = "Qyf-7R-imQ"; */
12 | "Qyf-7R-imQ.configuration.title" = "Go to Docs";
13 |
14 | /* Class = "UIButton"; normalTitle = "Button"; ObjectID = "Qyf-7R-imQ"; */
15 | "Qyf-7R-imQ.normalTitle" = "Button";
16 |
--------------------------------------------------------------------------------
/StipopDemo/zh-Hans.lproj/Main.strings:
--------------------------------------------------------------------------------
1 |
2 | /* Class = "UIButton"; configuration.title = "Try it now"; ObjectID = "90n-t0-huY"; */
3 | "90n-t0-huY.configuration.title" = "Try it now";
4 |
5 | /* Class = "UIButton"; normalTitle = "aaa"; ObjectID = "90n-t0-huY"; */
6 | "90n-t0-huY.normalTitle" = "aaa";
7 |
8 | /* Class = "UILabel"; text = "Welcome to Stipop Demo App :)"; ObjectID = "I02-An-xTE"; */
9 | "I02-An-xTE.text" = "Welcome to Stipop Demo App :)";
10 |
11 | /* Class = "UIButton"; configuration.title = "Go to Docs"; ObjectID = "Qyf-7R-imQ"; */
12 | "Qyf-7R-imQ.configuration.title" = "Go to Docs";
13 |
14 | /* Class = "UIButton"; normalTitle = "Button"; ObjectID = "Qyf-7R-imQ"; */
15 | "Qyf-7R-imQ.normalTitle" = "Button";
16 |
--------------------------------------------------------------------------------
/StipopDemo/zh-Hant.lproj/Main.strings:
--------------------------------------------------------------------------------
1 |
2 | /* Class = "UIButton"; configuration.title = "Try it now"; ObjectID = "90n-t0-huY"; */
3 | "90n-t0-huY.configuration.title" = "Try it now";
4 |
5 | /* Class = "UIButton"; normalTitle = "aaa"; ObjectID = "90n-t0-huY"; */
6 | "90n-t0-huY.normalTitle" = "aaa";
7 |
8 | /* Class = "UILabel"; text = "Welcome to Stipop Demo App :)"; ObjectID = "I02-An-xTE"; */
9 | "I02-An-xTE.text" = "Welcome to Stipop Demo App :)";
10 |
11 | /* Class = "UIButton"; configuration.title = "Go to Docs"; ObjectID = "Qyf-7R-imQ"; */
12 | "Qyf-7R-imQ.configuration.title" = "Go to Docs";
13 |
14 | /* Class = "UIButton"; normalTitle = "Button"; ObjectID = "Qyf-7R-imQ"; */
15 | "Qyf-7R-imQ.normalTitle" = "Button";
16 |
--------------------------------------------------------------------------------
/StipopDemo/StipopAuth/DemoSAuthAPI_access_token.swift:
--------------------------------------------------------------------------------
1 | //
2 | // DemoSAuthAPI_access_token.swift
3 | // StipopDemo-UIKit
4 | //
5 | // Created by kyum on 2022/07/25.
6 | //
7 |
8 | import Alamofire
9 |
10 | extension DemoSAuthAPI {
11 |
12 | static func getAccessToken(userId: String,
13 | completion: ((String) -> Void)?,
14 | failure: ((DemoSAuthError?) -> Void)? = nil) -> DataRequest {
15 | return request(Path.accessToken,
16 | method: .post,
17 | userId: userId,
18 | completion: { response in
19 | completion?(response.body?.accessToken ?? "")
20 | }, failure: failure)
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/Package.swift:
--------------------------------------------------------------------------------
1 | // swift-tools-version:5.3
2 | // The swift-tools-version declares the minimum version of Swift required to build this package.
3 | import PackageDescription
4 | let package = Package(
5 | name: "Stipop",
6 | products: [
7 | // Products define the executables and libraries a package produces, and make them visible to other packages.
8 | .library(
9 | name: "Stipop",
10 | targets: ["Stipop"]),
11 | ],
12 | dependencies: [
13 | ],
14 | targets: [
15 | .binaryTarget(
16 | name: "Stipop",
17 | url: "https://ios-sdk.stipop.com/0.9.11/Stipop.xcframework.zip",
18 | checksum: "01c8bb322511a7da3ad1043478bb35b3092d5ed04d908c47c9bbae185443935c"
19 | )
20 | ]
21 | )
22 |
--------------------------------------------------------------------------------
/StipopDemo/View/SPDChatroomViewController/Views/SPDCounterExecuteChatCell.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SPDCounterExecuteChatCell.swift
3 | // Stipop Demo
4 | //
5 | // Created by Jay Ahn on 2021/10/19.
6 | //
7 |
8 | import UIKit
9 |
10 | class SPDCounterExecuteChatCell: UITableViewCell {
11 |
12 | @IBOutlet weak var contentButton: UIButton!
13 | @IBAction func onContentButtonSelected(_ sender: Any) {
14 | onSelectPerform?()
15 | }
16 |
17 | var onSelectPerform: (()->Void)?
18 |
19 | override func awakeFromNib() {
20 | super.awakeFromNib()
21 | contentButton.layer.cornerRadius = 20
22 | contentButton.layer.borderColor = #colorLiteral(red: 1, green: 0.4078431373, blue: 0.1058823529, alpha: 1)
23 | contentButton.layer.borderWidth = 1
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/StipopDemo/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | UIApplicationSceneManifest
6 |
7 | UIApplicationSupportsMultipleScenes
8 |
9 | UISceneConfigurations
10 |
11 | UIWindowSceneSessionRoleApplication
12 |
13 |
14 | UISceneConfigurationName
15 | Default Configuration
16 | UISceneDelegateClassName
17 | $(PRODUCT_MODULE_NAME).SceneDelegate
18 | UISceneStoryboardFile
19 | Main
20 |
21 |
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/StipopDemo/View/SPDChatroomViewController/Views/SPDCounterTextChatCell.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SPDCounterTextChatCell.swift
3 | // Stipop Demo
4 | //
5 | // Created by Jay Ahn on 2021/10/18.
6 | //
7 |
8 | import UIKit
9 |
10 | class SPDCounterTextChatCell: UITableViewCell {
11 |
12 | @IBOutlet weak var bubbleView: UIView!
13 | @IBOutlet weak var contentLabel: UILabel!
14 |
15 | override func layoutSubviews() {
16 | super.layoutSubviews()
17 |
18 | let path = UIBezierPath(
19 | roundedRect : bubbleView.bounds,
20 | byRoundingCorners : [.topLeft ,.topRight, .bottomRight],
21 | cornerRadii : CGSize(width: 14, height: 14)
22 | )
23 | let maskLayer = CAShapeLayer()
24 | maskLayer.path = path.cgPath
25 | bubbleView.layer.mask = maskLayer
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/Colors/Default.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "srgb",
6 | "components" : {
7 | "alpha" : "1.000",
8 | "blue" : "1.000",
9 | "green" : "1.000",
10 | "red" : "1.000"
11 | }
12 | },
13 | "idiom" : "universal"
14 | },
15 | {
16 | "appearances" : [
17 | {
18 | "appearance" : "luminosity",
19 | "value" : "dark"
20 | }
21 | ],
22 | "color" : {
23 | "color-space" : "srgb",
24 | "components" : {
25 | "alpha" : "1.000",
26 | "blue" : "0.000",
27 | "green" : "0.000",
28 | "red" : "0.000"
29 | }
30 | },
31 | "idiom" : "universal"
32 | }
33 | ],
34 | "info" : {
35 | "author" : "xcode",
36 | "version" : 1
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/Colors/DefaultReverse.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "srgb",
6 | "components" : {
7 | "alpha" : "1.000",
8 | "blue" : "0.000",
9 | "green" : "0.000",
10 | "red" : "0.000"
11 | }
12 | },
13 | "idiom" : "universal"
14 | },
15 | {
16 | "appearances" : [
17 | {
18 | "appearance" : "luminosity",
19 | "value" : "dark"
20 | }
21 | ],
22 | "color" : {
23 | "color-space" : "srgb",
24 | "components" : {
25 | "alpha" : "1.000",
26 | "blue" : "1.000",
27 | "green" : "1.000",
28 | "red" : "1.000"
29 | }
30 | },
31 | "idiom" : "universal"
32 | }
33 | ],
34 | "info" : {
35 | "author" : "xcode",
36 | "version" : 1
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/Colors/StipopTextFieldBackground.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "srgb",
6 | "components" : {
7 | "alpha" : "1.000",
8 | "blue" : "1.000",
9 | "green" : "1.000",
10 | "red" : "1.000"
11 | }
12 | },
13 | "idiom" : "universal"
14 | },
15 | {
16 | "appearances" : [
17 | {
18 | "appearance" : "luminosity",
19 | "value" : "dark"
20 | }
21 | ],
22 | "color" : {
23 | "color-space" : "srgb",
24 | "components" : {
25 | "alpha" : "1.000",
26 | "blue" : "0.227",
27 | "green" : "0.212",
28 | "red" : "0.180"
29 | }
30 | },
31 | "idiom" : "universal"
32 | }
33 | ],
34 | "info" : {
35 | "author" : "xcode",
36 | "version" : 1
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/Colors/StipopTextFieldBackgroundStroke.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "srgb",
6 | "components" : {
7 | "alpha" : "1.000",
8 | "blue" : "0.827",
9 | "green" : "0.827",
10 | "red" : "0.827"
11 | }
12 | },
13 | "idiom" : "universal"
14 | },
15 | {
16 | "appearances" : [
17 | {
18 | "appearance" : "luminosity",
19 | "value" : "dark"
20 | }
21 | ],
22 | "color" : {
23 | "color-space" : "srgb",
24 | "components" : {
25 | "alpha" : "1.000",
26 | "blue" : "0.227",
27 | "green" : "0.212",
28 | "red" : "0.180"
29 | }
30 | },
31 | "idiom" : "universal"
32 | }
33 | ],
34 | "info" : {
35 | "author" : "xcode",
36 | "version" : 1
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/Colors/StipopTypingViewLayoutBackground.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "srgb",
6 | "components" : {
7 | "alpha" : "1.000",
8 | "blue" : "1.000",
9 | "green" : "1.000",
10 | "red" : "1.000"
11 | }
12 | },
13 | "idiom" : "universal"
14 | },
15 | {
16 | "appearances" : [
17 | {
18 | "appearance" : "luminosity",
19 | "value" : "dark"
20 | }
21 | ],
22 | "color" : {
23 | "color-space" : "srgb",
24 | "components" : {
25 | "alpha" : "1.000",
26 | "blue" : "0.110",
27 | "green" : "0.106",
28 | "red" : "0.090"
29 | }
30 | },
31 | "idiom" : "universal"
32 | }
33 | ],
34 | "info" : {
35 | "author" : "xcode",
36 | "version" : 1
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/StipopDemo/Extensions/UIView+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UIView+Extensions.swift
3 | // StipopDemo
4 | //
5 | // Created by kyum on 2022/06/23.
6 | //
7 | import UIKit
8 |
9 | extension UIView {
10 |
11 | @IBInspectable var cornerRadius: CGFloat {
12 | get {
13 | return layer.cornerRadius
14 | }
15 | set {
16 | layer.cornerRadius = newValue
17 | layer.masksToBounds = newValue > 0
18 | }
19 | }
20 |
21 | @IBInspectable var borderWidth: CGFloat {
22 | get {
23 | return layer.borderWidth
24 | }
25 | set {
26 | layer.borderWidth = newValue
27 | }
28 | }
29 |
30 | @IBInspectable var borderColor: UIColor? {
31 | get {
32 | return UIColor(cgColor: layer.borderColor!)
33 | }
34 | set {
35 | layer.borderColor = newValue?.cgColor
36 | }
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/StipopDemo/View/SPDChatroomViewController/Views/SPDMyTextChatCell.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SPDMyTextChatCell.swift
3 | // Stipop Demo
4 | //
5 | // Created by Jay Ahn on 2021/10/19.
6 | //
7 |
8 | import UIKit
9 |
10 | class SPDMyTextChatCell: UITableViewCell {
11 |
12 | @IBOutlet weak var bubbleView: UIView!
13 | @IBOutlet weak var contentLabel: UILabel!
14 |
15 | override func awakeFromNib() {
16 | super.awakeFromNib()
17 | // bubbleView.layer.cornerRadius = 15
18 | // bubbleView.clipsToBounds = true
19 | }
20 |
21 | let gradient = CAGradientLayer()
22 | override func draw(_ rect: CGRect) {
23 | super.draw(rect)
24 | gradient.startPoint = CGPoint(x: 0.0, y: 0.0)
25 | gradient.endPoint = CGPoint(x: 1.0, y: 1.0)
26 | gradient.colors = [
27 | #colorLiteral(red: 1, green: 0.3058823529, blue: 0.07058823529, alpha: 1).cgColor,
28 | #colorLiteral(red: 1, green: 0.4392156863, blue: 0.1176470588, alpha: 1).cgColor
29 | ]
30 | gradient.frame = bubbleView.bounds
31 | bubbleView.layer.insertSublayer(gradient, at: 0)
32 | }
33 |
34 | override func layoutSubviews() {
35 | super.layoutSubviews()
36 |
37 | let path = UIBezierPath(
38 | roundedRect : bubbleView.bounds,
39 | byRoundingCorners : [.topLeft ,.topRight, .bottomLeft],
40 | cornerRadii : CGSize(width: 15, height: 15)
41 | )
42 | let maskLayer = CAShapeLayer()
43 | maskLayer.path = path.cgPath
44 | bubbleView.layer.mask = maskLayer
45 | gradient.frame = bubbleView.bounds
46 | }
47 | }
48 |
--------------------------------------------------------------------------------
/StipopDemo/Base.lproj/LaunchScreen.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/StipopDemo/View/SPDMainViewController/SPDMainViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SPDMainViewController.swift
3 | // Stipop Demo
4 | //
5 | // Created by Jay Ahn on 2021/10/12.
6 | //
7 |
8 | import UIKit
9 | import Stipop
10 |
11 | class SPDMainViewController: UIViewController {
12 |
13 | @IBAction func goToDemoAppButton(_ sender: Any) {
14 | guard let url = URL(string: "https://docs.stipop.io/en/sdk/ios/get-started/before-you-begin") else { return }
15 | UIApplication.shared.open(url)
16 | }
17 |
18 | override func viewDidLoad() {
19 | super.viewDidLoad()
20 | }
21 |
22 | override func viewWillAppear(_ animated: Bool) {
23 | super.viewWillAppear(animated)
24 | navigationController?.setNavigationBarHidden(true, animated: animated)
25 | }
26 |
27 | override func viewWillDisappear(_ animated: Bool) {
28 | super.viewWillDisappear(animated)
29 | navigationController?.setNavigationBarHidden(false, animated: animated)
30 | }
31 | @IBAction func newUserLoginClicked(_ sender: Any) {
32 |
33 | let userID = UUID().uuidString
34 |
35 | self.goToChatRoomVC(user: SPUser(userID: userID))
36 | }
37 | @IBAction func commonUserLoginClicked(_ sender: Any) {
38 |
39 | // userID must not include spacing
40 | let userID = "-1"
41 |
42 | self.goToChatRoomVC(user: SPUser(userID: userID))
43 | }
44 | private func goToChatRoomVC(user: SPUser){
45 |
46 | let storyboard: UIStoryboard? = UIStoryboard(name: "SPDChatroomViewController", bundle: nil)
47 | guard let chatRoomVC = storyboard?.instantiateViewController(identifier: "SPDChatroomViewController") as? SPDChatroomViewController else { return }
48 |
49 | chatRoomVC.user = user
50 |
51 | self.navigationController?.pushViewController(chatRoomVC, animated: true)
52 | }
53 | }
54 |
--------------------------------------------------------------------------------
/StipopDemo/SceneDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SceneDelegate.swift
3 | // StipopDemo
4 | //
5 | // Created by Jay Ahn on 2021/11/01.
6 | //
7 |
8 | import UIKit
9 |
10 | class SceneDelegate: UIResponder, UIWindowSceneDelegate {
11 |
12 | var window: UIWindow?
13 |
14 |
15 | func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
16 | // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
17 | // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
18 | // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
19 | guard let _ = (scene as? UIWindowScene) else { return }
20 | }
21 |
22 | func sceneDidDisconnect(_ scene: UIScene) {
23 | // Called as the scene is being released by the system.
24 | // This occurs shortly after the scene enters the background, or when its session is discarded.
25 | // Release any resources associated with this scene that can be re-created the next time the scene connects.
26 | // The scene may re-connect later, as its session was not necessarily discarded (see `application:didDiscardSceneSessions` instead).
27 | }
28 |
29 | func sceneDidBecomeActive(_ scene: UIScene) {
30 | // Called when the scene has moved from an inactive state to an active state.
31 | // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive.
32 | }
33 |
34 | func sceneWillResignActive(_ scene: UIScene) {
35 | // Called when the scene will move from an active state to an inactive state.
36 | // This may occur due to temporary interruptions (ex. an incoming phone call).
37 | }
38 |
39 | func sceneWillEnterForeground(_ scene: UIScene) {
40 | // Called as the scene transitions from the background to the foreground.
41 | // Use this method to undo the changes made on entering the background.
42 | }
43 |
44 | func sceneDidEnterBackground(_ scene: UIScene) {
45 | // Called as the scene transitions from the foreground to the background.
46 | // Use this method to save data, release shared resources, and store enough scene-specific state information
47 | // to restore the scene back to its current state.
48 | }
49 |
50 |
51 | }
52 |
53 |
--------------------------------------------------------------------------------
/README.kr.md:
--------------------------------------------------------------------------------
1 | [English](./README.md) | [한국어](./README.kr.md)
2 | 
3 |
4 | # Stipop UI SDK for iOS
5 |
6 | 
7 | 
8 | [](https://swift.org/package-manager/)
9 | [](https://cocoapods.org/pods/Stipop)
10 |
11 | 스티팝은 모바일 채팅, 댓글, 라이브 방송, 화상채팅 등에 손쉽게 적용할 수 있는 150,000개 이상의 png, gif 이모티콘을 제공합
12 | 니다. 전 세계 수백만명이 사랑하는 이모티콘을 이용하여 여러분의 앱을 다채롭게 만들어 보세요.
13 |
14 | ## Requirements
15 |
16 | - Swift 5.4+
17 | - XCode 12.5+
18 | - iOS 12.0+
19 |
20 | ## Getting started
21 |
22 | - 더욱 자세한 정보는 [스티팝 SDK 문서](https://docs.stipop.io/en/sdk/ios/get-started/quick-start)를 참고해주세요
23 |
24 | - [대시보드](https://dashboard.stipop.io/create-application)에 들어가서 Stipop.plist 파일을 다운로드 해주세요.
25 |
26 | ## 데모 앱(for XCode 13.0+)
27 |
28 | 1. 데모 앱 프로젝트를 다운로드(혹은 clone)받아주세요 (SPM이나 Cocoapods을 별도로 설정하지 않으셔도 됩니다.)
29 |
30 | ```bash
31 | git clone https://github.com/stipop-development/stipop-ios-sdk
32 | ```
33 |
34 | 2. 프로젝트에 Stipop.plist 파일을 추가해주세요
35 |
36 | 
37 |
38 | 3. 데모 앱을 실행하세요
39 |
40 |

41 |
42 | ## 기존 프로젝트에 설치하기
43 |
44 | ### Swift Package Manager
45 |
46 | #### By XCode
47 |
48 | File > Swift Packages > Add Package Dependency... 에 들어가서 `https://github.com/stipop-development/stipop-ios-sdk`을입
49 | 력하고, 사용하고 싶은 버전을 선택하여 설치하세요.
50 |
51 | #### By Package.swift
52 |
53 | Swift Package가 있다면, Package.swift의 dependency에 추가하세요.
54 |
55 | ```swift
56 | dependencies: [
57 | .package(url: "https://github.com/stipop-development/stipop-ios-sdk.git", .upToNextMajor(from: "0.9.11"))
58 | ]
59 | ```
60 |
61 | ### Cocoapods
62 |
63 | 아래 코드를 `Podfile`에 붙여넣고 `pod install`로 설치하세요
64 |
65 | ```ruby
66 | pod 'StipopUIKit', '0.9.11'
67 | ```
68 |
69 | ## Contact us
70 |
71 | - 더 많은 정보는 [Stipop Docs](https://docs.stipop.io/en/sdk/ios/get-started/quick-start)를 확인해주세요.
72 | - 궁금한 점이나 문제점을 발견하셨다면, tech-support@stipop.io 로 이메일을 보내주세요.
73 |
--------------------------------------------------------------------------------
/StipopDemo/StipopAuth/DemoSAuthManager.swift:
--------------------------------------------------------------------------------
1 | //
2 | // DemoSAuthManager.swift
3 | // StipopDemo-UIKit
4 | //
5 | // Created by kyum on 2022/07/25.
6 | //
7 |
8 | import UIKit
9 | import Stipop
10 |
11 | class DemoSAuthManager {
12 |
13 | static var key: String = "YOUR_API_KEY"
14 |
15 | static var appId: String = "YOUR_APP_ID"
16 | static var clientId: String = "YOUR_APP_CLIENT_ID"
17 | static var clientSecret: String = "YOUR_APP_CLIENT_SECRET"
18 | static var refreshToken: String = "YOUR_APP_REFRESH_TOKEN"
19 | static var expiryTime: Int = 86400
20 |
21 | private static var isSAuthWorking = false
22 |
23 | private static var sAuthAccessToken = ""
24 | static var sAuthAccessTokenUserId = "-1"
25 | private static var shouldRefreshAccessTokenTimeMillis: Double = 0
26 |
27 | static func getAccessTokenIfOverExpiryTime(userId: String, completion: ((String?) -> Void)?){
28 |
29 | setIsSAuthWorking(true)
30 |
31 | let currentTimeMillis = NSDate().currentTimeMillis()
32 |
33 | if(sAuthAccessTokenUserId != userId){
34 | getAccessToken(userId: userId){ accessToken in
35 | setIsSAuthWorking(false)
36 | completion?(accessToken)
37 | }
38 | } else if(currentTimeMillis >= shouldRefreshAccessTokenTimeMillis){
39 | getAccessToken(userId: userId){ accessToken in
40 | setIsSAuthWorking(false)
41 | completion?(accessToken)
42 | }
43 | } else {
44 | setIsSAuthWorking(false)
45 | completion?(sAuthAccessToken)
46 | }
47 | }
48 |
49 | private static func getAccessToken(userId: String, completion: ((String?) -> Void)?){
50 | let _ = DemoSAuthAPI.getAccessToken(userId: userId, completion: { accessToken in
51 | Stipop.setAccessToken(accessToken: accessToken)
52 | setSAuthInformation(accessToken: accessToken, userId: userId)
53 | completion?(accessToken)
54 | }, failure: { error in
55 | completion?(nil)
56 | })
57 | }
58 |
59 | private static func setIsSAuthWorking(_ isSAuthWorking: Bool){
60 | self.isSAuthWorking = isSAuthWorking
61 | }
62 |
63 | static func getIsSAuthWorking() -> Bool {
64 | return isSAuthWorking
65 | }
66 |
67 | private static func setSAuthInformation(accessToken: String, userId: String){
68 | let currentTimeMillis = NSDate().currentTimeMillis()
69 | let expiryTimeMillis = Double((expiryTime > 60 ? expiryTime - 5 : expiryTime - 3) * 1000)
70 | sAuthAccessToken = accessToken
71 | sAuthAccessTokenUserId = userId
72 | shouldRefreshAccessTokenTimeMillis = currentTimeMillis + expiryTimeMillis
73 | }
74 | }
75 |
76 | extension NSDate {
77 | func currentTimeMillis() -> Double {
78 | return self.timeIntervalSince1970 * 1000
79 | }
80 | }
81 |
--------------------------------------------------------------------------------
/StipopDemo/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.swift
3 | // StipopDemo-UIKit
4 | //
5 | // Created by Jay Ahn on 2021/07/26.
6 | //
7 |
8 | import UIKit
9 | import Stipop
10 |
11 | @main
12 | class AppDelegate: UIResponder, UIApplicationDelegate {
13 |
14 | var window: UIWindow?
15 | // let semaphore = DispatchSemaphore(value: 1)
16 |
17 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
18 | // Override point for customization after application launch.
19 | // *setSAuthDelegate() should be typed before initialize()
20 | // Stipop.setSAuthDelegate(sAuthDelegate: self)
21 | Stipop.initialize()
22 | navigationBarSetup()
23 | return true
24 | }
25 |
26 | // MARK: UISceneSession Lifecycle
27 | @available(iOS 13.0, *)
28 | func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
29 | // Called when a new scene session is being created.
30 | // Use this method to select a configuration to create the new scene with.
31 | return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
32 | }
33 |
34 | @available(iOS 13.0, *)
35 | func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) {
36 | // Called when the user discards a scene session.
37 | // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
38 | // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
39 | }
40 | private func navigationBarSetup(){
41 | if #available(iOS 15, *) {
42 | let appearance = UINavigationBarAppearance()
43 | appearance.configureWithOpaqueBackground()
44 | appearance.backgroundColor = UIColor(named: ColorEnum.StipopMain)
45 | appearance.shadowColor = .clear
46 | UINavigationBar.appearance().standardAppearance = appearance
47 | UINavigationBar.appearance().scrollEdgeAppearance = appearance
48 | }
49 | }
50 | }
51 |
52 | /* If you use SAuth, implement SAuthDelegate and refresh accessToken when authorization error occured. */
53 | /*
54 | extension AppDelegate: SAuthDelegate {
55 |
56 | func httpError(apiEnum: SPAPIEnum, error: SPError) {
57 | print("⚡️Stipop: HTTP Error => \(apiEnum)")
58 | DispatchQueue.global().async {
59 | self.semaphore.wait()
60 | DemoSAuthManager.getAccessTokenIfOverExpiryTime(userId: Stipop.getUser().userID, completion: { accessToken in
61 | self.semaphore.signal()
62 | guard let accessToken = accessToken else { return }
63 | Stipop.setAccessToken(accessToken: accessToken)
64 | SAuthManager.reRequest(api: apiEnum)
65 | })
66 | }
67 | }
68 | }
69 | */
70 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | Stipop.plist
2 |
3 | ### CocoaPods ###
4 | ## CocoaPods GitIgnore Template
5 |
6 | # CocoaPods - Only use to conserve bandwidth / Save time on Pushing
7 | # - Also handy if you have a large number of dependant pods
8 | # - AS PER https://guides.cocoapods.org/using/using-cocoapods.html NEVER IGNORE THE LOCK FILE
9 | Pods/
10 |
11 | ### macOS ###
12 | # General
13 | .DS_Store
14 | .AppleDouble
15 | .LSOverride
16 |
17 | # Icon must end with two \r
18 | Icon
19 |
20 |
21 | # Thumbnails
22 | ._*
23 |
24 | # Files that might appear in the root of a volume
25 | .DocumentRevisions-V100
26 | .fseventsd
27 | .Spotlight-V100
28 | .TemporaryItems
29 | .Trashes
30 | .VolumeIcon.icns
31 | .com.apple.timemachine.donotpresent
32 |
33 | # Directories potentially created on remote AFP share
34 | .AppleDB
35 | .AppleDesktop
36 | Network Trash Folder
37 | Temporary Items
38 | .apdisk
39 |
40 | ### Swift ###
41 | # Xcode
42 | #
43 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
44 |
45 | ## User settings
46 | xcuserdata/
47 | Stipop.xcscheme
48 |
49 | ## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9)
50 | *.xcscmblueprint
51 | *.xccheckout
52 |
53 | ## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4)
54 | build/
55 | DerivedData/
56 | *.moved-aside
57 | *.pbxuser
58 | !default.pbxuser
59 | *.mode1v3
60 | !default.mode1v3
61 | *.mode2v3
62 | !default.mode2v3
63 | *.perspectivev3
64 | !default.perspectivev3
65 |
66 | ## Obj-C/Swift specific
67 | *.hmap
68 |
69 | ## App packaging
70 | *.ipa
71 | *.dSYM.zip
72 | *.dSYM
73 |
74 | ## Playgrounds
75 | timeline.xctimeline
76 | playground.xcworkspace
77 |
78 | # Swift Package Manager
79 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.
80 | # Packages/
81 | # Package.pins
82 | # Package.resolved
83 | # *.xcodeproj
84 | # Xcode automatically generates this directory with a .xcworkspacedata file and xcuserdata
85 | # hence it is not needed unless you have added a package configuration file to your project
86 | # .swiftpm
87 |
88 |
89 | .build/
90 |
91 | # CocoaPods
92 | # We recommend against adding the Pods directory to your .gitignore. However
93 | # you should judge for yourself, the pros and cons are mentioned at:
94 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
95 | # Pods/
96 | # Add this line if you want to avoid checking in source code from the Xcode workspace
97 | # *.xcworkspace
98 |
99 | # Carthage
100 | # Add this line if you want to avoid checking in source code from Carthage dependencies.
101 | # Carthage/Checkouts
102 |
103 | Carthage/Build/
104 |
105 | # Accio dependency management
106 | Dependencies/
107 | .accio/
108 |
109 | # fastlane
110 | # It is recommended to not store the screenshots in the git repo.
111 | # Instead, use fastlane to re-generate the screenshots whenever they are needed.
112 | # For more information about the recommended setup visit:
113 | # https://docs.fastlane.tools/best-practices/source-control/#source-control
114 |
115 | fastlane/report.xml
116 | fastlane/Preview.html
117 | fastlane/screenshots/**/*.png
118 | fastlane/test_output
119 |
120 | # Code Injection
121 | # After new code Injection tools there's a generated folder /iOSInjectionProject
122 | # https://github.com/johnno1962/injectionforxcode
123 |
124 | iOSInjectionProject/
125 |
126 | ### VisualStudioCode ###
127 | .vscode/*
128 | !.vscode/settings.json
129 | !.vscode/tasks.json
130 | !.vscode/launch.json
131 | !.vscode/extensions.json
132 | *.code-workspace
133 |
134 | # Local History for Visual Studio Code
135 | .history/
136 |
137 | ### VisualStudioCode Patch ###
138 | # Ignore all local history of files
139 | .history
140 | .ionide
141 |
142 | ### Xcode ###
143 | # Xcode
144 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
145 |
146 |
147 |
148 |
149 | ## Gcc Patch
150 | /*.gcno
151 |
152 | ### Xcode Patch ###
153 | *.xcodeproj/*
154 | !*.xcodeproj/project.pbxproj
155 | !*.xcodeproj/xcshareddata/
156 | !*.xcworkspace/contents.xcworkspacedata
157 | **/xcshareddata/WorkspaceSettings.xcsettings
158 |
159 | # End of https://www.toptal.com/developers/gitignore/api/swift,cocoapods,swiftpackagemanager,xcode,macos,visualstudiocode
--------------------------------------------------------------------------------
/StipopDemo/StipopAuth/DemoSAuthAPI.swift:
--------------------------------------------------------------------------------
1 | //
2 | // DemoSAuthAPI.swift
3 | // StipopDemo-UIKit
4 | //
5 | // Created by kyum on 2022/07/25.
6 | //
7 |
8 | import Alamofire
9 | import UIKit
10 |
11 | enum DemoSAuthError: Error {
12 | case alamofire(AFError)
13 | case error(Error)
14 | case api(DemoSAuthAPI.Response.Header)
15 | case message(String)
16 | }
17 |
18 | extension DemoSAuthError: LocalizedError {
19 | var code: String? {
20 | switch self {
21 | case .api(let error):
22 | return error.code
23 | case .alamofire(let error):
24 | return String(describing: error.responseCode)
25 | default:
26 | return nil
27 | }
28 | }
29 | var message: String? {
30 | switch self {
31 | case .api(let error):
32 | return error.message
33 | case .message(let error):
34 | return error
35 | default:
36 | return nil
37 | }
38 | }
39 | }
40 |
41 | internal class DemoSAuthAPI {
42 |
43 | internal class Path {
44 |
45 | static let root: String = "https://messenger.stipop.io/v1"
46 | static let accessToken: String = root + "/access"
47 |
48 | }
49 |
50 | internal struct Response: Codable {
51 | let header: Header?
52 | struct Header: Codable {
53 | let code: String?
54 | let message: String?
55 | var isSuccess: Bool {
56 | return code == "0000"
57 | }
58 | }
59 |
60 | let body: Body?
61 | struct Body: Codable {
62 | let accessToken: String?
63 | }
64 |
65 | fileprivate func isSuccess(_ success: (()->Void)? = nil, failure: ((DemoSAuthError?) -> Void)? = nil) {
66 | if let header = header {
67 | if header.isSuccess {
68 | success?()
69 | } else {
70 | failure?(DemoSAuthError.api(header))
71 | }
72 | } else {
73 | failure?(DemoSAuthError.message("Cannot parse response header"))
74 | }
75 | }
76 |
77 | init(from decoder: Decoder) throws {
78 | let values = try decoder.container(keyedBy: CodingKeys.self)
79 | if let header = try? values.decode(Header.self, forKey: .header) {
80 | self.header = header
81 | } else {
82 | self.header = nil
83 | }
84 | if let body = try? values.decode(Body.self, forKey: .body) {
85 | self.body = body
86 | } else {
87 | self.body = nil
88 | }
89 | }
90 | }
91 |
92 | internal static func request(_ url: String,
93 | method: HTTPMethod,
94 | userId: String = "",
95 | encoding: ParameterEncoding = JSONEncoding.default,
96 | headers: HTTPHeaders = [:],
97 | completion: ((DemoSAuthAPI.Response)->Void)?,
98 | failure: ((DemoSAuthError?)->Void)? = nil) -> DataRequest {
99 |
100 | //Set Parameter
101 | var parameters_final: Parameters = [:]
102 |
103 | parameters_final["userId"] = userId
104 |
105 | parameters_final["appId"] = DemoSAuthManager.appId
106 | parameters_final["clientId"] = DemoSAuthManager.clientId
107 | parameters_final["clientSecret"] = DemoSAuthManager.clientSecret
108 | parameters_final["refreshToken"] = DemoSAuthManager.refreshToken
109 | parameters_final["expiryTime"] = DemoSAuthManager.expiryTime
110 |
111 | //Set Header
112 | var headers_final: HTTPHeaders = headers
113 | headers_final.add(name: "api_key", value: DemoSAuthManager.key)
114 |
115 | //Request
116 | return AF.request(url,
117 | method: method,
118 | parameters: parameters_final,
119 | encoding: encoding,
120 | headers: headers_final)
121 | .responseJSON { response in
122 | switch response.result {
123 | case .success(let obj):
124 | do {
125 | let dataJSON = try JSONSerialization.data(withJSONObject: obj, options: .prettyPrinted)
126 | let getInstanceData = try JSONDecoder().decode(DemoSAuthAPI.Response.self, from: dataJSON)
127 | getInstanceData.isSuccess({
128 | completion?(getInstanceData)
129 | }, failure: failure)
130 | } catch(let error) {
131 | failure?(DemoSAuthError.error(error))
132 | }
133 | case .failure(let e):
134 | failure?(DemoSAuthError.alamofire(e))
135 | }
136 | }
137 | }
138 | }
139 |
140 | fileprivate struct FailableDecodable : Decodable {
141 | let base: Base?
142 | init(from decoder: Decoder) throws {
143 | let container = try decoder.singleValueContainer()
144 | self.base = try? container.decode(Base.self)
145 | }
146 | }
147 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | [English](./README.md) | [한국어](./README.kr.md)
2 | 
3 |
4 | # Stipop UI SDK for iOS
5 |
6 | 
7 | 
8 | [](https://swift.org/package-manager/)
9 | [](https://cocoapods.org/pods/Stipop)
10 |
11 | Stipop SDK provides over 150,000 .png and .gif stickers that can be easily integrated into mobile app chats, comment
12 | sections, live streams, video calls, etc. Bring fun to your mobile app with stickers loved by millions of users
13 | worldwide.
14 |
15 | ## Requirements
16 |
17 | - Swift 5.4+
18 | - XCode 12.5+
19 | - iOS 12.0+
20 |
21 | ## Getting started
22 |
23 | - Check [Stipop Docs](https://docs.stipop.io/en/sdk/ios/get-started/quick-start) for the comprehensive guide.
24 |
25 | - Sign up to [Stipop Dashboard](https://dashboard.stipop.io/create-application) to download Stipop.plist file.
26 |
27 | ## Try demo(for XCode 13.0+)
28 |
29 | 1. Download(or Clone) Demo App (SPM or Cocoapods Adjustment is not necessary)
30 |
31 | ```bash
32 | git clone https://github.com/stipop-development/stipop-ios-sdk
33 | ```
34 |
35 | 2. Add Stipop.plist file into the project
36 |
37 | 
38 |
39 | 3. Run demo app
40 |
41 | 
42 |
43 | ## Including in your project
44 |
45 | ### Swift Package Manager
46 |
47 | #### By XCode
48 |
49 | Go to File > Swift Packages > Add Package Dependency... Enter `https://github.com/stipop-development/stipop-ios-sdk`.
50 | Then select a version you want to use.
51 |
52 | #### By Package.swift
53 |
54 | If you have a Swift Package, add dependency into Package.swift
55 |
56 | ```swift
57 | dependencies: [
58 | .package(url: "https://github.com/stipop-development/stipop-ios-sdk.git", .upToNextMajor(from: "0.9.11"))
59 | ]
60 | ```
61 |
62 | ### Cocoapods
63 |
64 | Copy & Paste below into `Podfile`. Then, run `pod install`.
65 |
66 | ```ruby
67 | pod 'StipopUIKit', '0.9.11'
68 | ```
69 |
70 | ## How do I use Stipop SDK?
71 |
72 | 1. Add Stipop.plist file into the project.
73 | 2. Import Stipop and Initialize Stipop SDK before use at AppDelegate.
74 |
75 | ```swift
76 | import UIKit
77 | import Stipop
78 |
79 | @main
80 | class AppDelegate: UIResponder, UIApplicationDelegate {
81 |
82 | var window: UIWindow?
83 | // let semaphore = DispatchSemaphore(value: 1)
84 |
85 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
86 | // Override point for customization after application launch.
87 |
88 | // If you want to use SAuth, execute setSAuthDelegate method.
89 | // *setSAuthDelegate() should be typed before initialize()
90 | // Stipop.setSAuthDelegate(sAuthDelegate: self)
91 | Stipop.initialize()
92 | return true
93 | }
94 |
95 | ...
96 | }
97 | /* If you use SAuth, implement SAuthDelegate and refresh accessToken when authorization error occured. */
98 | /*
99 | extension AppDelegate: SAuthDelegate {
100 |
101 | func httpError(apiEnum: SPAPIEnum, error: SPError) {
102 | print("⚡️Stipop: HTTP Error => \(apiEnum)")
103 | DispatchQueue.global().async {
104 | self.semaphore.wait()
105 | DemoSAuthManager.getAccessTokenIfOverExpiryTime(userId: Stipop.getUser().userID, completion: { accessToken in
106 | self.semaphore.signal()
107 | guard let accessToken = accessToken else { return }
108 | Stipop.setAccessToken(accessToken: accessToken)
109 | SAuthManager.reRequest(api: apiEnum)
110 | })
111 | }
112 | }
113 | }
114 | */
115 | ```
116 |
117 | 3. Go to the View Controller where you want to place the button. Then, Initialize SPUIButton and connect delegate.
118 |
119 | ```swift
120 | import UIKit
121 | import Stipop
122 |
123 | class ViewController: UIViewController {
124 |
125 | let stipopButton = SPUIButton(type: .system)
126 |
127 | override func viewDidLoad() {
128 | super.viewDidLoad()
129 |
130 | self.view.addSubview(stipopButton)
131 | stipopButton.translatesAutoresizingMaskIntoConstraints = false
132 | stipopButton.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
133 | stipopButton.centerYAnchor.constraint(equalTo: view.topAnchor, constant: 150).isActive = true
134 | stipopButton.heightAnchor.constraint(equalToConstant: 25).isActive = true
135 | stipopButton.widthAnchor.constraint(equalToConstant: 25).isActive = true
136 |
137 | let user = SPUser(userID: "some_user_id")
138 | stipopButton.setUser(user, viewType: .picker)
139 | stipopButton.delegate = self
140 | }
141 | }
142 |
143 | extension ViewController: SPUIDelegate {
144 |
145 | func onStickerSingleTapped(_ view: SPUIView, sticker: SPSticker) {
146 | // This function will be executed when user chooses a sticker.
147 | }
148 |
149 | /* If you want to use double tap feature, change the plist file and implement this function. */
150 | func onStickerDoubleTapped(_ view: SPUIView, sticker: SPSticker) {
151 | // This function will be executed when user chooses a sticker.
152 | }
153 |
154 | }
155 | ```
156 |
157 | ## Contact us
158 |
159 | - For more information, visit [Stipop Docs](https://docs.stipop.io/en/sdk/ios/get-started/quick-start).
160 | - Email us at tech-support@stipop.io if you need any help.
161 |
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "40.png",
5 | "idiom" : "iphone",
6 | "scale" : "2x",
7 | "size" : "20x20"
8 | },
9 | {
10 | "filename" : "60.png",
11 | "idiom" : "iphone",
12 | "scale" : "3x",
13 | "size" : "20x20"
14 | },
15 | {
16 | "filename" : "29.png",
17 | "idiom" : "iphone",
18 | "scale" : "1x",
19 | "size" : "29x29"
20 | },
21 | {
22 | "filename" : "58.png",
23 | "idiom" : "iphone",
24 | "scale" : "2x",
25 | "size" : "29x29"
26 | },
27 | {
28 | "filename" : "87.png",
29 | "idiom" : "iphone",
30 | "scale" : "3x",
31 | "size" : "29x29"
32 | },
33 | {
34 | "filename" : "80.png",
35 | "idiom" : "iphone",
36 | "scale" : "2x",
37 | "size" : "40x40"
38 | },
39 | {
40 | "filename" : "120.png",
41 | "idiom" : "iphone",
42 | "scale" : "3x",
43 | "size" : "40x40"
44 | },
45 | {
46 | "filename" : "57.png",
47 | "idiom" : "iphone",
48 | "scale" : "1x",
49 | "size" : "57x57"
50 | },
51 | {
52 | "filename" : "114.png",
53 | "idiom" : "iphone",
54 | "scale" : "2x",
55 | "size" : "57x57"
56 | },
57 | {
58 | "filename" : "120.png",
59 | "idiom" : "iphone",
60 | "scale" : "2x",
61 | "size" : "60x60"
62 | },
63 | {
64 | "filename" : "180.png",
65 | "idiom" : "iphone",
66 | "scale" : "3x",
67 | "size" : "60x60"
68 | },
69 | {
70 | "filename" : "20.png",
71 | "idiom" : "ipad",
72 | "scale" : "1x",
73 | "size" : "20x20"
74 | },
75 | {
76 | "filename" : "40.png",
77 | "idiom" : "ipad",
78 | "scale" : "2x",
79 | "size" : "20x20"
80 | },
81 | {
82 | "filename" : "29.png",
83 | "idiom" : "ipad",
84 | "scale" : "1x",
85 | "size" : "29x29"
86 | },
87 | {
88 | "filename" : "58.png",
89 | "idiom" : "ipad",
90 | "scale" : "2x",
91 | "size" : "29x29"
92 | },
93 | {
94 | "filename" : "40.png",
95 | "idiom" : "ipad",
96 | "scale" : "1x",
97 | "size" : "40x40"
98 | },
99 | {
100 | "filename" : "80.png",
101 | "idiom" : "ipad",
102 | "scale" : "2x",
103 | "size" : "40x40"
104 | },
105 | {
106 | "filename" : "50.png",
107 | "idiom" : "ipad",
108 | "scale" : "1x",
109 | "size" : "50x50"
110 | },
111 | {
112 | "filename" : "100.png",
113 | "idiom" : "ipad",
114 | "scale" : "2x",
115 | "size" : "50x50"
116 | },
117 | {
118 | "filename" : "72.png",
119 | "idiom" : "ipad",
120 | "scale" : "1x",
121 | "size" : "72x72"
122 | },
123 | {
124 | "filename" : "144.png",
125 | "idiom" : "ipad",
126 | "scale" : "2x",
127 | "size" : "72x72"
128 | },
129 | {
130 | "filename" : "76.png",
131 | "idiom" : "ipad",
132 | "scale" : "1x",
133 | "size" : "76x76"
134 | },
135 | {
136 | "filename" : "152.png",
137 | "idiom" : "ipad",
138 | "scale" : "2x",
139 | "size" : "76x76"
140 | },
141 | {
142 | "filename" : "167.png",
143 | "idiom" : "ipad",
144 | "scale" : "2x",
145 | "size" : "83.5x83.5"
146 | },
147 | {
148 | "filename" : "1024.png",
149 | "idiom" : "ios-marketing",
150 | "scale" : "1x",
151 | "size" : "1024x1024"
152 | },
153 | {
154 | "filename" : "16.png",
155 | "idiom" : "mac",
156 | "scale" : "1x",
157 | "size" : "16x16"
158 | },
159 | {
160 | "filename" : "32.png",
161 | "idiom" : "mac",
162 | "scale" : "2x",
163 | "size" : "16x16"
164 | },
165 | {
166 | "filename" : "32.png",
167 | "idiom" : "mac",
168 | "scale" : "1x",
169 | "size" : "32x32"
170 | },
171 | {
172 | "filename" : "64.png",
173 | "idiom" : "mac",
174 | "scale" : "2x",
175 | "size" : "32x32"
176 | },
177 | {
178 | "filename" : "128.png",
179 | "idiom" : "mac",
180 | "scale" : "1x",
181 | "size" : "128x128"
182 | },
183 | {
184 | "filename" : "256.png",
185 | "idiom" : "mac",
186 | "scale" : "2x",
187 | "size" : "128x128"
188 | },
189 | {
190 | "filename" : "256.png",
191 | "idiom" : "mac",
192 | "scale" : "1x",
193 | "size" : "256x256"
194 | },
195 | {
196 | "filename" : "512.png",
197 | "idiom" : "mac",
198 | "scale" : "2x",
199 | "size" : "256x256"
200 | },
201 | {
202 | "filename" : "512.png",
203 | "idiom" : "mac",
204 | "scale" : "1x",
205 | "size" : "512x512"
206 | },
207 | {
208 | "filename" : "1024.png",
209 | "idiom" : "mac",
210 | "scale" : "2x",
211 | "size" : "512x512"
212 | },
213 | {
214 | "filename" : "48.png",
215 | "idiom" : "watch",
216 | "role" : "notificationCenter",
217 | "scale" : "2x",
218 | "size" : "24x24",
219 | "subtype" : "38mm"
220 | },
221 | {
222 | "filename" : "55.png",
223 | "idiom" : "watch",
224 | "role" : "notificationCenter",
225 | "scale" : "2x",
226 | "size" : "27.5x27.5",
227 | "subtype" : "42mm"
228 | },
229 | {
230 | "filename" : "58.png",
231 | "idiom" : "watch",
232 | "role" : "companionSettings",
233 | "scale" : "2x",
234 | "size" : "29x29"
235 | },
236 | {
237 | "filename" : "87.png",
238 | "idiom" : "watch",
239 | "role" : "companionSettings",
240 | "scale" : "3x",
241 | "size" : "29x29"
242 | },
243 | {
244 | "idiom" : "watch",
245 | "role" : "notificationCenter",
246 | "scale" : "2x",
247 | "size" : "33x33",
248 | "subtype" : "45mm"
249 | },
250 | {
251 | "filename" : "80.png",
252 | "idiom" : "watch",
253 | "role" : "appLauncher",
254 | "scale" : "2x",
255 | "size" : "40x40",
256 | "subtype" : "38mm"
257 | },
258 | {
259 | "filename" : "88.png",
260 | "idiom" : "watch",
261 | "role" : "appLauncher",
262 | "scale" : "2x",
263 | "size" : "44x44",
264 | "subtype" : "40mm"
265 | },
266 | {
267 | "idiom" : "watch",
268 | "role" : "appLauncher",
269 | "scale" : "2x",
270 | "size" : "46x46",
271 | "subtype" : "41mm"
272 | },
273 | {
274 | "filename" : "100.png",
275 | "idiom" : "watch",
276 | "role" : "appLauncher",
277 | "scale" : "2x",
278 | "size" : "50x50",
279 | "subtype" : "44mm"
280 | },
281 | {
282 | "idiom" : "watch",
283 | "role" : "appLauncher",
284 | "scale" : "2x",
285 | "size" : "51x51",
286 | "subtype" : "45mm"
287 | },
288 | {
289 | "idiom" : "watch",
290 | "role" : "appLauncher",
291 | "scale" : "2x",
292 | "size" : "54x54",
293 | "subtype" : "49mm"
294 | },
295 | {
296 | "filename" : "172.png",
297 | "idiom" : "watch",
298 | "role" : "quickLook",
299 | "scale" : "2x",
300 | "size" : "86x86",
301 | "subtype" : "38mm"
302 | },
303 | {
304 | "filename" : "196.png",
305 | "idiom" : "watch",
306 | "role" : "quickLook",
307 | "scale" : "2x",
308 | "size" : "98x98",
309 | "subtype" : "42mm"
310 | },
311 | {
312 | "filename" : "216.png",
313 | "idiom" : "watch",
314 | "role" : "quickLook",
315 | "scale" : "2x",
316 | "size" : "108x108",
317 | "subtype" : "44mm"
318 | },
319 | {
320 | "idiom" : "watch",
321 | "role" : "quickLook",
322 | "scale" : "2x",
323 | "size" : "117x117",
324 | "subtype" : "45mm"
325 | },
326 | {
327 | "idiom" : "watch",
328 | "role" : "quickLook",
329 | "scale" : "2x",
330 | "size" : "129x129",
331 | "subtype" : "49mm"
332 | },
333 | {
334 | "filename" : "1024.png",
335 | "idiom" : "watch-marketing",
336 | "scale" : "1x",
337 | "size" : "1024x1024"
338 | }
339 | ],
340 | "info" : {
341 | "author" : "xcode",
342 | "version" : 1
343 | }
344 | }
345 |
--------------------------------------------------------------------------------
/StipopDemo/Assets.xcassets/jay.imageset/jay.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/StipopDemo/View/SPDChatroomViewController/SPDChatroomViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SPDChatroomViewController.swift
3 | // Stipop Demo
4 | //
5 | // Created by Jay Ahn on 2021/10/12.
6 | //
7 |
8 | import UIKit
9 | import Stipop
10 |
11 | class SPDChatroomViewController: UIViewController {
12 |
13 | @IBOutlet weak var navigationTitleView: UIView!
14 | @IBOutlet weak var moreButton: UIBarButtonItem!
15 | @IBOutlet weak var tableView: UITableView!
16 | @IBOutlet weak var stipopPickerButton: SPUIButton!
17 | @IBOutlet weak var messageField: UITextField!
18 | @IBOutlet weak var messageFieldBubble: UIView!
19 | @IBOutlet weak var messageFieldBottomConstraint: NSLayoutConstraint!
20 | @IBOutlet weak var messageSendButton: UIButton!
21 | @IBOutlet weak var pickerViewPositionView: UIView!
22 |
23 | var user: SPUser = SPUser(userID: "-1")
24 |
25 | @IBAction func messageSend(_ sender: Any) {
26 | if let text = messageField.text {
27 | appendChat(.text(.me, text))
28 | messageField.text = ""
29 | messageFieldDidChange(messageField)
30 | }
31 | }
32 |
33 | fileprivate var chattings: [SPDChatModel] = []
34 |
35 | override func viewDidLoad() {
36 | super.viewDidLoad()
37 | messageSendButton.isEnabled = false
38 | configureUI()
39 |
40 | configureStipopButton()
41 | // setupSearchVC()
42 | // setupPickerVC()
43 | }
44 |
45 | override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
46 | messageFieldBubble.layer.borderColor = UIColor(named: ColorEnum.StipopTextFieldBackgroundStroke)?.cgColor
47 | }
48 | }
49 |
50 | extension SPDChatroomViewController {
51 |
52 | private func configureUI(){
53 | configureNavigationBar()
54 | configureTableView()
55 | configureMoreButton()
56 | configureMessageFields()
57 |
58 | makeInitialBubbles()
59 |
60 | func configureNavigationBar(){
61 | let navigationBarTopView = UIView()
62 | navigationBarTopView.backgroundColor = UIColor(named: ColorEnum.StipopMain)
63 |
64 | view.addSubview(navigationBarTopView)
65 |
66 | let safeAreaTopInset = UIApplication.shared.windows[0].safeAreaInsets.top
67 |
68 | navigationBarTopView.translatesAutoresizingMaskIntoConstraints = false
69 | navigationBarTopView.topAnchor.constraint(equalTo: self.view.topAnchor).isActive = true
70 | navigationBarTopView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor).isActive = true
71 | navigationBarTopView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor).isActive = true
72 | navigationBarTopView.heightAnchor.constraint(equalToConstant: safeAreaTopInset).isActive = true
73 | }
74 | func configureTableView() {
75 | tableView.dataSource = self
76 | tableView.rowHeight = UITableView.automaticDimension
77 | }
78 |
79 | func configureMoreButton() {
80 | if #available(iOS 15.0, *) {
81 | let barButtonMenu = UIMenu(title: "", children: [
82 | UIAction(title: "Contact us", handler: { [weak self] action in
83 | self?.contactUs(action: action)
84 | }),
85 | UIAction(title: "Go to github", handler: { [weak self] action in
86 | self?.goToGithub(action: action)
87 | })
88 | ])
89 | moreButton.menu = barButtonMenu
90 | }
91 | }
92 |
93 | func configureMessageFields() {
94 | messageField.addTarget(self, action: #selector(messageFieldDidChange(_:)), for: .editingChanged)
95 |
96 | NotificationCenter.default.addObserver(self,
97 | selector: #selector(self.keyboardWillShow(_:)),
98 | name: UIResponder.keyboardWillShowNotification,
99 | object: nil)
100 | NotificationCenter.default.addObserver(self,
101 | selector: #selector(self.keyboardWillHide(_:)),
102 | name: UIResponder.keyboardWillHideNotification,
103 | object: nil)
104 | }
105 |
106 | func makeInitialBubbles(){
107 | appendChat(.text(.counter, "Hi, there!👋"))
108 | appendChat(.sticker(.counter, "https://img.stipop.io/2020/3/31/1585719674256_CookieArrow_size.gif"))
109 | DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { [weak self] in
110 | self?.appendChat(.text(.counter, "Welcome to Stipop SDK!\nPress the button below to get started."))
111 | }
112 | DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { [weak self] in
113 | self?.appendChat(.execution(.counter, "Try the sticker feature. 🔽", {
114 | self?.stipopPickerButton.sendActions(for: .touchUpInside)
115 | }))
116 | }
117 | }
118 | }
119 |
120 | @available(iOS 13.0, *)
121 | func contactUs(action: UIAction) {
122 | guard let url = URL(string: "https://developers.stipop.io/contact-us") else { return }
123 | UIApplication.shared.open(url)
124 | }
125 | @available(iOS 13.0, *)
126 | func goToGithub(action: UIAction? = nil) {
127 | guard let url = URL(string: "https://github.com/stipop-development/stipop-ios-sdk") else { return }
128 | UIApplication.shared.open(url)
129 | }
130 |
131 | @objc func keyboardWillShow(_ notification: NSNotification) {
132 | if let userInfo = notification.userInfo,
133 | let keyboardRectangle = userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? CGRect {
134 | self.messageFieldBottomConstraint.priority = UILayoutPriority(1000)
135 | self.messageFieldBottomConstraint.constant = keyboardRectangle.height
136 | }
137 | }
138 | @objc func keyboardWillHide(_ notification: NSNotification) {
139 | self.messageFieldBottomConstraint.priority = UILayoutPriority(1)
140 | self.messageFieldBottomConstraint.constant = 0
141 | }
142 | @objc func messageFieldDidChange(_ textField: UITextField) {
143 | if let text = messageField.text,
144 | text != "" {
145 | messageSendButton.isEnabled = true
146 | } else {
147 | messageSendButton.isEnabled = false
148 | }
149 | }
150 |
151 | func configureStipopButton() {
152 | stipopPickerButton.setUser(user, viewType: .picker)
153 | stipopPickerButton.delegate = self
154 |
155 | }
156 |
157 | func appendChat(_ chat: SPDChatModel) {
158 | chattings.append(chat)
159 | tableView.insertRows(at: [IndexPath(row: chattings.count-1, section: 1)], with: .right)
160 | scrollChatToBottom()
161 | }
162 |
163 | func scrollChatToBottom() {
164 | let indexPath = IndexPath(row: self.chattings.count-1, section: 1)
165 | DispatchQueue.main.async {
166 | self.tableView.scrollToRow(at: indexPath, at: .bottom, animated: true)
167 | }
168 | }
169 |
170 | func setupSearchVC(){
171 | let searchVc = SPUISearchViewController()
172 | searchVc.view.backgroundColor = .white
173 | searchVc.setUser(user)
174 | searchVc.delegate = self
175 |
176 | // self.present(searchVc, animated: true)
177 | if let searchView = searchVc.view {
178 | self.addChild(searchVc)
179 | self.view.addSubview(searchView)
180 | searchView.translatesAutoresizingMaskIntoConstraints = false
181 | searchView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
182 | searchView.heightAnchor.constraint(equalToConstant: 600).isActive = true
183 | searchView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
184 | searchView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
185 | }
186 | }
187 |
188 | func setupPickerVC(){
189 | let pickerView = SPUIPickerCustomView()
190 |
191 | pickerView.setUser(user)
192 | pickerView.delegate = self
193 |
194 | self.view.addSubview(pickerView)
195 | pickerView.translatesAutoresizingMaskIntoConstraints = false
196 | pickerView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
197 | pickerView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
198 | pickerView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor).isActive = true
199 | pickerView.heightAnchor.constraint(equalToConstant: 300).isActive = true
200 | }
201 | }
202 |
203 | extension SPDChatroomViewController: SPUIDelegate {
204 | func onStickerSingleTapped(_ view: SPUIView, sticker: SPSticker) {
205 | print("onStickerSingleTapped")
206 | appendChat(.sticker(.me, sticker.stickerImg))
207 | }
208 | func onStickerDoubleTapped(_ view: SPUIView, sticker: SPSticker) {
209 | print("onStickerDoubleTapped")
210 | appendChat(.sticker(.me, sticker.stickerImg))
211 | }
212 | func pickerCustomViewSetup(_ view: SPUIView, pickerView: UIView) {
213 | // 1. Add view.
214 | self.view.addSubview(pickerView)
215 |
216 | // 2. Custom picker view.
217 | pickerView.alpha = 0.8
218 |
219 | // 3. Set constraint.
220 | pickerView.translatesAutoresizingMaskIntoConstraints = false
221 | pickerView.topAnchor.constraint(equalTo: self.pickerViewPositionView.topAnchor).isActive = true
222 | pickerView.bottomAnchor.constraint(equalTo: self.pickerViewPositionView.bottomAnchor).isActive = true
223 | pickerView.leadingAnchor.constraint(equalTo: self.pickerViewPositionView.leadingAnchor).isActive = true
224 | pickerView.trailingAnchor.constraint(equalTo: self.pickerViewPositionView.trailingAnchor).isActive = true
225 | }
226 |
227 | func executePaymentForPackDownload(priceTier: SPPriceTier, packageId: Int, completion: @escaping (SPPriceTier, Int) -> Void) {
228 | /// 1. Proceed with payment process
229 | /// ~
230 | /// 2. Return `priceTier & packageId` in the completion parameter
231 | completion(priceTier, packageId)
232 | }
233 |
234 | func executePaymentForPackDownload(packageId: Int, completion: @escaping (Int) -> Void) {
235 |
236 | }
237 |
238 | func spViewWillAppear(_ view: SPUIView){
239 | switch view {
240 | case is SPUIPickerInputView:
241 | print("⚡️Stipop: SPUIPickerInputView -> spViewWillAppear")
242 | case is SPUIPickerCustomView:
243 | print("⚡️Stipop: SPUIPickerCustomView -> spViewWillAppear")
244 | case is SPUISearchViewController:
245 | print("⚡️Stipop: SPUISearchViewController -> spViewWillAppear")
246 | case is SPUIStoreViewController:
247 | print("⚡️Stipop: SPUIStoreViewController -> spViewWillAppear")
248 | default:
249 | break
250 | }
251 | }
252 | func spViewDidAppear(_ view: SPUIView){
253 | switch view {
254 | case is SPUIPickerInputView:
255 | print("⚡️Stipop: SPUIPickerInputView -> spViewDidAppear")
256 | case is SPUIPickerCustomView:
257 | print("⚡️Stipop: SPUIPickerCustomView -> spViewDidAppear")
258 | case is SPUISearchViewController:
259 | print("⚡️Stipop: SPUISearchViewController -> spViewDidAppear")
260 | case is SPUIStoreViewController:
261 | print("⚡️Stipop: SPUIStoreViewController -> spViewDidAppear")
262 | default:
263 | break
264 | }
265 | }
266 | func spViewWillDisappear(_ view: SPUIView){
267 | switch view {
268 | case is SPUIPickerInputView:
269 | print("⚡️Stipop: SPUIPickerInputView -> spViewWillDisappear")
270 | case is SPUIPickerCustomView:
271 | print("⚡️Stipop: SPUIPickerCustomView -> spViewWillDisappear")
272 | case is SPUISearchViewController:
273 | print("⚡️Stipop: SPUISearchViewController -> spViewWillDisappear")
274 | case is SPUIStoreViewController:
275 | print("⚡️Stipop: SPUIStoreViewController -> spViewWillDisappear")
276 | default:
277 | break
278 | }
279 | }
280 | func spViewDidDisappear(_ view: SPUIView){
281 | switch view {
282 | case is SPUIPickerInputView:
283 | print("⚡️Stipop: SPUIPickerInputView -> spViewDidDisappear")
284 | case is SPUIPickerCustomView:
285 | print("⚡️Stipop: SPUIPickerCustomView -> spViewDidDisappear")
286 | case is SPUISearchViewController:
287 | print("⚡️Stipop: SPUISearchViewController -> spViewDidDisappear")
288 | case is SPUIStoreViewController:
289 | print("⚡️Stipop: SPUIStoreViewController -> spViewDidDisappear")
290 | default:
291 | break
292 | }
293 | }
294 | }
295 |
296 | extension SPDChatroomViewController: UITableViewDataSource {
297 | func numberOfSections(in tableView: UITableView) -> Int {
298 | return 2
299 | }
300 |
301 | func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
302 | switch section {
303 | case 0:
304 | return 1
305 | case 1:
306 | return chattings.count
307 | default:
308 | return 0
309 | }
310 | }
311 |
312 | func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
313 | switch indexPath.section {
314 | case 0:
315 | if let cell = tableView.dequeueReusableCell(withIdentifier: "HeaderCell") {
316 | return cell
317 | }
318 | break
319 | case 1:
320 | let cellModel = chattings[indexPath.row]
321 | switch cellModel {
322 | case .text(let sender, let content):
323 | if sender == .counter,
324 | let cell = tableView.dequeueReusableCell(withIdentifier: "CounterTextCell") as? SPDCounterTextChatCell {
325 | cell.contentLabel.text = content
326 | return cell
327 | }
328 | if sender == .me,
329 | let cell = tableView.dequeueReusableCell(withIdentifier: "MyTextCell") as? SPDMyTextChatCell {
330 | cell.contentLabel.text = content
331 | return cell
332 | }
333 | case .sticker(let sender, let urlString):
334 | if sender == .me,
335 | let cell = tableView.dequeueReusableCell(withIdentifier: "MyStickerCell") as? SPDMyStickerChatCell {
336 | cell.stickerView.setSticker(urlString)
337 | return cell
338 | }
339 | if sender == .counter,
340 | let cell = tableView.dequeueReusableCell(withIdentifier: "CounterStickerCell") as? SPDCounterStickerChatCell {
341 | cell.stickerView.setSticker(urlString)
342 | return cell
343 | }
344 | case .execution(_, let content, let onSelect):
345 | if let cell = tableView.dequeueReusableCell(withIdentifier: "CounterExecuteCell") as? SPDCounterExecuteChatCell {
346 | cell.contentButton.setTitle(content, for: .normal)
347 | cell.onSelectPerform = onSelect
348 | return cell
349 | }
350 | }
351 | default:
352 | break
353 | }
354 | return UITableViewCell(style: .default, reuseIdentifier: "cell")
355 | }
356 | }
357 | // 키보드 숨기기
358 | extension UIViewController {
359 | func hideKeyboardWhenTappedAround() {
360 | let tap = UITapGestureRecognizer(target: self, action: #selector(UIViewController.dismissKeyboard))
361 | tap.cancelsTouchesInView = false
362 | view.addGestureRecognizer(tap)
363 | }
364 |
365 | @objc func dismissKeyboard() {
366 | view.endEditing(true)
367 | }
368 | }
369 |
--------------------------------------------------------------------------------
/StipopDemo/Base.lproj/Main.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
72 |
89 |
113 |
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 |
127 |
128 |
129 |
130 |
131 |
132 |
133 |
134 |
135 |
136 |
137 |
138 |
139 |
140 |
141 |
142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 |
166 |
167 |
168 |
169 |
170 |
171 |
172 |
173 |
174 |
--------------------------------------------------------------------------------
/StipopDemo.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 55;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 0345AB36272FB80D007B20F9 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0345AB35272FB80D007B20F9 /* AppDelegate.swift */; };
11 | 0345AB38272FB80D007B20F9 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0345AB37272FB80D007B20F9 /* SceneDelegate.swift */; };
12 | 0345AB3D272FB80D007B20F9 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 0345AB3B272FB80D007B20F9 /* Main.storyboard */; };
13 | 0345AB3F272FB80F007B20F9 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0345AB3E272FB80F007B20F9 /* Assets.xcassets */; };
14 | 0345AB42272FB80F007B20F9 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 0345AB40272FB80F007B20F9 /* LaunchScreen.storyboard */; };
15 | 0345AB59272FB84F007B20F9 /* SPChat.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0345AB4A272FB84F007B20F9 /* SPChat.swift */; };
16 | 0345AB5A272FB84F007B20F9 /* SPDMainViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0345AB4D272FB84F007B20F9 /* SPDMainViewController.swift */; };
17 | 0345AB5B272FB84F007B20F9 /* SPDChatroomViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 0345AB4F272FB84F007B20F9 /* SPDChatroomViewController.storyboard */; };
18 | 0345AB5C272FB84F007B20F9 /* SPDChatroomViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0345AB50272FB84F007B20F9 /* SPDChatroomViewController.swift */; };
19 | 0345AB5D272FB84F007B20F9 /* SPDMyStickerChatCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0345AB52272FB84F007B20F9 /* SPDMyStickerChatCell.swift */; };
20 | 0345AB5E272FB84F007B20F9 /* SPDCounterStickerChatCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0345AB53272FB84F007B20F9 /* SPDCounterStickerChatCell.swift */; };
21 | 0345AB5F272FB84F007B20F9 /* SPDChatroomNavigationTitleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0345AB54272FB84F007B20F9 /* SPDChatroomNavigationTitleView.swift */; };
22 | 0345AB60272FB84F007B20F9 /* SPDCounterTextChatCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0345AB55272FB84F007B20F9 /* SPDCounterTextChatCell.swift */; };
23 | 0345AB61272FB84F007B20F9 /* SPDChatroomHeaderCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0345AB56272FB84F007B20F9 /* SPDChatroomHeaderCell.swift */; };
24 | 0345AB62272FB84F007B20F9 /* SPDMyTextChatCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0345AB57272FB84F007B20F9 /* SPDMyTextChatCell.swift */; };
25 | 0345AB63272FB84F007B20F9 /* SPDCounterExecuteChatCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0345AB58272FB84F007B20F9 /* SPDCounterExecuteChatCell.swift */; };
26 | 23AC95732844A28700200E93 /* Stipop in Frameworks */ = {isa = PBXBuildFile; productRef = 23AC95722844A28700200E93 /* Stipop */; };
27 | 5F05EFC52891B2CD00E526FC /* Alamofire in Frameworks */ = {isa = PBXBuildFile; productRef = 5F05EFC42891B2CD00E526FC /* Alamofire */; };
28 | 5F1B860B2891B198005F85AD /* DemoSAuthAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F1B860A2891B198005F85AD /* DemoSAuthAPI.swift */; };
29 | 5F1B860D2891B1A2005F85AD /* DemoSAuthAPI_access_token.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F1B860C2891B1A2005F85AD /* DemoSAuthAPI_access_token.swift */; };
30 | 5F1B860F2891B1AA005F85AD /* DemoSAuthManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F1B860E2891B1AA005F85AD /* DemoSAuthManager.swift */; };
31 | 5FC99B6F2BA861480011AD3A /* Stipop.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5FC99B6E2BA861480011AD3A /* Stipop.plist */; };
32 | 5FDC4C9528641F5F006D3D12 /* ColorEnum.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5FDC4C9428641F5F006D3D12 /* ColorEnum.swift */; };
33 | 5FDC4C9B286425C6006D3D12 /* UIView+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5FDC4C9A286425C6006D3D12 /* UIView+Extensions.swift */; };
34 | /* End PBXBuildFile section */
35 |
36 | /* Begin PBXFileReference section */
37 | 0345AB32272FB80D007B20F9 /* StipopDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = StipopDemo.app; sourceTree = BUILT_PRODUCTS_DIR; };
38 | 0345AB35272FB80D007B20F9 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
39 | 0345AB37272FB80D007B20F9 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; };
40 | 0345AB3C272FB80D007B20F9 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
41 | 0345AB3E272FB80F007B20F9 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
42 | 0345AB41272FB80F007B20F9 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
43 | 0345AB43272FB80F007B20F9 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
44 | 0345AB4A272FB84F007B20F9 /* SPChat.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPChat.swift; sourceTree = ""; };
45 | 0345AB4D272FB84F007B20F9 /* SPDMainViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPDMainViewController.swift; sourceTree = ""; };
46 | 0345AB4F272FB84F007B20F9 /* SPDChatroomViewController.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = SPDChatroomViewController.storyboard; sourceTree = ""; };
47 | 0345AB50272FB84F007B20F9 /* SPDChatroomViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPDChatroomViewController.swift; sourceTree = ""; };
48 | 0345AB52272FB84F007B20F9 /* SPDMyStickerChatCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPDMyStickerChatCell.swift; sourceTree = ""; };
49 | 0345AB53272FB84F007B20F9 /* SPDCounterStickerChatCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPDCounterStickerChatCell.swift; sourceTree = ""; };
50 | 0345AB54272FB84F007B20F9 /* SPDChatroomNavigationTitleView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPDChatroomNavigationTitleView.swift; sourceTree = ""; };
51 | 0345AB55272FB84F007B20F9 /* SPDCounterTextChatCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPDCounterTextChatCell.swift; sourceTree = ""; };
52 | 0345AB56272FB84F007B20F9 /* SPDChatroomHeaderCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPDChatroomHeaderCell.swift; sourceTree = ""; };
53 | 0345AB57272FB84F007B20F9 /* SPDMyTextChatCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPDMyTextChatCell.swift; sourceTree = ""; };
54 | 0345AB58272FB84F007B20F9 /* SPDCounterExecuteChatCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPDCounterExecuteChatCell.swift; sourceTree = ""; };
55 | 0358A21227585E5100299464 /* vi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = vi; path = vi.lproj/Main.strings; sourceTree = ""; };
56 | 0358A21327585E5200299464 /* vi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = vi; path = vi.lproj/LaunchScreen.strings; sourceTree = ""; };
57 | 039EBAC7276B177700015364 /* hi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hi; path = hi.lproj/Main.strings; sourceTree = ""; };
58 | 039EBAC8276B177700015364 /* hi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hi; path = hi.lproj/LaunchScreen.strings; sourceTree = ""; };
59 | 03C1CFDA2732487800C16DE6 /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/Main.strings; sourceTree = ""; };
60 | 03C1CFDB2732487800C16DE6 /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/LaunchScreen.strings; sourceTree = ""; };
61 | 03C1CFDC273248AB00C16DE6 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Main.strings"; sourceTree = ""; };
62 | 03C1CFDD273248AB00C16DE6 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/LaunchScreen.strings"; sourceTree = ""; };
63 | 03C1CFDE273248B200C16DE6 /* zh-Hant */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hant"; path = "zh-Hant.lproj/Main.strings"; sourceTree = ""; };
64 | 03C1CFDF273248B200C16DE6 /* zh-Hant */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hant"; path = "zh-Hant.lproj/LaunchScreen.strings"; sourceTree = ""; };
65 | 03C1CFE0273248E500C16DE6 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Main.strings; sourceTree = ""; };
66 | 03C1CFE1273248E500C16DE6 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/LaunchScreen.strings; sourceTree = ""; };
67 | 5F1B860A2891B198005F85AD /* DemoSAuthAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DemoSAuthAPI.swift; sourceTree = ""; };
68 | 5F1B860C2891B1A2005F85AD /* DemoSAuthAPI_access_token.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DemoSAuthAPI_access_token.swift; sourceTree = ""; };
69 | 5F1B860E2891B1AA005F85AD /* DemoSAuthManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DemoSAuthManager.swift; sourceTree = ""; };
70 | 5FC99B6E2BA861480011AD3A /* Stipop.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Stipop.plist; path = "../../../Desktop/stipop/sdk/sp/ios/stipop-ios-sdk-dev-uikit/StipopDemo-UIKit/StipopDemo-UIKit/Stipop.plist"; sourceTree = ""; };
71 | 5FDC4C9428641F5F006D3D12 /* ColorEnum.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorEnum.swift; sourceTree = ""; };
72 | 5FDC4C9A286425C6006D3D12 /* UIView+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIView+Extensions.swift"; sourceTree = ""; };
73 | /* End PBXFileReference section */
74 |
75 | /* Begin PBXFrameworksBuildPhase section */
76 | 0345AB2F272FB80D007B20F9 /* Frameworks */ = {
77 | isa = PBXFrameworksBuildPhase;
78 | buildActionMask = 2147483647;
79 | files = (
80 | 23AC95732844A28700200E93 /* Stipop in Frameworks */,
81 | 5F05EFC52891B2CD00E526FC /* Alamofire in Frameworks */,
82 | );
83 | runOnlyForDeploymentPostprocessing = 0;
84 | };
85 | /* End PBXFrameworksBuildPhase section */
86 |
87 | /* Begin PBXGroup section */
88 | 0345AB29272FB80D007B20F9 = {
89 | isa = PBXGroup;
90 | children = (
91 | 0345AB34272FB80D007B20F9 /* StipopDemo */,
92 | 0345AB33272FB80D007B20F9 /* Products */,
93 | );
94 | sourceTree = "";
95 | };
96 | 0345AB33272FB80D007B20F9 /* Products */ = {
97 | isa = PBXGroup;
98 | children = (
99 | 0345AB32272FB80D007B20F9 /* StipopDemo.app */,
100 | );
101 | name = Products;
102 | sourceTree = "";
103 | };
104 | 0345AB34272FB80D007B20F9 /* StipopDemo */ = {
105 | isa = PBXGroup;
106 | children = (
107 | 5F1B86092891B188005F85AD /* StipopAuth */,
108 | 5FDC4C99286425BC006D3D12 /* Extensions */,
109 | 5FDC4C9328641F4E006D3D12 /* Enums */,
110 | 0345AB35272FB80D007B20F9 /* AppDelegate.swift */,
111 | 0345AB3E272FB80F007B20F9 /* Assets.xcassets */,
112 | 0345AB37272FB80D007B20F9 /* SceneDelegate.swift */,
113 | 0345AB3B272FB80D007B20F9 /* Main.storyboard */,
114 | 0345AB40272FB80F007B20F9 /* LaunchScreen.storyboard */,
115 | 0345AB49272FB84F007B20F9 /* Model */,
116 | 0345AB4B272FB84F007B20F9 /* View */,
117 | 0345AB43272FB80F007B20F9 /* Info.plist */,
118 | 5FC99B6E2BA861480011AD3A /* Stipop.plist */,
119 | );
120 | path = StipopDemo;
121 | sourceTree = "";
122 | };
123 | 0345AB49272FB84F007B20F9 /* Model */ = {
124 | isa = PBXGroup;
125 | children = (
126 | 0345AB4A272FB84F007B20F9 /* SPChat.swift */,
127 | );
128 | path = Model;
129 | sourceTree = "";
130 | };
131 | 0345AB4B272FB84F007B20F9 /* View */ = {
132 | isa = PBXGroup;
133 | children = (
134 | 0345AB4C272FB84F007B20F9 /* SPDMainViewController */,
135 | 0345AB4E272FB84F007B20F9 /* SPDChatroomViewController */,
136 | );
137 | path = View;
138 | sourceTree = "";
139 | };
140 | 0345AB4C272FB84F007B20F9 /* SPDMainViewController */ = {
141 | isa = PBXGroup;
142 | children = (
143 | 0345AB4D272FB84F007B20F9 /* SPDMainViewController.swift */,
144 | );
145 | path = SPDMainViewController;
146 | sourceTree = "";
147 | };
148 | 0345AB4E272FB84F007B20F9 /* SPDChatroomViewController */ = {
149 | isa = PBXGroup;
150 | children = (
151 | 0345AB50272FB84F007B20F9 /* SPDChatroomViewController.swift */,
152 | 0345AB4F272FB84F007B20F9 /* SPDChatroomViewController.storyboard */,
153 | 0345AB51272FB84F007B20F9 /* Views */,
154 | );
155 | path = SPDChatroomViewController;
156 | sourceTree = "";
157 | };
158 | 0345AB51272FB84F007B20F9 /* Views */ = {
159 | isa = PBXGroup;
160 | children = (
161 | 0345AB54272FB84F007B20F9 /* SPDChatroomNavigationTitleView.swift */,
162 | 0345AB56272FB84F007B20F9 /* SPDChatroomHeaderCell.swift */,
163 | 0345AB57272FB84F007B20F9 /* SPDMyTextChatCell.swift */,
164 | 0345AB52272FB84F007B20F9 /* SPDMyStickerChatCell.swift */,
165 | 0345AB55272FB84F007B20F9 /* SPDCounterTextChatCell.swift */,
166 | 0345AB53272FB84F007B20F9 /* SPDCounterStickerChatCell.swift */,
167 | 0345AB58272FB84F007B20F9 /* SPDCounterExecuteChatCell.swift */,
168 | );
169 | path = Views;
170 | sourceTree = "";
171 | };
172 | 5F1B86092891B188005F85AD /* StipopAuth */ = {
173 | isa = PBXGroup;
174 | children = (
175 | 5F1B860A2891B198005F85AD /* DemoSAuthAPI.swift */,
176 | 5F1B860C2891B1A2005F85AD /* DemoSAuthAPI_access_token.swift */,
177 | 5F1B860E2891B1AA005F85AD /* DemoSAuthManager.swift */,
178 | );
179 | path = StipopAuth;
180 | sourceTree = "";
181 | };
182 | 5FDC4C9328641F4E006D3D12 /* Enums */ = {
183 | isa = PBXGroup;
184 | children = (
185 | 5FDC4C9428641F5F006D3D12 /* ColorEnum.swift */,
186 | );
187 | path = Enums;
188 | sourceTree = "";
189 | };
190 | 5FDC4C99286425BC006D3D12 /* Extensions */ = {
191 | isa = PBXGroup;
192 | children = (
193 | 5FDC4C9A286425C6006D3D12 /* UIView+Extensions.swift */,
194 | );
195 | path = Extensions;
196 | sourceTree = "";
197 | };
198 | /* End PBXGroup section */
199 |
200 | /* Begin PBXNativeTarget section */
201 | 0345AB31272FB80D007B20F9 /* StipopDemo */ = {
202 | isa = PBXNativeTarget;
203 | buildConfigurationList = 0345AB46272FB80F007B20F9 /* Build configuration list for PBXNativeTarget "StipopDemo" */;
204 | buildPhases = (
205 | 0345AB2E272FB80D007B20F9 /* Sources */,
206 | 0345AB2F272FB80D007B20F9 /* Frameworks */,
207 | 0345AB30272FB80D007B20F9 /* Resources */,
208 | );
209 | buildRules = (
210 | );
211 | dependencies = (
212 | );
213 | name = StipopDemo;
214 | packageProductDependencies = (
215 | 23AC95722844A28700200E93 /* Stipop */,
216 | 5F05EFC42891B2CD00E526FC /* Alamofire */,
217 | );
218 | productName = StipopDemo;
219 | productReference = 0345AB32272FB80D007B20F9 /* StipopDemo.app */;
220 | productType = "com.apple.product-type.application";
221 | };
222 | /* End PBXNativeTarget section */
223 |
224 | /* Begin PBXProject section */
225 | 0345AB2A272FB80D007B20F9 /* Project object */ = {
226 | isa = PBXProject;
227 | attributes = {
228 | BuildIndependentTargetsInParallel = 1;
229 | LastSwiftUpdateCheck = 1310;
230 | LastUpgradeCheck = 1310;
231 | TargetAttributes = {
232 | 0345AB31272FB80D007B20F9 = {
233 | CreatedOnToolsVersion = 13.1;
234 | };
235 | };
236 | };
237 | buildConfigurationList = 0345AB2D272FB80D007B20F9 /* Build configuration list for PBXProject "StipopDemo" */;
238 | compatibilityVersion = "Xcode 13.0";
239 | developmentRegion = en;
240 | hasScannedForEncodings = 0;
241 | knownRegions = (
242 | en,
243 | Base,
244 | ko,
245 | "zh-Hans",
246 | "zh-Hant",
247 | fr,
248 | vi,
249 | hi,
250 | );
251 | mainGroup = 0345AB29272FB80D007B20F9;
252 | packageReferences = (
253 | 23AC95712844A28600200E93 /* XCRemoteSwiftPackageReference "stipop-ios-sdk" */,
254 | 5F05EFC32891B2CD00E526FC /* XCRemoteSwiftPackageReference "Alamofire" */,
255 | );
256 | productRefGroup = 0345AB33272FB80D007B20F9 /* Products */;
257 | projectDirPath = "";
258 | projectRoot = "";
259 | targets = (
260 | 0345AB31272FB80D007B20F9 /* StipopDemo */,
261 | );
262 | };
263 | /* End PBXProject section */
264 |
265 | /* Begin PBXResourcesBuildPhase section */
266 | 0345AB30272FB80D007B20F9 /* Resources */ = {
267 | isa = PBXResourcesBuildPhase;
268 | buildActionMask = 2147483647;
269 | files = (
270 | 0345AB42272FB80F007B20F9 /* LaunchScreen.storyboard in Resources */,
271 | 5FC99B6F2BA861480011AD3A /* Stipop.plist in Resources */,
272 | 0345AB3F272FB80F007B20F9 /* Assets.xcassets in Resources */,
273 | 0345AB5B272FB84F007B20F9 /* SPDChatroomViewController.storyboard in Resources */,
274 | 0345AB3D272FB80D007B20F9 /* Main.storyboard in Resources */,
275 | );
276 | runOnlyForDeploymentPostprocessing = 0;
277 | };
278 | /* End PBXResourcesBuildPhase section */
279 |
280 | /* Begin PBXSourcesBuildPhase section */
281 | 0345AB2E272FB80D007B20F9 /* Sources */ = {
282 | isa = PBXSourcesBuildPhase;
283 | buildActionMask = 2147483647;
284 | files = (
285 | 5FDC4C9B286425C6006D3D12 /* UIView+Extensions.swift in Sources */,
286 | 0345AB5C272FB84F007B20F9 /* SPDChatroomViewController.swift in Sources */,
287 | 0345AB36272FB80D007B20F9 /* AppDelegate.swift in Sources */,
288 | 0345AB59272FB84F007B20F9 /* SPChat.swift in Sources */,
289 | 0345AB63272FB84F007B20F9 /* SPDCounterExecuteChatCell.swift in Sources */,
290 | 0345AB38272FB80D007B20F9 /* SceneDelegate.swift in Sources */,
291 | 0345AB60272FB84F007B20F9 /* SPDCounterTextChatCell.swift in Sources */,
292 | 0345AB61272FB84F007B20F9 /* SPDChatroomHeaderCell.swift in Sources */,
293 | 5F1B860B2891B198005F85AD /* DemoSAuthAPI.swift in Sources */,
294 | 0345AB5F272FB84F007B20F9 /* SPDChatroomNavigationTitleView.swift in Sources */,
295 | 0345AB62272FB84F007B20F9 /* SPDMyTextChatCell.swift in Sources */,
296 | 0345AB5D272FB84F007B20F9 /* SPDMyStickerChatCell.swift in Sources */,
297 | 5FDC4C9528641F5F006D3D12 /* ColorEnum.swift in Sources */,
298 | 0345AB5E272FB84F007B20F9 /* SPDCounterStickerChatCell.swift in Sources */,
299 | 0345AB5A272FB84F007B20F9 /* SPDMainViewController.swift in Sources */,
300 | 5F1B860D2891B1A2005F85AD /* DemoSAuthAPI_access_token.swift in Sources */,
301 | 5F1B860F2891B1AA005F85AD /* DemoSAuthManager.swift in Sources */,
302 | );
303 | runOnlyForDeploymentPostprocessing = 0;
304 | };
305 | /* End PBXSourcesBuildPhase section */
306 |
307 | /* Begin PBXVariantGroup section */
308 | 0345AB3B272FB80D007B20F9 /* Main.storyboard */ = {
309 | isa = PBXVariantGroup;
310 | children = (
311 | 0345AB3C272FB80D007B20F9 /* Base */,
312 | 03C1CFDA2732487800C16DE6 /* ko */,
313 | 03C1CFDC273248AB00C16DE6 /* zh-Hans */,
314 | 03C1CFDE273248B200C16DE6 /* zh-Hant */,
315 | 03C1CFE0273248E500C16DE6 /* fr */,
316 | 0358A21227585E5100299464 /* vi */,
317 | 039EBAC7276B177700015364 /* hi */,
318 | );
319 | name = Main.storyboard;
320 | sourceTree = "";
321 | };
322 | 0345AB40272FB80F007B20F9 /* LaunchScreen.storyboard */ = {
323 | isa = PBXVariantGroup;
324 | children = (
325 | 0345AB41272FB80F007B20F9 /* Base */,
326 | 03C1CFDB2732487800C16DE6 /* ko */,
327 | 03C1CFDD273248AB00C16DE6 /* zh-Hans */,
328 | 03C1CFDF273248B200C16DE6 /* zh-Hant */,
329 | 03C1CFE1273248E500C16DE6 /* fr */,
330 | 0358A21327585E5200299464 /* vi */,
331 | 039EBAC8276B177700015364 /* hi */,
332 | );
333 | name = LaunchScreen.storyboard;
334 | sourceTree = "";
335 | };
336 | /* End PBXVariantGroup section */
337 |
338 | /* Begin XCBuildConfiguration section */
339 | 0345AB44272FB80F007B20F9 /* Debug */ = {
340 | isa = XCBuildConfiguration;
341 | buildSettings = {
342 | ALWAYS_SEARCH_USER_PATHS = NO;
343 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
344 | CLANG_ANALYZER_NONNULL = YES;
345 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
346 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
347 | CLANG_CXX_LIBRARY = "libc++";
348 | CLANG_ENABLE_MODULES = YES;
349 | CLANG_ENABLE_OBJC_ARC = YES;
350 | CLANG_ENABLE_OBJC_WEAK = YES;
351 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
352 | CLANG_WARN_BOOL_CONVERSION = YES;
353 | CLANG_WARN_COMMA = YES;
354 | CLANG_WARN_CONSTANT_CONVERSION = YES;
355 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
356 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
357 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
358 | CLANG_WARN_EMPTY_BODY = YES;
359 | CLANG_WARN_ENUM_CONVERSION = YES;
360 | CLANG_WARN_INFINITE_RECURSION = YES;
361 | CLANG_WARN_INT_CONVERSION = YES;
362 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
363 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
364 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
365 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
366 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
367 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
368 | CLANG_WARN_STRICT_PROTOTYPES = YES;
369 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
370 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
371 | CLANG_WARN_UNREACHABLE_CODE = YES;
372 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
373 | COPY_PHASE_STRIP = NO;
374 | DEBUG_INFORMATION_FORMAT = dwarf;
375 | ENABLE_STRICT_OBJC_MSGSEND = YES;
376 | ENABLE_TESTABILITY = YES;
377 | GCC_C_LANGUAGE_STANDARD = gnu11;
378 | GCC_DYNAMIC_NO_PIC = NO;
379 | GCC_NO_COMMON_BLOCKS = YES;
380 | GCC_OPTIMIZATION_LEVEL = 0;
381 | GCC_PREPROCESSOR_DEFINITIONS = (
382 | "DEBUG=1",
383 | "$(inherited)",
384 | );
385 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
386 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
387 | GCC_WARN_UNDECLARED_SELECTOR = YES;
388 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
389 | GCC_WARN_UNUSED_FUNCTION = YES;
390 | GCC_WARN_UNUSED_VARIABLE = YES;
391 | IPHONEOS_DEPLOYMENT_TARGET = 15.0;
392 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
393 | MTL_FAST_MATH = YES;
394 | ONLY_ACTIVE_ARCH = YES;
395 | SDKROOT = iphoneos;
396 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
397 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
398 | };
399 | name = Debug;
400 | };
401 | 0345AB45272FB80F007B20F9 /* Release */ = {
402 | isa = XCBuildConfiguration;
403 | buildSettings = {
404 | ALWAYS_SEARCH_USER_PATHS = NO;
405 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
406 | CLANG_ANALYZER_NONNULL = YES;
407 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
408 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
409 | CLANG_CXX_LIBRARY = "libc++";
410 | CLANG_ENABLE_MODULES = YES;
411 | CLANG_ENABLE_OBJC_ARC = YES;
412 | CLANG_ENABLE_OBJC_WEAK = YES;
413 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
414 | CLANG_WARN_BOOL_CONVERSION = YES;
415 | CLANG_WARN_COMMA = YES;
416 | CLANG_WARN_CONSTANT_CONVERSION = YES;
417 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
418 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
419 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
420 | CLANG_WARN_EMPTY_BODY = YES;
421 | CLANG_WARN_ENUM_CONVERSION = YES;
422 | CLANG_WARN_INFINITE_RECURSION = YES;
423 | CLANG_WARN_INT_CONVERSION = YES;
424 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
425 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
426 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
427 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
428 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
429 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
430 | CLANG_WARN_STRICT_PROTOTYPES = YES;
431 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
432 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
433 | CLANG_WARN_UNREACHABLE_CODE = YES;
434 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
435 | COPY_PHASE_STRIP = NO;
436 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
437 | ENABLE_NS_ASSERTIONS = NO;
438 | ENABLE_STRICT_OBJC_MSGSEND = YES;
439 | GCC_C_LANGUAGE_STANDARD = gnu11;
440 | GCC_NO_COMMON_BLOCKS = YES;
441 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
442 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
443 | GCC_WARN_UNDECLARED_SELECTOR = YES;
444 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
445 | GCC_WARN_UNUSED_FUNCTION = YES;
446 | GCC_WARN_UNUSED_VARIABLE = YES;
447 | IPHONEOS_DEPLOYMENT_TARGET = 15.0;
448 | MTL_ENABLE_DEBUG_INFO = NO;
449 | MTL_FAST_MATH = YES;
450 | SDKROOT = iphoneos;
451 | SWIFT_COMPILATION_MODE = wholemodule;
452 | SWIFT_OPTIMIZATION_LEVEL = "-O";
453 | VALIDATE_PRODUCT = YES;
454 | };
455 | name = Release;
456 | };
457 | 0345AB47272FB80F007B20F9 /* Debug */ = {
458 | isa = XCBuildConfiguration;
459 | buildSettings = {
460 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
461 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
462 | CODE_SIGN_STYLE = Automatic;
463 | CURRENT_PROJECT_VERSION = 1;
464 | DEVELOPMENT_TEAM = 2R37F73YB9;
465 | GENERATE_INFOPLIST_FILE = YES;
466 | INFOPLIST_FILE = StipopDemo/Info.plist;
467 | INFOPLIST_KEY_CFBundleDisplayName = "Stipop SDK Demo";
468 | INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
469 | INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
470 | INFOPLIST_KEY_UIMainStoryboardFile = Main;
471 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
472 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
473 | LD_RUNPATH_SEARCH_PATHS = (
474 | "$(inherited)",
475 | "@executable_path/Frameworks",
476 | );
477 | MARKETING_VERSION = 1.0;
478 | PRODUCT_BUNDLE_IDENTIFIER = "com.stipop.ios-sdk.StipopDemo";
479 | PRODUCT_NAME = "$(TARGET_NAME)";
480 | SWIFT_EMIT_LOC_STRINGS = YES;
481 | SWIFT_VERSION = 5.0;
482 | TARGETED_DEVICE_FAMILY = "1,2";
483 | };
484 | name = Debug;
485 | };
486 | 0345AB48272FB80F007B20F9 /* Release */ = {
487 | isa = XCBuildConfiguration;
488 | buildSettings = {
489 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
490 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
491 | CODE_SIGN_STYLE = Automatic;
492 | CURRENT_PROJECT_VERSION = 1;
493 | DEVELOPMENT_TEAM = 2R37F73YB9;
494 | GENERATE_INFOPLIST_FILE = YES;
495 | INFOPLIST_FILE = StipopDemo/Info.plist;
496 | INFOPLIST_KEY_CFBundleDisplayName = "Stipop SDK Demo";
497 | INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
498 | INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
499 | INFOPLIST_KEY_UIMainStoryboardFile = Main;
500 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
501 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
502 | LD_RUNPATH_SEARCH_PATHS = (
503 | "$(inherited)",
504 | "@executable_path/Frameworks",
505 | );
506 | MARKETING_VERSION = 1.0;
507 | PRODUCT_BUNDLE_IDENTIFIER = "com.stipop.ios-sdk.StipopDemo";
508 | PRODUCT_NAME = "$(TARGET_NAME)";
509 | SWIFT_EMIT_LOC_STRINGS = YES;
510 | SWIFT_VERSION = 5.0;
511 | TARGETED_DEVICE_FAMILY = "1,2";
512 | };
513 | name = Release;
514 | };
515 | /* End XCBuildConfiguration section */
516 |
517 | /* Begin XCConfigurationList section */
518 | 0345AB2D272FB80D007B20F9 /* Build configuration list for PBXProject "StipopDemo" */ = {
519 | isa = XCConfigurationList;
520 | buildConfigurations = (
521 | 0345AB44272FB80F007B20F9 /* Debug */,
522 | 0345AB45272FB80F007B20F9 /* Release */,
523 | );
524 | defaultConfigurationIsVisible = 0;
525 | defaultConfigurationName = Release;
526 | };
527 | 0345AB46272FB80F007B20F9 /* Build configuration list for PBXNativeTarget "StipopDemo" */ = {
528 | isa = XCConfigurationList;
529 | buildConfigurations = (
530 | 0345AB47272FB80F007B20F9 /* Debug */,
531 | 0345AB48272FB80F007B20F9 /* Release */,
532 | );
533 | defaultConfigurationIsVisible = 0;
534 | defaultConfigurationName = Release;
535 | };
536 | /* End XCConfigurationList section */
537 |
538 | /* Begin XCRemoteSwiftPackageReference section */
539 | 23AC95712844A28600200E93 /* XCRemoteSwiftPackageReference "stipop-ios-sdk" */ = {
540 | isa = XCRemoteSwiftPackageReference;
541 | repositoryURL = "https://github.com/stipop-development/stipop-ios-sdk.git";
542 | requirement = {
543 | branch = main;
544 | kind = branch;
545 | };
546 | };
547 | 5F05EFC32891B2CD00E526FC /* XCRemoteSwiftPackageReference "Alamofire" */ = {
548 | isa = XCRemoteSwiftPackageReference;
549 | repositoryURL = "https://github.com/Alamofire/Alamofire.git";
550 | requirement = {
551 | kind = upToNextMajorVersion;
552 | minimumVersion = 5.0.0;
553 | };
554 | };
555 | /* End XCRemoteSwiftPackageReference section */
556 |
557 | /* Begin XCSwiftPackageProductDependency section */
558 | 23AC95722844A28700200E93 /* Stipop */ = {
559 | isa = XCSwiftPackageProductDependency;
560 | package = 23AC95712844A28600200E93 /* XCRemoteSwiftPackageReference "stipop-ios-sdk" */;
561 | productName = Stipop;
562 | };
563 | 5F05EFC42891B2CD00E526FC /* Alamofire */ = {
564 | isa = XCSwiftPackageProductDependency;
565 | package = 5F05EFC32891B2CD00E526FC /* XCRemoteSwiftPackageReference "Alamofire" */;
566 | productName = Alamofire;
567 | };
568 | /* End XCSwiftPackageProductDependency section */
569 | };
570 | rootObject = 0345AB2A272FB80D007B20F9 /* Project object */;
571 | }
572 |
--------------------------------------------------------------------------------
/StipopDemo/View/SPDChatroomViewController/SPDChatroomViewController.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
51 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 |
127 |
128 |
129 |
130 |
131 |
132 |
133 |
134 |
135 |
136 |
137 |
138 |
139 |
140 |
141 |
142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 |
160 |
173 |
174 |
175 |
176 |
177 |
178 |
179 |
180 |
181 |
182 |
183 |
184 |
185 |
186 |
187 |
188 |
189 |
190 |
191 |
192 |
193 |
194 |
195 |
201 |
202 |
203 |
204 |
205 |
206 |
207 |
208 |
209 |
210 |
211 |
212 |
213 |
214 |
215 |
216 |
217 |
218 |
219 |
220 |
221 |
222 |
223 |
224 |
225 |
226 |
227 |
228 |
229 |
230 |
231 |
232 |
233 |
234 |
235 |
236 |
237 |
238 |
239 |
240 |
241 |
242 |
243 |
244 |
245 |
246 |
247 |
248 |
249 |
250 |
251 |
252 |
253 |
254 |
255 |
256 |
257 |
258 |
259 |
260 |
261 |
262 |
263 |
264 |
265 |
266 |
267 |
268 |
276 |
277 |
278 |
279 |
280 |
281 |
282 |
283 |
284 |
285 |
286 |
287 |
288 |
289 |
290 |
303 |
304 |
305 |
306 |
307 |
308 |
309 |
310 |
311 |
312 |
313 |
314 |
315 |
316 |
317 |
318 |
319 |
320 |
321 |
322 |
323 |
324 |
325 |
326 |
327 |
328 |
329 |
330 |
331 |
332 |
333 |
334 |
335 |
336 |
337 |
338 |
339 |
340 |
341 |
342 |
343 |
344 |
345 |
346 |
347 |
348 |
349 |
350 |
351 |
352 |
353 |
354 |
355 |
356 |
357 |
358 |
359 |
360 |
361 |
362 |
363 |
364 |
365 |
366 |
367 |
368 |
369 |
370 |
376 |
382 |
383 |
384 |
385 |
386 |
387 |
388 |
389 |
390 |
391 |
392 |
393 |
394 |
395 |
396 |
397 |
398 |
399 |
400 |
401 |
402 |
403 |
404 |
405 |
406 |
407 |
408 |
409 |
410 |
411 |
412 |
413 |
414 |
415 |
416 |
417 |
418 |
419 |
420 |
421 |
422 |
423 |
424 |
425 |
426 |
427 |
428 |
429 |
430 |
431 |
432 |
433 |
434 |
435 |
436 |
437 |
438 |
439 |
440 |
441 |
442 |
443 |
444 |
445 |
446 |
447 |
448 |
449 |
450 |
451 |
452 |
453 |
454 |
--------------------------------------------------------------------------------