├── .github └── ISSUE_TEMPLATE.md ├── .gitignore ├── IMSDK-iOS.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ ├── xcshareddata │ │ └── IDEWorkspaceChecks.plist │ └── xcuserdata │ │ └── lilu.xcuserdatad │ │ └── UserInterfaceState.xcuserstate └── xcuserdata │ └── lilu.xcuserdatad │ └── xcschemes │ └── xcschememanagement.plist ├── IMSDK-iOS.xcworkspace ├── contents.xcworkspacedata ├── xcshareddata │ └── IDEWorkspaceChecks.plist └── xcuserdata │ └── lilu.xcuserdatad │ └── UserInterfaceState.xcuserstate ├── IMSDK-iOS ├── AppDelegate.h ├── AppDelegate.m ├── Assets.xcassets │ ├── Contents.json │ └── LaunchImage.launchimage │ │ └── Contents.json ├── Base.lproj │ ├── LaunchScreen.storyboard │ └── Main.storyboard ├── Info.plist ├── ViewController.h ├── ViewController.m ├── main.m └── open_scheme.html ├── InstallDemo.sh ├── LICENSE ├── Podfile ├── README.md └── README_zh_CN.md /.github/ISSUE_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | ### 问题检查清单 2 | 3 | 感谢您向我们提出问题,在提交问题之前,请确认以下事宜: 4 | 5 | - [ ] 我已经阅读了组件文档: 6 | 7 | [《Startalk客户端配置导航》](https://im.qunar.com/new/#/platform/access_guide/manage_nav?id=manage_nav_mb) 8 | 9 | [《QIMSDK iOS接入文档》](https://github.com/qunarcorp/imsdk-ios/wiki/QIMSDK-iOS%E6%8E%A5%E5%85%A5%E6%96%87%E6%A1%A3) 10 | 11 | [《QIMSDK iOS接口文档说明》](https://github.com/qunarcorp/imsdk-ios/wiki/QIMSDK-iOS%E6%8E%A5%E5%8F%A3%E6%96%87%E6%A1%A3%E8%AF%B4%E6%98%8E) 12 | 13 | [《QIMSDK Scheme跳转说明》](https://github.com/qunarcorp/imsdk-ios/wiki/QIMSDK-Scheme%E8%B7%B3%E8%BD%AC%E8%AF%B4%E6%98%8E) 14 | 15 | [《QIMSDK 文档说明》](https://github.com/qunarcorp/imsdk-ios/wiki/QIMSDK-%E6%96%87%E6%A1%A3%E8%AF%B4%E6%98%8E) 16 | 17 | [《QIMSDK Changelog》](https://github.com/qunarcorp/imsdk-ios/wiki/QIMSDKDemo-Changelog) 18 | 19 | - [ ] 我已经搜索了[当前问题](https://github.com/qunarcorp/imsdk-ios/issues?utf8=%E2%9C%93&q=is%3Aissue), 但是找不到相关解决方案。 20 | 21 | 22 | ### 问题描述 23 | 24 | #### 问题现象 25 | 26 | [描述具体问题表现] 27 | 28 | #### 是否重现 29 | 30 | [重现此问题的步骤] 31 | 32 | #### 其它备注 33 | 34 | [在这里添加任何其他相关细节] 35 | 36 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | # 3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 4 | 5 | *.xcbkptlist 6 | *.xcuserstate 7 | IMSDK-iOS.xcworkspace 8 | xcuserdata 9 | UserInterfaceState.xcuserstate 10 | IMSDK-iOS.xcworkspace/ 11 | xcuserdata/ 12 | UserInterface.xcuserstate 13 | 14 | *.xcuserstate 15 | project.xcworkspace 16 | xcuserdata 17 | UserInterfaceState.xcuserstate 18 | project.xcworkspace/ 19 | xcuserdata/ 20 | UserInterface.xcuserstate 21 | 22 | yarn.lock 23 | package-lock.json 24 | QIMSDK/Podfile.lock 25 | 26 | */.idea/ 27 | .idea/ 28 | 29 | # old skool 30 | .svn 31 | 32 | # Exclude the build directory 33 | SRC/build/ 34 | build/ 35 | app/ 36 | beta/ 37 | 38 | # Exclude temp nibs and swap files 39 | *~.nib 40 | *.swp 41 | 42 | ## Build generated 43 | build/ 44 | DerivedData/ 45 | 46 | ## Various settings 47 | *.pbxuser 48 | !default.pbxuser 49 | *.mode1v3 50 | !default.mode1v3 51 | *.mode2v3 52 | !default.mode2v3 53 | *.perspectivev3 54 | !default.perspectivev3 55 | xcuserdata/ 56 | 57 | ## Other 58 | *.moved-aside 59 | *.xccheckout 60 | *.xcscmblueprint 61 | 62 | ## Obj-C/Swift specific 63 | .hmap 64 | .ipa 65 | .dSYM.zip 66 | .dSYM 67 | 68 | # osx noise 69 | .DS_Store 70 | *.swp 71 | profile 72 | /xcodePack/pack 73 | /xcodePack/build 74 | /xcodePack/resources 75 | 76 | # ignore node_modules 77 | /node_modules 78 | npm-debug.log 79 | 80 | # CocoaPods 81 | # 82 | # We recommend against adding the Pods directory to your .gitignore. However 83 | # you should judge for yourself, the pros and cons are mentioned at: 84 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 85 | # 86 | Pods/* 87 | Podfile.lock 88 | QIMRNKit/Pods/* 89 | QIMSDK/Pods/* 90 | -------------------------------------------------------------------------------- /IMSDK-iOS.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 50; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 2C794BF921B173F90063BA11 /* open_scheme.html in Resources */ = {isa = PBXBuildFile; fileRef = 2C794BF821B173F90063BA11 /* open_scheme.html */; }; 11 | 2CC52E1721B027DC0009EAB5 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 2CC52E1621B027DC0009EAB5 /* AppDelegate.m */; }; 12 | 2CC52E1A21B027DC0009EAB5 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2CC52E1921B027DC0009EAB5 /* ViewController.m */; }; 13 | 2CC52E1D21B027DC0009EAB5 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 2CC52E1B21B027DC0009EAB5 /* Main.storyboard */; }; 14 | 2CC52E1F21B027DE0009EAB5 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 2CC52E1E21B027DE0009EAB5 /* Assets.xcassets */; }; 15 | 2CC52E2221B027DE0009EAB5 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 2CC52E2021B027DE0009EAB5 /* LaunchScreen.storyboard */; }; 16 | 2CC52E2521B027DE0009EAB5 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 2CC52E2421B027DE0009EAB5 /* main.m */; }; 17 | BC9908A376B6B28934DA4BC2 /* libPods-IMSDK-iOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = CD5739EC91D4FD5A403CFE4C /* libPods-IMSDK-iOS.a */; }; 18 | /* End PBXBuildFile section */ 19 | 20 | /* Begin PBXFileReference section */ 21 | 2C2A79A822168AE800AF2153 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = System/Library/Frameworks/CoreFoundation.framework; sourceTree = SDKROOT; }; 22 | 2C2A79AA22168D4000AF2153 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 23 | 2C794BF821B173F90063BA11 /* open_scheme.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = open_scheme.html; sourceTree = ""; }; 24 | 2CC52E1221B027DC0009EAB5 /* IMSDK-iOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "IMSDK-iOS.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 25 | 2CC52E1521B027DC0009EAB5 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 26 | 2CC52E1621B027DC0009EAB5 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 27 | 2CC52E1821B027DC0009EAB5 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; 28 | 2CC52E1921B027DC0009EAB5 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; 29 | 2CC52E1C21B027DC0009EAB5 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 30 | 2CC52E1E21B027DE0009EAB5 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 31 | 2CC52E2121B027DE0009EAB5 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 32 | 2CC52E2321B027DE0009EAB5 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 33 | 2CC52E2421B027DE0009EAB5 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 34 | 6BFF7E29ACF67F0EDFD9CEAE /* Pods-IMSDK-iOS.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-IMSDK-iOS.debug.xcconfig"; path = "Pods/Target Support Files/Pods-IMSDK-iOS/Pods-IMSDK-iOS.debug.xcconfig"; sourceTree = ""; }; 35 | 9A830545AC1BCEB56DED8FEE /* Pods-IMSDK-iOS.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-IMSDK-iOS.release.xcconfig"; path = "Pods/Target Support Files/Pods-IMSDK-iOS/Pods-IMSDK-iOS.release.xcconfig"; sourceTree = ""; }; 36 | CD5739EC91D4FD5A403CFE4C /* libPods-IMSDK-iOS.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-IMSDK-iOS.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 37 | /* End PBXFileReference section */ 38 | 39 | /* Begin PBXFrameworksBuildPhase section */ 40 | 2CC52E0F21B027DC0009EAB5 /* Frameworks */ = { 41 | isa = PBXFrameworksBuildPhase; 42 | buildActionMask = 2147483647; 43 | files = ( 44 | BC9908A376B6B28934DA4BC2 /* libPods-IMSDK-iOS.a in Frameworks */, 45 | ); 46 | runOnlyForDeploymentPostprocessing = 0; 47 | }; 48 | /* End PBXFrameworksBuildPhase section */ 49 | 50 | /* Begin PBXGroup section */ 51 | 062F977CF210DA8C15089C39 /* Frameworks */ = { 52 | isa = PBXGroup; 53 | children = ( 54 | 2C2A79AA22168D4000AF2153 /* CoreGraphics.framework */, 55 | 2C2A79A822168AE800AF2153 /* CoreFoundation.framework */, 56 | CD5739EC91D4FD5A403CFE4C /* libPods-IMSDK-iOS.a */, 57 | ); 58 | name = Frameworks; 59 | sourceTree = ""; 60 | }; 61 | 2CC52E0921B027DC0009EAB5 = { 62 | isa = PBXGroup; 63 | children = ( 64 | 2CC52E1421B027DC0009EAB5 /* IMSDK-iOS */, 65 | 2CC52E1321B027DC0009EAB5 /* Products */, 66 | D2BCDABEE36D10B63C2FD6F0 /* Pods */, 67 | 062F977CF210DA8C15089C39 /* Frameworks */, 68 | ); 69 | sourceTree = ""; 70 | }; 71 | 2CC52E1321B027DC0009EAB5 /* Products */ = { 72 | isa = PBXGroup; 73 | children = ( 74 | 2CC52E1221B027DC0009EAB5 /* IMSDK-iOS.app */, 75 | ); 76 | name = Products; 77 | sourceTree = ""; 78 | }; 79 | 2CC52E1421B027DC0009EAB5 /* IMSDK-iOS */ = { 80 | isa = PBXGroup; 81 | children = ( 82 | 2C794BF821B173F90063BA11 /* open_scheme.html */, 83 | 2CC52E1521B027DC0009EAB5 /* AppDelegate.h */, 84 | 2CC52E1621B027DC0009EAB5 /* AppDelegate.m */, 85 | 2CC52E1821B027DC0009EAB5 /* ViewController.h */, 86 | 2CC52E1921B027DC0009EAB5 /* ViewController.m */, 87 | 2CC52E1B21B027DC0009EAB5 /* Main.storyboard */, 88 | 2CC52E1E21B027DE0009EAB5 /* Assets.xcassets */, 89 | 2CC52E2021B027DE0009EAB5 /* LaunchScreen.storyboard */, 90 | 2CC52E2321B027DE0009EAB5 /* Info.plist */, 91 | 2CC52E2421B027DE0009EAB5 /* main.m */, 92 | ); 93 | path = "IMSDK-iOS"; 94 | sourceTree = ""; 95 | }; 96 | D2BCDABEE36D10B63C2FD6F0 /* Pods */ = { 97 | isa = PBXGroup; 98 | children = ( 99 | 6BFF7E29ACF67F0EDFD9CEAE /* Pods-IMSDK-iOS.debug.xcconfig */, 100 | 9A830545AC1BCEB56DED8FEE /* Pods-IMSDK-iOS.release.xcconfig */, 101 | ); 102 | name = Pods; 103 | sourceTree = ""; 104 | }; 105 | /* End PBXGroup section */ 106 | 107 | /* Begin PBXNativeTarget section */ 108 | 2CC52E1121B027DC0009EAB5 /* IMSDK-iOS */ = { 109 | isa = PBXNativeTarget; 110 | buildConfigurationList = 2CC52E2821B027DE0009EAB5 /* Build configuration list for PBXNativeTarget "IMSDK-iOS" */; 111 | buildPhases = ( 112 | 85837ABA31E07E39268060DF /* [CP] Check Pods Manifest.lock */, 113 | 2CC52E0E21B027DC0009EAB5 /* Sources */, 114 | 2CC52E0F21B027DC0009EAB5 /* Frameworks */, 115 | 2CC52E1021B027DC0009EAB5 /* Resources */, 116 | 35B71279B55488FAB2F12B0A /* [CP] Copy Pods Resources */, 117 | 7F99527C83A268ACC0A3615F /* [CP] Embed Pods Frameworks */, 118 | ); 119 | buildRules = ( 120 | ); 121 | dependencies = ( 122 | ); 123 | name = "IMSDK-iOS"; 124 | productName = "IMSDK-iOS"; 125 | productReference = 2CC52E1221B027DC0009EAB5 /* IMSDK-iOS.app */; 126 | productType = "com.apple.product-type.application"; 127 | }; 128 | /* End PBXNativeTarget section */ 129 | 130 | /* Begin PBXProject section */ 131 | 2CC52E0A21B027DC0009EAB5 /* Project object */ = { 132 | isa = PBXProject; 133 | attributes = { 134 | LastUpgradeCheck = 1000; 135 | ORGANIZATIONNAME = QIM; 136 | TargetAttributes = { 137 | 2CC52E1121B027DC0009EAB5 = { 138 | CreatedOnToolsVersion = 10.0; 139 | }; 140 | }; 141 | }; 142 | buildConfigurationList = 2CC52E0D21B027DC0009EAB5 /* Build configuration list for PBXProject "IMSDK-iOS" */; 143 | compatibilityVersion = "Xcode 9.3"; 144 | developmentRegion = en; 145 | hasScannedForEncodings = 0; 146 | knownRegions = ( 147 | en, 148 | Base, 149 | ); 150 | mainGroup = 2CC52E0921B027DC0009EAB5; 151 | productRefGroup = 2CC52E1321B027DC0009EAB5 /* Products */; 152 | projectDirPath = ""; 153 | projectRoot = ""; 154 | targets = ( 155 | 2CC52E1121B027DC0009EAB5 /* IMSDK-iOS */, 156 | ); 157 | }; 158 | /* End PBXProject section */ 159 | 160 | /* Begin PBXResourcesBuildPhase section */ 161 | 2CC52E1021B027DC0009EAB5 /* Resources */ = { 162 | isa = PBXResourcesBuildPhase; 163 | buildActionMask = 2147483647; 164 | files = ( 165 | 2CC52E2221B027DE0009EAB5 /* LaunchScreen.storyboard in Resources */, 166 | 2CC52E1F21B027DE0009EAB5 /* Assets.xcassets in Resources */, 167 | 2C794BF921B173F90063BA11 /* open_scheme.html in Resources */, 168 | 2CC52E1D21B027DC0009EAB5 /* Main.storyboard in Resources */, 169 | ); 170 | runOnlyForDeploymentPostprocessing = 0; 171 | }; 172 | /* End PBXResourcesBuildPhase section */ 173 | 174 | /* Begin PBXShellScriptBuildPhase section */ 175 | 35B71279B55488FAB2F12B0A /* [CP] Copy Pods Resources */ = { 176 | isa = PBXShellScriptBuildPhase; 177 | buildActionMask = 2147483647; 178 | files = ( 179 | ); 180 | inputPaths = ( 181 | "${PODS_ROOT}/Target Support Files/Pods-IMSDK-iOS/Pods-IMSDK-iOS-resources.sh", 182 | "${PODS_ROOT}/AMap3DMap/MAMapKit.framework/AMap.bundle", 183 | "${PODS_ROOT}/MJRefresh/MJRefresh/MJRefresh.bundle", 184 | "${PODS_CONFIGURATION_BUILD_DIR}/QIMCommon/QIMCommonResource.bundle", 185 | "${PODS_ROOT}/QIMGeneralModule/QIMGeneralModule/WebRTC/RTC/icons/call_bg@2x.png", 186 | "${PODS_ROOT}/QIMGeneralModule/QIMGeneralModule/WebRTC/RTC/icons/icon_audio_receive_normal@2x.png", 187 | "${PODS_ROOT}/QIMGeneralModule/QIMGeneralModule/WebRTC/RTC/icons/icon_audio_receive_press@2x.png", 188 | "${PODS_ROOT}/QIMGeneralModule/QIMGeneralModule/WebRTC/RTC/icons/icon_avp_camera_white@2x.png", 189 | "${PODS_ROOT}/QIMGeneralModule/QIMGeneralModule/WebRTC/RTC/icons/icon_avp_invite_black@2x.png", 190 | "${PODS_ROOT}/QIMGeneralModule/QIMGeneralModule/WebRTC/RTC/icons/icon_avp_invite_blue@2x.png", 191 | "${PODS_ROOT}/QIMGeneralModule/QIMGeneralModule/WebRTC/RTC/icons/icon_avp_invite_gray@2x.png", 192 | "${PODS_ROOT}/QIMGeneralModule/QIMGeneralModule/WebRTC/RTC/icons/icon_avp_invite_white@2x.png", 193 | "${PODS_ROOT}/QIMGeneralModule/QIMGeneralModule/WebRTC/RTC/icons/icon_avp_loudspeaker_black@2x.png", 194 | "${PODS_ROOT}/QIMGeneralModule/QIMGeneralModule/WebRTC/RTC/icons/icon_avp_loudspeaker_blue@2x.png", 195 | "${PODS_ROOT}/QIMGeneralModule/QIMGeneralModule/WebRTC/RTC/icons/icon_avp_loudspeaker_gray@2x.png", 196 | "${PODS_ROOT}/QIMGeneralModule/QIMGeneralModule/WebRTC/RTC/icons/icon_avp_loudspeaker_white@2x.png", 197 | "${PODS_ROOT}/QIMGeneralModule/QIMGeneralModule/WebRTC/RTC/icons/icon_avp_mute_black@2x.png", 198 | "${PODS_ROOT}/QIMGeneralModule/QIMGeneralModule/WebRTC/RTC/icons/icon_avp_mute_blue@2x.png", 199 | "${PODS_ROOT}/QIMGeneralModule/QIMGeneralModule/WebRTC/RTC/icons/icon_avp_mute_gray@2x.png", 200 | "${PODS_ROOT}/QIMGeneralModule/QIMGeneralModule/WebRTC/RTC/icons/icon_avp_mute_white@2x.png", 201 | "${PODS_ROOT}/QIMGeneralModule/QIMGeneralModule/WebRTC/RTC/icons/icon_avp_reduce_black@2x.png", 202 | "${PODS_ROOT}/QIMGeneralModule/QIMGeneralModule/WebRTC/RTC/icons/icon_avp_reduce_blue@2x.png", 203 | "${PODS_ROOT}/QIMGeneralModule/QIMGeneralModule/WebRTC/RTC/icons/icon_avp_reduce_gray@2x.png", 204 | "${PODS_ROOT}/QIMGeneralModule/QIMGeneralModule/WebRTC/RTC/icons/icon_avp_reduce_white@2x.png", 205 | "${PODS_ROOT}/QIMGeneralModule/QIMGeneralModule/WebRTC/RTC/icons/icon_avp_video_black@2x.png", 206 | "${PODS_ROOT}/QIMGeneralModule/QIMGeneralModule/WebRTC/RTC/icons/icon_avp_video_blue@2x.png", 207 | "${PODS_ROOT}/QIMGeneralModule/QIMGeneralModule/WebRTC/RTC/icons/icon_avp_video_gray@2x.png", 208 | "${PODS_ROOT}/QIMGeneralModule/QIMGeneralModule/WebRTC/RTC/icons/icon_avp_video_white@2x.png", 209 | "${PODS_ROOT}/QIMGeneralModule/QIMGeneralModule/WebRTC/RTC/icons/icon_av_audio_micro_normal@2x.png", 210 | "${PODS_ROOT}/QIMGeneralModule/QIMGeneralModule/WebRTC/RTC/icons/icon_av_audio_micro_press@2x.png", 211 | "${PODS_ROOT}/QIMGeneralModule/QIMGeneralModule/WebRTC/RTC/icons/icon_av_audio_receive_normal@2x.png", 212 | "${PODS_ROOT}/QIMGeneralModule/QIMGeneralModule/WebRTC/RTC/icons/icon_av_audio_receive_press@2x.png", 213 | "${PODS_ROOT}/QIMGeneralModule/QIMGeneralModule/WebRTC/RTC/icons/icon_av_reply_message_normal@2x.png", 214 | "${PODS_ROOT}/QIMGeneralModule/QIMGeneralModule/WebRTC/RTC/icons/icon_av_reply_message_press@2x.png", 215 | "${PODS_ROOT}/QIMGeneralModule/QIMGeneralModule/WebRTC/RTC/icons/icon_call_reject_normal@2x.png", 216 | "${PODS_ROOT}/QIMGeneralModule/QIMGeneralModule/WebRTC/RTC/icons/icon_call_reject_press@2x.png", 217 | "${PODS_ROOT}/QIMGeneralModule/QIMGeneralModule/WebRTC/RTC/icons/im_skin_icon_audiocall_bg.jpg", 218 | "${PODS_ROOT}/QIMGeneralModule/QIMGeneralModule/WebRTC/RTC/icons/portrait.jpg", 219 | "${PODS_ROOT}/QIMGeneralModule/QIMGeneralModule/WebRTC/RTC/icons/portrait@2x.png", 220 | "${PODS_ROOT}/QIMGeneralModule/QIMGeneralModule/WebRTC/RTC/icons/voip_camera_icons_130x130_@1x.png", 221 | "${PODS_ROOT}/QIMGeneralModule/QIMGeneralModule/WebRTC/RTC/icons/voip_camera_icons_66x66_@3x.png", 222 | "${PODS_ROOT}/QIMGeneralModule/QIMGeneralModule/WebRTC/RTC/icons/voip_convert_icons_130x130_@1x.png", 223 | "${PODS_ROOT}/QIMGeneralModule/QIMGeneralModule/WebRTC/RTC/icons/voip_convert_icons_66x66_@3x.png", 224 | "${PODS_ROOT}/QIMGeneralModule/QIMGeneralModule/WebRTC/RTC/sound/AVChat_busy.mp3", 225 | "${PODS_ROOT}/QIMGeneralModule/QIMGeneralModule/WebRTC/RTC/sound/AVChat_endCall.mp3", 226 | "${PODS_ROOT}/QIMGeneralModule/QIMGeneralModule/WebRTC/RTC/sound/AVChat_incoming.mp3", 227 | "${PODS_ROOT}/QIMGeneralModule/QIMGeneralModule/WebRTC/RTC/sound/AVChat_waitingForAnswer.mp3", 228 | "${PODS_ROOT}/QIMGeneralModule/QIMGeneralModule/WebRTC/RTC/sound/incomingRing.wav", 229 | "${PODS_ROOT}/QIMGeneralModule/QIMGeneralModule/WebRTC/RTC/sound/Message_system.mp3", 230 | "${PODS_CONFIGURATION_BUILD_DIR}/QIMKitVendor/QIMPinYin.bundle", 231 | "${PODS_ROOT}/QIMReactNativeLibrary/react-native-vector-icons/Fonts/Entypo.ttf", 232 | "${PODS_ROOT}/QIMReactNativeLibrary/react-native-vector-icons/Fonts/EvilIcons.ttf", 233 | "${PODS_ROOT}/QIMReactNativeLibrary/react-native-vector-icons/Fonts/Feather.ttf", 234 | "${PODS_ROOT}/QIMReactNativeLibrary/react-native-vector-icons/Fonts/FontAwesome.ttf", 235 | "${PODS_ROOT}/QIMReactNativeLibrary/react-native-vector-icons/Fonts/Foundation.ttf", 236 | "${PODS_ROOT}/QIMReactNativeLibrary/react-native-vector-icons/Fonts/Ionicons.ttf", 237 | "${PODS_ROOT}/QIMReactNativeLibrary/react-native-vector-icons/Fonts/MaterialCommunityIcons.ttf", 238 | "${PODS_ROOT}/QIMReactNativeLibrary/react-native-vector-icons/Fonts/MaterialIcons.ttf", 239 | "${PODS_ROOT}/QIMReactNativeLibrary/react-native-vector-icons/Fonts/Octicons.ttf", 240 | "${PODS_ROOT}/QIMReactNativeLibrary/react-native-vector-icons/Fonts/SimpleLineIcons.ttf", 241 | "${PODS_ROOT}/QIMReactNativeLibrary/react-native-vector-icons/Fonts/Zocial.ttf", 242 | "${PODS_CONFIGURATION_BUILD_DIR}/QIMUIKit/QIMSourceCode.bundle", 243 | "${PODS_ROOT}/QIMUIKit/QIMUIKit/General/Verders/QIMMWPhotoBrowser/Assets", 244 | "${PODS_ROOT}/QIMUIKit/QIMNoteUI/CKEditor5.bundle", 245 | "${PODS_ROOT}/QIMUIKit/QIMNoteUI/QTPassword/EditPasswordView.xib", 246 | "${PODS_ROOT}/QIMUIKit/QIMRNKit/QIMRNKit.bundle", 247 | "${PODS_ROOT}/QIMUIKit/QIMUIKit/QIMUIKitResources/片段/NetWorkSetting.html", 248 | "${PODS_ROOT}/QIMUIKit/QIMUIKit/QIMUIKitResources/片段/QIMMicroTourRoot.css", 249 | "${PODS_ROOT}/QIMUIKit/QIMUIKit/QIMUIKitResources/片段/QIMMicroTourRoot.html", 250 | "${PODS_ROOT}/QIMUIKit/QIMUIKit/QIMUIKitResources/片段/QTalkeula.html", 251 | "${PODS_ROOT}/QIMUIKit/QIMUIKit/QIMUIKitResources/片段/Startalkeula.html", 252 | "${PODS_ROOT}/QIMUIKit/QIMUIKit/Application/ViewController/Login/QIMLoginViewController.xib", 253 | "${PODS_ROOT}/QIMUIKit/QIMUIKit/QIMUIKitResources/Audio/end.wav", 254 | "${PODS_ROOT}/QIMUIKit/QIMUIKit/QIMUIKitResources/Audio/msg.wav", 255 | "${PODS_ROOT}/QIMUIKit/QIMUIKit/QIMUIKitResources/Audio/right_answer.mp3", 256 | "${PODS_ROOT}/QIMUIKit/QIMUIKit/QIMUIKitResources/Audio/新咨询的播报.wav", 257 | "${PODS_ROOT}/QIMUIKit/QIMUIKit/QIMUIKitResources/Certificate/certificate.der", 258 | "${PODS_ROOT}/QIMUIKit/QIMUIKit/QIMUIKitResources/Certificate/public_key.der", 259 | "${PODS_ROOT}/QIMUIKit/QIMUIKit/QIMUIKitResources/Certificate/public_key.pem", 260 | "${PODS_ROOT}/QIMUIKit/QIMUIKit/QIMUIKitResources/Certificate/pub_key.pem", 261 | "${PODS_ROOT}/QIMUIKit/QIMUIKit/QIMUIKitResources/Certificate/pub_key_chat_dev.pem", 262 | "${PODS_ROOT}/QIMUIKit/QIMUIKit/QIMUIKitResources/Certificate/pub_key_chat_release.pem", 263 | "${PODS_ROOT}/QIMUIKit/QIMUIKit/QIMUIKitResources/Certificate/pub_key_talk_release.pem", 264 | "${PODS_ROOT}/QIMUIKit/QIMUIKit/QIMUIKitResources/Fonts/DS-DIGI.TTF", 265 | "${PODS_ROOT}/QIMUIKit/QIMUIKit/QIMUIKitResources/Fonts/DS-DIGIB.TTF", 266 | "${PODS_ROOT}/QIMUIKit/QIMUIKit/QIMUIKitResources/Fonts/DS-DIGII.TTF", 267 | "${PODS_ROOT}/QIMUIKit/QIMUIKit/QIMUIKitResources/Fonts/DS-DIGIT.TTF", 268 | "${PODS_ROOT}/QIMUIKit/QIMUIKit/QIMUIKitResources/Fonts/iconfont.eot", 269 | "${PODS_ROOT}/QIMUIKit/QIMUIKit/QIMUIKitResources/Fonts/iconfont.ttf", 270 | "${PODS_ROOT}/QIMUIKit/QIMUIKit/QIMUIKitResources/Fonts/iconfont.woff", 271 | "${PODS_ROOT}/QIMUIKit/QIMUIKit/QIMUIKitResources/Fonts/Ionicons.ttf", 272 | "${PODS_ROOT}/QIMUIKit/QIMUIKit/QIMUIKitResources/Fonts/ops_opsapp.eot", 273 | "${PODS_ROOT}/QIMUIKit/QIMUIKit/QIMUIKitResources/Fonts/ops_opsapp.svg", 274 | "${PODS_ROOT}/QIMUIKit/QIMUIKit/QIMUIKitResources/Fonts/ops_opsapp.ttf", 275 | "${PODS_ROOT}/QIMUIKit/QIMUIKit/QIMUIKitResources/Fonts/ops_opsapp.woff", 276 | "${PODS_ROOT}/QIMUIKit/QIMUIKit/QIMUIKitResources/Fonts/QTalk-QChat.eot", 277 | "${PODS_ROOT}/QIMUIKit/QIMUIKit/QIMUIKitResources/Fonts/QTalk-QChat.html", 278 | "${PODS_ROOT}/QIMUIKit/QIMUIKit/QIMUIKitResources/Fonts/QTalk-QChat.svg", 279 | "${PODS_ROOT}/QIMUIKit/QIMUIKit/QIMUIKitResources/Fonts/QTalk-QChat.ttf", 280 | "${PODS_ROOT}/QIMUIKit/QIMUIKit/QIMUIKitResources/Fonts/QTalk-QChat.woff", 281 | "${PODS_ROOT}/QIMUIKit/QIMUIKit/QIMUIKitResources/Fonts/方正兰亭黑简.TTF", 282 | "${PODS_ROOT}/QIMUIKit/QIMUIKit/QIMUIKitResources/Stickers/EmojiOne.zip", 283 | "${PODS_ROOT}/QIMUIKit/QIMUIKit/QIMUIKitResources/Stickers/qunar_camel.zip", 284 | "${PODS_ROOT}/QIMUIKit/QIMUIKit/QIMUIKitResources/QIMI18N.bundle", 285 | "${PODS_ROOT}/QIMUIKit/QIMUIKit/QIMUIKitResources/QIMUIKit.bundle", 286 | "${PODS_ROOT}/QIMUIKit/QIMUIVendorKit/QIMArrowView/QIMArrowCellTableViewCell.xib", 287 | "${PODS_ROOT}/QIMUIKit/QIMUIVendorKit/QIMDaePickerView/QIMWSDatePickerView.xib", 288 | ); 289 | name = "[CP] Copy Pods Resources"; 290 | outputPaths = ( 291 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/AMap.bundle", 292 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/MJRefresh.bundle", 293 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/QIMCommonResource.bundle", 294 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/call_bg@2x.png", 295 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/icon_audio_receive_normal@2x.png", 296 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/icon_audio_receive_press@2x.png", 297 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/icon_avp_camera_white@2x.png", 298 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/icon_avp_invite_black@2x.png", 299 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/icon_avp_invite_blue@2x.png", 300 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/icon_avp_invite_gray@2x.png", 301 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/icon_avp_invite_white@2x.png", 302 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/icon_avp_loudspeaker_black@2x.png", 303 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/icon_avp_loudspeaker_blue@2x.png", 304 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/icon_avp_loudspeaker_gray@2x.png", 305 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/icon_avp_loudspeaker_white@2x.png", 306 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/icon_avp_mute_black@2x.png", 307 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/icon_avp_mute_blue@2x.png", 308 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/icon_avp_mute_gray@2x.png", 309 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/icon_avp_mute_white@2x.png", 310 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/icon_avp_reduce_black@2x.png", 311 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/icon_avp_reduce_blue@2x.png", 312 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/icon_avp_reduce_gray@2x.png", 313 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/icon_avp_reduce_white@2x.png", 314 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/icon_avp_video_black@2x.png", 315 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/icon_avp_video_blue@2x.png", 316 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/icon_avp_video_gray@2x.png", 317 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/icon_avp_video_white@2x.png", 318 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/icon_av_audio_micro_normal@2x.png", 319 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/icon_av_audio_micro_press@2x.png", 320 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/icon_av_audio_receive_normal@2x.png", 321 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/icon_av_audio_receive_press@2x.png", 322 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/icon_av_reply_message_normal@2x.png", 323 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/icon_av_reply_message_press@2x.png", 324 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/icon_call_reject_normal@2x.png", 325 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/icon_call_reject_press@2x.png", 326 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/im_skin_icon_audiocall_bg.jpg", 327 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/portrait.jpg", 328 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/portrait@2x.png", 329 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/voip_camera_icons_130x130_@1x.png", 330 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/voip_camera_icons_66x66_@3x.png", 331 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/voip_convert_icons_130x130_@1x.png", 332 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/voip_convert_icons_66x66_@3x.png", 333 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/AVChat_busy.mp3", 334 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/AVChat_endCall.mp3", 335 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/AVChat_incoming.mp3", 336 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/AVChat_waitingForAnswer.mp3", 337 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/incomingRing.wav", 338 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Message_system.mp3", 339 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/QIMPinYin.bundle", 340 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Entypo.ttf", 341 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/EvilIcons.ttf", 342 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Feather.ttf", 343 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FontAwesome.ttf", 344 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Foundation.ttf", 345 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Ionicons.ttf", 346 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/MaterialCommunityIcons.ttf", 347 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/MaterialIcons.ttf", 348 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Octicons.ttf", 349 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/SimpleLineIcons.ttf", 350 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Zocial.ttf", 351 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/QIMSourceCode.bundle", 352 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Assets", 353 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/CKEditor5.bundle", 354 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/EditPasswordView.nib", 355 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/QIMRNKit.bundle", 356 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/NetWorkSetting.html", 357 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/QIMMicroTourRoot.css", 358 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/QIMMicroTourRoot.html", 359 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/QTalkeula.html", 360 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Startalkeula.html", 361 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/QIMLoginViewController.nib", 362 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/end.wav", 363 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/msg.wav", 364 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/right_answer.mp3", 365 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/新咨询的播报.wav", 366 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/certificate.der", 367 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/public_key.der", 368 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/public_key.pem", 369 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/pub_key.pem", 370 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/pub_key_chat_dev.pem", 371 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/pub_key_chat_release.pem", 372 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/pub_key_talk_release.pem", 373 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/DS-DIGI.TTF", 374 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/DS-DIGIB.TTF", 375 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/DS-DIGII.TTF", 376 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/DS-DIGIT.TTF", 377 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/iconfont.eot", 378 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/iconfont.ttf", 379 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/iconfont.woff", 380 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ops_opsapp.eot", 381 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ops_opsapp.svg", 382 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ops_opsapp.ttf", 383 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ops_opsapp.woff", 384 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/QTalk-QChat.eot", 385 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/QTalk-QChat.html", 386 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/QTalk-QChat.svg", 387 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/QTalk-QChat.ttf", 388 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/QTalk-QChat.woff", 389 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/方正兰亭黑简.TTF", 390 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/EmojiOne.zip", 391 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/qunar_camel.zip", 392 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/QIMI18N.bundle", 393 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/QIMUIKit.bundle", 394 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/QIMArrowCellTableViewCell.nib", 395 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/QIMWSDatePickerView.nib", 396 | ); 397 | runOnlyForDeploymentPostprocessing = 0; 398 | shellPath = /bin/sh; 399 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-IMSDK-iOS/Pods-IMSDK-iOS-resources.sh\"\n"; 400 | showEnvVarsInLog = 0; 401 | }; 402 | 7F99527C83A268ACC0A3615F /* [CP] Embed Pods Frameworks */ = { 403 | isa = PBXShellScriptBuildPhase; 404 | buildActionMask = 2147483647; 405 | files = ( 406 | ); 407 | inputPaths = ( 408 | "${PODS_ROOT}/Target Support Files/Pods-IMSDK-iOS/Pods-IMSDK-iOS-frameworks.sh", 409 | "${PODS_ROOT}/GoogleWebRTC/Frameworks/frameworks/WebRTC.framework", 410 | ); 411 | name = "[CP] Embed Pods Frameworks"; 412 | outputPaths = ( 413 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/WebRTC.framework", 414 | ); 415 | runOnlyForDeploymentPostprocessing = 0; 416 | shellPath = /bin/sh; 417 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-IMSDK-iOS/Pods-IMSDK-iOS-frameworks.sh\"\n"; 418 | showEnvVarsInLog = 0; 419 | }; 420 | 85837ABA31E07E39268060DF /* [CP] Check Pods Manifest.lock */ = { 421 | isa = PBXShellScriptBuildPhase; 422 | buildActionMask = 2147483647; 423 | files = ( 424 | ); 425 | inputPaths = ( 426 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 427 | "${PODS_ROOT}/Manifest.lock", 428 | ); 429 | name = "[CP] Check Pods Manifest.lock"; 430 | outputPaths = ( 431 | "$(DERIVED_FILE_DIR)/Pods-IMSDK-iOS-checkManifestLockResult.txt", 432 | ); 433 | runOnlyForDeploymentPostprocessing = 0; 434 | shellPath = /bin/sh; 435 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; 436 | showEnvVarsInLog = 0; 437 | }; 438 | /* End PBXShellScriptBuildPhase section */ 439 | 440 | /* Begin PBXSourcesBuildPhase section */ 441 | 2CC52E0E21B027DC0009EAB5 /* Sources */ = { 442 | isa = PBXSourcesBuildPhase; 443 | buildActionMask = 2147483647; 444 | files = ( 445 | 2CC52E1A21B027DC0009EAB5 /* ViewController.m in Sources */, 446 | 2CC52E2521B027DE0009EAB5 /* main.m in Sources */, 447 | 2CC52E1721B027DC0009EAB5 /* AppDelegate.m in Sources */, 448 | ); 449 | runOnlyForDeploymentPostprocessing = 0; 450 | }; 451 | /* End PBXSourcesBuildPhase section */ 452 | 453 | /* Begin PBXVariantGroup section */ 454 | 2CC52E1B21B027DC0009EAB5 /* Main.storyboard */ = { 455 | isa = PBXVariantGroup; 456 | children = ( 457 | 2CC52E1C21B027DC0009EAB5 /* Base */, 458 | ); 459 | name = Main.storyboard; 460 | sourceTree = ""; 461 | }; 462 | 2CC52E2021B027DE0009EAB5 /* LaunchScreen.storyboard */ = { 463 | isa = PBXVariantGroup; 464 | children = ( 465 | 2CC52E2121B027DE0009EAB5 /* Base */, 466 | ); 467 | name = LaunchScreen.storyboard; 468 | sourceTree = ""; 469 | }; 470 | /* End PBXVariantGroup section */ 471 | 472 | /* Begin XCBuildConfiguration section */ 473 | 2CC52E2621B027DE0009EAB5 /* Debug */ = { 474 | isa = XCBuildConfiguration; 475 | buildSettings = { 476 | ALWAYS_SEARCH_USER_PATHS = NO; 477 | CLANG_ANALYZER_NONNULL = YES; 478 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 479 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 480 | CLANG_CXX_LIBRARY = "libc++"; 481 | CLANG_ENABLE_MODULES = YES; 482 | CLANG_ENABLE_OBJC_ARC = YES; 483 | CLANG_ENABLE_OBJC_WEAK = YES; 484 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 485 | CLANG_WARN_BOOL_CONVERSION = YES; 486 | CLANG_WARN_COMMA = YES; 487 | CLANG_WARN_CONSTANT_CONVERSION = YES; 488 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 489 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 490 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 491 | CLANG_WARN_EMPTY_BODY = YES; 492 | CLANG_WARN_ENUM_CONVERSION = YES; 493 | CLANG_WARN_INFINITE_RECURSION = YES; 494 | CLANG_WARN_INT_CONVERSION = YES; 495 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 496 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 497 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 498 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 499 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 500 | CLANG_WARN_STRICT_PROTOTYPES = YES; 501 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 502 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 503 | CLANG_WARN_UNREACHABLE_CODE = YES; 504 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 505 | CODE_SIGN_IDENTITY = "iPhone Developer"; 506 | COPY_PHASE_STRIP = NO; 507 | DEBUG_INFORMATION_FORMAT = dwarf; 508 | ENABLE_BITCODE = NO; 509 | ENABLE_STRICT_OBJC_MSGSEND = YES; 510 | ENABLE_TESTABILITY = YES; 511 | GCC_C_LANGUAGE_STANDARD = gnu11; 512 | GCC_DYNAMIC_NO_PIC = NO; 513 | GCC_NO_COMMON_BLOCKS = YES; 514 | GCC_OPTIMIZATION_LEVEL = 0; 515 | GCC_PREPROCESSOR_DEFINITIONS = ( 516 | "DEBUG=1", 517 | "$(inherited)", 518 | ); 519 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 520 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 521 | GCC_WARN_UNDECLARED_SELECTOR = YES; 522 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 523 | GCC_WARN_UNUSED_FUNCTION = YES; 524 | GCC_WARN_UNUSED_VARIABLE = YES; 525 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 526 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 527 | MTL_FAST_MATH = YES; 528 | ONLY_ACTIVE_ARCH = YES; 529 | SDKROOT = iphoneos; 530 | }; 531 | name = Debug; 532 | }; 533 | 2CC52E2721B027DE0009EAB5 /* Release */ = { 534 | isa = XCBuildConfiguration; 535 | buildSettings = { 536 | ALWAYS_SEARCH_USER_PATHS = NO; 537 | CLANG_ANALYZER_NONNULL = YES; 538 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 539 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 540 | CLANG_CXX_LIBRARY = "libc++"; 541 | CLANG_ENABLE_MODULES = YES; 542 | CLANG_ENABLE_OBJC_ARC = YES; 543 | CLANG_ENABLE_OBJC_WEAK = YES; 544 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 545 | CLANG_WARN_BOOL_CONVERSION = YES; 546 | CLANG_WARN_COMMA = YES; 547 | CLANG_WARN_CONSTANT_CONVERSION = YES; 548 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 549 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 550 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 551 | CLANG_WARN_EMPTY_BODY = YES; 552 | CLANG_WARN_ENUM_CONVERSION = YES; 553 | CLANG_WARN_INFINITE_RECURSION = YES; 554 | CLANG_WARN_INT_CONVERSION = YES; 555 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 556 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 557 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 558 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 559 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 560 | CLANG_WARN_STRICT_PROTOTYPES = YES; 561 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 562 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 563 | CLANG_WARN_UNREACHABLE_CODE = YES; 564 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 565 | CODE_SIGN_IDENTITY = "iPhone Developer"; 566 | COPY_PHASE_STRIP = NO; 567 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 568 | ENABLE_BITCODE = NO; 569 | ENABLE_NS_ASSERTIONS = NO; 570 | ENABLE_STRICT_OBJC_MSGSEND = YES; 571 | GCC_C_LANGUAGE_STANDARD = gnu11; 572 | GCC_NO_COMMON_BLOCKS = YES; 573 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 574 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 575 | GCC_WARN_UNDECLARED_SELECTOR = YES; 576 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 577 | GCC_WARN_UNUSED_FUNCTION = YES; 578 | GCC_WARN_UNUSED_VARIABLE = YES; 579 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 580 | MTL_ENABLE_DEBUG_INFO = NO; 581 | MTL_FAST_MATH = YES; 582 | SDKROOT = iphoneos; 583 | VALIDATE_PRODUCT = YES; 584 | }; 585 | name = Release; 586 | }; 587 | 2CC52E2921B027DE0009EAB5 /* Debug */ = { 588 | isa = XCBuildConfiguration; 589 | baseConfigurationReference = 6BFF7E29ACF67F0EDFD9CEAE /* Pods-IMSDK-iOS.debug.xcconfig */; 590 | buildSettings = { 591 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; 592 | CODE_SIGN_IDENTITY = "iPhone Developer"; 593 | CODE_SIGN_STYLE = Automatic; 594 | DEVELOPMENT_TEAM = ""; 595 | INFOPLIST_FILE = "IMSDK-iOS/Info.plist"; 596 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 597 | LD_RUNPATH_SEARCH_PATHS = ( 598 | "$(inherited)", 599 | "@executable_path/Frameworks", 600 | ); 601 | PRODUCT_BUNDLE_IDENTIFIER = "com.yourcompany.ProductName.IMSDK-iOS"; 602 | PRODUCT_NAME = "$(TARGET_NAME)"; 603 | PROVISIONING_PROFILE_SPECIFIER = ""; 604 | TARGETED_DEVICE_FAMILY = "1,2"; 605 | }; 606 | name = Debug; 607 | }; 608 | 2CC52E2A21B027DE0009EAB5 /* Release */ = { 609 | isa = XCBuildConfiguration; 610 | baseConfigurationReference = 9A830545AC1BCEB56DED8FEE /* Pods-IMSDK-iOS.release.xcconfig */; 611 | buildSettings = { 612 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; 613 | CODE_SIGN_IDENTITY = "iPhone Developer"; 614 | CODE_SIGN_STYLE = Automatic; 615 | DEVELOPMENT_TEAM = ""; 616 | INFOPLIST_FILE = "IMSDK-iOS/Info.plist"; 617 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 618 | LD_RUNPATH_SEARCH_PATHS = ( 619 | "$(inherited)", 620 | "@executable_path/Frameworks", 621 | ); 622 | PRODUCT_BUNDLE_IDENTIFIER = "com.yourcompany.ProductName.IMSDK-iOS"; 623 | PRODUCT_NAME = "$(TARGET_NAME)"; 624 | PROVISIONING_PROFILE_SPECIFIER = ""; 625 | TARGETED_DEVICE_FAMILY = "1,2"; 626 | }; 627 | name = Release; 628 | }; 629 | /* End XCBuildConfiguration section */ 630 | 631 | /* Begin XCConfigurationList section */ 632 | 2CC52E0D21B027DC0009EAB5 /* Build configuration list for PBXProject "IMSDK-iOS" */ = { 633 | isa = XCConfigurationList; 634 | buildConfigurations = ( 635 | 2CC52E2621B027DE0009EAB5 /* Debug */, 636 | 2CC52E2721B027DE0009EAB5 /* Release */, 637 | ); 638 | defaultConfigurationIsVisible = 0; 639 | defaultConfigurationName = Release; 640 | }; 641 | 2CC52E2821B027DE0009EAB5 /* Build configuration list for PBXNativeTarget "IMSDK-iOS" */ = { 642 | isa = XCConfigurationList; 643 | buildConfigurations = ( 644 | 2CC52E2921B027DE0009EAB5 /* Debug */, 645 | 2CC52E2A21B027DE0009EAB5 /* Release */, 646 | ); 647 | defaultConfigurationIsVisible = 0; 648 | defaultConfigurationName = Release; 649 | }; 650 | /* End XCConfigurationList section */ 651 | }; 652 | rootObject = 2CC52E0A21B027DC0009EAB5 /* Project object */; 653 | } 654 | -------------------------------------------------------------------------------- /IMSDK-iOS.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /IMSDK-iOS.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /IMSDK-iOS.xcodeproj/project.xcworkspace/xcuserdata/lilu.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qunarcorp/imsdk-ios/5d026a9d9cdebb89c676826d5dfe79a5581e79a3/IMSDK-iOS.xcodeproj/project.xcworkspace/xcuserdata/lilu.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /IMSDK-iOS.xcodeproj/xcuserdata/lilu.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | IMSDK-iOS.xcscheme 8 | 9 | orderHint 10 | 46 11 | 12 | IMSDK-iOS.xcscheme_^#shared#^_ 13 | 14 | orderHint 15 | 51 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /IMSDK-iOS.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /IMSDK-iOS.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /IMSDK-iOS.xcworkspace/xcuserdata/lilu.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qunarcorp/imsdk-ios/5d026a9d9cdebb89c676826d5dfe79a5581e79a3/IMSDK-iOS.xcworkspace/xcuserdata/lilu.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /IMSDK-iOS/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // IMSDK-iOS 4 | // 5 | // Created by 李露 on 11/29/18. 6 | // Copyright © 2018 QIM. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface AppDelegate : UIResponder 12 | 13 | @property (strong, nonatomic) UIWindow *window; 14 | 15 | 16 | @end 17 | 18 | -------------------------------------------------------------------------------- /IMSDK-iOS/AppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.m 3 | // IMSDK-iOS 4 | // 5 | // Created by 李露 on 11/29/18. 6 | // Copyright © 2018 QIM. All rights reserved. 7 | // 8 | 9 | #import "AppDelegate.h" 10 | #import 11 | #import 12 | #import 13 | #import 14 | #include // Per msqr 15 | #include 16 | #include 17 | #include 18 | #include 19 | #import 20 | #if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 21 | #import 22 | #endif 23 | 24 | #if __has_include("QIMNoteManager.h") 25 | #import "QIMNoteManager.h" 26 | #endif 27 | 28 | #if __has_include("QIMLocalLog.h") 29 | #import "QIMLocalLog.h" 30 | #endif 31 | #import "AvoidCrash.h" 32 | #import "QIMWatchDog.h" 33 | #import "QIMJSONSerializer.h" 34 | #import "QIMUUIDTools.h" 35 | #import "QIMPublicRedefineHeader.h" 36 | #import "QIMSDK.h" 37 | 38 | #define GAODE_APIKEY @"" 39 | 40 | #pragma mark - 系统错误信号捕获 41 | 42 | static int s_fatal_signals[] = { 43 | SIGABRT, 44 | SIGBUS, 45 | SIGFPE, 46 | SIGILL, 47 | SIGSEGV, 48 | SIGTRAP, 49 | SIGTERM, 50 | SIGKILL, 51 | }; 52 | 53 | static int s_fatal_signal_num = sizeof(s_fatal_signals) / sizeof(s_fatal_signals[0]); 54 | 55 | void UncaughtExceptionHandler(NSException *exception) { 56 | NSArray *arr = [exception callStackSymbols]; //得到当前调用栈信息 57 | NSString *reason = [exception reason]; //非常重要,就是崩溃的原因 58 | NSString *name = [exception name]; //异常类型 59 | QIMErrorLog(@"CrashMsgArray %@", arr); 60 | QIMErrorLog(@"CrashMsgReson %@", reason); 61 | QIMErrorLog(@"CrashMsgName %@", name); 62 | 63 | NSString *userId = [[QIMKit sharedInstance] getLastJid]; 64 | NSString *systemVersion = [[QIMKit sharedInstance] SystemVersion]; 65 | NSString *appVersion = [[QIMKit sharedInstance] AppBuildVersion]; 66 | NSString *eventName = [NSString stringWithFormat:@"【%@】 -【SystemVersion:%@】-【AppVersion:%@】UncaughtExceptionHandler 捕获到崩溃了 - 【%@ %@】\n", userId, systemVersion, appVersion, name, reason]; 67 | #if __has_include("QIMLocalLog.h") 68 | 69 | [[QIMLocalLog sharedInstance] submitFeedBackWithContent:[NSString stringWithFormat:@"%@", eventName] withUserInitiative:NO]; 70 | 71 | #endif 72 | [[QIMKit sharedInstance] saveUserDefault]; 73 | } 74 | 75 | void SignalHandler(int code) 76 | { 77 | QIMErrorLog(@"SignalHandler = %d",code); 78 | } 79 | 80 | void InitCrashReport() 81 | { 82 | //系统错误信号捕获 83 | for (int i = 0; i < s_fatal_signal_num; ++i) { 84 | signal(s_fatal_signals[i], SignalHandler); 85 | } 86 | //oc未捕获异常的捕获 87 | NSSetUncaughtExceptionHandler(&UncaughtExceptionHandler); 88 | } 89 | 90 | @interface AppDelegate () 91 | 92 | @end 93 | 94 | @implementation AppDelegate 95 | 96 | #pragma mark - life cicle 97 | 98 | - (void) foo { 99 | [QIMSDKUIHelper signOutWithNoPush]; 100 | } 101 | 102 | - (void)initRemoteNotification { 103 | //注册系统通知 104 | #if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 105 | if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 10.0) { 106 | 107 | UNUserNotificationCenter *notifyCenter = [UNUserNotificationCenter currentNotificationCenter]; 108 | notifyCenter.delegate = self; 109 | [notifyCenter requestAuthorizationWithOptions:UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert | UNAuthorizationOptionCarPlay completionHandler:^(BOOL granted, NSError * _Nullable error) { 110 | if (granted) { 111 | NSLog(@"通知权限request authorization successed!"); 112 | } 113 | }]; 114 | 115 | //用户通知权限变更 116 | [notifyCenter getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) { 117 | NSLog(@"用户通知权限设置%@", settings); 118 | NSLog(@"用户通知权限状态%ld", (long)settings.authorizationStatus); //// .authorized | .denied | .notDetermined 119 | NSLog(@"用户通知红角标权限%ld", (long)settings.badgeSetting); // 120 | }]; 121 | UNTextInputNotificationAction *textInputAction = [UNTextInputNotificationAction actionWithIdentifier:@"comments" title:@"快捷回复" options:UNNotificationActionOptionDestructive textInputButtonTitle:@"回复" textInputPlaceholder:@"请输入回复内容"]; 122 | //创建通知模板 123 | UNNotificationCategory * category = [UNNotificationCategory categoryWithIdentifier:@"msg" actions:@[textInputAction] intentIdentifiers:@[] options:UNNotificationCategoryOptionCustomDismissAction]; 124 | [notifyCenter setNotificationCategories:[NSSet setWithObjects:category,nil]]; 125 | [[UIApplication sharedApplication] registerForRemoteNotifications]; 126 | }else{ 127 | UIMutableUserNotificationCategory *categorys = nil; 128 | if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 9.0) { 129 | UIMutableUserNotificationAction *action = [[UIMutableUserNotificationAction alloc] init]; 130 | action.identifier = @"comments"; 131 | action.title = @"回复"; 132 | //当点击的时候不启动程序,在后台处理 133 | action.activationMode = UIUserNotificationActivationModeBackground; 134 | action.authenticationRequired = NO; 135 | //设置了behavior属性为 UIUserNotificationActionBehaviorTextInput 的话,则用户点击了该按钮会出现输入框供用户输入 136 | action.behavior = UIUserNotificationActionBehaviorTextInput; 137 | //这个字典定义了当用户点击了评论按钮后,输入框右侧的按钮名称,如果不设置该字典,则右侧按钮名称默认为 “发送” 138 | action.parameters = @{UIUserNotificationTextInputActionButtonTitleKey: @"回复"}; 139 | 140 | categorys = [[UIMutableUserNotificationCategory alloc] init]; 141 | categorys.identifier = @"msg"; 142 | NSArray *actions = @[action]; 143 | [categorys setActions:actions forContext:UIUserNotificationActionContextMinimal]; 144 | } 145 | if ([[UIApplication sharedApplication] respondsToSelector:@selector(registerUserNotificationSettings:)]) { 146 | UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound) categories:[NSSet setWithObjects:categorys, nil]]; 147 | [[UIApplication sharedApplication] registerUserNotificationSettings:settings]; 148 | } else { 149 | [[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound]; 150 | } 151 | } 152 | #else 153 | UIMutableUserNotificationCategory *categorys = nil; 154 | if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 9.0) { 155 | UIMutableUserNotificationAction *action = [[UIMutableUserNotificationAction alloc] init]; 156 | action.identifier = @"comments"; 157 | action.title = @"回复"; 158 | //当点击的时候不启动程序,在后台处理 159 | action.activationMode = UIUserNotificationActivationModeBackground; 160 | action.authenticationRequired = YES; 161 | //设置了behavior属性为 UIUserNotificationActionBehaviorTextInput 的话,则用户点击了该按钮会出现输入框供用户输入 162 | action.behavior = UIUserNotificationActionBehaviorTextInput; 163 | //这个字典定义了当用户点击了评论按钮后,输入框右侧的按钮名称,如果不设置该字典,则右侧按钮名称默认为 “发送” 164 | action.parameters = @{UIUserNotificationTextInputActionButtonTitleKey: @"回复"}; 165 | 166 | categorys = [[UIMutableUserNotificationCategory alloc] init]; 167 | categorys.identifier = @"msg"; 168 | NSArray *actions = @[action]; 169 | [categorys setActions:actions forContext:UIUserNotificationActionContextMinimal]; 170 | } 171 | if ([[UIApplication sharedApplication] respondsToSelector:@selector(registerUserNotificationSettings:)]) { 172 | UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound) categories:[NSSet setWithObjects:categorys, nil]]; 173 | [[UIApplication sharedApplication] registerUserNotificationSettings:settings]; 174 | } else { 175 | [[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound]; 176 | } 177 | #endif 178 | } 179 | 180 | - (void)applicationInit { 181 | 182 | [QIMSDKUIHelper shareInstance]; 183 | InitCrashReport(); 184 | [[QIMKit sharedInstance] isFirstLauched]; 185 | 186 | { 187 | // 检查版本,做首次升级使用。回头再挪 188 | long long localVersion = [[[QIMKit sharedInstance] userObjectForKey:@"QTalkApplicationLastVersion"] longLongValue]; 189 | long long currentVersion = [[[NSBundle mainBundle] objectForInfoDictionaryKey:(NSString*)kCFBundleVersionKey] longLongValue]; 190 | 191 | if (localVersion != currentVersion) { 192 | // 清掉表情检查配置 193 | [[QIMKit sharedInstance] removeUserObjectForKey:@"emotion_check"]; 194 | } 195 | } 196 | 197 | dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 198 | if ([QIMKit getQIMProjectType] == QIMProjectTypeQChat) { 199 | [[QIMKit sharedInstance] qimNav_updateNavigationConfigWithCheck:YES]; 200 | // 更新应用模版 201 | [[QIMSDKUIHelper shareInstance] updateMicroTourModel]; 202 | } 203 | }); 204 | { 205 | // 做登录超期使用 206 | [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(foo) name:@"kNotificationOutOfDateFromQTalkMainVc" object:nil]; 207 | } 208 | 209 | { 210 | [self configureAPIKey]; 211 | [[UIApplication sharedApplication] setApplicationSupportsShakeToEdit:YES]; 212 | } 213 | [self initRemoteNotification]; 214 | 215 | self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 216 | self.window.backgroundColor = [UIColor whiteColor]; 217 | [self.window makeKeyAndVisible]; 218 | 219 | [[QIMSDKUIHelper shareInstance] launchMainControllerWithWindow:self.window]; 220 | //距离上次展示广告是否超过间隔时间 221 | NSTimeInterval nowTime = [NSDate timeIntervalSinceReferenceDate]; 222 | NSTimeInterval lastAdTime = [[[QIMKit sharedInstance] userObjectForKey:@"lastAdShowTime"] longLongValue]; 223 | long long adShowIntervalTime = nowTime - lastAdTime; 224 | if ([[QIMKit sharedInstance] qimNav_AdShown] && [[[QIMKit sharedInstance] qimNav_AdItems] count] > 0 && adShowIntervalTime > [[QIMKit sharedInstance] qimNav_AdInterval]) { 225 | //展示广告window 226 | [[QIMSDKUIHelper shareInstance] launchMainAdvertWindow]; 227 | } 228 | } 229 | 230 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 231 | [QIMKit setQIMProjectType:0]; 232 | [self applicationInit]; 233 | [[QIMKit sharedInstance] chooseNewData:YES]; 234 | return YES; 235 | } 236 | 237 | - (void)applicationWillResignActive:(UIApplication *)application 238 | { 239 | NSLog(@"应用程序将要入非活动状态执行,applicationWillResignActive"); 240 | [[QIMKit sharedInstance] setWillCancelLogin:YES]; 241 | [[QIMKit sharedInstance] saveUserDefault]; 242 | if ([QIMKit getLastUserName]) { 243 | [[QIMKit sharedInstance] setNeedTryRelogin:YES]; 244 | } 245 | if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 10.0) { 246 | // dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 247 | // NSTimer *testTimer = [NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(testiOS10LocalQuickReplyNotification) userInfo:nil repeats:YES]; 248 | // [[NSRunLoop currentRunLoop] addTimer:testTimer forMode:NSRunLoopCommonModes]; 249 | // [[NSRunLoop currentRunLoop] run]; 250 | // }); 251 | // [self performSelector:@selector(testiOS10LocalQuickReplyNotification) withObject:nil afterDelay:0.5]; 252 | // [self performSelector:@selector(testiOS10LocalQuickReplyNotification) withObject:nil afterDelay:1]; 253 | // [self performSelector:@selector(testiOS10LocalQuickReplyNotification) withObject:nil afterDelay:1.5]; 254 | } else { 255 | // [self testLocalQuickReplyNotification]; 256 | // [self performSelector:@selector(testLocalQuickReplyNotification) withObject:nil afterDelay:0.5]; 257 | // [self performSelector:@selector(testLocalQuickReplyNotification) withObject:nil afterDelay:1]; 258 | // [self performSelector:@selector(testLocalQuickReplyNotification) withObject:nil afterDelay:1.5]; 259 | } 260 | } 261 | 262 | - (void)applicationDidBecomeActive:(UIApplication *)application 263 | { 264 | 265 | NSLog(@"应用程序入活动状态执行,applicationDidBecomeActive"); 266 | [[QIMKit sharedInstance] setWillCancelLogin:YES]; 267 | NSString *userToken = [[QIMKit sharedInstance] userObjectForKey:@"userToken"]; 268 | NSString *lastUserName = [QIMKit getLastUserName]; 269 | if (userToken.length > 0 && lastUserName.length > 0) { 270 | [[QIMKit sharedInstance] goOnline]; 271 | } 272 | if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 10.0) { 273 | // [self performSelector:@selector(testiOS10LocalQuickReplyNotification) withObject:nil afterDelay:0.5]; 274 | // [self performSelector:@selector(testiOS10LocalQuickReplyNotification) withObject:nil afterDelay:1]; 275 | // [self performSelector:@selector(testiOS10LocalQuickReplyNotification) withObject:nil afterDelay:1.5]; 276 | } else { 277 | // [self testLocalQuickReplyNotification]; 278 | // [self performSelector:@selector(testLocalQuickReplyNotification) withObject:nil afterDelay:0.5]; 279 | // [self performSelector:@selector(testLocalQuickReplyNotification) withObject:nil afterDelay:1]; 280 | // [self performSelector:@selector(testLocalQuickReplyNotification) withObject:nil afterDelay:1.5]; 281 | } 282 | } 283 | 284 | - (void)applicationDidEnterBackground:(UIApplication *)application 285 | { 286 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 287 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 288 | NSLog(@"应用程序将要入后台状态执行,applicationDidEnterBackground"); 289 | NSLog(@"Supported background:%@", [UIDevice currentDevice].multitaskingSupported ? @"YES" : @"NO"); 290 | [[QIMKit sharedInstance] setWillCancelLogin:YES]; 291 | dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{ 292 | [[QIMKit sharedInstance] saveUserDefault]; 293 | [QIMKit updateSessionListToKeyChain]; 294 | [QIMKit updateGroupListToKeyChain]; 295 | [QIMKit updateFriendListToKeyChain]; 296 | [QIMKit updateRequestURL]; 297 | [QIMKit updateRequestDomain]; 298 | }); 299 | 300 | [[QIMKit sharedInstance] updateAppNotReadCount]; 301 | if ([QIMKit getLastUserName]) { 302 | [[QIMKit sharedInstance] setNeedTryRelogin:YES]; 303 | //最近联系人数据写入3D Touch, 重新注册 304 | if ([[UIApplication sharedApplication] respondsToSelector:@selector(setShortcutItems:)]) { 305 | [self create3DItemsWithIcons]; 306 | } 307 | //设置状态为 离开 308 | [[QIMKit sharedInstance] goAway]; 309 | } 310 | } 311 | 312 | - (void)applicationWillEnterForeground:(UIApplication *)application 313 | { 314 | NSLog(@"应用程序将要入前台状态执行, applicationWillEnterForeground"); 315 | [[QIMKit sharedInstance] setWillCancelLogin:NO]; 316 | [[QIMKit sharedInstance] relogin]; 317 | dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 318 | 319 | // 更新应用模版 320 | if ([QIMKit getQIMProjectType] == QIMProjectTypeQChat) { 321 | [[QIMSDKUIHelper shareInstance] updateMicroTourModel]; 322 | } 323 | }); 324 | [[UNUserNotificationCenter currentNotificationCenter] removePendingNotificationRequestsWithIdentifiers:@[@"comments"]]; 325 | [[UNUserNotificationCenter currentNotificationCenter] removeAllPendingNotificationRequests]; 326 | [[UNUserNotificationCenter currentNotificationCenter] removeDeliveredNotificationsWithIdentifiers:@[@"comments"]]; 327 | [[UNUserNotificationCenter currentNotificationCenter] removeAllDeliveredNotifications]; 328 | 329 | [[QIMKit sharedInstance] removeUserObjectForKey:@"LaunchByRemoteNotificationUserInfo"]; 330 | } 331 | 332 | - (void)applicationWillTerminate:(UIApplication *)application 333 | { 334 | NSLog(@"App 异常退出了"); 335 | [[QIMKit sharedInstance] saveUserDefault]; 336 | } 337 | 338 | //performFetchWithCompletionHandler 339 | - (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler { 340 | // [QTalkFastCommonTool excutePatch:3 completion:completionHandler]; 341 | } 342 | 343 | #pragma mark - 本地通知 344 | - (void)testiOS10LocalQuickReplyNotification { 345 | 346 | #if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 347 | if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 10.0) { 348 | 349 | UNTextInputNotificationAction * action = [UNTextInputNotificationAction actionWithIdentifier:@"comments" title:@"回复" options:UNNotificationActionOptionDestructive textInputButtonTitle:@"回复" textInputPlaceholder:@"请输入回复内容"]; 350 | //创建通知模板 351 | UNNotificationCategory * category = [UNNotificationCategory categoryWithIdentifier:@"comments" actions:@[action] intentIdentifiers:@[] options:UNNotificationCategoryOptionCustomDismissAction]; 352 | UNMutableNotificationContent * content = [UNMutableNotificationContent new]; 353 | content.badge = @1; 354 | content.body = [NSString localizedUserNotificationStringForKey:@"测试推送的快捷回复" arguments:nil]; 355 | content.subtitle = [NSString localizedUserNotificationStringForKey:@"这里是副标题" arguments:nil]; 356 | content.title = [NSString localizedUserNotificationStringForKey:@"这里是通知的标题" arguments:nil]; 357 | //默认的通知提示音 358 | content.sound = [UNNotificationSound defaultSound]; 359 | //设置通知内容对应的模板 需要注意 这里的值要与对应模板id一致 360 | content.categoryIdentifier = @"comments"; 361 | content.userInfo = @{@"aps": @{ 362 | @"alert":@{ 363 | @"title":@"Title is Happy day", 364 | @"subtitle":@"Subtitle is Happy day", 365 | @"body":@"按下以显示更多" 366 | }, 367 | @"sound":@"新咨询的播报.wav", 368 | @"mutable-content":@(1), 369 | @"badge":@(1), 370 | }, 371 | @"category":@"msg", 372 | @"userid":@"e5ad60f2a824456d87027246f7fa6e3d@conference.apple.com", 373 | @"image":@"https://source.qunarzz.com/common/hf/logo.png" 374 | }; 375 | //设置5S之后执行 376 | UNTimeIntervalNotificationTrigger * trigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:5 repeats:NO]; 377 | [[UNUserNotificationCenter currentNotificationCenter] setNotificationCategories:[NSSet setWithObjects:category, nil]]; 378 | UNNotificationRequest * request = [UNNotificationRequest requestWithIdentifier:@"comments" content:content trigger:trigger]; 379 | [[UNUserNotificationCenter currentNotificationCenter] addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) { 380 | if (error) { 381 | QIMErrorLog(@"Error"); 382 | } 383 | }]; 384 | } 385 | #endif 386 | } 387 | 388 | - (void)testLocalQuickReplyNotification { 389 | 390 | UILocalNotification *notification = [[UILocalNotification alloc] init]; 391 | notification.fireDate = [NSDate dateWithTimeIntervalSinceNow:5]; 392 | notification.timeZone = [NSTimeZone defaultTimeZone]; 393 | notification.alertBody = @"测试推送的快捷回复"; 394 | notification.category = @"msg"; 395 | notification.userInfo = @{@"aps":@{@"alert":@{@"body":@"测试推送进入"}, @"sound":@"hongbao.acc", @"badge": @(110), @"category":@"msg", @"userid":@"e5ad60f2a824456d87027246f7fa6e3d@conference.apple.com"},@"userid":@"e5ad60f2a824456d87027246f7fa6e3d@conference.apple.com"}; 396 | [[UIApplication sharedApplication] scheduleLocalNotification:notification]; 397 | } 398 | 399 | #pragma mark - register notification 400 | //ios8 需要调用内容 401 | - (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings { 402 | [application registerForRemoteNotifications]; 403 | } 404 | 405 | //本地通知快捷回复,点击回复后回调 406 | - (void)application:(UIApplication *)application handleActionWithIdentifier:(nullable NSString *)identifier forLocalNotification:(UILocalNotification *)notification withResponseInfo:(NSDictionary *)responseInfo completionHandler:(void(^)())completionHandler { 407 | NSLog(@"LocalNotification Identifier : %@, notification : %@, responseInfo : %@", identifier, notification, responseInfo); 408 | if ([identifier isEqualToString:@"comments"]) { 409 | NSString * replyValue = responseInfo[UIUserNotificationActionResponseTypedTextKey]; 410 | NSDictionary * userInfo = notification.userInfo[@"aps"]; 411 | if (userInfo) { 412 | NSString * userid1 = notification.userInfo[@"userid"]; 413 | 414 | NSString * userid2 = userInfo[@"userid"]; 415 | NSString * userId1 = notification.userInfo[@"userId"]; 416 | NSString * userId2 = userInfo[@"userId"]; 417 | 418 | if (userid1.length && replyValue.length) { 419 | [self send:replyValue to:userid1 extendInfo:nil msgType:QIMMessageType_Text completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 420 | }]; 421 | } else if (userid2.length && replyValue.length) { 422 | [self send:replyValue to:userid2 extendInfo:nil msgType:QIMMessageType_Text completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 423 | }]; 424 | } else if (userId1.length && replyValue.length) { 425 | [self send:replyValue to:userId1 extendInfo:nil msgType:QIMMessageType_Text completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 426 | }]; 427 | } else if (userId2.length && replyValue.length) { 428 | [self send:replyValue to:userId2 extendInfo:nil msgType:QIMMessageType_Text completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 429 | }]; 430 | } 431 | } 432 | } 433 | completionHandler(); 434 | } 435 | 436 | //远程通知快捷回复,点击回复后回调 437 | - (void)application:(UIApplication *)application handleActionWithIdentifier:(nullable NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo withResponseInfo:(NSDictionary *)responseInfo completionHandler:(void(^)())completionHandler { 438 | NSLog(@"iOS10之前远程通知快捷回复,点击回复后回调RemoteNotification Identifier : %@, userInfo : %@, responseInfo : %@", identifier, userInfo, responseInfo); 439 | if ([identifier isEqualToString:@"comments"]) { 440 | NSString * replyValue = responseInfo[UIUserNotificationActionResponseTypedTextKey]; 441 | NSDictionary * userInfoDic = userInfo[@"aps"]; 442 | NSLog(@"iOS10之前远程通知快捷回复 APS : %@", userInfoDic); 443 | if (userInfoDic) { 444 | 445 | NSString * userid = userInfo[@"userid"]; 446 | 447 | if (userid.length && replyValue.length) { 448 | [self send:replyValue to:userid extendInfo:nil msgType:QIMMessageType_Text completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 449 | }]; 450 | } 451 | } 452 | } 453 | completionHandler(); 454 | } 455 | 456 | - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification { 457 | NSLog(@"收到本地通知 : %@, userInfo : %@", notification, notification.userInfo); 458 | if (application.applicationState == UIApplicationStateInactive && notification.userInfo) { 459 | [[QIMKit sharedInstance] setUserObject:notification.userInfo forKey:@"LaunchByRemoteNotificationUserInfo"]; 460 | if ([[QIMKit sharedInstance] appWorkState] == AppWorkState_Login) { 461 | [[QIMSDKUIHelper shareInstance] checkUpNotifacationHandle]; 462 | } 463 | }else{ 464 | [[QIMKit sharedInstance] removeUserObjectForKey:@"LaunchByRemoteNotificationUserInfo"]; 465 | } 466 | } 467 | 468 | - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler { 469 | if (userInfo) { 470 | [[QIMKit sharedInstance] setUserObject:userInfo forKey:@"LaunchByRemoteNotificationUserInfo"]; 471 | if (application.applicationState == UIApplicationStateInactive) { 472 | [[QIMSDKUIHelper shareInstance] checkUpNotifacationHandle]; 473 | } 474 | }else{ 475 | [[QIMKit sharedInstance] removeUserObjectForKey:@"LaunchByRemoteNotificationUserInfo"]; 476 | } 477 | } 478 | 479 | #pragma mark - iOS10接收远程通知 480 | #if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 481 | 482 | - (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler{ 483 | NSLog(@"iOS10通知快捷回复 %s : %@", __func__, response); 484 | NSDictionary *userInfo = response.notification.request.content.userInfo; 485 | NSLog(@"iOS10通知快捷回复 userInfo : %@", userInfo); 486 | 487 | NSString *actionIdentifier = response.actionIdentifier; 488 | if ([actionIdentifier isEqualToString:@"comments"]) { 489 | if ([response respondsToSelector:@selector(userText)]) { 490 | NSString * replyValue = [(UNTextInputNotificationResponse *)response userText]; 491 | NSDictionary * userInfoDic = userInfo[@"aps"]; 492 | NSLog(@"iOS10通知快捷回复 aps : %@", userInfoDic); 493 | if (userInfoDic) { 494 | NSString *userid = userInfo[@"userid"]; 495 | if (userid.length > 0 && replyValue.length > 0) { 496 | [self send:replyValue to:userid extendInfo:nil msgType:QIMMessageType_Text completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 497 | }]; 498 | } 499 | } 500 | } 501 | } else{ 502 | if ([UIApplication sharedApplication].applicationState == UIApplicationStateInactive && userInfo) { 503 | [[QIMKit sharedInstance] setUserObject:userInfo forKey:@"LaunchByRemoteNotificationUserInfo"]; 504 | if ([[QIMKit sharedInstance] appWorkState] == AppWorkState_Login) { 505 | [[QIMSDKUIHelper shareInstance] checkUpNotifacationHandle]; 506 | } 507 | }else{ 508 | [[QIMKit sharedInstance] removeUserObjectForKey:@"LaunchByRemoteNotificationUserInfo"]; 509 | } 510 | } 511 | completionHandler(); 512 | } 513 | 514 | #endif 515 | 516 | - (void)application:(UIApplication *)application handleActionWithIdentifier:(nullable NSString *)identifier forLocalNotification:(UILocalNotification *)notification completionHandler:(void(^)())completionHandler { 517 | completionHandler(); 518 | } 519 | 520 | //ios8 push下拉扩展 521 | - (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo completionHandler:(void(^)())completionHandler { 522 | //handle the actions 523 | if ([identifier isEqualToString:@"declineAction"]){ 524 | } 525 | else if ([identifier isEqualToString:@"answerAction"]){ 526 | } 527 | completionHandler(); 528 | } 529 | 530 | -(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { 531 | //添加token注册的回调 532 | 533 | // Token 534 | NSMutableString *deviceTokenString = [[NSMutableString alloc] init]; 535 | // 获取bytes 536 | NSInteger length = [deviceToken length]; 537 | if (length > 0) { 538 | const void *deviceBytes = [deviceToken bytes]; 539 | for(NSInteger i = 0; i < length; i++) 540 | { 541 | [deviceTokenString appendFormat:@"%02.2hhx", ((char *)deviceBytes)[i]]; 542 | } 543 | [[QIMKit sharedInstance] setUserObject:deviceTokenString forKey:@"myPushToken"]; 544 | [[QIMKit sharedInstance] setPushToken:deviceTokenString]; 545 | NSLog(@"注册的推送通知token : %@", deviceTokenString); 546 | } else { 547 | [[QIMKit sharedInstance] removeUserObjectForKey:@"myPushToken"]; 548 | [[QIMKit sharedInstance] setPushToken:nil]; 549 | } 550 | } 551 | 552 | - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error { 553 | QIMErrorLog(@"Push register token failed %@",error); 554 | } 555 | 556 | 557 | - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url { 558 | return [[QIMSDKUIHelper shareInstance] parseURL:url]; 559 | } 560 | 561 | - (void)configureAPIKey { 562 | 563 | [[QIMKit sharedInstance] setGAODE_APIKEY:GAODE_APIKEY]; 564 | } 565 | 566 | - (void)send:(NSString *)content to:(NSString *)targetID extendInfo:(NSString *)extendInfo msgType:(int) msgType completionHandler:(void (^)(NSData * data, NSURLResponse * response, NSError * error))completionHandler { 567 | 568 | [[QIMKit sharedInstance] sendWlanMessage:content to:targetID extendInfo:extendInfo msgType:msgType completionHandler:completionHandler]; 569 | } 570 | 571 | #if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_9_0 572 | 573 | - (void)create3DItemsWithIcons { 574 | 575 | if ([QIMKit getQIMProjectType] == QIMProjectTypeQTalk) { 576 | 577 | CGFloat systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue]; 578 | if (!(systemVersion >= 9.0)) { 579 | return; 580 | } 581 | NSString *lastUserName = [QIMKit getLastUserName]; 582 | NSString * userToken = [[QIMKit sharedInstance] userObjectForKey:@"userToken"]; 583 | if (lastUserName && userToken) { 584 | 585 | NSArray *applicationShortcutItems = nil; 586 | 587 | UIApplicationShortcutIcon *quickChatIcon = [UIApplicationShortcutIcon iconWithTemplateImageName:@"qunar-msg_empty_o"]; 588 | UIMutableApplicationShortcutItem *quickStartChatItem = [[UIMutableApplicationShortcutItem alloc]initWithType:@"quickChat" localizedTitle:@"发起聊天" localizedSubtitle:@"" icon:quickChatIcon userInfo:nil]; 589 | UIApplicationShortcutIcon *lastedSingleChatIcon = [UIApplicationShortcutIcon iconWithTemplateImageName:@"qunar-porfile_o"]; 590 | NSDictionary *lastedSingleChatDic = [[QIMKit sharedInstance] getLastedSingleChatSession]; 591 | NSString *userId = nil; 592 | NSString *userName = nil; 593 | if (lastedSingleChatDic.count) { 594 | userId = lastedSingleChatDic[@"XmppId"]; 595 | if (userId) { 596 | NSDictionary *userInfo = [[QIMKit sharedInstance] getUserInfoByUserId:userId]; 597 | if (userInfo.count) { 598 | userName = userInfo[@"Name"]; 599 | if (userName) { 600 | UIMutableApplicationShortcutItem *lastedSingleChatItem = [[UIMutableApplicationShortcutItem alloc]initWithType:@"lastestSingleChat" localizedTitle:userName localizedSubtitle:@"" icon:lastedSingleChatIcon userInfo:userInfo]; 601 | applicationShortcutItems = @[quickStartChatItem, lastedSingleChatItem]; 602 | } 603 | } 604 | } 605 | } else { 606 | applicationShortcutItems = @[quickStartChatItem]; 607 | } 608 | 609 | if ([[UIApplication sharedApplication] respondsToSelector:@selector(setShortcutItems:)]) { 610 | [UIApplication sharedApplication].shortcutItems = applicationShortcutItems; 611 | } 612 | } else { 613 | if ([[UIApplication sharedApplication] respondsToSelector:@selector(setShortcutItems:)]) { 614 | [UIApplication sharedApplication].shortcutItems = nil; 615 | } 616 | } 617 | } 618 | } 619 | 620 | - (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void(^)(BOOL succeeded))completionHandler{ 621 | //判断先前我们设置的唯一标识 622 | 623 | //我的二维码 624 | if ([shortcutItem.type isEqualToString:@"MyQRCode"]) { 625 | [QIMSDKUIHelper showQRCodeWithQRId:[[QIMKit sharedInstance] getLastJid] withType:QRCodeType_UserQR]; 626 | } 627 | //扫一扫 628 | if([shortcutItem.type isEqualToString:@"qrcode"]){ 629 | [QIMSDKUIHelper openQRCodeVC]; 630 | } 631 | //发起聊天 632 | if ([shortcutItem.type isEqualToString:@"quickChat"]) { 633 | [QIMSDKUIHelper openQIMGroupListVC]; 634 | } 635 | //最近联系人 636 | if ([shortcutItem.type isEqualToString:@"lastestSingleChat"]) { 637 | NSDictionary *resultInfo = shortcutItem.userInfo; 638 | [[QIMKit sharedInstance] openChatSessionByUserId:[resultInfo objectForKey:@"XmppId"]]; 639 | NSString *jid = [resultInfo objectForKey:@"XmppId"]; 640 | [QIMSDKUIHelper openSingleChatVCByUserId:jid]; 641 | } 642 | } 643 | #endif 644 | 645 | #if __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_9_0 646 | - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(nullable NSString *)sourceApplication annotation:(id)annotation { 647 | 648 | return NO; 649 | } 650 | 651 | #else 652 | - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(nonnull NSDictionary *)options { 653 | 654 | NSLog(@"applicationOpenURL : %@, options : %@", url, options); 655 | /* 656 | [[QIMKit sharedInstance] uploadFileForData:[NSData dataWithContentsOfURL:url] forCacheType:QIMFileCacheTypeColoction isFile:YES fileExt:[url pathExtension] completionBlock:^(UIImage *image, NSError *error, QIMFileCacheType cacheType, NSString *imageURL) { 657 | NSLog(@"imageUrl : %@", imageURL); 658 | if (imageURL.length > 0) { 659 | NSString *fileSize = [NSByteCountFormatter stringFromByteCount:[NSData dataWithContentsOfURL:url].length countStyle:NSByteCountFormatterCountStyleFile]; 660 | NSDictionary *jsonObject = @{@"HttpUrl": imageURL, 661 | @"FileName": [url lastPathComponent], 662 | @"FileSize": fileSize, 663 | @"FileLength": @([NSData dataWithContentsOfURL:url].length)}; 664 | NSString *extendInfo = [[QIMJSONSerializer sharedInstance] serializeObject:jsonObject]; 665 | QIMMessageModel *msg = [QIMMessageModel new]; 666 | [msg setMessage:extendInfo]; 667 | [msg setMessageType:QIMMessageType_File]; 668 | [msg setMessageId:[QIMUUIDTools UUID]]; 669 | [msg setExtendInformation:extendInfo]; 670 | dispatch_async(dispatch_get_main_queue(), ^{ 671 | UINavigationController *navigation = (UINavigationController *)application.keyWindow.rootViewController; 672 | UIViewController *contactVc = [[QIMSDKUIHelper shareInstance] getContactSelectionVC:msg withExternalForward:YES]; 673 | UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:contactVc]; 674 | 675 | [navigation presentViewController:nav animated:YES completion:nil]; 676 | }); 677 | } 678 | }]; 679 | */ 680 | return YES; 681 | } 682 | #endif 683 | 684 | @end 685 | -------------------------------------------------------------------------------- /IMSDK-iOS/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /IMSDK-iOS/Assets.xcassets/LaunchImage.launchimage/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "orientation" : "portrait", 5 | "idiom" : "ipad", 6 | "minimum-system-version" : "7.0", 7 | "extent" : "full-screen", 8 | "scale" : "2x" 9 | }, 10 | { 11 | "orientation" : "landscape", 12 | "idiom" : "ipad", 13 | "minimum-system-version" : "7.0", 14 | "extent" : "full-screen", 15 | "scale" : "1x" 16 | }, 17 | { 18 | "orientation" : "landscape", 19 | "idiom" : "ipad", 20 | "minimum-system-version" : "7.0", 21 | "extent" : "full-screen", 22 | "scale" : "2x" 23 | }, 24 | { 25 | "orientation" : "portrait", 26 | "idiom" : "iphone", 27 | "minimum-system-version" : "7.0", 28 | "scale" : "2x" 29 | }, 30 | { 31 | "orientation" : "portrait", 32 | "idiom" : "iphone", 33 | "minimum-system-version" : "7.0", 34 | "subtype" : "retina4", 35 | "scale" : "2x" 36 | }, 37 | { 38 | "orientation" : "portrait", 39 | "idiom" : "ipad", 40 | "minimum-system-version" : "7.0", 41 | "extent" : "full-screen", 42 | "scale" : "1x" 43 | } 44 | ], 45 | "info" : { 46 | "version" : 1, 47 | "author" : "xcode" 48 | } 49 | } -------------------------------------------------------------------------------- /IMSDK-iOS/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /IMSDK-iOS/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /IMSDK-iOS/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleDisplayName 8 | IMSDK-iOSDemo 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 | 1.0 21 | CFBundleVersion 22 | 1 23 | LSRequiresIPhoneOS 24 | 25 | NSAppleMusicUsageDescription 26 | 请点击"好"以允许访问。 27 | NSCalendarsUsageDescription 28 | 请点击"好"以允许访问。 29 | 30 | 若不允许,你将无法给同步行程到系统日历。 31 | NSCameraUsageDescription 32 | 请点击"好"以允许访问。 33 | 34 | 若不允许,你将无法使用拍照、录制视频、扫一扫等功能。 35 | NSContactsUsageDescription 36 | 请点击"好"以允许访问。 37 | 38 | 若不允许,你将无法使用通讯录联系人、添加手机联系人等功能。 39 | NSLocationAlwaysAndWhenInUseUsageDescription 40 | 请点击"好"以允许访问。 41 | 42 | 若不允许,你将无法使用位置发送等功能。 43 | NSLocationAlwaysUsageDescription 44 | 请点击"好"以允许访问。 45 | 46 | 若不允许,你将无法使用位置发送等功能。 47 | NSLocationWhenInUseUsageDescription 48 | 请点击"好"以允许访问。 49 | 50 | 若不允许,你将无法使用位置发送等功能。 51 | NSMicrophoneUsageDescription 52 | 请点击"好"以允许访问。 53 | 54 | 若不允许,你将无法使用视频通话、发送语音消息等功能。 55 | NSPhotoLibraryAddUsageDescription 56 | 请点击"好"以允许访问。 57 | 58 | 若不允许,你将无法给好友发送本地相册图片及视频内容。 59 | NSPhotoLibraryUsageDescription 60 | 请点击"好"以允许访问。 61 | 62 | 若不允许,你将无法给好友发送本地相册图片及视频内容。 63 | NSRemindersUsageDescription 64 | 请点击"好"以允许访问。 65 | 66 | 若不允许,你将无法给同步行程到系统日历。 67 | UIAppFonts 68 | 69 | 方正兰亭黑简.TTF 70 | Ionicons.ttf 71 | DS-DIGIB.TTF 72 | DS-DIGI.TTF 73 | DS-DIGII.TTF 74 | ops_opsapp.ttf 75 | DS-DIGIT.TTF 76 | ops_opsapp.svg 77 | ops_opsapp.eot 78 | ops_opsapp.woff 79 | Qtalk.woff 80 | Qtalk.ttf 81 | Qtalk.svg 82 | Qtalk.eot 83 | 液晶数字字体.TTF 84 | 85 | UILaunchStoryboardName 86 | LaunchScreen 87 | UIMainStoryboardFile 88 | Main 89 | UIRequiredDeviceCapabilities 90 | 91 | armv7 92 | 93 | UISupportedInterfaceOrientations 94 | 95 | UIInterfaceOrientationPortrait 96 | UIInterfaceOrientationLandscapeLeft 97 | UIInterfaceOrientationLandscapeRight 98 | 99 | UISupportedInterfaceOrientations~ipad 100 | 101 | UIInterfaceOrientationPortrait 102 | UIInterfaceOrientationPortraitUpsideDown 103 | UIInterfaceOrientationLandscapeLeft 104 | UIInterfaceOrientationLandscapeRight 105 | 106 | 107 | 108 | -------------------------------------------------------------------------------- /IMSDK-iOS/ViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.h 3 | // IMSDK-iOS 4 | // 5 | // Created by 李露 on 11/29/18. 6 | // Copyright © 2018 QIM. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface ViewController : UIViewController 12 | 13 | 14 | @end 15 | 16 | -------------------------------------------------------------------------------- /IMSDK-iOS/ViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.m 3 | // IMSDK-iOS 4 | // 5 | // Created by 李露 on 11/29/18. 6 | // Copyright © 2018 QIM. All rights reserved. 7 | // 8 | 9 | #import "ViewController.h" 10 | 11 | @interface ViewController () 12 | 13 | @end 14 | 15 | @implementation ViewController 16 | 17 | - (void)viewDidLoad { 18 | [super viewDidLoad]; 19 | // Do any additional setup after loading the view, typically from a nib. 20 | } 21 | 22 | 23 | @end 24 | -------------------------------------------------------------------------------- /IMSDK-iOS/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // IMSDK-iOS 4 | // 5 | // Created by 李露 on 11/29/18. 6 | // Copyright © 2018 QIM. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "AppDelegate.h" 11 | 12 | int main(int argc, char * argv[]) { 13 | @autoreleasepool { 14 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /IMSDK-iOS/open_scheme.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 99 | 100 | UIWebView拦截URL 101 | 102 | 103 |

iOS Schema跳转demo

104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | -------------------------------------------------------------------------------- /InstallDemo.sh: -------------------------------------------------------------------------------- 1 | #/bin/bash 2 | #FileName:ProjectInit.sh 3 | rm -rf node_modules && rm -rf Pods && rm -rf Podfile.lock && npm install &&pod install --no-repo-update --verbose 4 | echo -e "\033[37;31;5m初始化IMSDK-Demo成功后的项目列表为: \033[39;49;0m" 5 | ls -al -sh 6 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Qunar, Inc. 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 | -------------------------------------------------------------------------------- /Podfile: -------------------------------------------------------------------------------- 1 | # Uncomment the next line to define a global platform for your project 2 | platform :ios, '9.0' 3 | ENV["COCOAPODS_DISABLE_STATS"] = "true" 4 | # 忽略cocoaPods警告 5 | inhibit_all_warnings! 6 | 7 | source 'https://github.com/qunarcorp/libqimkit-ios-cook.git' 8 | source 'git@github.com:CocoaPods/Specs.git' 9 | 10 | target 'IMSDK-iOS' do 11 | # Uncomment the next line if you're using Swift or would like to use dynamic frameworks 12 | # use_frameworks! 13 | 14 | # Pods for IMSDK-iOS 15 | 16 | pod 'QIMUIKit', '~> 4.0' 17 | end 18 | 19 | post_install do |installer_representation| 20 | 21 | installer_representation.pods_project.targets.each do |target| 22 | 23 | # 修复Pod resources中携带xcassets的情况。 24 | # https://github.com/CocoaPods/CocoaPods/issues/7003 25 | # https://github.com/CocoaPods/CocoaPods/pull/7020 26 | if target.name.include? "IMSDK-iOS" then 27 | puts "Adding app icons for #{target.name}" 28 | copy_pods_resources_path = "Pods/Target Support Files/#{target.name}/#{target.name}-resources.sh" 29 | string_to_replace = '--compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"' 30 | assets_compile_with_app_icon_arguments = '--compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" --output-partial-info-plist "${BUILD_DIR}/assetcatalog_generated_info.plist"' 31 | text = File.read(copy_pods_resources_path) 32 | new_contents = text.gsub(string_to_replace, assets_compile_with_app_icon_arguments) 33 | File.open(copy_pods_resources_path, "w") {|file| file.puts new_contents } 34 | end 35 | target.build_configurations.each do |config| 36 | config.build_settings['APPLICATION_EXTENSION_API_ONLY'] = 'NO' 37 | config.build_settings['ENABLE_BITCODE'] = 'NO' 38 | # config.build_settings['FRAMEWORK_SEARCH_PATHS'] = '${PODS_ROOT}/**' 39 | end 40 | end 41 | end 42 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Startalk, The Best open sourced instant messenger software in the world! 2 | * [Chinese Version(中文版)](https://github.com/qunarcorp/imsdk-ios/blob/master/README_zh_CN.md) 3 | 4 | Public Cloud(Startalk App) 5 | ===== 6 | Based on Startalk server and client-side, users can build their own domain, 7 | Sign up an account, create new domains, add users, download client app, and configure navigation for domain, 8 | After the 5 steps above, you own strong IM abilities. 9 | 10 | Download client app [Download](https://im.qunar.com/new/#/download) 11 | 12 | - Android 13 | 14 | [![Startalk on Android](https://s.qunarzz.com/qtalk_official_web/pages/download/android.png)](https://qt.qunar.com/downloads/qtalk_android.apk) 15 | 16 | - iOS 17 | 18 | [![Startalk on iOS](https://qim.qunar.com/file/v2/download/temp/new/82a410a7a85627c123b1a7bd06745b4d.png?w=260&h=260)](https://qim.qunar.com/file/v2/download/temp/new/82a410a7a85627c123b1a7bd06745b4d.png?w=260&h=260) 19 | 20 | Configure navigation for client app [Configure navigation](https://im.qunar.com/new/#/platform/access_guide/manage_nav?id=manage_nav_mb) 21 | 22 | Private Cloud(Startalk SDK) 23 | ===== 24 | Private Cloud is a way for decentralized deployment. Customers or enterprises would deploy the back end code on their own servers, embedding SDK into their own app. Every enterprise is an independent node; every node works independently, and the data would only be saved in the node. 25 | 26 | Please see the guide of embedding Android SDK and the configuration below. 27 | 28 | ## Requirements 29 | 30 | - iOS 9.0 or later 31 | - Xcode 10.0 or later 32 | 33 | ## Getting Started 34 | 35 | - Read this Readme doc 36 | 37 | ## Communication 38 | - If you'd like to **ask a general question**, use [Stack Overflow](http://stackoverflow.com/questions/tagged/startalk). 39 | - If you **found a bug**, open an issue. 40 | - If you **have a feature request**, open an issue. 41 | 42 | 43 | ## Example Run 44 | ``` 45 | 1. pod install 46 | 2. open IMSDK-iOS.xcworkspace use Xcode10+ 47 | ``` 48 | ## How To Use 49 | 50 | * Objective-C 51 | 52 | ```objective-c 53 | #import "QIMSDK.h" 54 | ... 55 | [QIMSDKUIHelper sharedInstanceWithRootNav:rootNav rootVc:rootVc]; 56 | ... 57 | BOOL success = [[QIMKit sharedInstance] qimNav_updateNavigationConfigWithDomain:@"qim.com" WithUserName:@"san.zhang"]; 58 | if (success = YES) { 59 | [[QIMKit sharedInstance] loginWithUserName:userName WithPassWord:userPwd]; 60 | } else { 61 | 62 | } 63 | ... 64 | UIView *sessionView = [[QIMSDKUIHelper sharedInstance] getQIMSessionListViewWithBaseFrame:self.view.bounds]; 65 | [self.view addSubview:sessionView]; 66 | ``` 67 | 68 | - For details about how to use the library and clear examples, see [The detailed How to use](https://github.com/qunarcorp/imsdk-ios/wiki/QIMSDK-iOS%E6%8E%A5%E5%8F%A3%E6%96%87%E6%A1%A3%E8%AF%B4%E6%98%8E) 69 | 70 | ## Installation 71 | 72 | There are four ways to use QIMSDK in your project: 73 | - using CocoaPods 74 | - manual install (build frameworks or embed Xcode Project) 75 | 76 | ### Installation with CocoaPods 77 | 78 | [CocoaPods](http://cocoapods.org/) is a dependency manager for Objective-C, which automates and simplifies the process of using 3rd-party libraries in your projects. See the [Get Started](http://cocoapods.org/#get_started) section for more details. 79 | 80 | #### Podfile 81 | ``` 82 | source 'https://github.com/qunarcorp/libqimkit-ios-cook.git' 83 | source 'git@github.com:CocoaPods/Specs.git' 84 | platform :ios, '9.0' 85 | pod 'QIMUIKit', '~> 4.0' 86 | ``` 87 | 88 | ### Manual Installation Guide 89 | 90 | See more on [Manual install Guide](https://github.com/qunarcorp/imsdk-ios/wiki/QIMSDK-iOS%E6%8E%A5%E5%85%A5%E6%96%87%E6%A1%A3) 91 | 92 | ### Import headers in your source files 93 | 94 | In the source files where you need to use the library, import the umbrella header file: 95 | 96 | ```objective-c 97 | #import "QIMSDK.h" 98 | ``` 99 | 100 | ### Build Project 101 | 102 | At this point your workspace should build without error. If you are having problem, post to the Issue and the 103 | community can help you solve it. 104 | 105 | Feedback 106 | ===== 107 | - qchat@qunar.com(Email) 108 | -------------------------------------------------------------------------------- /README_zh_CN.md: -------------------------------------------------------------------------------- 1 | 2 | 公有云(Startalk APP) 3 | ===== 4 | 基于Startalk服务器及客户端,用户可建立属于自己的域, 5 | 6 | 注册账号、新建域、添加域用户、下载客户端、配置域导航, 7 | 8 | 仅需5步,您就可以拥有强大的im能力, 9 | 10 | 客户端下载[下载](https://im.qunar.com/new/#/download) 11 | 12 | 客户端导航配置[配置导航](https://im.qunar.com/new/#/platform/access_guide/manage_nav?id=manage_nav_mb) 13 | 14 | 私有云(Startalk SDK) 15 | ===== 16 | Startalk私有云是一种去中心化的部署方式, 17 | 18 | 用户或企业将Startalk后端代码完全部署在自己的服务器上, 19 | 20 | 选择SDK嵌入自己的APP中, 21 | 22 | 每个公司都是一个单独的节点,每个节点独立运营,数据只保存在节点中 23 | 24 | ## Demo运行 25 | 26 | 1. 初始化项目: 27 | 在项目根目录执行` pod install` 28 | 2. 使用XCode打开IMSDK-iOS.xcworkspace并运行; 29 | 30 | ## 集成 31 | `imsdk-ios` 目前提供手动集成与Cocoapods集成的方式(IMSDK默认会依赖React-Native0.54版本), 具体步骤参考[集成文档](https://github.com/qunarcorp/imsdk-ios/wiki/QIMSDK-iOS%E6%8E%A5%E5%85%A5%E6%96%87%E6%A1%A3) 32 | 33 | ## Swift 集成 34 | 35 | 目前不支持Swift集成 36 | 37 | ## 如何使用(主要接口) 38 | 首先需要对sdk进行初始化操作,之后配置导航Url,然后进行登录。 39 | ```init 40 | 1. 在需要使用QIMSDK的地方引入头文件QIMSDK.h 41 | #import "QIMSDK.h" 42 | 2. 初始化QIMSDK中的UI栈(如果需要在不同的地方进行scheme跳转,切换页面务必重新初始化QIMSDK的UI栈) 43 | 44 | [QIMSDKUIHelper sharedInstanceWithRootNav:rootNav rootVc:rootVc]; 45 | ``` 46 | ```config 47 | 3. 配置导航地址 48 | 49 | BOOL success = [[QIMKit sharedInstance] qimNav_updateNavigationConfigWithDomain:@"qim.com" WithUserName:@"san.zhang"]; 50 | 51 | 4. 账号密码登录账号 52 | 53 | [[QIMKit sharedInstance] loginWithUserName:@"san.zhang" WithPassWord:@"abcdef"]; 54 | 55 | 5. 获取消息对话列表页,贴到自定义VC的View上 56 | UIView *sessionView = [[QIMSDKUIHelper sharedInstance] getQIMSessionListViewWithBaseFrame:self.view.bounds]; 57 | [self.view addSubview:sessionView]; 58 | 59 | ``` 60 | [其他接口参考](https://github.com/qunarcorp/imsdk-ios/wiki/QIMSDK-iOS%E6%8E%A5%E5%8F%A3%E6%96%87%E6%A1%A3%E8%AF%B4%E6%98%8E) 61 | 62 | ## 历史版本: 63 | 你可以在当前仓库的 [Release](https://github.com/qunarcorp/imsdk-ios/releases) 进行历史版本下载。 64 | 65 | ## 更新日志 66 | 67 | 你可以在 [这里](https://github.com/qunarcorp/imsdk-ios/wiki/QIMSDKDemo-Changelog) 查看IMSDK所有更新信息 68 | 69 | ## 问题反馈 70 | 71 | - qchat@qunar.com(邮件) 72 | --------------------------------------------------------------------------------