├── .gitignore
├── ContacterModule
├── DB
│ └── JCVerificationInfoDB.swift
├── Model
│ └── JCVerificationInfo.swift
├── View
│ ├── JCContacterCell.swift
│ ├── JCDoubleButtonCell.swift
│ ├── JCResaonCell.swift
│ ├── JCSearchController.swift
│ ├── JCTableViewCell.swift
│ ├── JCUserAvatorCell.swift
│ ├── JCUserInfoCell.swift
│ └── JCVerificationCell.swift
└── ViewController
│ ├── JCAddFriendViewController.swift
│ ├── JCContactsViewController.swift
│ ├── JCFriendSettingViewController.swift
│ ├── JCGroupDescViewController.swift
│ ├── JCGroupListViewController.swift
│ ├── JCGroupNameViewController.swift
│ ├── JCIdentityVerificationViewController.swift
│ ├── JCMoreResultViewController.swift
│ ├── JCSearchFriendViewController.swift
│ ├── JCSearchResultViewController.swift
│ ├── JCUserInfoViewController.swift
│ └── JCVerificationDetailViewController.swift
├── Images
├── 1.gif
└── 2.jpg
├── JChat.xcodeproj
├── project.pbxproj
└── project.xcworkspace
│ └── contents.xcworkspacedata
├── JChat.xcworkspace
├── contents.xcworkspacedata
└── xcshareddata
│ └── IDEWorkspaceChecks.plist
├── JChat
├── AppDelegate.swift
├── Assets.xcassets
│ ├── AppIcon.appiconset
│ │ ├── Contents.json
│ │ ├── iOS icon 120.png
│ │ └── iOS icon 180.png
│ ├── Contents.json
│ └── LaunchImage.launchimage
│ │ ├── Contents.json
│ │ ├── ios_1125_2436.png
│ │ ├── ios_1242-2208.png
│ │ ├── ios_640-1136.png
│ │ ├── ios_640-960-copy.png
│ │ └── ios_750-1334.png
├── Info.plist
├── JChat-Bridging-Header.h
├── JChat.entitlements
├── Resources
│ ├── Themes
│ │ └── emoticons.bundle
│ │ │ ├── cn.com.a-li
│ │ │ ├── 285f3a4de507b1bd33c450aa7c003924@2x.png
│ │ │ ├── 29cce34d5eefcb45926e85bec21ed2da@2x.png
│ │ │ ├── 7102df423b57a50c8ab077b6f0358f18@2x.png
│ │ │ ├── 74e369456ef0626c6c1a4c0e16994b9d@2x.png
│ │ │ ├── 7ae989bacebdc5cdaf73293023b19b3c@2x.png
│ │ │ ├── 84c4b60449c26dfebf83bda748be7853@2x.png
│ │ │ ├── 940a83613ff938fb86f857c3baa0eeed@2x.png
│ │ │ ├── Info.plist
│ │ │ ├── aa50438bcbd8542b7eb05163d9506482@2x.png
│ │ │ ├── f89ac3021df353b3c16b39e9725793c0@2x.png
│ │ │ ├── fbd44750aeb9790f80f420bc333b221e@2x.png
│ │ │ └── icon@2x.png
│ │ │ ├── cn.jchat.guangguang
│ │ │ ├── 01@3x.png
│ │ │ ├── 02@3x.png
│ │ │ ├── 03@3x.png
│ │ │ ├── 04@3x.png
│ │ │ ├── 05@3x.png
│ │ │ ├── 06@3x.png
│ │ │ ├── 07@3x.png
│ │ │ ├── 08@3x.png
│ │ │ ├── 09@3x.png
│ │ │ ├── 10@3x.png
│ │ │ ├── 11@3x.png
│ │ │ ├── 12@3x.png
│ │ │ ├── 13@3x.png
│ │ │ ├── 14@3x.png
│ │ │ ├── 15@3x.png
│ │ │ ├── 16@3x.png
│ │ │ ├── 17@3x.png
│ │ │ ├── 18@3x.png
│ │ │ ├── 19@3x.png
│ │ │ ├── 20@3x.png
│ │ │ ├── 21@3x.png
│ │ │ ├── 22@3x.png
│ │ │ ├── 23@3x.png
│ │ │ ├── 24@3x.png
│ │ │ ├── Info.plist
│ │ │ └── icon.png
│ │ │ ├── com.apple.emoji
│ │ │ ├── Info.plist
│ │ │ └── icon@2x.png
│ │ │ ├── com.qq.classic
│ │ │ ├── 001@2x.png
│ │ │ ├── 002@2x.png
│ │ │ ├── 003@2x.png
│ │ │ ├── 004@2x.png
│ │ │ ├── 005@2x.png
│ │ │ ├── 006@2x.png
│ │ │ ├── 007@2x.png
│ │ │ ├── 008@2x.png
│ │ │ ├── 009@2x.png
│ │ │ ├── 010@2x.png
│ │ │ ├── 011@2x.png
│ │ │ ├── 012@2x.png
│ │ │ ├── 013@2x.png
│ │ │ ├── 014@2x.png
│ │ │ ├── 015@2x.png
│ │ │ ├── 016@2x.png
│ │ │ ├── 017@2x.png
│ │ │ ├── 018@2x.png
│ │ │ ├── 019@2x.png
│ │ │ ├── 020@2x.png
│ │ │ ├── 021@2x.png
│ │ │ ├── 022@2x.png
│ │ │ ├── 023@2x.png
│ │ │ ├── 024@2x.png
│ │ │ ├── 025@2x.png
│ │ │ ├── 026@2x.png
│ │ │ ├── 027@2x.png
│ │ │ ├── 028@2x.png
│ │ │ ├── 029@2x.png
│ │ │ ├── 030@2x.png
│ │ │ ├── 031@2x.png
│ │ │ ├── 032@2x.png
│ │ │ ├── 033@2x.png
│ │ │ ├── 034@2x.png
│ │ │ ├── 035@2x.png
│ │ │ ├── 036@2x.png
│ │ │ ├── 037@2x.png
│ │ │ ├── 038@2x.png
│ │ │ ├── 039@2x.png
│ │ │ ├── 040@2x.png
│ │ │ ├── 041@2x.png
│ │ │ ├── 042@2x.png
│ │ │ ├── 043@2x.png
│ │ │ ├── 044@2x.png
│ │ │ ├── 045@2x.png
│ │ │ ├── 046@2x.png
│ │ │ ├── 047@2x.png
│ │ │ ├── 048@2x.png
│ │ │ ├── 049@2x.png
│ │ │ ├── 050@2x.png
│ │ │ ├── 051@2x.png
│ │ │ ├── 052@2x.png
│ │ │ ├── 053@2x.png
│ │ │ ├── 054@2x.png
│ │ │ ├── 055@2x.png
│ │ │ ├── 056@2x.png
│ │ │ ├── 057@2x.png
│ │ │ ├── 058@2x.png
│ │ │ ├── 059@2x.png
│ │ │ ├── 060@2x.png
│ │ │ ├── 061@2x.png
│ │ │ ├── 062@2x.png
│ │ │ ├── 063@2x.png
│ │ │ ├── 064@2x.png
│ │ │ ├── 065@2x.png
│ │ │ ├── 066@2x.png
│ │ │ ├── 067@2x.png
│ │ │ ├── 068@2x.png
│ │ │ ├── 069@2x.png
│ │ │ ├── 070@2x.png
│ │ │ ├── 071@2x.png
│ │ │ ├── 072@2x.png
│ │ │ ├── 073@2x.png
│ │ │ ├── 074@2x.png
│ │ │ ├── 075@2x.png
│ │ │ ├── 076@2x.png
│ │ │ ├── 077@2x.png
│ │ │ ├── 078@2x.png
│ │ │ ├── 079@2x.png
│ │ │ ├── 080@2x.png
│ │ │ ├── 081@2x.png
│ │ │ ├── 082@2x.png
│ │ │ ├── 083@2x.png
│ │ │ ├── 084@2x.png
│ │ │ ├── 085@2x.png
│ │ │ ├── 086@2x.png
│ │ │ ├── 087@2x.png
│ │ │ ├── 088@2x.png
│ │ │ ├── 089@2x.png
│ │ │ ├── 090@2x.png
│ │ │ ├── 091@2x.png
│ │ │ ├── 092@2x.png
│ │ │ ├── 093@2x.png
│ │ │ ├── 094@2x.png
│ │ │ ├── 095@2x.png
│ │ │ ├── 096@2x.png
│ │ │ ├── 097@2x.png
│ │ │ ├── 098@2x.png
│ │ │ ├── 099@2x.png
│ │ │ ├── 100@2x.png
│ │ │ ├── 101@2x.png
│ │ │ ├── 102@2x.png
│ │ │ ├── 103@2x.png
│ │ │ ├── 104@2x.png
│ │ │ ├── 105@2x.png
│ │ │ ├── 106@2x.png
│ │ │ ├── 107@2x.png
│ │ │ ├── 108@2x.png
│ │ │ ├── 109@2x.png
│ │ │ ├── 110@2x.png
│ │ │ ├── 111@2x.png
│ │ │ ├── 112@2x.png
│ │ │ ├── 113@2x.png
│ │ │ ├── 114@2x.png
│ │ │ ├── 115@2x.png
│ │ │ ├── 116@2x.png
│ │ │ ├── 117@2x.png
│ │ │ ├── 118@2x.png
│ │ │ ├── 119@2x.png
│ │ │ ├── 120@2x.png
│ │ │ ├── 121@2x.png
│ │ │ ├── 122@2x.png
│ │ │ ├── 123@2x.png
│ │ │ ├── 124@2x.png
│ │ │ ├── 125@2x.png
│ │ │ ├── 126@2x.png
│ │ │ ├── 127@2x.png
│ │ │ ├── 128@2x.png
│ │ │ ├── 129@2x.png
│ │ │ ├── 130@2x.png
│ │ │ ├── 131@2x.png
│ │ │ ├── 132@2x.png
│ │ │ ├── 133@2x.png
│ │ │ ├── 134@2x.png
│ │ │ ├── 135@2x.png
│ │ │ ├── 136@2x.png
│ │ │ ├── 137@2x.png
│ │ │ ├── 138@2x.png
│ │ │ ├── 139@2x.png
│ │ │ ├── 140@2x.png
│ │ │ ├── 141@2x.png
│ │ │ ├── Info.plist
│ │ │ └── icon@2x.png
│ │ │ ├── emoticons.plist
│ │ │ └── icon
│ │ │ ├── com.apple.emoji@2x.png
│ │ │ └── com.qq.classic@2x.png
│ ├── yh_image_no_picked@2x.png
│ ├── yh_image_no_picked@3x.png
│ ├── yh_image_picked@2x.png
│ └── yh_image_picked@3x.png
└── Src
│ ├── ChatModule
│ ├── Chat
│ │ ├── Model
│ │ │ ├── JCCEmoticon.swift
│ │ │ ├── JCCEmoticonGroup.swift
│ │ │ ├── JCCEmoticonLarge.swift
│ │ │ ├── JCDraft.swift
│ │ │ ├── JCMessage.swift
│ │ │ └── JCRemind.swift
│ │ ├── Protocols
│ │ │ ├── JCMessageContentViewType.swift
│ │ │ ├── JCMessageOptions.swift
│ │ │ ├── JCMessageType.swift
│ │ │ └── JCUserType.swift
│ │ ├── View
│ │ │ ├── FileCell.swift
│ │ │ ├── GroupAvatorCell.swift
│ │ │ ├── ImageFileCell.swift
│ │ │ ├── ImageFileHeader.swift
│ │ │ ├── JCChatView.swift
│ │ │ ├── JCChatViewCell.swift
│ │ │ ├── JCChatViewData.swift
│ │ │ ├── JCChatViewLayout.swift
│ │ │ ├── JCChatViewLayoutAttributes.swift
│ │ │ ├── JCChatViewLayoutAttributesInfo.swift
│ │ │ ├── JCChatViewUpdate.swift
│ │ │ ├── JCConversationCell.swift
│ │ │ ├── JCGroupMemberCell.swift
│ │ │ ├── JCGroupSettingCell.swift
│ │ │ ├── JCMessageAvatarView.swift
│ │ │ ├── JCMessageCardView.swift
│ │ │ ├── JCMessageTipsView.swift
│ │ │ ├── JCNetworkTipsCell.swift
│ │ │ ├── JCSelectMemberCell.swift
│ │ │ ├── JCSingleSettingCell.swift
│ │ │ ├── JCUpdateMemberCell.swift
│ │ │ ├── Message
│ │ │ │ ├── JACMessageImageContentView.swift
│ │ │ │ ├── JCBusinessCardContent.swift
│ │ │ │ ├── JCBusinessCardContentView.swift
│ │ │ │ ├── JCMessageFileContent.swift
│ │ │ │ ├── JCMessageFileContentView.swift
│ │ │ │ ├── JCMessageImageContent.swift
│ │ │ │ ├── JCMessageLocationContent.swift
│ │ │ │ ├── JCMessageLocationContentView.swift
│ │ │ │ ├── JCMessageNoticeContent.swift
│ │ │ │ ├── JCMessageNoticeContentView.swift
│ │ │ │ ├── JCMessageTextContent.swift
│ │ │ │ ├── JCMessageTextContentView.swift
│ │ │ │ ├── JCMessageTimeLineContent.swift
│ │ │ │ ├── JCMessageTimeLineContentView.swift
│ │ │ │ ├── JCMessageVideoContent.swift
│ │ │ │ ├── JCMessageVideoContentView.swift
│ │ │ │ ├── JCMessageVoiceContent.swift
│ │ │ │ └── JCMessageVoiceContentView.swift
│ │ │ └── MorePopupView.swift
│ │ └── ViewController
│ │ │ ├── FileManagerViewController.swift
│ │ │ ├── FileViewController.swift
│ │ │ ├── FriendsBusinessCardViewController.swift
│ │ │ ├── GroupAvatorViewController.swift
│ │ │ ├── ImageFileViewController.swift
│ │ │ ├── JCChatViewController.swift
│ │ │ ├── JCConversationListViewController.swift
│ │ │ ├── JCDocumentViewController.swift
│ │ │ ├── JCFileDownloadViewController.swift
│ │ │ ├── JCForwardViewController.swift
│ │ │ ├── JCGroupMembersViewController.swift
│ │ │ ├── JCGroupSettingViewController.swift
│ │ │ ├── JCRemindListViewController.swift
│ │ │ ├── JCRemoveMemberViewController.swift
│ │ │ ├── JCSingleSettingViewController.swift
│ │ │ ├── JCUpdateMemberViewController.swift
│ │ │ ├── ScanQRCodeViewController.swift
│ │ │ └── UnreadListViewController.swift
│ └── Input
│ │ ├── InputView
│ │ └── Emoticon
│ │ │ ├── JCEmoticon.swift
│ │ │ ├── JCEmoticonBackgroundView.swift
│ │ │ ├── JCEmoticonGroup.swift
│ │ │ ├── JCEmoticonInputView.swift
│ │ │ ├── JCEmoticonInputViewLayout.swift
│ │ │ ├── JCEmoticonLine.swift
│ │ │ ├── JCEmoticonPage.swift
│ │ │ ├── JCEmoticonPageView.swift
│ │ │ ├── JCEmoticonPreviewer.swift
│ │ │ └── JCEmoticonTabItemView.swift
│ │ └── Map
│ │ ├── JCAddMapViewController.h
│ │ ├── JCAddMapViewController.mm
│ │ ├── Resources
│ │ ├── icon_baidu_marker.png
│ │ ├── jiantou2@2x.png
│ │ ├── 定位1.png
│ │ └── 定位2.png
│ │ └── View
│ │ ├── AddMapTableViewCell.h
│ │ ├── AddMapTableViewCell.m
│ │ └── AddMapTableViewCell.xib
│ ├── ChatRoomModule
│ ├── View
│ │ ├── JCChatRoomInfoCell.swift
│ │ ├── JCChatRoomListTableViewCell.swift
│ │ └── JCChatRoomManagerListCell.swift
│ └── ViewController
│ │ ├── JCCRSearchResultViewController.swift
│ │ ├── JCChatRoomAddManagerViewController.swift
│ │ ├── JCChatRoomBlackOrSilentListViewController.swift
│ │ ├── JCChatRoomChangeOwnerViewController.swift
│ │ ├── JCChatRoomChatViewController.swift
│ │ ├── JCChatRoomInfoTableViewController.swift
│ │ ├── JCChatRoomInfoTableViewController.xib
│ │ ├── JCChatRoomIntroduceViewController.swift
│ │ ├── JCChatRoomIntroduceViewController.xib
│ │ ├── JCChatRoomListViewController.swift
│ │ ├── JCChatRoomManagerListViewController.swift
│ │ ├── JCChatRoomNameInfoViewController.swift
│ │ ├── JCChatRoomNameInfoViewController.xib
│ │ └── JCSearchUserViewController.swift
│ ├── ContacterModule
│ ├── View
│ │ └── JCSearchController.swift
│ └── ViewController
│ │ └── JCMoreResultViewController.swift
│ ├── MainModule
│ └── ViewController
│ │ ├── JCMainTabBarController.swift
│ │ └── JCNavigationController.swift
│ ├── UserModule
│ ├── Model
│ │ └── UserDefaultValidationService.swift
│ ├── Protocols
│ │ └── UserProtocols.swift
│ ├── View
│ │ ├── JCButtonCell.swift
│ │ ├── JCDatePickerViwe.swift
│ │ ├── JCJChatInfoCell.swift
│ │ ├── JCMineAvatorCell.swift
│ │ ├── JCMineInfoCell.swift
│ │ ├── JCMyAvatorCell.swift
│ │ ├── JCMyInfoCell.swift
│ │ └── JCPhotoBar.swift
│ └── ViewController
│ │ ├── JCFeedbackViewController.swift
│ │ ├── JCJChatInfoViewController.swift
│ │ ├── JCLoginViewController.swift
│ │ ├── JCMineViewController.swift
│ │ ├── JCMyInfoViewController.swift
│ │ ├── JCNicknameViewController.swift
│ │ ├── JCNoteNameViewController.swift
│ │ ├── JCRegisterInfoViewController.swift
│ │ ├── JCRegisterViewController.swift
│ │ ├── JCSignatureViewController.swift
│ │ ├── JCUpdatePassworkViewController.swift
│ │ └── MyQRCodeViewController.swift
│ └── Utilites
│ ├── 3rdParty
│ ├── AreaPickerView
│ │ ├── JCAreaPickerView.swift
│ │ ├── JCLocation.swift
│ │ ├── addressCode
│ │ └── area.plist
│ ├── DLSlideView
│ │ ├── DLCache
│ │ │ ├── DLCacheProtocol.h
│ │ │ ├── DLLRUCache.h
│ │ │ └── DLLRUCache.m
│ │ ├── DLCustomSlideView.h
│ │ ├── DLCustomSlideView.m
│ │ ├── DLSlideView.h
│ │ ├── DLSlideView.m
│ │ ├── DLTabbarView
│ │ │ ├── DLFixedTabbarView.h
│ │ │ ├── DLFixedTabbarView.m
│ │ │ ├── DLScrollTabbarView.h
│ │ │ ├── DLScrollTabbarView.m
│ │ │ └── DLSlideTabbarProtocol.h
│ │ ├── DLTabedSlideView.h
│ │ ├── DLTabedSlideView.m
│ │ ├── DLUtility.h
│ │ └── DLUtility.m
│ ├── ImageBrowser
│ │ ├── JCImageBrowserViewController.swift
│ │ ├── JCMessageImageCollectionViewCell.swift
│ │ └── JCMessageImageCollectionViewCell.xib
│ ├── InputBar
│ │ ├── SAIInputAccessoryView.swift
│ │ ├── SAIInputAccessoryViewLayout.swift
│ │ ├── SAIInputBackgroundView.swift
│ │ ├── SAIInputBar+Resource.swift
│ │ ├── SAIInputBar.swift
│ │ ├── SAIInputBarDisplayable.swift
│ │ ├── SAIInputItem.swift
│ │ ├── SAIInputItemView.swift
│ │ ├── SAIInputTextField.swift
│ │ ├── SAIInputTextFieldItem.swift
│ │ ├── SAIInputView.swift
│ │ ├── SAIToolboxInputView.swift
│ │ ├── SAIToolboxInputViewLayout.swift
│ │ ├── SAIToolboxItem.swift
│ │ └── SAIToolboxItemView.swift
│ ├── KILabel
│ │ ├── KILabel.h
│ │ └── KILabel.m
│ └── RecordVoice
│ │ ├── JCAudioPlayerHelper.swift
│ │ ├── JCRecordVoiceHelper.swift
│ │ └── JCRecordingView.swift
│ ├── ExJMessage
│ ├── Core
│ │ └── ExJMessage.swift
│ └── Extensions
│ │ ├── JMSGConversation+.swift
│ │ ├── JMSGMessage+.swift
│ │ └── JMSGOptionalContent+.swift
│ ├── Extension
│ ├── Array+JChat.swift
│ ├── Date+JChat.swift
│ ├── MBProgressHUD+JChat.swift
│ ├── NSLayoutConstraint+JChat.swift
│ ├── String+JChat.swift
│ ├── UIColor+JChat.swift
│ ├── UIImage+JChat.swift
│ ├── UISearchBar+JChat.swift
│ ├── UITextInput+JChat.swift
│ ├── UIView+JChat.swift
│ └── UIViewController+JChat.swift
│ ├── NetworkManager
│ └── JCNetworkManager.swift
│ ├── Reachability
│ ├── Reachability.h
│ └── Reachability.m
│ ├── RxSwift
│ └── Operators.swift
│ ├── ThemeManager
│ ├── Extensions.swift
│ ├── Protocols.swift
│ ├── ThemeManager.swift
│ ├── blackTheme.bundle
│ │ └── themeColor.txt
│ └── defaultTheme.bundle
│ │ ├── image
│ │ ├── YH_KB_Emotion@3x.png
│ │ ├── YH_KB_EmotionHL@3x.png
│ │ ├── YH_KB_Keyboard@3x.png
│ │ ├── YH_KB_KeyboardHL@3x.png
│ │ ├── YH_KB_More@3x.png
│ │ ├── YH_KB_MoreHL@3x.png
│ │ ├── YH_KB_Voice@3x.png
│ │ ├── YH_KB_VoiceHL@3x.png
│ │ ├── chat_bubble_recive_nor@3x.png
│ │ ├── chat_bubble_recive_press@3x.png
│ │ ├── chat_bubble_send_nor@3x.png
│ │ ├── chat_bubble_send_press@3x.png
│ │ ├── chat_emoticon_btn_send_blue@2x.png
│ │ ├── chat_emoticon_btn_send_blue_h@2x.png
│ │ ├── chat_emoticon_btn_send_gray@2x.png
│ │ ├── chat_emoticon_btn_setting@2x.png
│ │ ├── chat_tool_businessCard@3x.png
│ │ ├── chat_tool_camera@3x.png
│ │ ├── chat_tool_location@3x.png
│ │ ├── chat_tool_pic@3x.png
│ │ ├── chat_tool_video_short@3x.png
│ │ ├── chat_voice_receive_icon_1@3x.png
│ │ ├── chat_voice_receive_icon_2@3x.png
│ │ ├── chat_voice_receive_icon_3@3x.png
│ │ ├── chat_voice_send_icon_1@3x.png
│ │ ├── chat_voice_send_icon_2@3x.png
│ │ ├── chat_voice_send_icon_3@3x.png
│ │ ├── com_icon _selectList@3x.png
│ │ ├── com_icon_80@3x.png
│ │ ├── com_icon_about@3x.png
│ │ ├── com_icon_add@3x.png
│ │ ├── com_icon_add_65@3x.png
│ │ ├── com_icon_add_65_pre@3x.png
│ │ ├── com_icon_artboard@3x.png
│ │ ├── com_icon_back@3x.png
│ │ ├── com_icon_back_pre@3x.png
│ │ ├── com_icon_birthday@3x.png
│ │ ├── com_icon_chat@3x.png
│ │ ├── com_icon_chat_pre@3x.png
│ │ ├── com_icon_chatroom@3x.png
│ │ ├── com_icon_chatroom_pre@3x.png
│ │ ├── com_icon_contacter@3x.png
│ │ ├── com_icon_contacter_pre@3x.png
│ │ ├── com_icon_conv_group@3x.png
│ │ ├── com_icon_conv_single@3x.png
│ │ ├── com_icon_file_file@3x.png
│ │ ├── com_icon_file_file_75@3x.png
│ │ ├── com_icon_file_more@3x.png
│ │ ├── com_icon_file_more_pre@3x.png
│ │ ├── com_icon_file_music@3x.png
│ │ ├── com_icon_file_other@3x.png
│ │ ├── com_icon_file_photo@3x.png
│ │ ├── com_icon_file_select@3x.png
│ │ ├── com_icon_file_unselect@3x.png
│ │ ├── com_icon_file_video@3x.png
│ │ ├── com_icon_friend_add@3x.png
│ │ ├── com_icon_friend_tip@3x.png
│ │ ├── com_icon_gender@3x.png
│ │ ├── com_icon_group_36@3x.png
│ │ ├── com_icon_group_50@3x.png
│ │ ├── com_icon_group_w@3x.png
│ │ ├── com_icon_isSelect@3x.png
│ │ ├── com_icon_mine@3x.png
│ │ ├── com_icon_mine_pre@3x.png
│ │ ├── com_icon_more@3x.png
│ │ ├── com_icon_nickname@3x.png
│ │ ├── com_icon_password@3x.png
│ │ ├── com_icon_password_pre@3x.png
│ │ ├── com_icon_play@3x.png
│ │ ├── com_icon_play_pre@3x.png
│ │ ├── com_icon_qrc_border@3x.png
│ │ ├── com_icon_qrc_line@3x.png
│ │ ├── com_icon_qrcode@3x.png
│ │ ├── com_icon_record@3x.png
│ │ ├── com_icon_record_cancel@3x.png
│ │ ├── com_icon_record_error@3x.png
│ │ ├── com_icon_region@3x.png
│ │ ├── com_icon_remove@3x.png
│ │ ├── com_icon_remove_pre@3x.png
│ │ ├── com_icon_scan@3x.png
│ │ ├── com_icon_select@3x.png
│ │ ├── com_icon_send_error@3x.png
│ │ ├── com_icon_shield@3x.png
│ │ ├── com_icon_signature@3x.png
│ │ ├── com_icon_single_add@3x.png
│ │ ├── com_icon_single_add_per@3x.png
│ │ ├── com_icon_unselect@3x.png
│ │ ├── com_icon_upload@3x.png
│ │ ├── com_icon_user_120@3x.png
│ │ ├── com_icon_user_18@3x.png
│ │ ├── com_icon_user_18_pre@3x.png
│ │ ├── com_icon_user_36@3x.png
│ │ ├── com_icon_user_40@3x.png
│ │ ├── com_icon_user_50@3x.png
│ │ ├── com_icon_user_65@3x.png
│ │ ├── com_icon_user_80@3x.png
│ │ ├── com_icon_user_w@3x.png
│ │ ├── com_icon_username@3x.png
│ │ ├── icon_icon_close@3x.png
│ │ ├── icon_icon_close_pre@3x.png
│ │ ├── icon_ios_add@3x.png
│ │ └── location_address@3x.png
│ │ └── themeColor.txt
│ └── Utility
│ ├── JCAlertView.swift
│ ├── JCAppManager.swift
│ ├── JCConstants.swift
│ ├── JCFPSLabel.swift
│ ├── JCFileManager.swift
│ ├── JCVideoManager.swift
│ └── Log.swift
├── JChatTests
├── Info.plist
└── JChatTests.swift
├── JChatUITests
├── Info.plist
└── JChatUITests.swift
├── LICENSE
├── Podfile
└── README.md
/.gitignore:
--------------------------------------------------------------------------------
1 | build/
2 | *.pbxuser
3 | !default.pbxuser
4 | *.mode1v3
5 | !default.mode1v3
6 | *.mode2v3
7 | !default.mode2v3
8 | *.perspectivev3
9 | !default.perspectivev3
10 | xcuserdata
11 | *.xccheckout
12 | *.moved-aside
13 | DerivedData
14 | *.hmap
15 | *.ipa
16 | *.xcuserstate
17 | Pods/
18 | Podfile.lock
19 |
20 |
--------------------------------------------------------------------------------
/ContacterModule/Model/JCVerificationInfo.swift:
--------------------------------------------------------------------------------
1 | //
2 | // JCVerificationInfo.swift
3 | // JChat
4 | //
5 | // Created by JIGUANG on 14/04/2017.
6 | // Copyright © 2017 HXHG. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 |
12 | enum JCVerificationType: Int {
13 | case wait
14 | case accept
15 | case reject
16 | case receive
17 | }
18 |
19 |
20 | class JCVerificationInfo: NSObject {
21 | var id = 0
22 | var username: String = ""
23 | var nickname: String = ""
24 | var appkey: String = ""
25 | var resaon: String = ""
26 | var state: Int = 0
27 |
28 | static func create(username: String, nickname: String?, appkey: String, resaon: String?, state: Int) -> JCVerificationInfo {
29 | let info = JCVerificationInfo()
30 | info.username = username
31 | info.nickname = nickname ?? ""
32 | info.appkey = appkey
33 | info.resaon = resaon ?? ""
34 | info.state = state
35 | return info
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/ContacterModule/View/JCResaonCell.swift:
--------------------------------------------------------------------------------
1 | //
2 | // JCResaonCell.swift
3 | // JChat
4 | //
5 | // Created by JIGUANG on 2017/5/25.
6 | // Copyright © 2017年 HXHG. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | class JCResaonCell: JCTableViewCell {
12 |
13 | var resaon: String? {
14 | get {
15 | return titleLabel.text
16 | }
17 | set {
18 | titleLabel.text = newValue
19 | }
20 | }
21 |
22 | override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
23 | super.init(style: style, reuseIdentifier: reuseIdentifier)
24 | _init()
25 | }
26 | required init?(coder aDecoder: NSCoder) {
27 | super.init(coder: aDecoder)
28 | _init()
29 | }
30 |
31 | override func awakeFromNib() {
32 | super.awakeFromNib()
33 | _init()
34 | }
35 |
36 | private lazy var titleLabel: UILabel = UILabel()
37 |
38 | private func _init() {
39 | titleLabel.font = UIFont.systemFont(ofSize: 14)
40 | titleLabel.textColor = UIColor(netHex: 0x999999)
41 |
42 | addSubview(titleLabel)
43 |
44 | addConstraint(_JCLayoutConstraintMake(titleLabel, .centerY, .equal, contentView, .centerY))
45 | addConstraint(_JCLayoutConstraintMake(titleLabel, .left, .equal, contentView, .left, 15))
46 | addConstraint(_JCLayoutConstraintMake(titleLabel, .right, .equal, contentView, .right, -15))
47 | addConstraint(_JCLayoutConstraintMake(titleLabel, .height, .equal, nil, .notAnAttribute, 20))
48 | }
49 |
50 | }
51 |
--------------------------------------------------------------------------------
/ContacterModule/View/JCTableViewCell.swift:
--------------------------------------------------------------------------------
1 | //
2 | // JCTableViewCell.swift
3 | // JChat
4 | //
5 | // Created by JIGUANG on 2017/4/6.
6 | // Copyright © 2017年 HXHG. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | class JCTableViewCell: UITableViewCell {
12 |
13 | override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
14 | super.init(style: style, reuseIdentifier: reuseIdentifier)
15 | _init()
16 | }
17 | required init?(coder aDecoder: NSCoder) {
18 | super.init(coder: aDecoder)
19 | _init()
20 | }
21 |
22 | override func awakeFromNib() {
23 | super.awakeFromNib()
24 | _init()
25 | }
26 |
27 | private lazy var line: UILabel = UILabel()
28 |
29 | private func _init() {
30 | line.backgroundColor = UIColor(netHex: 0xE8E8E8)
31 | line.layer.backgroundColor = UIColor(netHex: 0xE8E8E8).cgColor
32 |
33 | addSubview(line)
34 |
35 | addConstraint(_JCLayoutConstraintMake(line, .bottom, .equal, contentView, .bottom))
36 | addConstraint(_JCLayoutConstraintMake(line, .left, .equal, self, .left, 15))
37 | addConstraint(_JCLayoutConstraintMake(line, .right, .equal, self, .right, -15))
38 | addConstraint(_JCLayoutConstraintMake(line, .height, .equal, nil, .notAnAttribute, 0.5))
39 | }
40 |
41 | }
42 |
--------------------------------------------------------------------------------
/Images/1.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/Images/1.gif
--------------------------------------------------------------------------------
/Images/2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/Images/2.jpg
--------------------------------------------------------------------------------
/JChat.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/JChat.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/JChat.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/JChat/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "iphone",
5 | "size" : "20x20",
6 | "scale" : "2x"
7 | },
8 | {
9 | "idiom" : "iphone",
10 | "size" : "20x20",
11 | "scale" : "3x"
12 | },
13 | {
14 | "idiom" : "iphone",
15 | "size" : "29x29",
16 | "scale" : "1x"
17 | },
18 | {
19 | "idiom" : "iphone",
20 | "size" : "29x29",
21 | "scale" : "2x"
22 | },
23 | {
24 | "idiom" : "iphone",
25 | "size" : "29x29",
26 | "scale" : "3x"
27 | },
28 | {
29 | "idiom" : "iphone",
30 | "size" : "40x40",
31 | "scale" : "2x"
32 | },
33 | {
34 | "idiom" : "iphone",
35 | "size" : "40x40",
36 | "scale" : "3x"
37 | },
38 | {
39 | "idiom" : "iphone",
40 | "size" : "57x57",
41 | "scale" : "1x"
42 | },
43 | {
44 | "idiom" : "iphone",
45 | "size" : "57x57",
46 | "scale" : "2x"
47 | },
48 | {
49 | "size" : "60x60",
50 | "idiom" : "iphone",
51 | "filename" : "iOS icon 120.png",
52 | "scale" : "2x"
53 | },
54 | {
55 | "size" : "60x60",
56 | "idiom" : "iphone",
57 | "filename" : "iOS icon 180.png",
58 | "scale" : "3x"
59 | },
60 | {
61 | "idiom" : "ios-marketing",
62 | "size" : "1024x1024",
63 | "scale" : "1x"
64 | }
65 | ],
66 | "info" : {
67 | "version" : 1,
68 | "author" : "xcode"
69 | }
70 | }
--------------------------------------------------------------------------------
/JChat/Assets.xcassets/AppIcon.appiconset/iOS icon 120.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Assets.xcassets/AppIcon.appiconset/iOS icon 120.png
--------------------------------------------------------------------------------
/JChat/Assets.xcassets/AppIcon.appiconset/iOS icon 180.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Assets.xcassets/AppIcon.appiconset/iOS icon 180.png
--------------------------------------------------------------------------------
/JChat/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | }
6 | }
--------------------------------------------------------------------------------
/JChat/Assets.xcassets/LaunchImage.launchimage/ios_1125_2436.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Assets.xcassets/LaunchImage.launchimage/ios_1125_2436.png
--------------------------------------------------------------------------------
/JChat/Assets.xcassets/LaunchImage.launchimage/ios_1242-2208.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Assets.xcassets/LaunchImage.launchimage/ios_1242-2208.png
--------------------------------------------------------------------------------
/JChat/Assets.xcassets/LaunchImage.launchimage/ios_640-1136.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Assets.xcassets/LaunchImage.launchimage/ios_640-1136.png
--------------------------------------------------------------------------------
/JChat/Assets.xcassets/LaunchImage.launchimage/ios_640-960-copy.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Assets.xcassets/LaunchImage.launchimage/ios_640-960-copy.png
--------------------------------------------------------------------------------
/JChat/Assets.xcassets/LaunchImage.launchimage/ios_750-1334.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Assets.xcassets/LaunchImage.launchimage/ios_750-1334.png
--------------------------------------------------------------------------------
/JChat/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | zh_CN
7 | CFBundleDisplayName
8 | JChat
9 | CFBundleExecutable
10 | $(EXECUTABLE_NAME)
11 | CFBundleIdentifier
12 | $(PRODUCT_BUNDLE_IDENTIFIER)
13 | CFBundleInfoDictionaryVersion
14 | 6.0
15 | CFBundleName
16 | $(PRODUCT_NAME)
17 | CFBundlePackageType
18 | APPL
19 | CFBundleShortVersionString
20 | 3.3.0
21 | CFBundleVersion
22 | 16
23 | LSRequiresIPhoneOS
24 |
25 | NSAppTransportSecurity
26 |
27 | NSAllowsArbitraryLoads
28 |
29 |
30 | NSCameraUsageDescription
31 |
32 | NSLocationWhenInUseUsageDescription
33 | 应用需要使用的地理位置信息
34 | NSMicrophoneUsageDescription
35 | 应用需要使用的麦克风
36 | NSPhotoLibraryAddUsageDescription
37 |
38 | NSPhotoLibraryUsageDescription
39 |
40 | UIRequiredDeviceCapabilities
41 |
42 | armv7
43 |
44 | UISupportedInterfaceOrientations
45 |
46 | UIInterfaceOrientationPortrait
47 |
48 |
49 |
50 |
--------------------------------------------------------------------------------
/JChat/JChat-Bridging-Header.h:
--------------------------------------------------------------------------------
1 | //
2 | // BMKSwiftDemo-Bridging-Header.h
3 | // BMKSwiftDemo
4 | //
5 | // Created by wzy on 15/11/2.
6 | // Copyright © 2015年 baidu. All rights reserved.
7 | //
8 |
9 | #ifndef JChat_Bridging_Header_h
10 | #define JChat_Bridging_Header_h
11 |
12 | #import
13 | #import
14 | #import
15 | #import
16 | #import
17 | #import
18 |
19 | #import "JCAddMapViewController.h"
20 | #import
21 | #import "Reachability.h"
22 | #import "KILabel.h"
23 | #import "DLSlideView.h"
24 | #import "DLTabedSlideView.h"
25 |
26 | #endif /* JChat_Bridging_Header_h */
27 |
--------------------------------------------------------------------------------
/JChat/JChat.entitlements:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | aps-environment
6 | development
7 |
8 |
9 |
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/cn.com.a-li/285f3a4de507b1bd33c450aa7c003924@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.com.a-li/285f3a4de507b1bd33c450aa7c003924@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/cn.com.a-li/29cce34d5eefcb45926e85bec21ed2da@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.com.a-li/29cce34d5eefcb45926e85bec21ed2da@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/cn.com.a-li/7102df423b57a50c8ab077b6f0358f18@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.com.a-li/7102df423b57a50c8ab077b6f0358f18@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/cn.com.a-li/74e369456ef0626c6c1a4c0e16994b9d@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.com.a-li/74e369456ef0626c6c1a4c0e16994b9d@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/cn.com.a-li/7ae989bacebdc5cdaf73293023b19b3c@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.com.a-li/7ae989bacebdc5cdaf73293023b19b3c@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/cn.com.a-li/84c4b60449c26dfebf83bda748be7853@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.com.a-li/84c4b60449c26dfebf83bda748be7853@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/cn.com.a-li/940a83613ff938fb86f857c3baa0eeed@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.com.a-li/940a83613ff938fb86f857c3baa0eeed@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/cn.com.a-li/aa50438bcbd8542b7eb05163d9506482@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.com.a-li/aa50438bcbd8542b7eb05163d9506482@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/cn.com.a-li/f89ac3021df353b3c16b39e9725793c0@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.com.a-li/f89ac3021df353b3c16b39e9725793c0@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/cn.com.a-li/fbd44750aeb9790f80f420bc333b221e@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.com.a-li/fbd44750aeb9790f80f420bc333b221e@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/cn.com.a-li/icon@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.com.a-li/icon@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/01@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/01@3x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/02@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/02@3x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/03@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/03@3x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/04@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/04@3x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/05@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/05@3x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/06@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/06@3x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/07@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/07@3x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/08@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/08@3x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/09@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/09@3x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/10@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/10@3x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/11@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/11@3x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/12@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/12@3x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/13@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/13@3x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/14@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/14@3x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/15@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/15@3x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/16@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/16@3x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/17@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/17@3x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/18@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/18@3x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/19@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/19@3x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/20@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/20@3x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/21@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/21@3x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/22@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/22@3x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/23@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/23@3x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/24@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/24@3x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/icon.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.apple.emoji/icon@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.apple.emoji/icon@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/001@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/001@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/002@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/002@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/003@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/003@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/004@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/004@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/005@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/005@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/006@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/006@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/007@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/007@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/008@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/008@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/009@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/009@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/010@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/010@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/011@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/011@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/012@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/012@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/013@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/013@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/014@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/014@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/015@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/015@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/016@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/016@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/017@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/017@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/018@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/018@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/019@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/019@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/020@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/020@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/021@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/021@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/022@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/022@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/023@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/023@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/024@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/024@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/025@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/025@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/026@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/026@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/027@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/027@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/028@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/028@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/029@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/029@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/030@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/030@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/031@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/031@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/032@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/032@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/033@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/033@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/034@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/034@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/035@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/035@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/036@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/036@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/037@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/037@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/038@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/038@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/039@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/039@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/040@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/040@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/041@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/041@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/042@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/042@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/043@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/043@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/044@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/044@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/045@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/045@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/046@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/046@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/047@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/047@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/048@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/048@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/049@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/049@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/050@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/050@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/051@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/051@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/052@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/052@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/053@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/053@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/054@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/054@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/055@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/055@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/056@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/056@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/057@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/057@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/058@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/058@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/059@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/059@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/060@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/060@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/061@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/061@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/062@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/062@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/063@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/063@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/064@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/064@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/065@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/065@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/066@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/066@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/067@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/067@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/068@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/068@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/069@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/069@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/070@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/070@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/071@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/071@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/072@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/072@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/073@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/073@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/074@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/074@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/075@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/075@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/076@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/076@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/077@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/077@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/078@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/078@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/079@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/079@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/080@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/080@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/081@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/081@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/082@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/082@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/083@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/083@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/084@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/084@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/085@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/085@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/086@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/086@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/087@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/087@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/088@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/088@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/089@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/089@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/090@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/090@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/091@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/091@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/092@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/092@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/093@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/093@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/094@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/094@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/095@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/095@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/096@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/096@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/097@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/097@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/098@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/098@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/099@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/099@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/100@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/100@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/101@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/101@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/102@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/102@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/103@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/103@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/104@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/104@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/105@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/105@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/106@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/106@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/107@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/107@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/108@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/108@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/109@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/109@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/110@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/110@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/111@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/111@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/112@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/112@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/113@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/113@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/114@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/114@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/115@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/115@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/116@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/116@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/117@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/117@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/118@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/118@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/119@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/119@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/120@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/120@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/121@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/121@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/122@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/122@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/123@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/123@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/124@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/124@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/125@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/125@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/126@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/126@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/127@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/127@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/128@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/128@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/129@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/129@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/130@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/130@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/131@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/131@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/132@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/132@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/133@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/133@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/134@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/134@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/135@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/135@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/136@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/136@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/137@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/137@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/138@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/138@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/139@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/139@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/140@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/140@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/141@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/141@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/icon@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/icon@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/emoticons.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | image
7 | icon/com.qq.default.png
8 | identifier
9 | com.qq.default
10 | is_default
11 |
12 | sub_groups
13 |
14 |
15 | image
16 | icon/com.apple.emoji.png
17 | identifier
18 | com.apple.emoji
19 |
20 |
21 | image
22 | icon/com.qq.classic.png
23 | identifier
24 | com.qq.classic
25 | is_default
26 |
27 |
28 |
29 |
30 |
31 |
32 |
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/icon/com.apple.emoji@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/icon/com.apple.emoji@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/Themes/emoticons.bundle/icon/com.qq.classic@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/icon/com.qq.classic@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/yh_image_no_picked@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/yh_image_no_picked@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/yh_image_no_picked@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/yh_image_no_picked@3x.png
--------------------------------------------------------------------------------
/JChat/Resources/yh_image_picked@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/yh_image_picked@2x.png
--------------------------------------------------------------------------------
/JChat/Resources/yh_image_picked@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/yh_image_picked@3x.png
--------------------------------------------------------------------------------
/JChat/Src/ChatModule/Chat/Model/JCCEmoticon.swift:
--------------------------------------------------------------------------------
1 | //
2 | // JCCEmotiocon.swift
3 | // JChat
4 | //
5 | // Created by JIGUANG on 2017/3/9.
6 | // Copyright © 2017年 HXHG. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | open class JCCEmoticon: JCEmoticon {
12 |
13 | public required init?(object: NSDictionary) {
14 | guard let id = object["id"] as? String, let title = object["title"] as? String, let type = object["type"] as? Int else {
15 | return nil
16 | }
17 |
18 | self.id = id
19 | self.title = title
20 |
21 | super.init()
22 |
23 | self.image = object["image"] as? String
24 | self.preview = object["preview"] as? String
25 |
26 | if type == 1 {
27 | self.contents = object["contents"]
28 | }
29 | }
30 |
31 | public static func emoticons(with objects: NSArray, at directory: String) -> [JCCEmoticon] {
32 | return objects.compactMap {
33 | guard let dic = $0 as? NSDictionary else {
34 | return nil
35 | }
36 | guard let e = self.init(object: dic) else {
37 | return nil
38 | }
39 | if let name = e.preview {
40 | e.contents = UIImage(contentsOfFile: "\(directory)/\(name)")
41 | }
42 | return e
43 | }
44 | }
45 |
46 | var id: String
47 | var title: String
48 |
49 | var image: String?
50 | var preview: String?
51 |
52 | }
53 |
--------------------------------------------------------------------------------
/JChat/Src/ChatModule/Chat/Model/JCCEmoticonGroup.swift:
--------------------------------------------------------------------------------
1 | //
2 | // JCCEmoticonGroup.swift
3 | // JChat
4 | //
5 | // Created by JIGUANG on 2017/3/9.
6 | // Copyright © 2017年 HXHG. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | class JCCEmoticonGroup: JCEmoticonGroup {
12 | @objc init?(contentsOfFile: String) {
13 | guard let dic = NSDictionary(contentsOfFile: contentsOfFile), let arr = dic["emoticons"] as? NSArray else {
14 | return nil
15 | }
16 | let directory = URL(fileURLWithPath: contentsOfFile).deletingLastPathComponent().path
17 |
18 | super.init()
19 |
20 | type = JCEmoticonType(rawValue: dic["type"] as? Int ?? 0) ?? .small
21 | rows = dic["rows"] as? Int ?? 3
22 | columns = dic["columns"] as? Int ?? 7
23 | rowsInLandscape = dic["rowsInLandscape"] as? Int ?? 2
24 | columnsInLandscape = dic["columnsInLandscape"] as? Int ?? 13
25 |
26 | if let img = dic["image"] as? String {
27 | thumbnail = UIImage(contentsOfFile: "\(directory)/\(img)")
28 | }
29 |
30 | if type.isSmall {
31 | emoticons = JCCEmoticon.emoticons(with: arr, at: directory)
32 | } else {
33 | emoticons = JCCEmoticonLarge.emoticons(with: arr, at: directory)
34 | }
35 | }
36 |
37 | convenience init?(identifier : String) {
38 | let bundle = Bundle.main
39 | guard let path = bundle.path(forResource: "emoticons.bundle/\(identifier)/Info", ofType: "plist") else {
40 | return nil
41 | }
42 | self.init(contentsOfFile: path)
43 | }
44 |
45 | open var rows: Int = 3
46 | open var columns: Int = 7
47 | open var rowsInLandscape: Int = 3
48 | open var columnsInLandscape: Int = 13
49 | }
50 |
--------------------------------------------------------------------------------
/JChat/Src/ChatModule/Chat/Model/JCDraft.swift:
--------------------------------------------------------------------------------
1 | //
2 | // JCDraft.swift
3 | // JChat
4 | //
5 | // Created by JIGUANG on 2017/6/2.
6 | // Copyright © 2017年 HXHG. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | class JCDraft: NSObject {
12 |
13 | static var draftCache: Dictionary = Dictionary()
14 |
15 | static func update(text: String?, conversation: JMSGConversation) {
16 | let id = JCDraft.getDraftId(conversation)
17 | if text == nil || (text?.isEmpty)! {
18 | UserDefaults.standard.removeObject(forKey: id)
19 | draftCache.removeValue(forKey: id)
20 | return
21 | }
22 | UserDefaults.standard.set(text!, forKey: id)
23 | draftCache[id] = text!
24 | }
25 |
26 | static func getDraft(_ conversation: JMSGConversation) -> String? {
27 | let id = JCDraft.getDraftId(conversation)
28 | if let cache = draftCache[id] {
29 | return cache
30 | }
31 | let draft = UserDefaults.standard.object(forKey: id) as? String
32 | if draft != nil {
33 | draftCache[id] = draft
34 | } else {
35 | draftCache[id] = ""
36 | }
37 | return draft
38 | }
39 |
40 | static func getDraftId(_ conversation: JMSGConversation) -> String {
41 | var id = ""
42 | let me = JMSGUser.myInfo()
43 | if me.username.isEmpty {
44 | return ""
45 | }
46 | if conversation.ex.isGroup {
47 | guard let group = conversation.target as? JMSGGroup else {
48 | return ""
49 | }
50 | id = "\(me.username)\(me.appKey!)\(group.gid)"
51 | } else {
52 | guard let user = conversation.target as? JMSGUser else {
53 | return ""
54 | }
55 | guard let appkey = user.appKey else {
56 | return ""
57 | }
58 | id = "\(me.username)\(me.appKey!)\(user.username)\(appkey)"
59 | }
60 | return id
61 | }
62 | }
63 |
--------------------------------------------------------------------------------
/JChat/Src/ChatModule/Chat/Model/JCRemind.swift:
--------------------------------------------------------------------------------
1 | //
2 | // JCRemind.swift
3 | // JChat
4 | //
5 | // Created by JIGUANG on 2017/7/19.
6 | // Copyright © 2017年 HXHG. All rights reserved.
7 | //
8 |
9 | import UIKit
10 | class JCRemind: NSObject {
11 |
12 | var user: JMSGUser?
13 | var startIndex: Int
14 | var endIndex: Int
15 | var length: Int
16 | var isAtAll: Bool
17 |
18 | init(_ user: JMSGUser?, _ startIndex: Int, _ endIndex: Int, _ length: Int, _ isAtAll: Bool) {
19 | self.user = user
20 | self.startIndex = startIndex
21 | self.endIndex = endIndex
22 | self.length = length
23 | self.isAtAll = isAtAll
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/JChat/Src/ChatModule/Chat/Protocols/JCMessageContentViewType.swift:
--------------------------------------------------------------------------------
1 | //
2 | // JCMessageContentViewType.swift
3 | // JChat
4 | //
5 | // Created by JIGUANG on 10/04/2017.
6 | // Copyright © 2017 HXHG. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | @objc public protocol JCMessageContentType: class {
12 |
13 | weak var delegate: JCMessageDelegate? { get }
14 | var layoutMargins: UIEdgeInsets { get }
15 |
16 | func sizeThatFits(_ size: CGSize) -> CGSize
17 |
18 | static var viewType: JCMessageContentViewType.Type { get }
19 | }
20 |
21 | @objc public protocol JCMessageContentViewType: class {
22 |
23 | init()
24 | func apply(_ message: JCMessageType)
25 | }
26 |
27 |
--------------------------------------------------------------------------------
/JChat/Src/ChatModule/Chat/Protocols/JCMessageOptions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // JCMessageOptions.swift
3 | // JChat
4 | //
5 | // Created by JIGUANG on 2017/3/8.
6 | // Copyright © 2017年 HXHG. All rights reserved.
7 | //
8 |
9 | import UIKit
10 | import JMessage
11 |
12 | /// 消息类型
13 | @objc public enum JCMessageStyle: Int {
14 | case notice
15 | case bubble
16 | }
17 |
18 | /// 消息对齐方式
19 | @objc public enum JCMessageAlignment: Int {
20 | case left
21 | case right
22 | case center
23 | }
24 |
25 | @objc public enum JCMessageState: Int {
26 | case sending
27 | case sendError
28 | case sendSucceed
29 | case downloadFailed
30 | }
31 |
32 | /// 消息选项
33 | @objc open class JCMessageOptions: NSObject {
34 |
35 | public override init() {
36 | super.init()
37 | }
38 |
39 | public convenience init(with content: JCMessageContentType) {
40 | self.init()
41 |
42 | switch content {
43 | case is JCMessageNoticeContent:
44 | self.style = .notice
45 | self.alignment = .center
46 | self.showsCard = false
47 | self.showsAvatar = false
48 | self.showsBubble = true
49 | self.isUserInteractionEnabled = false
50 |
51 | case is JCMessageTimeLineContent:
52 | self.style = .notice
53 | self.alignment = .center
54 | self.showsCard = false
55 | self.showsAvatar = false
56 | self.showsBubble = false
57 | self.isUserInteractionEnabled = false
58 |
59 | // case is JCMessageImageContent:
60 | // self.showsTips = false
61 |
62 | default:
63 | break
64 | }
65 | }
66 |
67 | open var style: JCMessageStyle = .bubble
68 | open var alignment: JCMessageAlignment = .left
69 |
70 | open var isUserInteractionEnabled: Bool = true
71 |
72 | open var showsCard: Bool = false
73 | open var showsAvatar: Bool = true
74 | open var showsBubble: Bool = true
75 | open var showsTips: Bool = true
76 | open var state: JCMessageState = .sendSucceed
77 |
78 | internal func fix(with content: JCMessageContentType) {
79 | }
80 | }
81 |
82 |
--------------------------------------------------------------------------------
/JChat/Src/ChatModule/Chat/Protocols/JCMessageType.swift:
--------------------------------------------------------------------------------
1 | //
2 | // JCMessageType.swift
3 | // JChat
4 | //
5 | // Created by JIGUANG on 10/04/2017.
6 | // Copyright © 2017 HXHG. All rights reserved.
7 | //
8 |
9 | import Foundation
10 | import JMessage
11 |
12 | @objc public enum MessageTargetType: Int {
13 | case single = 1
14 | case group = 2
15 | case chatRoom = 3
16 | }
17 |
18 | @objc public protocol JCMessageType: class {
19 |
20 | var name: String { get }
21 | var identifier: UUID { get }
22 | var msgId: String { get }
23 | var date: Date { get }
24 | var sender: JMSGUser? { get }
25 | var senderAvator: UIImage? { get }
26 | var receiver: JMSGUser? { get }
27 | var content: JCMessageContentType { get }
28 | var options: JCMessageOptions { get }
29 | var updateSizeIfNeeded: Bool { get }
30 | var unreadCount: Int { get }
31 | var targetType: MessageTargetType { get }
32 | var contentType: JMSGContentType { get }
33 | var jmessage: JMSGMessage? { get }
34 | }
35 |
36 | @objc public protocol JCMessageDelegate: NSObjectProtocol {
37 | @objc optional func message(message: JCMessageType, videoData data: Data?)
38 | @objc optional func message(message: JCMessageType, voiceData data: Data?, duration: Double)
39 | @objc optional func message(message: JCMessageType, fileData data: Data?, fileName: String?, fileType: String?)
40 | @objc optional func message(message: JCMessageType, location address: String?, lat: Double, lon: Double)
41 | @objc optional func message(message: JCMessageType, image: UIImage?)
42 | // user 对象是为了提高效率,如果 user 已经加载出来了,就直接使用,不需要重新去获取一次
43 | @objc optional func message(message: JCMessageType, user: JMSGUser?, businessCardName: String, businessCardAppKey: String)
44 | @objc optional func clickTips(message: JCMessageType)
45 | @objc optional func tapAvatarView(message: JCMessageType)
46 | @objc optional func longTapAvatarView(message: JCMessageType)
47 | @objc optional func tapUnreadTips(message: JCMessageType)
48 | }
49 |
--------------------------------------------------------------------------------
/JChat/Src/ChatModule/Chat/Protocols/JCUserType.swift:
--------------------------------------------------------------------------------
1 | //
2 | // JCUserType.swift
3 | // JChat
4 | //
5 | // Created by JIGUANG on 10/04/2017.
6 | // Copyright © 2017 HXHG. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | @objc public protocol JCUserType: class {
12 | var identifier: String { get }
13 | var name: String? { get }
14 | var portrait: UIImage? { get }
15 | }
16 |
--------------------------------------------------------------------------------
/JChat/Src/ChatModule/Chat/View/ImageFileHeader.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SHomeHeader.swift
3 | //
4 | // Created by wangjie on 16/5/4.
5 | // Copyright © 2016年 wangjie. All rights reserved.
6 | //
7 |
8 | import UIKit
9 |
10 | class ImageFileHeader: UICollectionReusableView {
11 |
12 | override init(frame: CGRect) {
13 | super.init(frame: frame)
14 | _init()
15 | }
16 |
17 | required init?(coder aDecoder: NSCoder) {
18 | fatalError("init(coder:) has not been implemented")
19 | }
20 |
21 | var titleLabel: UILabel!
22 |
23 | private func _init(){
24 | titleLabel = UILabel(frame: CGRect(x: 16.5, y: 0, width: self.width, height: self.height))
25 | titleLabel.textColor = UIColor(netHex: 0x808080)
26 | titleLabel.font = UIFont.systemFont(ofSize: 13)
27 | addSubview(titleLabel)
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/JChat/Src/ChatModule/Chat/View/JCChatViewData.swift:
--------------------------------------------------------------------------------
1 | //
2 | // JCChatViewData.swift
3 | // JChat
4 | //
5 | // Created by JIGUANG on 10/04/2017.
6 | // Copyright © 2017 HXHG. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | internal class JCChatViewData: NSObject, NSCopying {
12 |
13 | internal override init() {
14 | self.elements = []
15 | super.init()
16 | }
17 | internal init(elements: [JCMessageType]) {
18 | self.elements = elements
19 | super.init()
20 | }
21 |
22 | internal var count: Int {
23 | return elements.count
24 | }
25 |
26 | func copy(with zone: NSZone? = nil) -> Any {
27 | return JCChatViewData(elements: self.elements)
28 | }
29 |
30 |
31 | internal subscript(index: Int) -> JCMessageType {
32 | return elements[index]
33 | }
34 |
35 |
36 | internal func subarray(with subrange: Range) -> Array {
37 | return Array(elements[subrange])
38 | }
39 |
40 | internal func replaceSubrange(_ subrange: Range, with collection: Array) {
41 | elements.replaceSubrange(subrange, with: collection)
42 | }
43 |
44 |
45 | internal var elements: [JCMessageType]
46 | }
47 |
--------------------------------------------------------------------------------
/JChat/Src/ChatModule/Chat/View/JCChatViewLayoutAttributes.swift:
--------------------------------------------------------------------------------
1 | //
2 | // JCChatViewLayoutAttributes.swift
3 | // JChat
4 | //
5 | // Created by JIGUANG on 2017/3/1.
6 | // Copyright © 2017年 HXHG. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | @objc public enum JCChatViewLayoutItem: Int {
12 | case all
13 | case card
14 | case avatar
15 | case bubble
16 | case content
17 | case tips
18 | }
19 |
20 | @objc open class JCChatViewLayoutAttributes: UICollectionViewLayoutAttributes {
21 |
22 | public override init() {
23 | super.init()
24 | }
25 |
26 | open override func copy(with zone: NSZone? = nil) -> Any {
27 | let new = super.copy(with: zone)
28 | if let new = new as? JCChatViewLayoutAttributes {
29 | new.info = info
30 | }
31 | return new
32 | }
33 |
34 | open var message: JCMessageType? {
35 | return info?.message
36 | }
37 |
38 | open var info: JCChatViewLayoutAttributesInfo?
39 | }
40 |
41 |
--------------------------------------------------------------------------------
/JChat/Src/ChatModule/Chat/View/JCChatViewLayoutAttributesInfo.swift:
--------------------------------------------------------------------------------
1 | //
2 | // JCChatViewLayoutAttributesInfo.swift
3 | // JChat
4 | //
5 | // Created by JIGUANG on 10/04/2017.
6 | // Copyright © 2017 HXHG. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | @objc open class JCChatViewLayoutAttributesInfo: NSObject {
12 |
13 | public init(message: JCMessageType, size: CGSize, rects: [JCChatViewLayoutItem: CGRect], boxRects: [JCChatViewLayoutItem: CGRect]) {
14 | _message = message
15 | _cacheSize = size
16 | _allLayoutedRects = rects
17 | _allLayoutedBoxRects = boxRects
18 | super.init()
19 | }
20 |
21 | open var message: JCMessageType {
22 | return _message
23 | }
24 |
25 | open func layoutedRect(with item: JCChatViewLayoutItem) -> CGRect {
26 | return _allLayoutedRects[item] ?? .zero
27 | }
28 | open func layoutedBoxRect(with item: JCChatViewLayoutItem) -> CGRect {
29 | return _allLayoutedBoxRects[item] ?? .zero
30 | }
31 |
32 | private var _message: JCMessageType
33 | private var _cacheSize: CGSize
34 |
35 | private var _allLayoutedRects: [JCChatViewLayoutItem: CGRect]
36 | private var _allLayoutedBoxRects: [JCChatViewLayoutItem: CGRect]
37 |
38 | }
39 |
--------------------------------------------------------------------------------
/JChat/Src/ChatModule/Chat/View/JCMessageCardView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // JCMessageCardView.swift
3 | // JChat
4 | //
5 | // Created by JIGUANG on 10/04/2017.
6 | // Copyright © 2017 HXHG. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | open class JCMessageCardView: UILabel, JCMessageContentViewType {
12 |
13 | public override init(frame: CGRect) {
14 | super.init(frame: frame)
15 | _commonInit()
16 | }
17 | public required init?(coder aDecoder: NSCoder) {
18 | super.init(coder: aDecoder)
19 | _commonInit()
20 | }
21 |
22 | open func apply(_ message: JCMessageType) {
23 | let isRight = message.options.alignment == .right
24 | text = message.name
25 | textAlignment = isRight ? .right : .left
26 | }
27 |
28 | private func _commonInit() {
29 | font = UIFont.systemFont(ofSize: 14)
30 | textColor = UIColor(netHex: 0xB3B3B3)
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/JChat/Src/ChatModule/Chat/View/JCNetworkTipsCell.swift:
--------------------------------------------------------------------------------
1 | //
2 | // JCNetworkTipsCell.swift
3 | // JChat
4 | //
5 | // Created by JIGUANG on 2017/6/12.
6 | // Copyright © 2017年 HXHG. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | class JCNetworkTipsCell: UITableViewCell {
12 |
13 | override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
14 | super.init(style: style, reuseIdentifier: reuseIdentifier)
15 | _init()
16 | }
17 | required init?(coder aDecoder: NSCoder) {
18 | super.init(coder: aDecoder)
19 | _init()
20 | }
21 |
22 | override func awakeFromNib() {
23 | super.awakeFromNib()
24 | _init()
25 | }
26 |
27 | private lazy var statueView: UIImageView = {
28 | let statueView = UIImageView()
29 | statueView.image = UIImage.loadImage("com_icon_send_error")
30 | return statueView
31 | }()
32 | private lazy var tipsLabel: UILabel = {
33 | let tipsLabel = UILabel()
34 | tipsLabel.text = "当前网络不可用,请检查您的网络设置"
35 | tipsLabel.font = UIFont.systemFont(ofSize: 14)
36 | return tipsLabel
37 | }()
38 |
39 | //MARK: - private func
40 | private func _init() {
41 | backgroundColor = UIColor(netHex: 0xFFDFE0)
42 |
43 | contentView.addSubview(statueView)
44 | contentView.addSubview(tipsLabel)
45 |
46 | addConstraint(_JCLayoutConstraintMake(tipsLabel, .left, .equal, statueView, .right, 11.5))
47 | addConstraint(_JCLayoutConstraintMake(tipsLabel, .centerY, .equal, contentView, .centerY))
48 | addConstraint(_JCLayoutConstraintMake(tipsLabel, .right, .equal, contentView, .right))
49 | addConstraint(_JCLayoutConstraintMake(tipsLabel, .height, .equal, contentView, .height))
50 |
51 | addConstraint(_JCLayoutConstraintMake(statueView, .centerY, .equal, contentView, .centerY))
52 | addConstraint(_JCLayoutConstraintMake(statueView, .left, .equal, contentView, .left, 15))
53 | addConstraint(_JCLayoutConstraintMake(statueView, .height, .equal, nil, .notAnAttribute, 21))
54 | addConstraint(_JCLayoutConstraintMake(statueView, .width, .equal, nil, .notAnAttribute, 21))
55 | }
56 | }
57 |
--------------------------------------------------------------------------------
/JChat/Src/ChatModule/Chat/View/JCUpdateMemberCell.swift:
--------------------------------------------------------------------------------
1 | //
2 | // JCUpdateMemberCell.swift
3 | // JChat
4 | //
5 | // Created by JIGUANG on 2017/5/11.
6 | // Copyright © 2017年 HXHG. All rights reserved.
7 | //
8 |
9 | import UIKit
10 | import JMessage
11 |
12 | class JCUpdateMemberCell: UICollectionViewCell {
13 | var avator: UIImage? {
14 | get {
15 | return avatorView.image
16 | }
17 | set {
18 | avatorView.image = newValue
19 | }
20 | }
21 |
22 | public override init(frame: CGRect) {
23 | super.init(frame: frame)
24 | _init()
25 | }
26 |
27 | public required init?(coder aDecoder: NSCoder) {
28 | super.init(coder: aDecoder)
29 | _init()
30 | }
31 |
32 | private var avatorView: UIImageView = UIImageView()
33 | private lazy var defaultUserIcon = UIImage.loadImage("com_icon_user_36")
34 |
35 | private func _init() {
36 |
37 | avatorView.image = defaultUserIcon
38 |
39 | addSubview(avatorView)
40 |
41 | addConstraint(_JCLayoutConstraintMake(avatorView, .centerY, .equal, contentView, .centerY))
42 | addConstraint(_JCLayoutConstraintMake(avatorView, .width, .equal, nil, .notAnAttribute, 36))
43 | addConstraint(_JCLayoutConstraintMake(avatorView, .height, .equal, nil, .notAnAttribute, 36))
44 | addConstraint(_JCLayoutConstraintMake(avatorView, .centerX, .equal, contentView, .centerX))
45 |
46 | }
47 |
48 | func bindDate(user: JMSGUser) {
49 | user.thumbAvatarData { (data, id, error) in
50 | if let data = data {
51 | let image = UIImage(data: data)
52 | self.avatorView.image = image
53 | } else {
54 | self.avatorView.image = self.defaultUserIcon
55 | }
56 | }
57 | }
58 | }
59 |
--------------------------------------------------------------------------------
/JChat/Src/ChatModule/Chat/View/Message/JCBusinessCardContent.swift:
--------------------------------------------------------------------------------
1 | //
2 | // JCBusinessCardContent.swift
3 | // JChat
4 | //
5 | // Created by JIGUANG on 2017/8/31.
6 | // Copyright © 2017年 HXHG. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | class JCBusinessCardContent: NSObject, JCMessageContentType {
12 |
13 | public weak var delegate: JCMessageDelegate?
14 | open var layoutMargins: UIEdgeInsets = .zero
15 |
16 | open class var viewType: JCMessageContentViewType.Type {
17 | return JCBusinessCardContentView.self
18 | }
19 |
20 | open var userName: String?
21 | open var appKey: String?
22 |
23 | open func sizeThatFits(_ size: CGSize) -> CGSize {
24 | return .init(width: 200, height: 87)
25 | }
26 |
27 | }
28 |
--------------------------------------------------------------------------------
/JChat/Src/ChatModule/Chat/View/Message/JCMessageFileContent.swift:
--------------------------------------------------------------------------------
1 | //
2 | // JCMessageFileContent.swift
3 | // JChat
4 | //
5 | // Created by JIGUANG on 2017/7/20.
6 | // Copyright © 2017年 HXHG. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | class JCMessageFileContent: NSObject, JCMessageContentType {
12 |
13 | public weak var delegate: JCMessageDelegate?
14 | open var layoutMargins: UIEdgeInsets = .zero
15 |
16 | open class var viewType: JCMessageContentViewType.Type {
17 | return JCMessageFileContentView.self
18 | }
19 |
20 | open var data: Data?
21 | open var fileName: String?
22 | open var fileType: String?
23 | open var fileSize: String?
24 |
25 | open func sizeThatFits(_ size: CGSize) -> CGSize {
26 | return .init(width: 200, height: 95)
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/JChat/Src/ChatModule/Chat/View/Message/JCMessageImageContent.swift:
--------------------------------------------------------------------------------
1 | //
2 | // JCMessageImageContent.swift
3 | // JChat
4 | //
5 | // Created by JIGUANG on 2017/3/9.
6 | // Copyright © 2017年 HXHG. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | open class JCMessageImageContent: NSObject, JCMessageContentType {
12 | typealias uploadHandle = (_ percent: Float) -> ()
13 |
14 | public weak var delegate: JCMessageDelegate?
15 | var upload: uploadHandle?
16 | var imageSize: CGSize?
17 | open var image: UIImage?
18 | open var layoutMargins: UIEdgeInsets = .zero
19 |
20 | open class var viewType: JCMessageContentViewType.Type {
21 | return JCMessageImageContentView.self
22 | }
23 |
24 | open func sizeThatFits(_ size: CGSize) -> CGSize {
25 | if image == nil {
26 | image = UIImage.createImage(color: UIColor(netHex: 0xCDD0D1), size: imageSize ?? CGSize(width: 160, height: 160))
27 | }
28 | let size = imageSize ?? (image?.size)!
29 | let scale = min(min(160, size.width) / size.width, min(160, size.height) / size.height)
30 | let w = size.width * scale
31 | let h = size.height * scale
32 | return .init(width: w, height: h)
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/JChat/Src/ChatModule/Chat/View/Message/JCMessageLocationContent.swift:
--------------------------------------------------------------------------------
1 | //
2 | // JCMessageLocationContent.swift
3 | // JChat
4 | //
5 | // Created by JIGUANG on 2017/4/19.
6 | // Copyright © 2017年 HXHG. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | class JCMessageLocationContent: NSObject, JCMessageContentType {
12 |
13 | public weak var delegate: JCMessageDelegate?
14 | open var layoutMargins: UIEdgeInsets = .zero
15 | open class var viewType: JCMessageContentViewType.Type {
16 | return JCMessageLocationContentView.self
17 | }
18 |
19 | open var address: String?
20 | open var lon: Double?
21 | open var lat: Double?
22 |
23 | open func sizeThatFits(_ size: CGSize) -> CGSize {
24 | return .init(width: 141, height: 91)
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/JChat/Src/ChatModule/Chat/View/Message/JCMessageNoticeContent.swift:
--------------------------------------------------------------------------------
1 | //
2 | // JCMessageNoticeContent.swift
3 | // JChat
4 | //
5 | // Created by JIGUANG on 2017/3/9.
6 | // Copyright © 2017年 HXHG. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | open class JCMessageNoticeContent: NSObject, JCMessageContentType {
12 | public weak var delegate: JCMessageDelegate?
13 |
14 | open var layoutMargins: UIEdgeInsets = .zero
15 |
16 | open class var viewType: JCMessageContentViewType.Type {
17 | return JCMessageNoticeContentView.self
18 | }
19 |
20 | public init(text: String) {
21 | self.text = text
22 | super.init()
23 | }
24 |
25 | open var text: String
26 |
27 | open func sizeThatFits(_ size: CGSize) -> CGSize {
28 |
29 | let attr = NSMutableAttributedString(string: text, attributes: convertToOptionalNSAttributedStringKeyDictionary([
30 | convertFromNSAttributedStringKey(NSAttributedString.Key.font): UIFont.systemFont(ofSize: 12),
31 | convertFromNSAttributedStringKey(NSAttributedString.Key.foregroundColor): UIColor.white,
32 | ]))
33 | let mattrSize = attr.boundingRect(with: CGSize(width: 250.0, height: Double(MAXFLOAT)), options: [.usesLineFragmentOrigin,.usesFontLeading], context: nil)
34 | let size = CGSize(width: mattrSize.size.width + 11, height: mattrSize.size.height + 4)
35 | return size
36 | }
37 |
38 | public static let unsupport: JCMessageNoticeContent = JCMessageNoticeContent(text: "The message does not support")
39 | }
40 |
41 | // Helper function inserted by Swift 4.2 migrator.
42 | fileprivate func convertToOptionalNSAttributedStringKeyDictionary(_ input: [String: Any]?) -> [NSAttributedString.Key: Any]? {
43 | guard let input = input else { return nil }
44 | return Dictionary(uniqueKeysWithValues: input.map { key, value in (NSAttributedString.Key(rawValue: key), value)})
45 | }
46 |
47 | // Helper function inserted by Swift 4.2 migrator.
48 | fileprivate func convertFromNSAttributedStringKey(_ input: NSAttributedString.Key) -> String {
49 | return input.rawValue
50 | }
51 |
--------------------------------------------------------------------------------
/JChat/Src/ChatModule/Chat/View/Message/JCMessageNoticeContentView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // JCMessageNoticeContentView.swift
3 | // JChat
4 | //
5 | // Created by JIGUANG on 2017/3/9.
6 | // Copyright © 2017年 HXHG. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | open class JCMessageNoticeContentView: UILabel, JCMessageContentViewType {
12 |
13 | public override init(frame: CGRect) {
14 | super.init(frame: frame)
15 | _commonInit()
16 | }
17 | public required init?(coder aDecoder: NSCoder) {
18 | super.init(coder: aDecoder)
19 | _commonInit()
20 | }
21 |
22 |
23 | open func apply(_ message: JCMessageType) {
24 | guard let content = message.content as? JCMessageNoticeContent else {
25 | return
26 | }
27 | text = content.text
28 | }
29 |
30 | private func _commonInit() {
31 | layer.cornerRadius = 2.5
32 | layer.borderWidth = 1.0
33 | layer.borderColor = UIColor(netHex: 0xD7DCE2).cgColor
34 | layer.masksToBounds = true
35 | font = UIFont.systemFont(ofSize: 12)
36 | backgroundColor = UIColor(netHex: 0xD7DCE2)
37 | textColor = .white
38 | textAlignment = .center
39 | numberOfLines = 0
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/JChat/Src/ChatModule/Chat/View/Message/JCMessageTextContent.swift:
--------------------------------------------------------------------------------
1 | //
2 | // JCMessageTextContent.swift
3 | // JChat
4 | //
5 | // Created by JIGUANG on 2017/3/9.
6 | // Copyright © 2017年 HXHG. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | open class JCMessageTextContent: NSObject, JCMessageContentType {
12 | public weak var delegate: JCMessageDelegate?
13 | public override init() {
14 | let text = "this is a test text"
15 | self.text = NSAttributedString(string: text)
16 | super.init()
17 | }
18 | public init(text: String) {
19 | self.text = NSAttributedString(string: text)
20 | super.init()
21 | }
22 | public init(attributedText: NSAttributedString) {
23 | self.text = attributedText
24 | super.init()
25 | }
26 |
27 | open class var viewType: JCMessageContentViewType.Type {
28 | return JCMessageTextContentView.self
29 | }
30 | open var layoutMargins: UIEdgeInsets = .init(top: 9, left: 10, bottom: 9, right: 10)
31 |
32 | open var text: NSAttributedString
33 |
34 | open func sizeThatFits(_ size: CGSize) -> CGSize {
35 | let mattr = NSMutableAttributedString(attributedString: text)
36 | mattr.addAttribute(NSAttributedString.Key.font, value: UIFont.systemFont(ofSize: 16), range: NSMakeRange(0, mattr.length))
37 |
38 | let mattrSize = mattr.boundingRect(with: CGSize(width: 220.0, height: Double(MAXFLOAT)), options: [.usesLineFragmentOrigin,.usesFontLeading], context: nil)
39 | self.text = mattr
40 | return .init(width: max(mattrSize.width, 15), height: max(mattrSize.height, 15))
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/JChat/Src/ChatModule/Chat/View/Message/JCMessageTextContentView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // JCMessageTextContentView.swift
3 | // JChat
4 | //
5 | // Created by JIGUANG on 2017/3/9.
6 | // Copyright © 2017年 HXHG. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | open class JCMessageTextContentView: KILabel, JCMessageContentViewType {
12 |
13 | public override init(frame: CGRect) {
14 | super.init(frame: frame)
15 | _commonInit()
16 | }
17 | public required init?(coder aDecoder: NSCoder) {
18 | super.init(coder: aDecoder)
19 | _commonInit()
20 | }
21 |
22 | open override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
23 | return super.canPerformAction(action, withSender: sender)
24 | }
25 |
26 | open func apply(_ message: JCMessageType) {
27 | guard let content = message.content as? JCMessageTextContent else {
28 | return
29 | }
30 | self.attributedText = content.text
31 | self.linkDetectionTypes = KILinkTypeOption.URL
32 | self.urlLinkTapHandler = { label, url, range in
33 | if let Url = URL(string: url) {
34 | if UIApplication.shared.canOpenURL(Url) {
35 | UIApplication.shared.openURL(Url)
36 | } else {
37 | let newUrl = URL(string: "https://" + url)
38 | UIApplication.shared.openURL(newUrl!)
39 | }
40 | }
41 | }
42 | }
43 |
44 | private func _commonInit() {
45 | self.numberOfLines = 0
46 | }
47 | }
48 |
49 |
50 |
--------------------------------------------------------------------------------
/JChat/Src/ChatModule/Chat/View/Message/JCMessageTimeLineContentView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // JCMessageTimeLineContentView.swift
3 | // JChat
4 | //
5 | // Created by JIGUANG on 2017/3/9.
6 | // Copyright © 2017年 HXHG. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | open class JCMessageTimeLineContentView: UILabel, JCMessageContentViewType {
12 |
13 | public override init(frame: CGRect) {
14 | super.init(frame: frame)
15 | _commonInit()
16 | }
17 | public required init?(coder aDecoder: NSCoder) {
18 | super.init(coder: aDecoder)
19 | _commonInit()
20 | }
21 |
22 | open func apply(_ message: JCMessageType) {
23 | guard let content = message.content as? JCMessageTimeLineContent else {
24 | return
25 | }
26 | text = content.text
27 | }
28 |
29 | private func _commonInit() {
30 | layer.cornerRadius = 2.5
31 | layer.borderWidth = 1.0
32 | layer.borderColor = UIColor(netHex: 0xD7DCE2).cgColor
33 | layer.masksToBounds = true
34 | font = UIFont.systemFont(ofSize: 12)
35 | backgroundColor = UIColor(netHex: 0xD7DCE2)
36 | textColor = .white
37 | textAlignment = .center
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/JChat/Src/ChatModule/Chat/View/Message/JCMessageVideoContent.swift:
--------------------------------------------------------------------------------
1 | //
2 | // JCMessageVideoContent.swift
3 | // JChat
4 | //
5 | // Created by JIGUANG on 2017/3/9.
6 | // Copyright © 2017年 HXHG. All rights reserved.
7 | //
8 |
9 | import UIKit
10 | import JMessage
11 |
12 | let JC_VIDEO_MSG_IMAGE_WIDTH: CGFloat = 160.0
13 | let JC_VIDEO_MSG_IMAGE_HEIGHT: CGFloat = 120.0
14 |
15 | open class JCMessageVideoContent: NSObject, JCMessageContentType {
16 |
17 | typealias uploadVideoHandle = (_ percent: Float) -> ()
18 |
19 | public weak var delegate: JCMessageDelegate?
20 | var uploadVideo: uploadVideoHandle?
21 | open var layoutMargins: UIEdgeInsets = .zero
22 | open class var viewType: JCMessageContentViewType.Type {
23 | return JCMessageVideoContentView.self
24 | }
25 | open var data: Data?
26 | open var image: UIImage?
27 | //open var fileContent: JMSGFileContent?
28 | open var videoContent: JMSGVideoContent?
29 | //由于andriod暂时不支持文件视频类型,故sdk对文件视频类的做了特殊处理
30 | open var videoFileContent: JMSGFileContent?
31 |
32 | open func sizeThatFits(_ size: CGSize) -> CGSize {
33 | printLog("viedeo")
34 | if image == nil {
35 | return .init(width: 140, height: 89)
36 | }
37 | //image = JCVideoManager.getFristImage(data: data!)
38 | let size = image?.size ?? .zero
39 | let scale = min(min(JC_VIDEO_MSG_IMAGE_WIDTH, size.width) / size.width, min(JC_VIDEO_MSG_IMAGE_HEIGHT, size.height) / size.height)
40 |
41 | let w = size.width * scale
42 | let h = size.height * scale
43 | return .init(width: w, height: h)
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/JChat/Src/ChatModule/Chat/View/Message/JCMessageVoiceContent.swift:
--------------------------------------------------------------------------------
1 | //
2 | // JCMessageVoiceContent.swift
3 | // JChat
4 | //
5 | // Created by JIGUANG on 2017/3/9.
6 | // Copyright © 2017年 HXHG. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | open class JCMessageVoiceContent: NSObject, JCMessageContentType {
12 |
13 | public weak var delegate: JCMessageDelegate?
14 | open var layoutMargins: UIEdgeInsets = .init(top: 5, left: 10, bottom: 5, right: 10)
15 | open class var viewType: JCMessageContentViewType.Type {
16 | return JCMessageVoiceContentView.self
17 | }
18 | open var data: Data?
19 | open var duration: TimeInterval = 9999
20 | open var attributedText: NSAttributedString?
21 |
22 | open func sizeThatFits(_ size: CGSize) -> CGSize {
23 | // +---------------+
24 | // | ||| 99'59'' |
25 | // +---------------+
26 | let minute = Int(duration) / 60
27 | let second = Int(duration) % 60
28 | var string = "\(minute)'\(second)''"
29 | if minute == 0 {
30 | string = "\(second)''"
31 | }
32 | attributedText = NSAttributedString(string: string, attributes: convertToOptionalNSAttributedStringKeyDictionary([convertFromNSAttributedStringKey(NSAttributedString.Key.font): UIFont.systemFont(ofSize: 14)]))
33 |
34 | return .init(width: 20 + 38 + 20, height: 26)
35 | }
36 | }
37 |
38 | // Helper function inserted by Swift 4.2 migrator.
39 | fileprivate func convertToOptionalNSAttributedStringKeyDictionary(_ input: [String: Any]?) -> [NSAttributedString.Key: Any]? {
40 | guard let input = input else { return nil }
41 | return Dictionary(uniqueKeysWithValues: input.map { key, value in (NSAttributedString.Key(rawValue: key), value)})
42 | }
43 |
44 | // Helper function inserted by Swift 4.2 migrator.
45 | fileprivate func convertFromNSAttributedStringKey(_ input: NSAttributedString.Key) -> String {
46 | return input.rawValue
47 | }
48 |
--------------------------------------------------------------------------------
/JChat/Src/ChatModule/Input/InputView/Emoticon/JCEmoticonGroup.swift:
--------------------------------------------------------------------------------
1 | //
2 | // JCEmoticonGroup.swift
3 | // JChat
4 | //
5 | // Created by JIGUANG on 2017/3/9.
6 | // Copyright © 2017年 HXHG. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | public enum JCEmoticonType: Int {
12 | case small = 0
13 | case large = 1
14 |
15 | public var isSmall: Bool {
16 | return self == .small
17 | }
18 |
19 | public var isLarge: Bool {
20 | return self == .large
21 | }
22 | }
23 |
24 | open class JCEmoticonGroup: NSObject {
25 |
26 | open lazy var id: String = UUID().uuidString
27 |
28 | open var title: String?
29 | open var thumbnail: UIImage?
30 | open var type: JCEmoticonType = .small
31 | open var emoticons: [JCEmoticon] = []
32 |
33 | }
34 |
--------------------------------------------------------------------------------
/JChat/Src/ChatModule/Input/InputView/Emoticon/JCEmoticonTabItemView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // JCEmoticonTabItemViewCollectionViewCell.swift
3 | // JChat
4 | //
5 | // Created by JIGUANG on 2017/3/9.
6 | // Copyright © 2017年 HXHG. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | class JCEmoticonTabItemView: UICollectionViewCell {
12 |
13 | private lazy var _imageView: UIImageView = UIImageView()
14 | private lazy var _line: CALayer = CALayer()
15 | var group: JCEmoticonGroup? {
16 | willSet {
17 | guard group !== newValue else {
18 | return
19 | }
20 | _imageView.image = newValue?.thumbnail
21 | }
22 | }
23 |
24 | override init(frame: CGRect) {
25 | super.init(frame: frame)
26 | _init()
27 | }
28 | required init?(coder aDecoder: NSCoder) {
29 | super.init(coder: aDecoder)
30 | _init()
31 | }
32 |
33 | override func layoutSubviews() {
34 | super.layoutSubviews()
35 | _imageView.center = CGPoint(x: bounds.midX, y: bounds.midY)
36 | _line.frame = CGRect(x: bounds.maxX - 0.25, y: 8, width: 0.5, height: bounds.height - 16)
37 | }
38 |
39 | private func _init() {
40 |
41 | _line.backgroundColor = UIColor(white: 0.9, alpha: 1.0).cgColor
42 |
43 | _imageView.contentMode = .scaleAspectFit
44 | _imageView.bounds = CGRect(x: 0, y: 0, width: 25, height: 25)
45 |
46 | contentView.addSubview(_imageView)
47 | contentView.layer.addSublayer(_line)
48 |
49 | selectedBackgroundView = UIView()
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/JChat/Src/ChatModule/Input/Map/JCAddMapViewController.h:
--------------------------------------------------------------------------------
1 |
2 | #import
3 |
4 | #import
5 | #import
6 | #import
7 | #import
8 | #import
9 | #import
10 | #import
11 | #import "AddMapTableViewCell.h"
12 |
13 | typedef void (^ MapAddress)(NSDictionary *dic);
14 | @interface JCAddMapViewController : UIViewController
15 |
16 | @property (nonatomic, copy) MapAddress addressBlock;
17 | @property (nonatomic, assign) BOOL isOnlyShowMap;
18 | @property (nonatomic, assign) double lon;
19 | @property (nonatomic, assign) double lat;
20 |
21 | @end
22 |
--------------------------------------------------------------------------------
/JChat/Src/ChatModule/Input/Map/Resources/icon_baidu_marker.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/ChatModule/Input/Map/Resources/icon_baidu_marker.png
--------------------------------------------------------------------------------
/JChat/Src/ChatModule/Input/Map/Resources/jiantou2@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/ChatModule/Input/Map/Resources/jiantou2@2x.png
--------------------------------------------------------------------------------
/JChat/Src/ChatModule/Input/Map/Resources/定位1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/ChatModule/Input/Map/Resources/定位1.png
--------------------------------------------------------------------------------
/JChat/Src/ChatModule/Input/Map/Resources/定位2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/ChatModule/Input/Map/Resources/定位2.png
--------------------------------------------------------------------------------
/JChat/Src/ChatModule/Input/Map/View/AddMapTableViewCell.h:
--------------------------------------------------------------------------------
1 | //
2 | // AddMapTableViewCell.h
3 | // 仿美团地图功能
4 | //
5 | // Created by chedeping on 16/3/4.
6 | // Copyright © 2016年 车德平. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface AddMapTableViewCell : UITableViewCell
12 |
13 | @property (weak, nonatomic) IBOutlet UIImageView *cellImage;
14 | @property (weak, nonatomic) IBOutlet UILabel *cellLabelText;
15 | @property (weak, nonatomic) IBOutlet UILabel *cellDetailTextLabelText;
16 |
17 | @end
18 |
--------------------------------------------------------------------------------
/JChat/Src/ChatModule/Input/Map/View/AddMapTableViewCell.m:
--------------------------------------------------------------------------------
1 |
2 | #import "AddMapTableViewCell.h"
3 |
4 | @implementation AddMapTableViewCell
5 |
6 | - (void)awakeFromNib {
7 | [super awakeFromNib];
8 | }
9 |
10 | - (void)setSelected:(BOOL)selected animated:(BOOL)animated {
11 | [super setSelected:selected animated:animated];
12 | }
13 |
14 | @end
15 |
--------------------------------------------------------------------------------
/JChat/Src/ChatRoomModule/View/JCChatRoomManagerListCell.swift:
--------------------------------------------------------------------------------
1 | //
2 | // JCChatRoomManagerListCell.swift
3 | // JChat
4 | //
5 | // Created by Allan on 2019/4/28.
6 | // Copyright © 2019 HXHG. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | class JCChatRoomManagerListCell: JCContacterCell {
12 |
13 | override func awakeFromNib() {
14 | super.awakeFromNib()
15 | // Initialization code
16 | _init()
17 | }
18 | override func setSelected(_ selected: Bool, animated: Bool) {
19 | super.setSelected(selected, animated: animated)
20 |
21 | }
22 |
23 | override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
24 | super.init(style: style, reuseIdentifier: reuseIdentifier)
25 | _init()
26 | }
27 |
28 | required init?(coder aDecoder: NSCoder) {
29 | super.init(coder: aDecoder)
30 | _init()
31 | fatalError("init(coder:) has not been implemented")
32 | }
33 | private func _init(){
34 | self.isShowBadge = false
35 | self.contentView.addSubview(self.deletBtn)
36 | self.deletBtn.mas_makeConstraints { (make) in
37 | make?.centerY.equalTo()(self.contentView)
38 | make?.right.equalTo()(self.contentView)?.offset()(-10.0)
39 | make?.size.equalTo()(CGSize.init(width: 72, height: 25))
40 | }
41 | }
42 | lazy var deletBtn: UIButton = {
43 | let deletBtn = UIButton.init()
44 | deletBtn.setTitle("移除", for: .normal)
45 | deletBtn.titleLabel?.font = UIFont.systemFont(ofSize: 14)
46 | let image = UIImage.createImage(color: UIColor(netHex: 0x2dd0cf), size: CGSize(width: 72, height: 25))
47 | deletBtn.setBackgroundImage(image, for: .normal)
48 | deletBtn.layer.cornerRadius = 2
49 | deletBtn.layer.masksToBounds = true
50 | return deletBtn
51 | }()
52 | }
53 |
--------------------------------------------------------------------------------
/JChat/Src/ChatRoomModule/ViewController/JCChatRoomBlackOrSilentListViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // JCChatRoomBlackOrSilentListViewController.swift
3 | // JChat
4 | //
5 | // Created by Allan on 2019/4/25.
6 | // Copyright © 2019 HXHG. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | class JCChatRoomBlackOrSilentListViewController: UIViewController {
12 | open var isBlack: Bool!
13 | override func viewDidLoad() {
14 | super.viewDidLoad()
15 | view.backgroundColor = UIColor(netHex: 0xe8edf3)
16 |
17 | if(self.isBlack){
18 | self.title = "黑名单"
19 | }else{
20 | self.title = "禁言列表"
21 | }
22 | }
23 |
24 |
25 | }
26 |
--------------------------------------------------------------------------------
/JChat/Src/ChatRoomModule/ViewController/JCChatRoomChangeOwnerViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // JCSetChatRoomOwnerViewController.swift
3 | // JChat
4 | //
5 | // Created by Allan on 2019/4/25.
6 | // Copyright © 2019 HXHG. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | class JCChatRoomChangeOwnerViewController: JCSearchFriendViewController {
12 |
13 | override func viewDidLoad() {
14 | super.viewDidLoad()
15 | self.title = "设置房主"
16 | view.backgroundColor = UIColor(netHex: 0xe8edf3)
17 | addButton.setTitle("设置房主", for: .normal)
18 | addButton.addTarget(self, action: #selector(_setRoomOwner), for: .touchUpInside)
19 |
20 | }
21 |
22 | @objc func _setRoomOwner(){
23 |
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/JChat/Src/ChatRoomModule/ViewController/JCChatRoomIntroduceViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // JCChatRoomIntroduceViewController.swift
3 | // JChat
4 | //
5 | // Created by Allan on 2019/4/25.
6 | // Copyright © 2019 HXHG. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | class JCChatRoomIntroduceViewController: UIViewController {
12 |
13 | open var introduceText: String?
14 | @IBOutlet weak var introduceInfo: UITextView!
15 | open var roomIntroduceInfo: String?
16 |
17 | override func viewDidLoad() {
18 | super.viewDidLoad()
19 | self.title = "聊天室介绍"
20 | self.introduceInfo.text = self.introduceText
21 | view.backgroundColor = UIColor(netHex: 0xe8edf3)
22 | }
23 |
24 |
25 | }
26 |
--------------------------------------------------------------------------------
/JChat/Src/ChatRoomModule/ViewController/JCChatRoomNameInfoViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // JCChatRoomNameInfoViewController.swift
3 | // JChat
4 | //
5 | // Created by Allan on 2019/4/25.
6 | // Copyright © 2019 HXHG. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | class JCChatRoomNameInfoViewController: UIViewController {
12 | @IBOutlet weak var nameInfo: UITextView!
13 |
14 | open var roomName: String?
15 | override func viewDidLoad() {
16 | super.viewDidLoad()
17 | self.title = "聊天室名称"
18 | self.nameInfo.text = self.roomName
19 | view.backgroundColor = UIColor(netHex: 0xe8edf3)
20 |
21 | }
22 |
23 | }
24 |
--------------------------------------------------------------------------------
/JChat/Src/ChatRoomModule/ViewController/JCSearchUserViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // JCSearchUserViewController.swift
3 | // JChat
4 | //
5 | // Created by Allan on 2019/4/26.
6 | // Copyright © 2019 HXHG. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | class JCSearchUserViewController: UIViewController {
12 |
13 | open var searchBar: UISearchBar!
14 | override func viewDidLoad() {
15 | super.viewDidLoad()
16 | self.searchBar = self.searchController.searchBar
17 | // Do any additional setup after loading the view.
18 | }
19 |
20 | fileprivate lazy var searchController: UISearchController = {
21 | let rootVC = JCCRSearchResultViewController()
22 | let resultNav = JCNavigationController(rootViewController:rootVC)
23 | var searchVC = UISearchController(searchResultsController:resultNav)
24 | searchVC.delegate = self
25 | searchVC.searchResultsUpdater = rootVC
26 | // 设置开始搜索时导航条是否隐藏
27 | searchVC.hidesNavigationBarDuringPresentation = true
28 | // 设置开始搜索时背景是否显示
29 | searchVC.dimsBackgroundDuringPresentation = false
30 | let searchBar = searchVC.searchBar
31 | searchBar.sizeToFit()
32 | searchBar.delegate = self
33 | searchBar.searchBarStyle = .minimal
34 | searchBar.placeholder = "请输入用户ID"
35 | searchVC.searchBar.returnKeyType = .search
36 | searchBar.setSearchFieldBackgroundImage(UIImage.createImage(color: .white, size: CGSize(width: UIScreen.main.bounds.size.width, height: 31)), for: .normal)
37 |
38 | return searchVC
39 | } ()
40 |
41 |
42 | }
43 |
44 |
45 | extension JCSearchUserViewController: UISearchControllerDelegate,UISearchBarDelegate{
46 |
47 |
48 | }
49 |
--------------------------------------------------------------------------------
/JChat/Src/UserModule/Model/UserDefaultValidationService.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UserDefaultValidationService.swift
3 | // JChat
4 | //
5 | // Created by JIGUANG on 2017/8/11.
6 | // Copyright © 2017年 HXHG. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | final class UserDefaultValidationService: UserValidationService {
12 | static let sharedValidationService = UserDefaultValidationService()
13 |
14 | private init () {}
15 |
16 | let maxCount = 128
17 | let minCount = 4
18 |
19 | func validateUsername(_ username: String) -> ValidationResult {
20 |
21 | if username.isEmpty {
22 | return .failed(message: "用户名不能为空")
23 | }
24 |
25 | if username.length < minCount || username.length > maxCount {
26 | return .failed(message: "用户名为4-128位字符")
27 | }
28 |
29 | let fristCharRegex = "^([a-zA-Z0-9])(.*)$"
30 | let fristCharPredicate = NSPredicate(format: "SELF MATCHES %@", fristCharRegex)
31 | if !fristCharPredicate.evaluate(with: username) {
32 | return .failed(message: "用户名以字母或数字开头")
33 | }
34 |
35 | if username.isContainsChinese {
36 | return .failed(message: "用户名不能包含中文字符")
37 | }
38 |
39 | if username.isExpectations {
40 | return .ok
41 | }
42 |
43 | return .failed(message: "用户名包含非法字符")
44 | }
45 |
46 | func validatePassword(_ password: String) -> ValidationResult {
47 | if password.isEmpty {
48 | return .failed(message: "密码不能为空")
49 | }
50 | if password.length < minCount || password.length > maxCount {
51 | return .failed(message: "密码为4-128位字符")
52 | }
53 | return .ok
54 | }
55 | }
56 |
--------------------------------------------------------------------------------
/JChat/Src/UserModule/Protocols/UserProtocols.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Protocols.swift
3 | // JChat
4 | //
5 | // Created by JIGUANG on 2017/8/11.
6 | // Copyright © 2017年 HXHG. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | func == (lhs: ValidationResult, rhs: ValidationResult) -> Bool {
12 | switch (lhs, rhs) {
13 | case (.ok, .ok):
14 | return true
15 | case (.empty, .empty):
16 | return true
17 | case (.validating, .validating):
18 | return true
19 | case (.failed, .failed):
20 | return true
21 | default:
22 | return false
23 | }
24 | }
25 |
26 | enum ValidationResult: CustomStringConvertible, Equatable {
27 | case ok
28 | case empty
29 | case validating
30 | case failed(message: String)
31 |
32 | var description: String {
33 | switch self {
34 | case .ok:
35 | return ""
36 | case .empty:
37 | return ""
38 | case .validating:
39 | return "validating ..."
40 | case let .failed(message):
41 | return message
42 | }
43 | }
44 | }
45 |
46 | protocol UserValidationService {
47 | func validateUsername(_ username: String) -> ValidationResult
48 | func validatePassword(_ password: String) -> ValidationResult
49 | }
50 |
--------------------------------------------------------------------------------
/JChat/Src/Utilites/3rdParty/AreaPickerView/JCLocation.swift:
--------------------------------------------------------------------------------
1 | //
2 | // JCLocation.swift
3 | // JChat
4 | //
5 | // Created by JIGUANG on 2017/5/3.
6 | // Copyright © 2017年 dengyonghao. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | @objc(JCLocation)
12 | public class JCLocation: NSObject {
13 |
14 | var country = ""
15 | var province = ""
16 | var city = ""
17 | var area = ""
18 | var street = ""
19 |
20 | var provinceCode = ""
21 | var cityCode = ""
22 | var areaCode = ""
23 |
24 | func decription() {
25 | print("\(province): \(provinceCode) \(city): \(cityCode) \(area): \(areaCode)")
26 | }
27 |
28 | }
29 |
--------------------------------------------------------------------------------
/JChat/Src/Utilites/3rdParty/DLSlideView/DLCache/DLCacheProtocol.h:
--------------------------------------------------------------------------------
1 | //
2 | // DLCacheProtocol.h
3 | // DLSlideViewDemo
4 | //
5 | // Created by Dongle Su on 15-2-13.
6 | // Copyright (c) 2015年 dongle. All rights reserved.
7 | //
8 |
9 | #ifndef DLSlideViewDemo_DLCacheProtocol_h
10 | #define DLSlideViewDemo_DLCacheProtocol_h
11 | #import
12 |
13 | @protocol DLCacheProtocol
14 | - (void)setObject:(id)object forKey:(NSString *)key;
15 | - (id)objectForKey:(NSString *)key;
16 | @end
17 |
18 | #endif
19 |
--------------------------------------------------------------------------------
/JChat/Src/Utilites/3rdParty/DLSlideView/DLCache/DLLRUCache.h:
--------------------------------------------------------------------------------
1 | //
2 | // DLFIFOCache.h
3 | // DLSlideViewDemo
4 | //
5 | // Created by Dongle Su on 14-12-13.
6 | // Copyright (c) 2014年 dongle. All rights reserved.
7 | //
8 |
9 | #import
10 | #import "DLCacheProtocol.h"
11 |
12 | @interface DLLRUCache : NSObject
13 |
14 | - (id)initWithCount:(NSInteger)count;
15 |
16 | - (void)setObject:(id)object forKey:(NSString *)key;
17 | - (id)objectForKey:(NSString *)key;
18 | @end
19 |
--------------------------------------------------------------------------------
/JChat/Src/Utilites/3rdParty/DLSlideView/DLCache/DLLRUCache.m:
--------------------------------------------------------------------------------
1 | //
2 | // DLFIFOCache.m
3 | // DLSlideViewDemo
4 | //
5 | // Created by Dongle Su on 14-12-13.
6 | // Copyright (c) 2014年 dongle. All rights reserved.
7 | //
8 |
9 | #import "DLLRUCache.h"
10 |
11 | @implementation DLLRUCache{
12 | NSMutableDictionary *dic_;
13 | NSMutableArray *lruKeyList_;
14 | NSInteger capacity_;
15 | }
16 |
17 | - (id)initWithCount:(NSInteger)count{
18 | if (self = [super init]) {
19 | capacity_ = count;
20 | dic_ = [NSMutableDictionary dictionaryWithCapacity:capacity_];
21 | lruKeyList_ = [NSMutableArray arrayWithCapacity:capacity_];
22 | }
23 |
24 | return self;
25 | }
26 |
27 | - (void)setObject:(id)object forKey:(NSString *)key{
28 | if (![lruKeyList_ containsObject:key]) {
29 | if (lruKeyList_.count < capacity_) {
30 | [dic_ setValue:object forKey:key];
31 | [lruKeyList_ addObject:key];
32 | }
33 | else{
34 | NSString *longTimeUnusedKey = [lruKeyList_ firstObject];
35 | [dic_ setValue:nil forKey:longTimeUnusedKey];
36 | [lruKeyList_ removeObjectAtIndex:0];
37 |
38 | [dic_ setValue:object forKey:key];
39 | [lruKeyList_ addObject:key];
40 | }
41 | }
42 | else{
43 | [dic_ setValue:object forKey:key];
44 | [lruKeyList_ removeObject:key];
45 | [lruKeyList_ addObject:key];
46 | }
47 | }
48 |
49 | - (id)objectForKey:(NSString *)key{
50 | if ([lruKeyList_ containsObject:key]) {
51 | [lruKeyList_ removeObject:key];
52 | [lruKeyList_ addObject:key];
53 |
54 | return [dic_ objectForKey:key];
55 | }
56 | else{
57 | return nil;
58 | }
59 | }
60 | @end
61 |
--------------------------------------------------------------------------------
/JChat/Src/Utilites/3rdParty/DLSlideView/DLCustomSlideView.h:
--------------------------------------------------------------------------------
1 | //
2 | // DLCustomSlideView.h
3 | // DLSlideViewDemo
4 | //
5 | // Created by Dongle Su on 15-2-12.
6 | // Copyright (c) 2015年 dongle. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | #import "DLSlideTabbarProtocol.h"
12 | #import "DLSlideView.h"
13 | #import "DLTabedSlideView.h"
14 | #import "DLCacheProtocol.h"
15 |
16 |
17 | @class DLCustomSlideView;
18 |
19 | @protocol DLCustomSlideViewDelegate
20 | - (NSInteger)numberOfTabsInDLCustomSlideView:(DLCustomSlideView *)sender;
21 | - (UIViewController *)DLCustomSlideView:(DLCustomSlideView *)sender controllerAt:(NSInteger)index;
22 | @optional
23 | - (void)DLCustomSlideView:(DLCustomSlideView *)sender didSelectedAt:(NSInteger)index;
24 | @end
25 |
26 |
27 |
28 | @interface DLCustomSlideView : UIView
29 | @property(nonatomic, weak) UIViewController *baseViewController;
30 | @property(nonatomic, assign) NSInteger selectedIndex;
31 |
32 | // tabbar
33 | @property(nonatomic, strong) UIView *tabbar;
34 | @property(nonatomic, assign) float tabbarBottomSpacing;
35 |
36 | // cache properties
37 | @property(nonatomic, strong) id cache;
38 |
39 | // delegate
40 | @property(nonatomic, weak)IBOutlet iddelegate;
41 |
42 | // init method. 初始分方法
43 | - (void)setup;
44 |
45 | @end
46 |
--------------------------------------------------------------------------------
/JChat/Src/Utilites/3rdParty/DLSlideView/DLSlideView.h:
--------------------------------------------------------------------------------
1 | //
2 | // DLSlideView.h
3 | // DLSlideController
4 | //
5 | // Created by Dongle Su on 14-12-7.
6 | // Copyright (c) 2014年 dongle. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @class DLSlideView;
12 |
13 | @protocol DLSlideViewDataSource
14 | - (NSInteger)numberOfControllersInDLSlideView:(DLSlideView *)sender;
15 | - (UIViewController *)DLSlideView:(DLSlideView *)sender controllerAt:(NSInteger)index;
16 | @end
17 |
18 | @protocol DLSlideViewDelegate
19 | @optional
20 | - (void)DLSlideView:(DLSlideView *)slide switchingFrom:(NSInteger)oldIndex to:(NSInteger)toIndex percent:(float)percent;
21 | - (void)DLSlideView:(DLSlideView *)slide didSwitchTo:(NSInteger)index;
22 | - (void)DLSlideView:(DLSlideView *)slide switchCanceled:(NSInteger)oldIndex;
23 | @end
24 |
25 | @interface DLSlideView : UIView
26 | //@property(nonatomic, strong) NSArray *viewControllers;
27 | @property(nonatomic, assign) NSInteger selectedIndex;
28 | @property(nonatomic, weak) UIViewController *baseViewController;
29 | @property(nonatomic, weak) iddelegate;
30 | @property(nonatomic, weak) iddataSource;
31 | - (void)switchTo:(NSInteger)index;
32 |
33 | @end
34 |
--------------------------------------------------------------------------------
/JChat/Src/Utilites/3rdParty/DLSlideView/DLTabbarView/DLFixedTabbarView.h:
--------------------------------------------------------------------------------
1 | //
2 | // DLFixedTabbarView.h
3 | // DLSlideController
4 | //
5 | // Created by Dongle Su on 14-12-8.
6 | // Copyright (c) 2014年 dongle. All rights reserved.
7 | //
8 |
9 | #import
10 | #import "DLSlideTabbarProtocol.h"
11 |
12 | @interface DLFixedTabbarViewTabItem : NSObject
13 | @property(nonatomic, strong) NSString *title;
14 | @property(nonatomic, strong) UIImage *image;
15 | @property(nonatomic, strong) UIImage *selectedImage;
16 | @property(nonatomic, strong) UIColor *titleColor;
17 | @property(nonatomic, strong) UIColor *selectedTitleColor;
18 | @end
19 |
20 | @interface DLFixedTabbarView : UIView
21 | @property(nonatomic, strong) UIImage *backgroundImage;
22 | @property(nonatomic, strong) UIColor *trackColor;
23 | @property(nonatomic, strong) NSArray *tabbarItems;
24 | //- (void)addBarItemWithTitle:(NSString *)title titleColor:(UIColor *)titleColor image:(UIImage *)image selectedImage:(UIImage *)selectedImage;
25 |
26 | @property(nonatomic, assign) NSInteger selectedIndex;
27 | @property(nonatomic, readonly) NSInteger tabbarCount;
28 | @property(nonatomic, weak) id delegate;
29 | - (void)switchingFrom:(NSInteger)fromIndex to:(NSInteger)toIndex percent:(float)percent;
30 |
31 | @end
32 |
--------------------------------------------------------------------------------
/JChat/Src/Utilites/3rdParty/DLSlideView/DLTabbarView/DLScrollTabbarView.h:
--------------------------------------------------------------------------------
1 | //
2 | // DLScrollTabbarView.h
3 | // DLSlideViewDemo
4 | //
5 | // Created by Dongle Su on 15-2-12.
6 | // Copyright (c) 2015年 dongle. All rights reserved.
7 | //
8 |
9 | #import
10 | #import "DLSlideTabbarProtocol.h"
11 |
12 | @interface DLScrollTabbarItem : NSObject
13 | @property(nonatomic, strong) NSString *title;
14 | @property(nonatomic, assign) CGFloat width;
15 | + (DLScrollTabbarItem *)itemWithTitle:(NSString *)title width:(CGFloat)width;
16 | @end
17 |
18 | @interface DLScrollTabbarView : UIView
19 | @property(nonatomic, strong) UIView *backgroundView;
20 |
21 | // tabbar属性
22 | @property (nonatomic, strong) UIColor *tabItemNormalColor UI_APPEARANCE_SELECTOR;
23 | @property (nonatomic, strong) UIColor *tabItemSelectedColor UI_APPEARANCE_SELECTOR;
24 | @property (nonatomic, assign) CGFloat tabItemNormalFontSize;
25 | @property(nonatomic, strong) UIColor *trackColor UI_APPEARANCE_SELECTOR;
26 | @property(nonatomic, strong) NSArray *tabbarItems;
27 |
28 | // DLSlideTabbarProtocol
29 | @property(nonatomic, assign) NSInteger selectedIndex;
30 | @property(nonatomic, readonly) NSInteger tabbarCount;
31 | @property(nonatomic, weak) id delegate;
32 | - (void)switchingFrom:(NSInteger)fromIndex to:(NSInteger)toIndex percent:(float)percent;
33 |
34 | @end
35 |
--------------------------------------------------------------------------------
/JChat/Src/Utilites/3rdParty/DLSlideView/DLTabbarView/DLSlideTabbarProtocol.h:
--------------------------------------------------------------------------------
1 | //
2 | // DLSlideTabbarProtocol.h
3 | // DLSlideController
4 | //
5 | // Created by Dongle Su on 14-12-8.
6 | // Copyright (c) 2014年 dongle. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @protocol DLSlideTabbarDelegate
12 | - (void)DLSlideTabbar:(id)sender selectAt:(NSInteger)index;
13 | @end
14 |
15 | @protocol DLSlideTabbarProtocol
16 | @property(nonatomic, assign) NSInteger selectedIndex;
17 | @property(nonatomic, readonly) NSInteger tabbarCount;
18 | @property(nonatomic, weak) id delegate;
19 | - (void)switchingFrom:(NSInteger)fromIndex to:(NSInteger)toIndex percent:(float)percent;
20 |
21 | @end
22 |
--------------------------------------------------------------------------------
/JChat/Src/Utilites/3rdParty/DLSlideView/DLTabedSlideView.h:
--------------------------------------------------------------------------------
1 | //
2 | // DLTabedSlideView.h
3 | // DLSlideController
4 | //
5 | // Created by Dongle Su on 14-12-8.
6 | // Copyright (c) 2014年 dongle. All rights reserved.
7 | //
8 |
9 | #import
10 | #import "DLSlideTabbarProtocol.h"
11 |
12 | @interface DLTabedbarItem : NSObject
13 | @property (nonatomic, strong) NSString *title;
14 | @property(nonatomic, strong) UIImage *image;
15 | @property(nonatomic, strong) UIImage *selectedImage;
16 |
17 | + (DLTabedbarItem *)itemWithTitle:(NSString *)title image:(UIImage *)image selectedImage:(UIImage *)selectedImage;
18 | @end
19 |
20 | @class DLTabedSlideView;
21 |
22 | @protocol DLTabedSlideViewDelegate
23 | - (NSInteger)numberOfTabsInDLTabedSlideView:(DLTabedSlideView *)sender;
24 | - (UIViewController *)DLTabedSlideView:(DLTabedSlideView *)sender controllerAt:(NSInteger)index;
25 | @optional
26 | - (void)DLTabedSlideView:(DLTabedSlideView *)sender didSelectedAt:(NSInteger)index;
27 | @end
28 |
29 | @interface DLTabedSlideView : UIView
30 | //@property(nonatomic, strong) NSArray *viewControllers;
31 | @property(nonatomic, weak) UIViewController *baseViewController;
32 | @property(nonatomic, assign) NSInteger selectedIndex;
33 |
34 |
35 | //set tabbar properties.
36 | @property (nonatomic, strong) UIColor *tabItemNormalColor;
37 | @property (nonatomic, strong) UIColor *tabItemSelectedColor;
38 | @property(nonatomic, strong) UIImage *tabbarBackgroundImage;
39 | @property(nonatomic, strong) UIColor *tabbarTrackColor;
40 | @property(nonatomic, strong) NSArray *tabbarItems;
41 | @property(nonatomic, assign) float tabbarHeight;
42 | @property(nonatomic, assign) float tabbarBottomSpacing;
43 |
44 | // cache properties
45 | @property(nonatomic, assign) NSInteger cacheCount;
46 |
47 | - (void)buildTabbar;
48 |
49 | //@property(nonatomic, strong) IBOutlet id tabarView;
50 |
51 |
52 | @property(nonatomic, weak)IBOutlet iddelegate;
53 |
54 | @end
55 |
--------------------------------------------------------------------------------
/JChat/Src/Utilites/3rdParty/DLSlideView/DLUtility.h:
--------------------------------------------------------------------------------
1 | //
2 | // DLUtility.h
3 | // DLSlideViewDemo
4 | //
5 | // Created by Dongle Su on 15-2-12.
6 | // Copyright (c) 2015年 dongle. All rights reserved.
7 | //
8 |
9 | #import
10 | #import
11 |
12 | @interface DLUtility : NSObject
13 | + (UIColor *)getColorOfPercent:(CGFloat)percent between:(UIColor *)color1 and:(UIColor *)color2;
14 | @end
15 |
--------------------------------------------------------------------------------
/JChat/Src/Utilites/3rdParty/DLSlideView/DLUtility.m:
--------------------------------------------------------------------------------
1 | //
2 | // DLUtility.m
3 | // DLSlideViewDemo
4 | //
5 | // Created by Dongle Su on 15-2-12.
6 | // Copyright (c) 2015年 dongle. All rights reserved.
7 | //
8 |
9 | #import "DLUtility.h"
10 |
11 | @implementation DLUtility
12 | + (UIColor *)getColorOfPercent:(CGFloat)percent between:(UIColor *)color1 and:(UIColor *)color2{
13 | CGFloat red1, green1, blue1, alpha1;
14 | [color1 getRed:&red1 green:&green1 blue:&blue1 alpha:&alpha1];
15 |
16 | CGFloat red2, green2, blue2, alpha2;
17 | [color2 getRed:&red2 green:&green2 blue:&blue2 alpha:&alpha2];
18 |
19 | CGFloat p1 = percent;
20 | CGFloat p2 = 1.0 - percent;
21 | UIColor *mid = [UIColor colorWithRed:red1*p1+red2*p2 green:green1*p1+green2*p2 blue:blue1*p1+blue2*p2 alpha:1.0f];
22 | return mid;
23 | }
24 |
25 | @end
26 |
--------------------------------------------------------------------------------
/JChat/Src/Utilites/3rdParty/InputBar/SAIInputBackgroundView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SAIInputBackgroundView.swift
3 | // SAIInputBar
4 | //
5 | // Created by SAGESSE on 8/31/16.
6 | // Copyright © 2016-2017 SAGESSE. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | internal class SAIInputBackgroundView: UIToolbar {
12 |
13 | }
14 |
--------------------------------------------------------------------------------
/JChat/Src/Utilites/3rdParty/InputBar/SAIToolboxItem.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SAIToolboxItem.swift
3 | // SAC
4 | //
5 | // Created by SAGESSE on 9/15/16.
6 | // Copyright © 2016-2017 SAGESSE. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | @objc open class SAIToolboxItem: NSObject {
12 |
13 | open var name: String
14 | open var identifier: String
15 |
16 | open var image: UIImage?
17 | open var highlightedImage: UIImage?
18 |
19 | public init(_ identifier: String, _ name: String, _ image: UIImage?, _ highlightedImage: UIImage? = nil) {
20 | self.identifier = identifier
21 | self.name = name
22 | self.image = image
23 | self.highlightedImage = highlightedImage
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/JChat/Src/Utilites/3rdParty/InputBar/SAIToolboxItemView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SAIToolboxItemView.swift
3 | // SAC
4 | //
5 | // Created by SAGESSE on 9/15/16.
6 | // Copyright © 2016-2017 SAGESSE. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | internal class SAIToolboxItemView: UICollectionViewCell {
12 |
13 | var item: SAIToolboxItem? {
14 | didSet {
15 | _titleLabel.text = item?.name
16 | _iconView.image = item?.image
17 | _iconView.highlightedImage = item?.highlightedImage
18 | }
19 | }
20 |
21 | weak var handler: AnyObject?
22 |
23 | private func _init() {
24 |
25 | _titleLabel.font = UIFont.systemFont(ofSize: 12)
26 | _titleLabel.textColor = .gray
27 | _titleLabel.textAlignment = .center
28 | _titleLabel.translatesAutoresizingMaskIntoConstraints = false
29 |
30 | _iconView.contentMode = .scaleAspectFit
31 | _iconView.translatesAutoresizingMaskIntoConstraints = false
32 |
33 | let view = UIView()
34 | view.backgroundColor = UIColor(white: 0, alpha: 0.2)
35 | view.layer.cornerRadius = 4
36 | selectedBackgroundView = view
37 |
38 | contentView.addSubview(_iconView)
39 | contentView.addSubview(_titleLabel)
40 |
41 | _iconView.mas_makeConstraints({ (make) in
42 | make?.centerX.equalTo()(_titleLabel.mas_centerX)
43 | make?.top.equalTo()(self.mas_top)?.offset()(8)
44 | make?.width.equalTo()(43)
45 | make?.height.equalTo()(43)
46 | })
47 | _titleLabel.mas_makeConstraints { (make) in
48 | make?.top.equalTo()(_iconView.mas_bottom)?.offset()(5)
49 | make?.left.and()?.right().equalTo()
50 | make?.height.equalTo()(20)
51 | }
52 | }
53 |
54 | private lazy var _iconView: UIImageView = UIImageView()
55 | private lazy var _titleLabel: UILabel = UILabel()
56 |
57 | override init(frame: CGRect) {
58 | super.init(frame: frame)
59 | _init()
60 | }
61 | required init?(coder aDecoder: NSCoder) {
62 | super.init(coder: aDecoder)
63 | _init()
64 | }
65 | }
66 |
67 |
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ExJMessage/Core/ExJMessage.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ExJMessage.swift
3 | // JChat
4 | //
5 | // Created by JIGUANG on 2017/10/1.
6 | // Copyright © 2017年 HXHG. All rights reserved.
7 | //
8 |
9 | import UIKit
10 | import JMessage
11 |
12 | public final class ExJMessage {
13 | public let base: Base
14 | public init(_ base: Base) {
15 | self.base = base
16 | }
17 | }
18 |
19 | /**
20 | A type that has ExJMessage extensions.
21 | */
22 | public protocol ExJMessageCompatible { }
23 |
24 | public extension ExJMessageCompatible {
25 | public static var ex: ExJMessage.Type {
26 | get { return ExJMessage.self }
27 | }
28 | public var ex: ExJMessage {
29 | get { return ExJMessage(self) }
30 | }
31 | }
32 |
33 | extension JMSGConversation: ExJMessageCompatible { }
34 | extension JMSGMessage: ExJMessageCompatible { }
35 | extension JMSGOptionalContent: ExJMessageCompatible { }
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ExJMessage/Extensions/JMSGOptionalContent+.swift:
--------------------------------------------------------------------------------
1 | //
2 | // JMSGOptionalContent+.swift
3 | // JChat
4 | //
5 | // Created by JIGUANG on 2017/10/8.
6 | // Copyright © 2017年 HXHG. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | extension ExJMessage where Base: JMSGOptionalContent {
12 |
13 | /**
14 | default optional content
15 | */
16 | static var `default`: JMSGOptionalContent {
17 | let optionalContent = JMSGOptionalContent()
18 | #if READ_VERSION
19 | optionalContent.needReadReceipt = true
20 | #else
21 | optionalContent.needReadReceipt = false
22 | #endif
23 | return optionalContent
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/JChat/Src/Utilites/Extension/Array+JChat.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Array+JChat.swift
3 | // JChat
4 | //
5 | // Created by JIGUANG on 2017/10/11.
6 | // Copyright © 2017年 HXHG. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | // MARK: - JCMessageType
12 | extension Array where Element: JCMessageType {
13 |
14 | func index(_ message: JMSGMessage) -> Int? {
15 | return self.index(where: { (m) -> Bool in
16 | m.msgId == message.msgId
17 | })
18 | }
19 |
20 | func index(_ message: JCMessageType) -> Int? {
21 | return self.index(where: { (m) -> Bool in
22 | m.msgId == message.msgId
23 | })
24 | }
25 | }
26 |
27 | // MARK: - String
28 | extension Array where Element == String {
29 | func sortedKeys() -> [Element] {
30 | var array = self.sorted(by: { (str1, str2) -> Bool in
31 | return str1 < str2
32 | })
33 | if let first = array.first {
34 | if first == "#" {
35 | array.removeFirst()
36 | array.append(first)
37 | }
38 | }
39 | return array
40 | }
41 |
42 | }
43 |
--------------------------------------------------------------------------------
/JChat/Src/Utilites/Extension/MBProgressHUD+JChat.swift:
--------------------------------------------------------------------------------
1 | //
2 | // MBProgressHUD+JChat.swift
3 | // JChat
4 | //
5 | // Created by JIGUANG on 2017/3/16.
6 | // Copyright © 2017年 HXHG. All rights reserved.
7 | //
8 |
9 | import UIKit
10 | import MBProgressHUD
11 |
12 | class MBProgressHUD_JChat: MBProgressHUD {
13 |
14 | public static func showMessage(message: String, toView: UIView?) {
15 | DispatchQueue.main.async {
16 | var currentView = toView
17 | if toView == nil {
18 | currentView = UIApplication.shared.keyWindow
19 | }
20 | let hud = MBProgressHUD.showAdded(to: currentView!, animated: true)
21 | hud.label.text = message
22 | hud.label.textColor = UIColor(white: 1, alpha: 0.7)
23 | hud.bezelView.color = .black
24 | hud.activityIndicatorColor = UIColor(netHex: 0x9B9B9B)
25 | hud.removeFromSuperViewOnHide = true
26 | }
27 | }
28 |
29 | public static func show(text: String, view: UIView?, _ time: TimeInterval = 1.5) {
30 | DispatchQueue.main.async {
31 | var currentView = view
32 | if view == nil {
33 | currentView = UIApplication.shared.keyWindow
34 | }
35 | let hud = MBProgressHUD.showAdded(to: currentView!, animated: true)
36 | hud.label.text = text
37 | hud.bezelView.color = .black
38 | hud.mode = .customView
39 | hud.removeFromSuperViewOnHide = true
40 | hud.label.textColor = UIColor(white: 1, alpha: 0.7)
41 | hud.hide(animated: true, afterDelay: time)
42 | }
43 | }
44 |
45 | public static func hide(forView: UIView?, animated: Bool) {
46 | DispatchQueue.main.async {
47 | var currentView = forView
48 | if currentView == nil {
49 | currentView = UIApplication.shared.keyWindow
50 | }
51 | MBProgressHUD.hide(for: currentView!, animated: animated)
52 | }
53 | }
54 |
55 | }
56 |
--------------------------------------------------------------------------------
/JChat/Src/Utilites/Extension/NSLayoutConstraint+JChat.swift:
--------------------------------------------------------------------------------
1 | //
2 | // File.swift
3 | // JChat
4 | //
5 | // Created by JIGUANG on 2017/3/22.
6 | // Copyright © 2017年 HXHG. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | @inline(__always)
12 | internal func _JCLayoutConstraintMake(_ item: AnyObject, _ attr1: NSLayoutConstraint.Attribute, _ related: NSLayoutConstraint.Relation, _ toItem: AnyObject? = nil, _ attr2: NSLayoutConstraint.Attribute = .notAnAttribute, _ constant: CGFloat = 0, priority: UILayoutPriority = UILayoutPriority(1000), multiplier: CGFloat = 1, output: UnsafeMutablePointer? = nil) -> NSLayoutConstraint {
13 |
14 | if let view = item as? UIView {
15 | view.translatesAutoresizingMaskIntoConstraints = false
16 | }
17 |
18 | if let view = item as? UIView {
19 | view.translatesAutoresizingMaskIntoConstraints = false
20 | }
21 |
22 | let c = NSLayoutConstraint(item:item, attribute:attr1, relatedBy:related, toItem:toItem, attribute:attr2, multiplier:multiplier, constant:constant)
23 | c.priority = priority
24 | if output != nil {
25 | output?.pointee = c
26 | }
27 |
28 | return c
29 | }
30 |
--------------------------------------------------------------------------------
/JChat/Src/Utilites/Extension/UIColor+JChat.swift:
--------------------------------------------------------------------------------
1 | //
2 | // CCUIColorExtension.swift
3 | // JChat
4 | //
5 | // Created by JIGUANG on 2017/2/16.
6 | // Copyright © 2017年 HXHG. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | extension UIColor {
12 |
13 | static var random: UIColor {
14 | let maxValue: UInt32 = 24
15 | return UIColor(red: CGFloat(arc4random() % maxValue) / CGFloat(maxValue),
16 | green: CGFloat(arc4random() % maxValue) / CGFloat(maxValue) ,
17 | blue: CGFloat(arc4random() % maxValue) / CGFloat(maxValue) ,
18 | alpha: 1)
19 | }
20 |
21 | // convenience init(red: Int, green: Int, blue: Int) {
22 | // assert(red >= 0 && red <= 255, "Invalid red component")
23 | // assert(green >= 0 && green <= 255, "Invalid green component")
24 | // assert(blue >= 0 && blue <= 255, "Invalid blue component")
25 | //
26 | // self.init(red: CGFloat(red) / 255.0, green: CGFloat(green) / 255.0, blue: CGFloat(blue) / 255.0, alpha: 1.0)
27 | // }
28 |
29 | convenience init(netHex:Int) {
30 | self.init(red:(netHex >> 16) & 0xff, green:(netHex >> 8) & 0xff, blue:netHex & 0xff)
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/JChat/Src/Utilites/Extension/UISearchBar+JChat.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UISearchBar+JChat.swift
3 | // JChat
4 | //
5 | // Created by JIGUANG on 2017/10/13.
6 | // Copyright © 2017年 HXHG. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | extension UISearchBar {
12 | static var `default`: UISearchBar {
13 | let searchBar = UISearchBar()
14 | searchBar.placeholder = "搜索"
15 | searchBar.barStyle = .default
16 | searchBar.backgroundColor = .white
17 | searchBar.barTintColor = .white
18 | searchBar.autocapitalizationType = .none
19 | searchBar.layer.borderColor = UIColor.white.cgColor
20 | searchBar.layer.borderWidth = 1
21 | searchBar.layer.masksToBounds = true
22 | return searchBar
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/JChat/Src/Utilites/Extension/UITextInput+JChat.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UITextInput+JChat.swift
3 | // JChat
4 | //
5 | // Created by JIGUANG on 2017/10/18.
6 | // Copyright © 2017年 HXHG. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | protocol TextProtocol {
12 | func limitNonMarkedTextSize(_ maxSize: Int)
13 | }
14 |
15 | extension UITextView: TextProtocol {
16 | func limitNonMarkedTextSize(_ maxSize: Int) {
17 | if self.markedTextRange != nil {
18 | return
19 | }
20 | let text = self.text!
21 | if text.count > maxSize {
22 | let range = text.startIndex ..< text.index(text.startIndex, offsetBy: maxSize)
23 | //let range = Range(text.startIndex ..< text.index(text.startIndex, offsetBy: maxSize))
24 | let subText = text.substring(with: range)
25 | self.text = subText
26 | }
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/JChat/Src/Utilites/Extension/UIView+JChat.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UIView+JChat.swift
3 | // JChat
4 | //
5 | // Created by JIGUANG on 2017/3/22.
6 | // Copyright © 2017年 HXHG. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | extension UIView {
12 |
13 | var x: CGFloat {
14 | return frame.origin.x
15 | }
16 |
17 | var y: CGFloat {
18 | return frame.origin.y
19 | }
20 |
21 | var width: CGFloat {
22 | return frame.size.width
23 | }
24 |
25 | var height: CGFloat {
26 | return frame.size.height
27 | }
28 |
29 | var size: CGSize {
30 | return frame.size
31 | }
32 |
33 | var origin: CGPoint {
34 | return frame.origin
35 | }
36 |
37 | var centerX: CGFloat {
38 | return (frame.origin.x + frame.size.width) / 2
39 | }
40 |
41 | var centerY: CGFloat {
42 | return (frame.origin.y + frame.size.height) / 2
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/JChat/Src/Utilites/Extension/UIViewController+JChat.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UIViewController+JChat.swift
3 | // JChat
4 | //
5 | // Created by JIGUANG on 2017/10/8.
6 | // Copyright © 2017年 HXHG. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | extension UIViewController {
12 | @objc func back(_ animated: Bool = true) {
13 | navigationController?.popViewController(animated: animated)
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/JChat/Src/Utilites/NetworkManager/JCNetworkManager.swift:
--------------------------------------------------------------------------------
1 | //
2 | // JCNetworkManager.swift
3 | // JChat
4 | //
5 | // Created by JIGUANG on 2017/6/16.
6 | // Copyright © 2017年 HXHG. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | class JCNetworkManager: NSObject {
12 |
13 | static var isNotReachable: Bool {
14 | get {
15 | let reachability = Reachability.forInternetConnection()
16 | if let status = reachability?.currentReachabilityStatus() {
17 | switch status {
18 | case NotReachable:
19 | return true
20 | default :
21 | return false
22 | }
23 | }
24 | return false
25 | }
26 | }
27 |
28 | }
29 |
--------------------------------------------------------------------------------
/JChat/Src/Utilites/Reachability/Reachability.h:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright (C) 2016 Apple Inc. All Rights Reserved.
3 | See LICENSE.txt for this sample’s licensing information
4 |
5 | Abstract:
6 | Basic demonstration of how to use the SystemConfiguration Reachablity APIs.
7 | */
8 |
9 | #import
10 | #import
11 | #import
12 |
13 |
14 | typedef enum : NSInteger {
15 | NotReachable = 0,
16 | ReachableViaWiFi,
17 | ReachableViaWWAN
18 | } NetworkStatus;
19 |
20 | #pragma mark IPv6 Support
21 | //Reachability fully support IPv6. For full details, see ReadMe.md.
22 |
23 |
24 | extern NSString *kReachabilityChangedNotification;
25 |
26 |
27 | @interface Reachability : NSObject
28 |
29 | /*!
30 | * Use to check the reachability of a given host name.
31 | */
32 | + (instancetype)reachabilityWithHostName:(NSString *)hostName;
33 |
34 | /*!
35 | * Use to check the reachability of a given IP address.
36 | */
37 | + (instancetype)reachabilityWithAddress:(const struct sockaddr *)hostAddress;
38 |
39 | /*!
40 | * Checks whether the default route is available. Should be used by applications that do not connect to a particular host.
41 | */
42 | + (instancetype)reachabilityForInternetConnection;
43 |
44 |
45 | #pragma mark reachabilityForLocalWiFi
46 | //reachabilityForLocalWiFi has been removed from the sample. See ReadMe.md for more information.
47 | //+ (instancetype)reachabilityForLocalWiFi;
48 |
49 | /*!
50 | * Start listening for reachability notifications on the current run loop.
51 | */
52 | - (BOOL)startNotifier;
53 | - (void)stopNotifier;
54 |
55 | - (NetworkStatus)currentReachabilityStatus;
56 |
57 | /*!
58 | * WWAN may be available, but not active until a connection has been established. WiFi may require a connection for VPN on Demand.
59 | */
60 | - (BOOL)connectionRequired;
61 |
62 | @end
63 |
64 |
65 |
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Extensions.swift
3 | // ThemeDemo
4 | //
5 | // Created by JIGUANG on 2017/8/24.
6 | // Copyright © 2017年 dengyonghao. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | extension UIImage {
12 |
13 | static func loadImage(_ imageName: String) -> UIImage? {
14 | return ThemeManager.instance.loadImage(imageName)
15 | }
16 |
17 | // 如果明确资源不受 theme 变化而变化,使用这个接口会更快
18 | static func loadDefaultImage(_ imageName: String) -> UIImage? {
19 | return ThemeManager.instance.loadImage(imageName, .default)
20 | }
21 |
22 | }
23 |
24 | extension UIColor {
25 |
26 | convenience init(red: Int, green: Int, blue: Int) {
27 | assert(red >= 0 && red <= 255, "Invalid red component")
28 | assert(green >= 0 && green <= 255, "Invalid green component")
29 | assert(blue >= 0 && blue <= 255, "Invalid blue component")
30 |
31 | self.init(red: CGFloat(red) / 255.0, green: CGFloat(green) / 255.0, blue: CGFloat(blue) / 255.0, alpha: 1.0)
32 | }
33 |
34 | convenience init(_ colorName: String) {
35 | let netHex = ThemeManager.instance.themeColor(colorName)
36 | self.init(red:(netHex >> 16) & 0xff, green:(netHex >> 8) & 0xff, blue:netHex & 0xff)
37 | }
38 |
39 | }
40 |
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/Protocols.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Protocoles.swift
3 | // ThemeDemo
4 | //
5 | // Created by JIGUANG on 2017/8/23.
6 | // Copyright © 2017年 dengyonghao. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | enum ThemeStyle: Int {
12 | case `default` = 0
13 | case black
14 | case online
15 | }
16 |
17 | protocol ThemeProtocol {
18 |
19 | }
20 |
21 | extension UIView {
22 | @objc func updateTheme() {
23 | print("update view theme")
24 | }
25 | }
26 |
27 | extension UIViewController {
28 | @objc func updateTheme() {
29 | print("update view controller theme")
30 | }
31 | }
32 |
33 | extension ThemeProtocol where Self: UIView {
34 |
35 | func addThemeObserver() {
36 | print("addViewThemeObserver")
37 | NotificationCenter.default.addObserver(self, selector: #selector(updateTheme), name: NSNotification.Name(rawValue: kUpdateTheme), object: nil)
38 | }
39 |
40 | func removeThemeObserver() {
41 | print("removeViewThemeObserver")
42 | NotificationCenter.default.removeObserver(self, name: NSNotification.Name(rawValue: kUpdateTheme), object: nil)
43 | }
44 |
45 | }
46 |
47 | extension ThemeProtocol where Self: UIViewController {
48 |
49 | func addThemeObserver() {
50 | print("addViewControllerThemeObserver")
51 | NotificationCenter.default.addObserver(self, selector: #selector(updateTheme), name: NSNotification.Name(rawValue: kUpdateTheme), object: nil)
52 | }
53 |
54 | func removeThemeObserver() {
55 | print("removeViewControllerThemeObserver")
56 | NotificationCenter.default.removeObserver(self, name: NSNotification.Name(rawValue: kUpdateTheme), object: nil)
57 | }
58 |
59 | }
60 |
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/blackTheme.bundle/themeColor.txt:
--------------------------------------------------------------------------------
1 | {
2 | "bg_main":"0x2dd0cf",
3 | "bg_testview":"0x2dd0af"
4 | }
5 |
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/YH_KB_Emotion@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/YH_KB_Emotion@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/YH_KB_EmotionHL@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/YH_KB_EmotionHL@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/YH_KB_Keyboard@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/YH_KB_Keyboard@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/YH_KB_KeyboardHL@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/YH_KB_KeyboardHL@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/YH_KB_More@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/YH_KB_More@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/YH_KB_MoreHL@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/YH_KB_MoreHL@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/YH_KB_Voice@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/YH_KB_Voice@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/YH_KB_VoiceHL@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/YH_KB_VoiceHL@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_bubble_recive_nor@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_bubble_recive_nor@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_bubble_recive_press@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_bubble_recive_press@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_bubble_send_nor@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_bubble_send_nor@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_bubble_send_press@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_bubble_send_press@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_emoticon_btn_send_blue@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_emoticon_btn_send_blue@2x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_emoticon_btn_send_blue_h@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_emoticon_btn_send_blue_h@2x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_emoticon_btn_send_gray@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_emoticon_btn_send_gray@2x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_emoticon_btn_setting@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_emoticon_btn_setting@2x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_tool_businessCard@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_tool_businessCard@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_tool_camera@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_tool_camera@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_tool_location@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_tool_location@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_tool_pic@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_tool_pic@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_tool_video_short@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_tool_video_short@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_voice_receive_icon_1@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_voice_receive_icon_1@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_voice_receive_icon_2@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_voice_receive_icon_2@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_voice_receive_icon_3@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_voice_receive_icon_3@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_voice_send_icon_1@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_voice_send_icon_1@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_voice_send_icon_2@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_voice_send_icon_2@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_voice_send_icon_3@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_voice_send_icon_3@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon _selectList@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon _selectList@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_80@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_80@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_about@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_about@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_add@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_add@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_add_65@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_add_65@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_add_65_pre@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_add_65_pre@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_artboard@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_artboard@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_back@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_back@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_back_pre@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_back_pre@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_birthday@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_birthday@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_chat@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_chat@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_chat_pre@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_chat_pre@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_chatroom@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_chatroom@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_chatroom_pre@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_chatroom_pre@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_contacter@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_contacter@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_contacter_pre@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_contacter_pre@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_conv_group@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_conv_group@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_conv_single@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_conv_single@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_file_file@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_file_file@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_file_file_75@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_file_file_75@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_file_more@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_file_more@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_file_more_pre@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_file_more_pre@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_file_music@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_file_music@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_file_other@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_file_other@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_file_photo@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_file_photo@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_file_select@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_file_select@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_file_unselect@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_file_unselect@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_file_video@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_file_video@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_friend_add@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_friend_add@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_friend_tip@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_friend_tip@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_gender@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_gender@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_group_36@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_group_36@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_group_50@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_group_50@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_group_w@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_group_w@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_isSelect@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_isSelect@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_mine@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_mine@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_mine_pre@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_mine_pre@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_more@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_more@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_nickname@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_nickname@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_password@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_password@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_password_pre@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_password_pre@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_play@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_play@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_play_pre@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_play_pre@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_qrc_border@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_qrc_border@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_qrc_line@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_qrc_line@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_qrcode@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_qrcode@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_record@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_record@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_record_cancel@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_record_cancel@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_record_error@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_record_error@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_region@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_region@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_remove@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_remove@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_remove_pre@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_remove_pre@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_scan@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_scan@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_select@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_select@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_send_error@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_send_error@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_shield@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_shield@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_signature@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_signature@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_single_add@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_single_add@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_single_add_per@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_single_add_per@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_unselect@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_unselect@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_upload@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_upload@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_user_120@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_user_120@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_user_18@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_user_18@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_user_18_pre@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_user_18_pre@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_user_36@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_user_36@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_user_40@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_user_40@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_user_50@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_user_50@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_user_65@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_user_65@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_user_80@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_user_80@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_user_w@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_user_w@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_username@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_username@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/icon_icon_close@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/icon_icon_close@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/icon_icon_close_pre@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/icon_icon_close_pre@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/icon_ios_add@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/icon_ios_add@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/location_address@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/location_address@3x.png
--------------------------------------------------------------------------------
/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/themeColor.txt:
--------------------------------------------------------------------------------
1 | {
2 | "bg_main":"0xD7DCE2",
3 | "bg_testview":"0x2da4af"
4 | }
5 |
--------------------------------------------------------------------------------
/JChat/Src/Utilites/Utility/JCAppManager.swift:
--------------------------------------------------------------------------------
1 | //
2 | // JCAppManager.swift
3 | // JChat
4 | //
5 | // Created by JIGUANG on 2017/6/23.
6 | // Copyright © 2017年 HXHG. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | class JCAppManager {
12 |
13 | static func openAppSetter() {
14 | let url = URL(string: UIApplication.openSettingsURLString)
15 | if UIApplication.shared.canOpenURL(url!) {
16 | UIApplication.shared.openURL(url!)
17 | }
18 | }
19 |
20 | }
21 |
22 |
23 | var isIPhoneX: Bool {
24 | if UIScreen.main.bounds.height > 736 {
25 | return true
26 | } else {
27 | return false
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/JChat/Src/Utilites/Utility/JCConstants.swift:
--------------------------------------------------------------------------------
1 | //
2 | // JCConstants.swift
3 | // JChat
4 | //
5 | // Created by JIGUANG on 2017/2/16.
6 | // Copyright © 2017年 HXHG. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | let kCurrentUserName = "kJCCurrentUserName"
12 | let kCurrentUserPassword = "kCurrentUserPassword"
13 | let kUpdateUserInfo = "kUpdateUserInfo"
14 | let kUpdateConversation = "kUpdateConversation"
15 | let kUpdateFriendInfo = "kUpdateFriendInfo"
16 | let kUpdateGroupInfo = "kUpdateGroupInfo"
17 | let kLastUserName = "kLastUserName"
18 | let kLastUserAvator = "kLastUserAvator"
19 | let kUpdateFriendList = "kUpdateFriendList"
20 | let kUpdateVerification = "kUpdateVerification"
21 | let kDeleteAllMessage = "kDeleteAllMessage"
22 | let kReloadAllMessage = "kReloadAllMessage"
23 | let kUnreadInvitationCount = "kUnreadInvitationCount"
24 | let kUpdateFileMessage = "kUpdateFileMessage"
25 |
26 |
27 | extension UIDevice {
28 | func isAboveiPhoneX() ->Bool {
29 | let screenHeight = UIScreen.main.nativeBounds.size.height;
30 | if screenHeight == 2436 || screenHeight == 1792 || screenHeight == 2688 || screenHeight == 1624 {
31 | return true
32 | }
33 | return false
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/JChat/Src/Utilites/Utility/JCFileManager.swift:
--------------------------------------------------------------------------------
1 | //
2 | // JCFileManager.swift
3 | // JChat
4 | //
5 | // Created by JIGUANG on 2017/7/24.
6 | // Copyright © 2017年 HXHG. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | class JCFileManager: NSObject {
12 |
13 | static func fileExists(atPath: String) -> Bool {
14 | let fileManager = FileManager.default
15 | return fileManager.fileExists(atPath: atPath)
16 | }
17 |
18 | static func saveFileToLocal(data: Data, savaPath: String) -> Bool {
19 | let fileManager = FileManager.default
20 | let exist = fileManager.fileExists(atPath: savaPath)
21 | if exist {
22 | try! fileManager.removeItem(atPath: savaPath)
23 | }
24 | if !fileManager.createFile(atPath: savaPath, contents: data, attributes: nil) {
25 | return false
26 | }
27 | return true
28 | }
29 |
30 | }
31 |
--------------------------------------------------------------------------------
/JChat/Src/Utilites/Utility/JCVideoManager.swift:
--------------------------------------------------------------------------------
1 | //
2 | // JCVideoManager.swift
3 | // JChat
4 | //
5 | // Created by JIGUANG on 2017/4/26.
6 | // Copyright © 2017年 HXHG. All rights reserved.
7 | //
8 |
9 | import UIKit
10 | import AVFoundation
11 | import AVKit
12 |
13 | class JCVideoManager {
14 |
15 | static func playVideo(data: Data, _ fileType: String = "MOV", currentViewController: UIViewController) {
16 | let playVC = AVPlayerViewController()
17 |
18 | let filePath = "\(NSHomeDirectory())/Documents/abcd." + fileType
19 |
20 | if JCFileManager.saveFileToLocal(data: data, savaPath: filePath) {
21 | let url = URL(fileURLWithPath: filePath)
22 | let player = AVPlayer(url: url)
23 | playVC.player = player
24 | currentViewController.present(playVC, animated: true, completion: nil)
25 | }
26 | }
27 |
28 | static func playVideo(path: String, currentViewController: UIViewController) {
29 | let playVC = AVPlayerViewController()
30 | let url = URL(fileURLWithPath: path)
31 | let player = AVPlayer(url: url)
32 | playVC.player = player
33 | currentViewController.present(playVC, animated: true, completion: nil)
34 | }
35 |
36 | static func getFristImage(data: Data) -> UIImage? {
37 | let filePath = "\(NSHomeDirectory())/Documents/getImage.MOV"
38 | if !JCFileManager.saveFileToLocal(data: data, savaPath: filePath) {
39 | return nil
40 | }
41 | let videoURL = URL(fileURLWithPath: filePath)
42 | let avAsset = AVAsset(url: videoURL)
43 | let generator = AVAssetImageGenerator(asset: avAsset)
44 | generator.appliesPreferredTrackTransform = true
45 | let time = CMTimeMakeWithSeconds(0.0,preferredTimescale: 600)
46 | var actualTime = CMTimeMake(value: 0,timescale: 0)
47 | do {
48 | let imageRef = try generator.copyCGImage(at: time, actualTime: &actualTime)
49 | let frameImg = UIImage(cgImage: imageRef)
50 | return frameImg
51 | } catch {
52 | return UIImage.createImage(color: .gray, size: CGSize(width: 160, height: 120))
53 | }
54 | }
55 |
56 | }
57 |
--------------------------------------------------------------------------------
/JChat/Src/Utilites/Utility/Log.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Log.swift
3 | // JChat
4 | //
5 | // Created by JIGUANG on 2017/10/5.
6 | // Copyright © 2017年 HXHG. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | /**
12 | print log
13 | #file String 包含这个符号的文件的路径
14 | #line Int 符号出现处的行号
15 | #column Int 符号出现处的列
16 | #function String 包含这个符号的方法名字
17 | */
18 | func printLog(_ message: T,
19 | file: String = #file,
20 | method: String = #function,
21 | line: Int = #line)
22 | {
23 | #if DEBUG
24 | print(" | JChat | D | [\((file as NSString).lastPathComponent)][\(line)] Func - \(method): \(message)")
25 | #endif
26 | }
27 |
--------------------------------------------------------------------------------
/JChatTests/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | BNDL
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleVersion
20 | 1
21 |
22 |
23 |
--------------------------------------------------------------------------------
/JChatTests/JChatTests.swift:
--------------------------------------------------------------------------------
1 | //
2 | // JChatTests.swift
3 | // JChatTests
4 | //
5 | // Created by JIGUANG on 2017/3/28.
6 | // Copyright © 2017年 dengyonghao. All rights reserved.
7 | //
8 |
9 | import XCTest
10 | @testable import JChat
11 |
12 | class JChatTests: XCTestCase {
13 |
14 | override func setUp() {
15 | super.setUp()
16 | // Put setup code here. This method is called before the invocation of each test method in the class.
17 | }
18 |
19 | override func tearDown() {
20 | // Put teardown code here. This method is called after the invocation of each test method in the class.
21 | super.tearDown()
22 | }
23 |
24 | func testExample() {
25 | // This is an example of a functional test case.
26 | // Use XCTAssert and related functions to verify your tests produce the correct results.
27 | }
28 |
29 | func testPerformanceExample() {
30 | // This is an example of a performance test case.
31 | self.measure {
32 | // Put the code you want to measure the time of here.
33 | }
34 | }
35 |
36 | }
37 |
--------------------------------------------------------------------------------
/JChatUITests/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | BNDL
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleVersion
20 | 1
21 |
22 |
23 |
--------------------------------------------------------------------------------
/JChatUITests/JChatUITests.swift:
--------------------------------------------------------------------------------
1 | //
2 | // JChatUITests.swift
3 | // JChatUITests
4 | //
5 | // Created by JIGUANG on 2017/3/28.
6 | // Copyright © 2017年 dengyonghao. All rights reserved.
7 | //
8 |
9 | import XCTest
10 |
11 | class JChatUITests: XCTestCase {
12 |
13 | override func setUp() {
14 | super.setUp()
15 |
16 | // Put setup code here. This method is called before the invocation of each test method in the class.
17 |
18 | // In UI tests it is usually best to stop immediately when a failure occurs.
19 | continueAfterFailure = false
20 | // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method.
21 | XCUIApplication().launch()
22 |
23 | // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this.
24 | }
25 |
26 | override func tearDown() {
27 | // Put teardown code here. This method is called after the invocation of each test method in the class.
28 | super.tearDown()
29 | }
30 |
31 | func testExample() {
32 | // Use recording to get started writing UI tests.
33 | // Use XCTAssert and related functions to verify your tests produce the correct results.
34 | }
35 |
36 | }
37 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2015 极光推送/IM JPush/JMesage
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
23 |
--------------------------------------------------------------------------------
/Podfile:
--------------------------------------------------------------------------------
1 | # Uncomment the next line to define a global platform for your project
2 | # platform :ios, '9.0'
3 |
4 | target 'JChat' do
5 | # Comment the next line if you're not using Swift and don't want to use dynamic frameworks
6 | use_frameworks!
7 |
8 | pod 'MBProgressHUD'
9 | pod 'YHPopupView'
10 | pod 'YHPhotoKit'
11 | pod 'MJRefresh'
12 | pod 'JMessage','~> 3.8.1'
13 | pod 'FMDB'
14 | pod 'RxSwift','~> 4.2.0'
15 | pod 'RxCocoa','~> 4.4.1'
16 | pod 'BaiduMapKit','~> 4.1.1'
17 | pod 'Masonry'
18 |
19 | # Pods for JChat
20 |
21 | # target 'JChatTests' do
22 | # inherit! :search_paths
23 | # # Pods for testing
24 | # end
25 | #
26 | # target 'JChatUITests' do
27 | # inherit! :search_paths
28 | # # Pods for testing
29 | # end
30 |
31 | end
32 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # JChat-Swift
2 |
3 | [](https://www.apple.com/nl/ios/)
4 | [](https://developer.apple.com/swift)
6 | [](http://mit-license.org)
8 |
9 |
10 | ### 简介
11 |
12 | JChat 是基于 JMessage SDK 带有完整 UI 界面的即时通讯应用。 演示了完整的即时通讯功能,包括:
13 |
14 | * 单聊、群聊、会话列表、好友、通讯录;
15 | * 支持发送文本、图片、语音、表情、位置、小视频;
16 | * 提供用户管理、群组管理、黑名单、免打扰、消息漫游等功能;
17 |
18 | JChat 同时具备好友模式和无好友模式:
19 |
20 | * 无好友模式:无需将对方加为好友,通过搜索对方的用户名可直接发起聊天。
21 | * 好友模式:可申请将对方加为好友,对方会收到好友验证,验证通过则互为好友关系。
22 |
23 | 目前已覆盖 iOS、 [Android](https://github.com/jpush/jchat-android) 、 [Web](https://github.com/jpush/jchat-web) 和 [Windows](https://github.com/jpush/jchat-windows) 平台,开发者可参照 JChat 快速打造自己的 APP,提高开发效率。
24 |
25 | 
26 |
27 | ### 应用截图
28 |
29 | 
30 |
31 | ### 环境配置
32 |
33 | 一、前提:安装 CocoaPods
34 |
35 | 在终端输入:
36 |
37 | ```
38 | sudo gem install cocoapods
39 | ```
40 | 如果安装成功,会有提示:
41 |
42 | ```
43 | Successfully installed cocoaPods
44 | ```
45 |
46 | 二、使用 CocoaPods 导入依赖库
47 |
48 | 在当前工程文件(.xcodeproj)所在文件夹下,打开终端,并执行:
49 |
50 | ```
51 | pod install(这个可能比较慢,请耐心等待……)
52 | ```
53 |
54 | ### 运行应用
55 |
56 | 一、打开项目文件 JChat.xcworkspace
57 |
58 | 二、配置运行的基本属性
59 |
60 | 1. 填写项目工程中的 Bundle Identifier
61 | 2. 在 AppDelegate.swift 文件中,按提示填入自己项目的 AppKey。AppKey 是 JMessage SDK 运行的基本参数,如示未获取到应的 AppKey,请到极 [极光官方网站](https://jiguang.cn) 登录控制台创建应用获取。
62 |
63 | ### 功能配置
64 |
65 | 一、消息回执功能
66 |
67 | 如果不需要支持已读未读功能,在 Build Settings 中,找到 Swift Compiler - Custom Flags,并在其中的 Other Swift Flags 删除 -D READ_VERSION。
68 |
69 | ### JMessage 文档
70 |
71 | * [JMessage iOS 集成指南](https://docs.jiguang.cn/jmessage/client/jmessage_ios_guide/)
72 | * [JMessage iOS 开发指南](https://docs.jiguang.cn/jmessage/client/im_sdk_ios/)
73 | * [JMessage iOS API Docs](https://docs.jiguang.cn/jmessage/client/jmessage_ios_appledoc_html/)
74 |
75 |
--------------------------------------------------------------------------------