├── 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 | ![Cover image](https://user-images.githubusercontent.com/30883319/139041228-f88b6e2f-4523-4d56-913e-927956e88dc6.png) 3 | 4 | # Stipop UI SDK for iOS 5 | 6 | ![Release](https://img.shields.io/github/v/release/stipop-development/stipop-ios-sdk?sort=semver&style=flat&label=release) 7 | ![Beta](https://img.shields.io/github/v/release/stipop-development/stipop-ios-sdk?include_prereleases&sort=semver&style=flat&label=beta) 8 | [![SwiftPM compatible](https://img.shields.io/badge/SwiftPM-compatible-green.svg?style=flat)](https://swift.org/package-manager/) 9 | [![CocoaPods compatible](https://img.shields.io/badge/CocoaPods-compatible-green.svg?style=flat)](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 | ![screenshot](https://user-images.githubusercontent.com/30883319/138623975-d5666bad-e0b4-405b-beaf-ed233e376135.png) 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 | ![Cover image](https://user-images.githubusercontent.com/30883319/139041228-f88b6e2f-4523-4d56-913e-927956e88dc6.png) 3 | 4 | # Stipop UI SDK for iOS 5 | 6 | ![Release](https://img.shields.io/github/v/release/stipop-development/stipop-ios-sdk?sort=semver&style=flat&label=release) 7 | ![Beta](https://img.shields.io/github/v/release/stipop-development/stipop-ios-sdk?include_prereleases&sort=semver&style=flat&label=beta) 8 | [![SwiftPM compatible](https://img.shields.io/badge/SwiftPM-compatible-green.svg?style=flat)](https://swift.org/package-manager/) 9 | [![CocoaPods compatible](https://img.shields.io/badge/CocoaPods-compatible-green.svg?style=flat)](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 | ![screenshot](https://user-images.githubusercontent.com/30883319/138623975-d5666bad-e0b4-405b-beaf-ed233e376135.png) 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 | 3 | Group 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 | -------------------------------------------------------------------------------- /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 | --------------------------------------------------------------------------------