Commit 0cb042ba82b5d8277df11eb0c5dce526d3b2a8d5
1 parent
809f0c69
no message
Showing
87 changed files
with
4553 additions
and
0 deletions
Too many changes to show.
To preserve performance only 87 of 108 files are displayed.
CNLiveBLoginModule.podspec
0 → 100644
| 1 | +# | ||
| 2 | +# Be sure to run `pod lib lint CNLiveBLoginModule.podspec' to ensure this is a | ||
| 3 | +# valid spec before submitting. | ||
| 4 | +# | ||
| 5 | +# Any lines starting with a # are optional, but their use is encouraged | ||
| 6 | +# To learn more about a Podspec see https://guides.cocoapods.org/syntax/podspec.html | ||
| 7 | +# | ||
| 8 | + | ||
| 9 | +Pod::Spec.new do |s| | ||
| 10 | + s.name = 'CNLiveBLoginModule' | ||
| 11 | + s.version = '0.0.1' | ||
| 12 | + s.summary = 'CNLiveBLoginModule.' | ||
| 13 | + | ||
| 14 | +# This description is used to generate tags and improve search results. | ||
| 15 | +# * Think: What does it do? Why did you write it? What is the focus? | ||
| 16 | +# * Try to keep it short, snappy and to the point. | ||
| 17 | +# * Write the description between the DESC delimiters below. | ||
| 18 | +# * Finally, don't worry about the indent, CocoaPods strips it! | ||
| 19 | + | ||
| 20 | + s.description = <<-DESC | ||
| 21 | +TODO: 网家家-登录模块. | ||
| 22 | + DESC | ||
| 23 | + | ||
| 24 | + s.homepage = 'http://bj.gitlab.cnlive.com/ios-team/CNLiveBLoginModule' | ||
| 25 | + # s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2' | ||
| 26 | + s.license = { :type => 'MIT', :file => 'LICENSE' } | ||
| 27 | + s.author = { '153993236@qq.com' => 'zhangxiaowen@cnlive.com' } | ||
| 28 | + s.source = { :git => 'http://bj.gitlab.cnlive.com/ios-team/CNLiveBLoginModule.git', :tag => s.version.to_s } | ||
| 29 | + # s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>' | ||
| 30 | + | ||
| 31 | + s.ios.deployment_target = '9.0' | ||
| 32 | + | ||
| 33 | + # s.source_files = 'CNLiveBLoginModule/Classes/**/*' | ||
| 34 | + | ||
| 35 | + # Module | ||
| 36 | + s.subspec 'Module' do |ss| | ||
| 37 | + ss.source_files = 'CNLiveBLoginModule/Classes/Module/*.{h,m}' | ||
| 38 | + ss.dependency 'CNLiveBLoginModule/Controller' | ||
| 39 | + end | ||
| 40 | + | ||
| 41 | + # Controller | ||
| 42 | + s.subspec 'Controller' do |ss| | ||
| 43 | + ss.source_files = 'CNLiveBLoginModule/Classes/Controller/*.{h,m}' | ||
| 44 | + ss.dependency 'CNLiveBLoginModule/View' | ||
| 45 | + ss.dependency 'CNLiveBLoginModule/Model' | ||
| 46 | + ss.dependency 'CNLiveBLoginModule/ThreeLogin' | ||
| 47 | + end | ||
| 48 | + | ||
| 49 | + # View | ||
| 50 | + s.subspec 'View' do |ss| | ||
| 51 | + ss.source_files = 'CNLiveBLoginModule/Classes/View/*.{h,m}' | ||
| 52 | + ss.dependency 'CNLiveBLoginModule/Model' | ||
| 53 | + end | ||
| 54 | + | ||
| 55 | + # Model | ||
| 56 | + s.subspec 'Model' do |ss| | ||
| 57 | + ss.source_files = 'CNLiveBLoginModule/Classes/Model/*.{h,m}' | ||
| 58 | + end | ||
| 59 | + | ||
| 60 | + s.subspec 'ThreeLogin' do |ss| | ||
| 61 | + ss.source_files = 'CNLiveBLoginModule/Classes/ThreeLogin/*.{h,m}' | ||
| 62 | + ss.dependency 'CNLiveBLoginModule/View' | ||
| 63 | + end | ||
| 64 | + | ||
| 65 | + s.subspec 'BindingManage' do |ss| | ||
| 66 | + ss.source_files = 'CNLiveBLoginModule/Classes/BindingManage/*.{h,m}' | ||
| 67 | + end | ||
| 68 | + | ||
| 69 | + s.resource_bundles = { | ||
| 70 | + 'CNLiveBLoginModule' => ['CNLiveBLoginModule/Assets/CNLiveBLoginModule.xcassets'] | ||
| 71 | + } | ||
| 72 | + | ||
| 73 | +# s.public_header_files = 'CNLiveBLoginModule/Classes/**/*.h' | ||
| 74 | + # s.frameworks = 'UIKit', 'MapKit' | ||
| 75 | + | ||
| 76 | + # pod | ||
| 77 | + s.dependency 'CNLiveSDKs/CNLiveUserSystemSDK', '~> 0.3.1.3' #GitHub所以指定版本号 | ||
| 78 | + s.dependency 'CNLiveTripartiteManagement/QMUIKit' | ||
| 79 | + s.dependency 'CNLiveTripartiteManagement/YYKit' | ||
| 80 | + s.dependency 'CNLiveTripartiteManagement/SDWebImage' | ||
| 81 | + s.dependency 'CNLiveTripartiteManagement/Masonry' | ||
| 82 | + s.dependency 'CNLiveTripartiteManagement/MJExtension' | ||
| 83 | + | ||
| 84 | + # 服务层 | ||
| 85 | + s.dependency 'CNLiveServices' | ||
| 86 | + | ||
| 87 | + # 切换成城市 | ||
| 88 | + s.dependency 'CNLiveChooseCountry' | ||
| 89 | + | ||
| 90 | + # 用户信息本地化 | ||
| 91 | + s.dependency 'CNLiveUserManagement' | ||
| 92 | + | ||
| 93 | + # 环境库 | ||
| 94 | + s.dependency 'CNLiveEnvironment' | ||
| 95 | + | ||
| 96 | + # 数据请求 | ||
| 97 | + s.dependency 'CNLiveRequestBastKit' | ||
| 98 | + | ||
| 99 | + # 用户协议 | ||
| 100 | + s.dependency 'CNLiveUserAgreementManager' | ||
| 101 | + | ||
| 102 | + # 管理类 | ||
| 103 | + s.dependency 'CNLiveManager' | ||
| 104 | + | ||
| 105 | + # 相册 | ||
| 106 | + s.dependency 'CNLiveImagePickerController' | ||
| 107 | + | ||
| 108 | + # 相机 | ||
| 109 | + s.dependency 'CNLiveAVCamera' | ||
| 110 | + | ||
| 111 | + #IM | ||
| 112 | + s.dependency 'CNLiveIMBaseSDK' | ||
| 113 | + | ||
| 114 | + s.dependency 'tingyunApp', '~>2.14.0' | ||
| 115 | + | ||
| 116 | + # 分享 | ||
| 117 | +# s.dependency 'CNLiveShareToolKit' | ||
| 118 | + | ||
| 119 | + # 类别 | ||
| 120 | + s.dependency 'CNLiveCategory' | ||
| 121 | + | ||
| 122 | + # 自定义控件 | ||
| 123 | + s.dependency 'CNLiveCustomControl' | ||
| 124 | + | ||
| 125 | + s.dependency 'CNLiveBusinessBaseModule' | ||
| 126 | + | ||
| 127 | + s.static_framework = true | ||
| 128 | + | ||
| 129 | +end |
CNLiveBLoginModule/Assets/.gitkeep
0 → 100644
CNLiveBLoginModule/Assets/CNLiveBLoginModule.xcassets/Contents.json
0 → 100644
CNLiveBLoginModule/Assets/CNLiveBLoginModule.xcassets/login_apple.imageset/Contents.json
0 → 100644
| 1 | +{ | ||
| 2 | + "images" : [ | ||
| 3 | + { | ||
| 4 | + "idiom" : "universal", | ||
| 5 | + "scale" : "1x" | ||
| 6 | + }, | ||
| 7 | + { | ||
| 8 | + "idiom" : "universal", | ||
| 9 | + "filename" : "login_apple@2x.png", | ||
| 10 | + "scale" : "2x" | ||
| 11 | + }, | ||
| 12 | + { | ||
| 13 | + "idiom" : "universal", | ||
| 14 | + "filename" : "login_apple@3x.png", | ||
| 15 | + "scale" : "3x" | ||
| 16 | + } | ||
| 17 | + ], | ||
| 18 | + "info" : { | ||
| 19 | + "version" : 1, | ||
| 20 | + "author" : "xcode" | ||
| 21 | + } | ||
| 22 | +} | ||
| 0 | \ No newline at end of file | 23 | \ No newline at end of file |
CNLiveBLoginModule/Assets/CNLiveBLoginModule.xcassets/login_apple.imageset/login_apple@2x.png
0 → 100644
5.16 KB
CNLiveBLoginModule/Assets/CNLiveBLoginModule.xcassets/login_apple.imageset/login_apple@3x.png
0 → 100644
11.4 KB
CNLiveBLoginModule/Assets/CNLiveBLoginModule.xcassets/login_apple_icon.imageset/Contents.json
0 → 100644
| 1 | +{ | ||
| 2 | + "images" : [ | ||
| 3 | + { | ||
| 4 | + "idiom" : "universal", | ||
| 5 | + "scale" : "1x" | ||
| 6 | + }, | ||
| 7 | + { | ||
| 8 | + "idiom" : "universal", | ||
| 9 | + "filename" : "login_apple_icon@2x.png", | ||
| 10 | + "scale" : "2x" | ||
| 11 | + }, | ||
| 12 | + { | ||
| 13 | + "idiom" : "universal", | ||
| 14 | + "filename" : "login_apple_icon@3x.png", | ||
| 15 | + "scale" : "3x" | ||
| 16 | + } | ||
| 17 | + ], | ||
| 18 | + "info" : { | ||
| 19 | + "version" : 1, | ||
| 20 | + "author" : "xcode" | ||
| 21 | + } | ||
| 22 | +} | ||
| 0 | \ No newline at end of file | 23 | \ No newline at end of file |
CNLiveBLoginModule/Assets/CNLiveBLoginModule.xcassets/login_apple_icon.imageset/login_apple_icon@2x.png
0 → 100644
3.09 KB
CNLiveBLoginModule/Assets/CNLiveBLoginModule.xcassets/login_apple_icon.imageset/login_apple_icon@3x.png
0 → 100644
5.8 KB
CNLiveBLoginModule/Assets/CNLiveBLoginModule.xcassets/login_camera.imageset/Contents.json
0 → 100644
| 1 | +{ | ||
| 2 | + "images" : [ | ||
| 3 | + { | ||
| 4 | + "idiom" : "universal", | ||
| 5 | + "scale" : "1x" | ||
| 6 | + }, | ||
| 7 | + { | ||
| 8 | + "idiom" : "universal", | ||
| 9 | + "filename" : "login_camera@2x.png", | ||
| 10 | + "scale" : "2x" | ||
| 11 | + }, | ||
| 12 | + { | ||
| 13 | + "idiom" : "universal", | ||
| 14 | + "filename" : "login_camera@3x.png", | ||
| 15 | + "scale" : "3x" | ||
| 16 | + } | ||
| 17 | + ], | ||
| 18 | + "info" : { | ||
| 19 | + "version" : 1, | ||
| 20 | + "author" : "xcode" | ||
| 21 | + } | ||
| 22 | +} | ||
| 0 | \ No newline at end of file | 23 | \ No newline at end of file |
CNLiveBLoginModule/Assets/CNLiveBLoginModule.xcassets/login_camera.imageset/login_camera@2x.png
0 → 100644
12.7 KB
CNLiveBLoginModule/Assets/CNLiveBLoginModule.xcassets/login_camera.imageset/login_camera@3x.png
0 → 100644
27.3 KB
CNLiveBLoginModule/Assets/CNLiveBLoginModule.xcassets/login_close.imageset/Contents.json
0 → 100644
| 1 | +{ | ||
| 2 | + "images" : [ | ||
| 3 | + { | ||
| 4 | + "idiom" : "universal", | ||
| 5 | + "scale" : "1x" | ||
| 6 | + }, | ||
| 7 | + { | ||
| 8 | + "idiom" : "universal", | ||
| 9 | + "filename" : "login_close@2x.png", | ||
| 10 | + "scale" : "2x" | ||
| 11 | + }, | ||
| 12 | + { | ||
| 13 | + "idiom" : "universal", | ||
| 14 | + "filename" : "login_close@3x.png", | ||
| 15 | + "scale" : "3x" | ||
| 16 | + } | ||
| 17 | + ], | ||
| 18 | + "info" : { | ||
| 19 | + "version" : 1, | ||
| 20 | + "author" : "xcode" | ||
| 21 | + } | ||
| 22 | +} | ||
| 0 | \ No newline at end of file | 23 | \ No newline at end of file |
CNLiveBLoginModule/Assets/CNLiveBLoginModule.xcassets/login_close.imageset/login_close@2x.png
0 → 100644
2.92 KB
CNLiveBLoginModule/Assets/CNLiveBLoginModule.xcassets/login_close.imageset/login_close@3x.png
0 → 100644
4.14 KB
CNLiveBLoginModule/Assets/CNLiveBLoginModule.xcassets/login_country.imageset/Contents.json
0 → 100644
| 1 | +{ | ||
| 2 | + "images" : [ | ||
| 3 | + { | ||
| 4 | + "idiom" : "universal", | ||
| 5 | + "scale" : "1x" | ||
| 6 | + }, | ||
| 7 | + { | ||
| 8 | + "idiom" : "universal", | ||
| 9 | + "filename" : "login_country@2x.png", | ||
| 10 | + "scale" : "2x" | ||
| 11 | + }, | ||
| 12 | + { | ||
| 13 | + "idiom" : "universal", | ||
| 14 | + "filename" : "login_country@3x.png", | ||
| 15 | + "scale" : "3x" | ||
| 16 | + } | ||
| 17 | + ], | ||
| 18 | + "info" : { | ||
| 19 | + "version" : 1, | ||
| 20 | + "author" : "xcode" | ||
| 21 | + } | ||
| 22 | +} | ||
| 0 | \ No newline at end of file | 23 | \ No newline at end of file |
CNLiveBLoginModule/Assets/CNLiveBLoginModule.xcassets/login_country.imageset/login_country@2x.png
0 → 100644
219 Bytes
CNLiveBLoginModule/Assets/CNLiveBLoginModule.xcassets/login_country.imageset/login_country@3x.png
0 → 100644
423 Bytes
CNLiveBLoginModule/Assets/CNLiveBLoginModule.xcassets/login_get_code.imageset/Contents.json
0 → 100644
| 1 | +{ | ||
| 2 | + "images" : [ | ||
| 3 | + { | ||
| 4 | + "idiom" : "universal", | ||
| 5 | + "scale" : "1x" | ||
| 6 | + }, | ||
| 7 | + { | ||
| 8 | + "idiom" : "universal", | ||
| 9 | + "filename" : "login_get_code@2x.png", | ||
| 10 | + "scale" : "2x" | ||
| 11 | + }, | ||
| 12 | + { | ||
| 13 | + "idiom" : "universal", | ||
| 14 | + "filename" : "login_get_code@3x.png", | ||
| 15 | + "scale" : "3x" | ||
| 16 | + } | ||
| 17 | + ], | ||
| 18 | + "info" : { | ||
| 19 | + "version" : 1, | ||
| 20 | + "author" : "xcode" | ||
| 21 | + } | ||
| 22 | +} | ||
| 0 | \ No newline at end of file | 23 | \ No newline at end of file |
CNLiveBLoginModule/Assets/CNLiveBLoginModule.xcassets/login_get_code.imageset/login_get_code@2x.png
0 → 100644
11 KB
CNLiveBLoginModule/Assets/CNLiveBLoginModule.xcassets/login_get_code.imageset/login_get_code@3x.png
0 → 100644
26 KB
CNLiveBLoginModule/Assets/CNLiveBLoginModule.xcassets/login_get_code_b.imageset/Contents.json
0 → 100644
| 1 | +{ | ||
| 2 | + "images" : [ | ||
| 3 | + { | ||
| 4 | + "idiom" : "universal", | ||
| 5 | + "scale" : "1x" | ||
| 6 | + }, | ||
| 7 | + { | ||
| 8 | + "filename" : "login_get_code_b@2x.png", | ||
| 9 | + "idiom" : "universal", | ||
| 10 | + "scale" : "2x" | ||
| 11 | + }, | ||
| 12 | + { | ||
| 13 | + "filename" : "login_get_code_b@3x.png", | ||
| 14 | + "idiom" : "universal", | ||
| 15 | + "scale" : "3x" | ||
| 16 | + } | ||
| 17 | + ], | ||
| 18 | + "info" : { | ||
| 19 | + "author" : "xcode", | ||
| 20 | + "version" : 1 | ||
| 21 | + } | ||
| 22 | +} |
CNLiveBLoginModule/Assets/CNLiveBLoginModule.xcassets/login_get_code_b.imageset/login_get_code_b@2x.png
0 → 100644
7.27 KB
CNLiveBLoginModule/Assets/CNLiveBLoginModule.xcassets/login_get_code_b.imageset/login_get_code_b@3x.png
0 → 100644
17.9 KB
CNLiveBLoginModule/Assets/CNLiveBLoginModule.xcassets/login_logo.imageset/Contents.json
0 → 100644
| 1 | +{ | ||
| 2 | + "images" : [ | ||
| 3 | + { | ||
| 4 | + "idiom" : "universal", | ||
| 5 | + "scale" : "1x" | ||
| 6 | + }, | ||
| 7 | + { | ||
| 8 | + "idiom" : "universal", | ||
| 9 | + "filename" : "login_logo@2x.png", | ||
| 10 | + "scale" : "2x" | ||
| 11 | + }, | ||
| 12 | + { | ||
| 13 | + "idiom" : "universal", | ||
| 14 | + "filename" : "login_logo@3x.png", | ||
| 15 | + "scale" : "3x" | ||
| 16 | + } | ||
| 17 | + ], | ||
| 18 | + "info" : { | ||
| 19 | + "version" : 1, | ||
| 20 | + "author" : "xcode" | ||
| 21 | + } | ||
| 22 | +} | ||
| 0 | \ No newline at end of file | 23 | \ No newline at end of file |
CNLiveBLoginModule/Assets/CNLiveBLoginModule.xcassets/login_logo.imageset/login_logo@2x.png
0 → 100644
18.2 KB
CNLiveBLoginModule/Assets/CNLiveBLoginModule.xcassets/login_logo.imageset/login_logo@3x.png
0 → 100644
35.6 KB
CNLiveBLoginModule/Assets/CNLiveBLoginModule.xcassets/login_logo_b.imageset/Contents.json
0 → 100644
| 1 | +{ | ||
| 2 | + "images" : [ | ||
| 3 | + { | ||
| 4 | + "idiom" : "universal", | ||
| 5 | + "scale" : "1x" | ||
| 6 | + }, | ||
| 7 | + { | ||
| 8 | + "filename" : "login_logo_b@2x.png", | ||
| 9 | + "idiom" : "universal", | ||
| 10 | + "scale" : "2x" | ||
| 11 | + }, | ||
| 12 | + { | ||
| 13 | + "filename" : "login_logo_b@3x.png", | ||
| 14 | + "idiom" : "universal", | ||
| 15 | + "scale" : "3x" | ||
| 16 | + } | ||
| 17 | + ], | ||
| 18 | + "info" : { | ||
| 19 | + "author" : "xcode", | ||
| 20 | + "version" : 1 | ||
| 21 | + } | ||
| 22 | +} |
CNLiveBLoginModule/Assets/CNLiveBLoginModule.xcassets/login_logo_b.imageset/login_logo_b@2x.png
0 → 100644
24.8 KB
CNLiveBLoginModule/Assets/CNLiveBLoginModule.xcassets/login_logo_b.imageset/login_logo_b@3x.png
0 → 100644
48.4 KB
CNLiveBLoginModule/Assets/CNLiveBLoginModule.xcassets/login_qq.imageset/Contents.json
0 → 100644
| 1 | +{ | ||
| 2 | + "images" : [ | ||
| 3 | + { | ||
| 4 | + "idiom" : "universal", | ||
| 5 | + "scale" : "1x" | ||
| 6 | + }, | ||
| 7 | + { | ||
| 8 | + "idiom" : "universal", | ||
| 9 | + "filename" : "login_qq@2x.png", | ||
| 10 | + "scale" : "2x" | ||
| 11 | + }, | ||
| 12 | + { | ||
| 13 | + "idiom" : "universal", | ||
| 14 | + "filename" : "login_qq@3x.png", | ||
| 15 | + "scale" : "3x" | ||
| 16 | + } | ||
| 17 | + ], | ||
| 18 | + "info" : { | ||
| 19 | + "version" : 1, | ||
| 20 | + "author" : "xcode" | ||
| 21 | + } | ||
| 22 | +} | ||
| 0 | \ No newline at end of file | 23 | \ No newline at end of file |
CNLiveBLoginModule/Assets/CNLiveBLoginModule.xcassets/login_qq.imageset/login_qq@2x.png
0 → 100644
3.25 KB
CNLiveBLoginModule/Assets/CNLiveBLoginModule.xcassets/login_qq.imageset/login_qq@3x.png
0 → 100644
6.58 KB
CNLiveBLoginModule/Assets/CNLiveBLoginModule.xcassets/login_sel.imageset/Contents.json
0 → 100644
| 1 | +{ | ||
| 2 | + "images" : [ | ||
| 3 | + { | ||
| 4 | + "idiom" : "universal", | ||
| 5 | + "scale" : "1x" | ||
| 6 | + }, | ||
| 7 | + { | ||
| 8 | + "idiom" : "universal", | ||
| 9 | + "filename" : "login_sel@2x.png", | ||
| 10 | + "scale" : "2x" | ||
| 11 | + }, | ||
| 12 | + { | ||
| 13 | + "idiom" : "universal", | ||
| 14 | + "filename" : "login_sel@3x.png", | ||
| 15 | + "scale" : "3x" | ||
| 16 | + } | ||
| 17 | + ], | ||
| 18 | + "info" : { | ||
| 19 | + "version" : 1, | ||
| 20 | + "author" : "xcode" | ||
| 21 | + } | ||
| 22 | +} | ||
| 0 | \ No newline at end of file | 23 | \ No newline at end of file |
CNLiveBLoginModule/Assets/CNLiveBLoginModule.xcassets/login_sel.imageset/login_sel@2x.png
0 → 100644
1.29 KB
CNLiveBLoginModule/Assets/CNLiveBLoginModule.xcassets/login_sel.imageset/login_sel@3x.png
0 → 100644
1.81 KB
CNLiveBLoginModule/Assets/CNLiveBLoginModule.xcassets/login_wechat.imageset/Contents.json
0 → 100644
| 1 | +{ | ||
| 2 | + "images" : [ | ||
| 3 | + { | ||
| 4 | + "idiom" : "universal", | ||
| 5 | + "scale" : "1x" | ||
| 6 | + }, | ||
| 7 | + { | ||
| 8 | + "idiom" : "universal", | ||
| 9 | + "filename" : "login_wechat@2x.png", | ||
| 10 | + "scale" : "2x" | ||
| 11 | + }, | ||
| 12 | + { | ||
| 13 | + "idiom" : "universal", | ||
| 14 | + "filename" : "login_wechat@3x.png", | ||
| 15 | + "scale" : "3x" | ||
| 16 | + } | ||
| 17 | + ], | ||
| 18 | + "info" : { | ||
| 19 | + "version" : 1, | ||
| 20 | + "author" : "xcode" | ||
| 21 | + } | ||
| 22 | +} | ||
| 0 | \ No newline at end of file | 23 | \ No newline at end of file |
CNLiveBLoginModule/Assets/CNLiveBLoginModule.xcassets/login_wechat.imageset/login_wechat@2x.png
0 → 100644
3.9 KB
CNLiveBLoginModule/Assets/CNLiveBLoginModule.xcassets/login_wechat.imageset/login_wechat@3x.png
0 → 100644
7.83 KB
CNLiveBLoginModule/Assets/CNLiveBLoginModule.xcassets/login_weibo.imageset/Contents.json
0 → 100644
| 1 | +{ | ||
| 2 | + "images" : [ | ||
| 3 | + { | ||
| 4 | + "idiom" : "universal", | ||
| 5 | + "scale" : "1x" | ||
| 6 | + }, | ||
| 7 | + { | ||
| 8 | + "idiom" : "universal", | ||
| 9 | + "filename" : "login_weibo@2x.png", | ||
| 10 | + "scale" : "2x" | ||
| 11 | + }, | ||
| 12 | + { | ||
| 13 | + "idiom" : "universal", | ||
| 14 | + "filename" : "login_weibo@3x.png", | ||
| 15 | + "scale" : "3x" | ||
| 16 | + } | ||
| 17 | + ], | ||
| 18 | + "info" : { | ||
| 19 | + "version" : 1, | ||
| 20 | + "author" : "xcode" | ||
| 21 | + } | ||
| 22 | +} | ||
| 0 | \ No newline at end of file | 23 | \ No newline at end of file |
CNLiveBLoginModule/Assets/CNLiveBLoginModule.xcassets/login_weibo.imageset/login_weibo@2x.png
0 → 100644
6.38 KB
CNLiveBLoginModule/Assets/CNLiveBLoginModule.xcassets/login_weibo.imageset/login_weibo@3x.png
0 → 100644
12.4 KB
CNLiveBLoginModule/Assets/CNLiveBLoginModule.xcassets/mine_back_black_b.imageset/Contents.json
0 → 100644
| 1 | +{ | ||
| 2 | + "images" : [ | ||
| 3 | + { | ||
| 4 | + "idiom" : "universal", | ||
| 5 | + "scale" : "1x" | ||
| 6 | + }, | ||
| 7 | + { | ||
| 8 | + "idiom" : "universal", | ||
| 9 | + "filename" : "mine_back_black_b@2x.png", | ||
| 10 | + "scale" : "2x" | ||
| 11 | + }, | ||
| 12 | + { | ||
| 13 | + "idiom" : "universal", | ||
| 14 | + "filename" : "mine_back_black_b@3x.png", | ||
| 15 | + "scale" : "3x" | ||
| 16 | + } | ||
| 17 | + ], | ||
| 18 | + "info" : { | ||
| 19 | + "version" : 1, | ||
| 20 | + "author" : "xcode" | ||
| 21 | + } | ||
| 22 | +} | ||
| 0 | \ No newline at end of file | 23 | \ No newline at end of file |
CNLiveBLoginModule/Assets/CNLiveBLoginModule.xcassets/mine_back_black_b.imageset/mine_back_black_b@2x.png
0 → 100644
1.49 KB
CNLiveBLoginModule/Assets/CNLiveBLoginModule.xcassets/mine_back_black_b.imageset/mine_back_black_b@3x.png
0 → 100644
1.79 KB
CNLiveBLoginModule/Classes/.gitkeep
0 → 100644
CNLiveBLoginModule/Classes/BindingManage/CNLiveBindingManageCell.h
0 → 100644
| 1 | +// | ||
| 2 | +// CNLiveBindingManageCell.h | ||
| 3 | +// CNLiveNetAdd | ||
| 4 | +// | ||
| 5 | +// Created by CNLive-zxw on 2019/9/10. | ||
| 6 | +// Copyright © 2019 cnlive. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import <UIKit/UIKit.h> | ||
| 10 | + | ||
| 11 | +NS_ASSUME_NONNULL_BEGIN | ||
| 12 | +@class CNLiveBindingManageModel; | ||
| 13 | +#define kCNLiveBindingManageCell @"CNLiveBindingManageCell" | ||
| 14 | + | ||
| 15 | +@class CNLiveBindingManageCell; | ||
| 16 | +@protocol CNLiveBindingManageCellDelegate <NSObject> | ||
| 17 | +//isBinding YES 绑定操作 NO 解除绑定操作 | ||
| 18 | +- (void)clickedBindingButton:(CNLiveBindingManageCell *)cell isBinding:(BOOL)isBinding; | ||
| 19 | + | ||
| 20 | +@end | ||
| 21 | + | ||
| 22 | +@interface CNLiveBindingManageCell : UITableViewCell | ||
| 23 | +@property (nonatomic, strong) CNLiveBindingManageModel *model; | ||
| 24 | +@property (nonatomic, weak) id<CNLiveBindingManageCellDelegate> delegate; | ||
| 25 | + | ||
| 26 | +@end | ||
| 27 | + | ||
| 28 | +NS_ASSUME_NONNULL_END |
CNLiveBLoginModule/Classes/BindingManage/CNLiveBindingManageCell.m
0 → 100644
| 1 | +// | ||
| 2 | +// CNLiveBindingManageCell.m | ||
| 3 | +// CNLiveNetAdd | ||
| 4 | +// | ||
| 5 | +// Created by CNLive-zxw on 2019/9/10. | ||
| 6 | +// Copyright © 2019 cnlive. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import "CNLiveBindingManageCell.h" | ||
| 10 | +#import <Masonry/Masonry.h> | ||
| 11 | +#import "QMUIKit.h" | ||
| 12 | +#import "CNLiveBaseKit.h" | ||
| 13 | +#import <CNLiveRequestBastKit/CNLiveNetworking.h> | ||
| 14 | + | ||
| 15 | +#import "CNLiveBindingManageModel.h" | ||
| 16 | +#import "CNLiveBindingManageRequest.h" | ||
| 17 | + | ||
| 18 | +@interface CNLiveBindingManageCell() | ||
| 19 | +@property (nonatomic, strong) UIImageView *icon; | ||
| 20 | +@property (nonatomic, strong) UILabel *title; | ||
| 21 | +@property (nonatomic, strong) UILabel *desc; | ||
| 22 | +@property (nonatomic, strong) UIButton *manage; | ||
| 23 | +@property (nonatomic, strong) UIView *line; | ||
| 24 | + | ||
| 25 | +@end | ||
| 26 | +@implementation CNLiveBindingManageCell | ||
| 27 | +static NSInteger const margin = 15; | ||
| 28 | + | ||
| 29 | +- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { | ||
| 30 | + self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; | ||
| 31 | + if (self) { | ||
| 32 | + self.contentView.backgroundColor = [UIColor whiteColor]; | ||
| 33 | + [self createSubViews]; | ||
| 34 | + } | ||
| 35 | + return self; | ||
| 36 | +} | ||
| 37 | +- (void)setModel:(CNLiveBindingManageModel *)model{ | ||
| 38 | + _model = model; | ||
| 39 | + _icon.image = [UIImage imageNamed:model.image]; | ||
| 40 | + _title.text = model.title; | ||
| 41 | + _desc.text = model.desc; | ||
| 42 | + if([model.isBinding isEqualToString:@"1"]){ | ||
| 43 | + _manage.backgroundColor = RGBOF(0xd9d9d9); | ||
| 44 | + [_manage setTitle:@"已绑定" forState:UIControlStateNormal]; | ||
| 45 | + | ||
| 46 | + }else{ | ||
| 47 | + _manage.backgroundColor = RGBOF(0x23d41e); | ||
| 48 | + [_manage setTitle:@"未绑定" forState:UIControlStateNormal]; | ||
| 49 | + | ||
| 50 | + } | ||
| 51 | + | ||
| 52 | +} | ||
| 53 | +#pragma mark - setupUI | ||
| 54 | +- (void)createSubViews { | ||
| 55 | + [self.contentView addSubview:self.icon]; | ||
| 56 | + [self.contentView addSubview:self.title]; | ||
| 57 | + [self.contentView addSubview:self.desc]; | ||
| 58 | + [self.contentView addSubview:self.manage]; | ||
| 59 | + [self.contentView addSubview:self.line]; | ||
| 60 | + | ||
| 61 | +} | ||
| 62 | + | ||
| 63 | +- (void)layoutSubviews { | ||
| 64 | + [self.icon mas_makeConstraints:^(MASConstraintMaker *make) { | ||
| 65 | + make.centerY.equalTo(self.contentView); | ||
| 66 | + make.left.equalTo(self.contentView).offset(margin); | ||
| 67 | + make.width.mas_equalTo(50); | ||
| 68 | + make.height.mas_equalTo(50); | ||
| 69 | + }]; | ||
| 70 | + | ||
| 71 | + [self.manage mas_makeConstraints:^(MASConstraintMaker *make) { | ||
| 72 | + make.centerY.equalTo(self.contentView); | ||
| 73 | + make.right.equalTo(self.contentView.mas_right).offset(-margin); | ||
| 74 | + make.width.mas_equalTo(70); | ||
| 75 | + make.height.mas_equalTo(30); | ||
| 76 | + }]; | ||
| 77 | + | ||
| 78 | + [self.title mas_makeConstraints:^(MASConstraintMaker *make) { | ||
| 79 | + make.top.equalTo(self.icon.mas_top); | ||
| 80 | + make.left.equalTo(self.icon.mas_right).offset(margin); | ||
| 81 | + make.right.equalTo(self.manage.mas_left).offset(-margin); | ||
| 82 | + make.height.mas_equalTo(25); | ||
| 83 | + }]; | ||
| 84 | + | ||
| 85 | + [self.desc mas_makeConstraints:^(MASConstraintMaker *make) { | ||
| 86 | + make.top.equalTo(self.title.mas_bottom); | ||
| 87 | + make.left.equalTo(self.title.mas_left); | ||
| 88 | + make.right.equalTo(self.title.mas_right); | ||
| 89 | + make.height.mas_equalTo(25); | ||
| 90 | + }]; | ||
| 91 | + [self.line mas_makeConstraints:^(MASConstraintMaker *make) { | ||
| 92 | + make.bottom.equalTo(self.contentView.mas_bottom).offset(-0.5); | ||
| 93 | + make.left.equalTo(self.contentView.mas_left); | ||
| 94 | + make.right.equalTo(self.contentView.mas_right); | ||
| 95 | + make.height.mas_equalTo(0.5); | ||
| 96 | + }]; | ||
| 97 | +} | ||
| 98 | + | ||
| 99 | +- (void)awakeFromNib { | ||
| 100 | + [super awakeFromNib]; | ||
| 101 | + // Initialization code | ||
| 102 | +} | ||
| 103 | + | ||
| 104 | +- (void)setSelected:(BOOL)selected animated:(BOOL)animated { | ||
| 105 | + [super setSelected:selected animated:animated]; | ||
| 106 | + | ||
| 107 | + // Configure the view for the selected state | ||
| 108 | +} | ||
| 109 | + | ||
| 110 | +#pragma mark - Lazy Loading | ||
| 111 | +- (UIImageView *)icon { | ||
| 112 | + if (!_icon) { | ||
| 113 | + _icon = [[UIImageView alloc] init]; | ||
| 114 | + _icon.contentMode = UIViewContentModeScaleAspectFill; | ||
| 115 | + _icon.layer.cornerRadius = 25; | ||
| 116 | + _icon.layer.masksToBounds = YES; | ||
| 117 | + } | ||
| 118 | + return _icon; | ||
| 119 | +} | ||
| 120 | +- (UILabel *)title { | ||
| 121 | + if (!_title) { | ||
| 122 | + _title = [[UILabel alloc] init]; | ||
| 123 | + _title.textColor = RGBOF(0x333333); | ||
| 124 | + _title.font = UIFontCNMake(16);//[UIFont fontWithName:@"PingFangSC-Regular" size:15]; | ||
| 125 | + _title.numberOfLines = 0; | ||
| 126 | + } | ||
| 127 | + return _title; | ||
| 128 | +} | ||
| 129 | +- (UILabel *)desc { | ||
| 130 | + if (!_desc) { | ||
| 131 | + _desc = [[UILabel alloc] init]; | ||
| 132 | + _desc.textColor = RGBOF(0x999999); | ||
| 133 | + _desc.font = UIFontCNMake(12);//[UIFont fontWithName:@"PingFangSC-Regular" size:15]; | ||
| 134 | + _desc.numberOfLines = 0; | ||
| 135 | + } | ||
| 136 | + return _desc; | ||
| 137 | +} | ||
| 138 | +- (UIButton *)manage { | ||
| 139 | + if (!_manage) { | ||
| 140 | + _manage = [UIButton buttonWithType:UIButtonTypeCustom]; | ||
| 141 | + _manage.backgroundColor = RGBOF(0xd9d9d9); | ||
| 142 | + [_manage setTitle:@"已绑定" forState:UIControlStateNormal]; | ||
| 143 | + [_manage setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; | ||
| 144 | + _manage.titleLabel.font = UIFontCNMake(14); | ||
| 145 | + _manage.layer.cornerRadius = 15; | ||
| 146 | + _manage.layer.masksToBounds = YES; | ||
| 147 | + [_manage addTarget:self action:@selector(manageDidClicked:) forControlEvents:UIControlEventTouchUpInside]; | ||
| 148 | + } | ||
| 149 | + return _manage; | ||
| 150 | +} | ||
| 151 | + | ||
| 152 | +- (UIView *)line { | ||
| 153 | + if (!_line) { | ||
| 154 | + _line = [[UIView alloc] init]; | ||
| 155 | + _line.backgroundColor = RGBOF(0xeeeeee); | ||
| 156 | + } | ||
| 157 | + return _line; | ||
| 158 | +} | ||
| 159 | + | ||
| 160 | +#pragma mark - Action | ||
| 161 | +- (void)manageDidClicked:(UIButton *)btn{ | ||
| 162 | + if([self.model.thirdPartyPlat isEqualToString:@"10"]){ | ||
| 163 | + return; | ||
| 164 | + } | ||
| 165 | + if(![CNLiveNetworking isNetworking]){ | ||
| 166 | + [QMUITips showError:@"无法连接网络" inView:([UIApplication sharedApplication].delegate).window hideAfterDelay:1.5]; | ||
| 167 | + return ; | ||
| 168 | + } | ||
| 169 | + btn.userInteractionEnabled = NO; | ||
| 170 | + if (self.delegate && [self.delegate respondsToSelector:@selector(clickedBindingButton:isBinding:)]) { | ||
| 171 | + [self.delegate clickedBindingButton:self isBinding:![self.model.isBinding isEqualToString:@"1"]]; | ||
| 172 | + btn.userInteractionEnabled = YES; | ||
| 173 | + | ||
| 174 | + } | ||
| 175 | +} | ||
| 176 | + | ||
| 177 | + | ||
| 178 | +@end |
CNLiveBLoginModule/Classes/BindingManage/CNLiveBindingManageController.h
0 → 100644
| 1 | +// | ||
| 2 | +// CNLiveBindingManageController.h | ||
| 3 | +// CNLiveNetAdd | ||
| 4 | +// | ||
| 5 | +// Created by CNLive-zxw on 2019/9/10. | ||
| 6 | +// Copyright © 2019 cnlive. All rights reserved. | ||
| 7 | +// | ||
| 8 | +// 绑定管理 | ||
| 9 | +#import "CNCommonViewController.h" | ||
| 10 | + | ||
| 11 | +NS_ASSUME_NONNULL_BEGIN | ||
| 12 | + | ||
| 13 | +@interface CNLiveBindingManageController : CNCommonViewController | ||
| 14 | + | ||
| 15 | +@end | ||
| 16 | + | ||
| 17 | +NS_ASSUME_NONNULL_END |
CNLiveBLoginModule/Classes/BindingManage/CNLiveBindingManageController.m
0 → 100644
| 1 | +// | ||
| 2 | +// CNLiveBindingManageController.m | ||
| 3 | +// CNLiveNetAdd | ||
| 4 | +// | ||
| 5 | +// Created by CNLive-zxw on 2019/9/10. | ||
| 6 | +// Copyright © 2019 cnlive. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import "CNLiveBindingManageController.h" | ||
| 10 | +#import <Masonry/Masonry.h> | ||
| 11 | +#import "CNLiveBaseKit.h" | ||
| 12 | + | ||
| 13 | +#import "CNLiveBindingManageHeaderView.h" | ||
| 14 | +#import "CNLiveBindingManageCell.h" | ||
| 15 | +#import "CNLiveBindingManageModel.h" | ||
| 16 | +#import "CNLiveBindingManageRequest.h" | ||
| 17 | + | ||
| 18 | +@interface CNLiveBindingManageController ()<UITableViewDelegate, UITableViewDataSource,CNLiveBindingManageCellDelegate> | ||
| 19 | +@property (nonatomic, strong) UITableView *tableView; | ||
| 20 | +@property (nonatomic, strong) NSArray *bindingData; | ||
| 21 | +@property (nonatomic, strong) NSArray *unBindingData; | ||
| 22 | + | ||
| 23 | +@end | ||
| 24 | + | ||
| 25 | +@implementation CNLiveBindingManageController | ||
| 26 | +#pragma mark - CNLiveBindingManageCellDelegate | ||
| 27 | +- (void)clickedBindingButton:(CNLiveBindingManageCell *)cell isBinding:(BOOL)isBinding{ | ||
| 28 | + if(isBinding){ | ||
| 29 | + //绑定操作 | ||
| 30 | + [self requestBindingManage:cell.model]; | ||
| 31 | + | ||
| 32 | + }else{ | ||
| 33 | + //解除绑定操作 | ||
| 34 | + UIAlertController *actionAlert1 = [UIAlertController alertControllerWithTitle:@"确定解除绑定?" message:nil preferredStyle:UIAlertControllerStyleAlert]; | ||
| 35 | + | ||
| 36 | + UIAlertAction *action1 = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleDefault handler:NULL]; | ||
| 37 | + __weak typeof(self) weakSelf = self; | ||
| 38 | + UIAlertAction *action2 = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { | ||
| 39 | + __strong typeof(weakSelf) strongSelf = weakSelf; | ||
| 40 | + if(!strongSelf) return; | ||
| 41 | + [strongSelf requestBindingManage:cell.model]; | ||
| 42 | + | ||
| 43 | + }]; | ||
| 44 | + [action1 setValue:RGBOF(0x23D41E) forKey:@"_titleTextColor"]; | ||
| 45 | + [action2 setValue:RGBOF(0x23D41E) forKey:@"_titleTextColor"]; | ||
| 46 | + | ||
| 47 | + [actionAlert1 addAction:action1]; | ||
| 48 | + [actionAlert1 addAction:action2]; | ||
| 49 | + [self presentViewController:actionAlert1 animated:YES completion:nil]; | ||
| 50 | + } | ||
| 51 | + | ||
| 52 | +} | ||
| 53 | +- (void)requestBindingManage:(CNLiveBindingManageModel *)model{ | ||
| 54 | +// switch (model.type) { | ||
| 55 | +// case CNLiveSendAuthRespWX: | ||
| 56 | +// { | ||
| 57 | +// if(![WXApi isWXAppInstalled]){ | ||
| 58 | +// [QMUITips showWithText:@"未安装微信" inView:self.view hideAfterDelay:1.5]; | ||
| 59 | +// return; | ||
| 60 | +// } | ||
| 61 | +// } | ||
| 62 | +// break; | ||
| 63 | +// case CNLiveSendAuthRespQQ: | ||
| 64 | +// { | ||
| 65 | +// if(![TencentOAuth iphoneQQInstalled]){ | ||
| 66 | +// [QMUITips showWithText:@"未安装QQ" inView:self.view hideAfterDelay:1.5]; | ||
| 67 | +// return; | ||
| 68 | +// } | ||
| 69 | +// } | ||
| 70 | +// break; | ||
| 71 | +// case CNLiveSendAuthRespWB: | ||
| 72 | +// { | ||
| 73 | +// if(![WeiboSDK isWeiboAppInstalled]){ | ||
| 74 | +// [QMUITips showWithText:@"未安装微博" inView:self.view hideAfterDelay:1.5]; | ||
| 75 | +// return; | ||
| 76 | +// } | ||
| 77 | +// } | ||
| 78 | +// break; | ||
| 79 | +// case CNLiveSendAuthRespApple: | ||
| 80 | +// { | ||
| 81 | +// } | ||
| 82 | +// break; | ||
| 83 | +// } | ||
| 84 | + __weak typeof(self) weakSelf = self; | ||
| 85 | + [CNLiveBindingManageRequest requestModel:model block:^(BOOL isSuccess, CNLiveBindingManageModel * _Nullable model, BOOL isBinding) { | ||
| 86 | + __strong typeof(weakSelf) strongSelf = weakSelf; | ||
| 87 | + if(!strongSelf) return; | ||
| 88 | + if(isSuccess){ | ||
| 89 | + [strongSelf loadData]; | ||
| 90 | + | ||
| 91 | + } | ||
| 92 | + | ||
| 93 | + }]; | ||
| 94 | +} | ||
| 95 | +#pragma mark - Data | ||
| 96 | +- (void)loadData{ | ||
| 97 | + __weak typeof(self) weakSelf = self; | ||
| 98 | + [CNLiveBindingManageRequest requestModels:^(NSArray * _Nullable bindingData, NSArray * _Nullable unBindingData) { | ||
| 99 | + __strong typeof(weakSelf) strongSelf = weakSelf; | ||
| 100 | + if(!strongSelf) return; | ||
| 101 | + strongSelf.bindingData = bindingData; | ||
| 102 | + strongSelf.unBindingData = unBindingData; | ||
| 103 | + [strongSelf.tableView reloadData]; | ||
| 104 | + }]; | ||
| 105 | + | ||
| 106 | +} | ||
| 107 | + | ||
| 108 | +- (void)viewDidLoad { | ||
| 109 | + [super viewDidLoad]; | ||
| 110 | + // Do any additional setup after loading the view. | ||
| 111 | + self.view.backgroundColor = RGBOF(0xf4f4f4); | ||
| 112 | + self.title = @"绑定管理"; | ||
| 113 | + if (@available(iOS 11.0, *)) { | ||
| 114 | + self.tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever; | ||
| 115 | + } else { | ||
| 116 | + self.automaticallyAdjustsScrollViewInsets = NO; | ||
| 117 | + } | ||
| 118 | + [self loadData]; | ||
| 119 | + [self createUI]; | ||
| 120 | + | ||
| 121 | +} | ||
| 122 | + | ||
| 123 | +- (void)createUI{ | ||
| 124 | + [self.view addSubview:self.tableView]; | ||
| 125 | + | ||
| 126 | +} | ||
| 127 | + | ||
| 128 | +- (void)viewDidLayoutSubviews { | ||
| 129 | + [super viewDidLayoutSubviews]; | ||
| 130 | + [_tableView mas_makeConstraints:^(MASConstraintMaker *make) { | ||
| 131 | + make.top.equalTo(self.view.mas_top).with.offset(kVerticalStatusHeight+44); | ||
| 132 | + make.left.equalTo(self.view.mas_left).with.offset(0); | ||
| 133 | + make.right.equalTo(self.view.mas_right).with.offset(-0); | ||
| 134 | + make.bottom.equalTo(self.view.mas_bottom).with.offset(-0); | ||
| 135 | + | ||
| 136 | + }]; | ||
| 137 | + | ||
| 138 | +} | ||
| 139 | + | ||
| 140 | +#pragma mark - UITableViewDataSource | ||
| 141 | +- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { | ||
| 142 | + return 2; | ||
| 143 | + | ||
| 144 | +} | ||
| 145 | + | ||
| 146 | +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { | ||
| 147 | + if(section == 0){ | ||
| 148 | + return self.bindingData.count; | ||
| 149 | + | ||
| 150 | + }else if(section == 1){ | ||
| 151 | + return self.unBindingData.count; | ||
| 152 | + | ||
| 153 | + }else{ | ||
| 154 | + return 0; | ||
| 155 | + } | ||
| 156 | + | ||
| 157 | +} | ||
| 158 | + | ||
| 159 | +- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { | ||
| 160 | + return 80; | ||
| 161 | + | ||
| 162 | +} | ||
| 163 | + | ||
| 164 | +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { | ||
| 165 | + CNLiveBindingManageCell *cell = [tableView dequeueReusableCellWithIdentifier:kCNLiveBindingManageCell forIndexPath:indexPath]; | ||
| 166 | + cell.selectionStyle = UITableViewCellSelectionStyleNone; | ||
| 167 | + cell.delegate = self; | ||
| 168 | + if(indexPath.section == 0){ | ||
| 169 | + if(self.bindingData.count > 0){ | ||
| 170 | + cell.model = self.bindingData[indexPath.row]; | ||
| 171 | + } | ||
| 172 | + | ||
| 173 | + }else if(indexPath.section == 1){ | ||
| 174 | + if(self.unBindingData.count > 0){ | ||
| 175 | + cell.model = self.unBindingData[indexPath.row]; | ||
| 176 | + } | ||
| 177 | + } | ||
| 178 | + return cell; | ||
| 179 | + | ||
| 180 | +} | ||
| 181 | + | ||
| 182 | +- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{ | ||
| 183 | + return 40.0; | ||
| 184 | + | ||
| 185 | +} | ||
| 186 | +- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section{ | ||
| 187 | + return 0.0000001f; | ||
| 188 | + | ||
| 189 | +} | ||
| 190 | + | ||
| 191 | +- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { | ||
| 192 | + NSArray *array = @[@"您已绑定网家家手机号账号", @"其他绑定方式"]; | ||
| 193 | + CNLiveBindingManageHeaderView *header = [tableView dequeueReusableHeaderFooterViewWithIdentifier:kCNLiveBindingManageHeaderView]; | ||
| 194 | + header.text = array[section]; | ||
| 195 | + return header; | ||
| 196 | + | ||
| 197 | +} | ||
| 198 | + | ||
| 199 | +- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ | ||
| 200 | + | ||
| 201 | + | ||
| 202 | +} | ||
| 203 | + | ||
| 204 | +/* | ||
| 205 | + #pragma mark - Navigation | ||
| 206 | + | ||
| 207 | + // In a storyboard-based application, you will often want to do a little preparation before navigation | ||
| 208 | + - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { | ||
| 209 | + // Get the new view controller using [segue destinationViewController]. | ||
| 210 | + // Pass the selected object to the new view controller. | ||
| 211 | + } | ||
| 212 | + */ | ||
| 213 | + | ||
| 214 | +#pragma mark - Lazy loading | ||
| 215 | +- (UITableView *)tableView { | ||
| 216 | + if (!_tableView) { | ||
| 217 | + _tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStyleGrouped]; | ||
| 218 | + _tableView.backgroundColor = RGBOF(0xf4f4f4); | ||
| 219 | + _tableView.delegate = self; | ||
| 220 | + _tableView.dataSource = self; | ||
| 221 | + _tableView.separatorStyle = UITableViewCellSeparatorStyleNone; | ||
| 222 | + _tableView.showsVerticalScrollIndicator = NO; | ||
| 223 | + _tableView.showsHorizontalScrollIndicator = NO; | ||
| 224 | + _tableView.estimatedRowHeight = 0; | ||
| 225 | + _tableView.estimatedSectionFooterHeight = 0; | ||
| 226 | + _tableView.estimatedSectionHeaderHeight = 0; | ||
| 227 | + [_tableView registerClass:[CNLiveBindingManageCell class] forCellReuseIdentifier:kCNLiveBindingManageCell]; | ||
| 228 | + [_tableView registerClass:[CNLiveBindingManageHeaderView class] forHeaderFooterViewReuseIdentifier:kCNLiveBindingManageHeaderView]; | ||
| 229 | + | ||
| 230 | + } | ||
| 231 | + return _tableView; | ||
| 232 | +} | ||
| 233 | + | ||
| 234 | +@end |
CNLiveBLoginModule/Classes/BindingManage/CNLiveBindingManageHeaderView.h
0 → 100644
| 1 | +// | ||
| 2 | +// CNLiveBindingManageHeaderView.h | ||
| 3 | +// CNLiveNetAdd | ||
| 4 | +// | ||
| 5 | +// Created by CNLive-zxw on 2019/9/10. | ||
| 6 | +// Copyright © 2019 cnlive. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import <UIKit/UIKit.h> | ||
| 10 | + | ||
| 11 | +NS_ASSUME_NONNULL_BEGIN | ||
| 12 | +#define kCNLiveBindingManageHeaderView @"CNLiveBindingManageHeaderView" | ||
| 13 | + | ||
| 14 | +@interface CNLiveBindingManageHeaderView : UITableViewHeaderFooterView | ||
| 15 | +@property (nonatomic, copy) NSString *text; | ||
| 16 | + | ||
| 17 | +@end | ||
| 18 | + | ||
| 19 | +NS_ASSUME_NONNULL_END |
CNLiveBLoginModule/Classes/BindingManage/CNLiveBindingManageHeaderView.m
0 → 100644
| 1 | +// | ||
| 2 | +// CNLiveBindingManageHeaderView.m | ||
| 3 | +// CNLiveNetAdd | ||
| 4 | +// | ||
| 5 | +// Created by CNLive-zxw on 2019/9/10. | ||
| 6 | +// Copyright © 2019 cnlive. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import "CNLiveBindingManageHeaderView.h" | ||
| 10 | +#import <Masonry/Masonry.h> | ||
| 11 | + | ||
| 12 | +@interface CNLiveBindingManageHeaderView() | ||
| 13 | +@property (nonatomic, strong) UILabel *title; | ||
| 14 | + | ||
| 15 | +@end | ||
| 16 | +@implementation CNLiveBindingManageHeaderView | ||
| 17 | +static NSInteger const margin = 15; | ||
| 18 | + | ||
| 19 | +- (instancetype)initWithReuseIdentifier:(NSString *)reuseIdentifier { | ||
| 20 | + if (self = [super initWithReuseIdentifier:reuseIdentifier]) { | ||
| 21 | + //在这里向contentView添加控件 | ||
| 22 | + self.backgroundColor = [UIColor colorWithRed:244/255.0 green:244/255.0 blue:244/255.0 alpha:1.0]; | ||
| 23 | + [self createSubviews]; | ||
| 24 | + [self xw_layoutSubviews]; | ||
| 25 | + | ||
| 26 | + } | ||
| 27 | + return self; | ||
| 28 | +} | ||
| 29 | +- (void)setText:(NSString *)text{ | ||
| 30 | + _text = text; | ||
| 31 | + _title.text = text; | ||
| 32 | +} | ||
| 33 | + | ||
| 34 | +#pragma mark - setupUI | ||
| 35 | +- (void)createSubviews { | ||
| 36 | + [self.contentView addSubview:self.title]; | ||
| 37 | + | ||
| 38 | +} | ||
| 39 | + | ||
| 40 | +- (void)xw_layoutSubviews { | ||
| 41 | + [self.title mas_makeConstraints:^(MASConstraintMaker *make) { | ||
| 42 | + make.top.equalTo(self.contentView); | ||
| 43 | + make.left.equalTo(self.contentView.mas_left).offset(margin); | ||
| 44 | + make.right.equalTo(self.contentView.mas_right).offset(-margin); | ||
| 45 | + make.bottom.equalTo(self.contentView.mas_bottom); | ||
| 46 | + | ||
| 47 | + }]; | ||
| 48 | + | ||
| 49 | +} | ||
| 50 | + | ||
| 51 | +/* | ||
| 52 | +// Only override drawRect: if you perform custom drawing. | ||
| 53 | +// An empty implementation adversely affects performance during animation. | ||
| 54 | +- (void)drawRect:(CGRect)rect { | ||
| 55 | + // Drawing code | ||
| 56 | +} | ||
| 57 | +*/ | ||
| 58 | + | ||
| 59 | +#pragma mark - Lazy Loading | ||
| 60 | +- (UILabel *)title { | ||
| 61 | + if (!_title) { | ||
| 62 | + _title = [[UILabel alloc] init]; | ||
| 63 | + _title.textColor = [UIColor colorWithRed:153/255.0 green:153/255.0 blue:153/255.0 alpha:1.0]; | ||
| 64 | + _title.font = [UIFont systemFontOfSize:14]; | ||
| 65 | + _title.numberOfLines = 0; | ||
| 66 | + } | ||
| 67 | + return _title; | ||
| 68 | +} | ||
| 69 | + | ||
| 70 | +@end |
CNLiveBLoginModule/Classes/BindingManage/CNLiveBindingManageModel.h
0 → 100644
| 1 | +// | ||
| 2 | +// CNLiveBindingManageModel.h | ||
| 3 | +// CNLiveNetAdd | ||
| 4 | +// | ||
| 5 | +// Created by CNLive-zxw on 2019/9/10. | ||
| 6 | +// Copyright © 2019 cnlive. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import <Foundation/Foundation.h> | ||
| 10 | +//#import "CNLiveShareImageManager.h" | ||
| 11 | + | ||
| 12 | +NS_ASSUME_NONNULL_BEGIN | ||
| 13 | + | ||
| 14 | +@interface CNLiveBindingManageModel : NSObject | ||
| 15 | +@property (nonatomic, copy) NSString *title; | ||
| 16 | +@property (nonatomic, copy) NSString *desc; | ||
| 17 | +@property (nonatomic, copy) NSString *image; | ||
| 18 | +@property (nonatomic, copy) NSString *isBinding;//是否绑定 | ||
| 19 | + | ||
| 20 | +@property (nonatomic, copy) NSString *thirdPartyPlat; | ||
| 21 | +@property (nonatomic, copy) NSString *thirdPartyId; | ||
| 22 | +//@property (nonatomic, assign) CNLiveSendAuthResp type; | ||
| 23 | + | ||
| 24 | + | ||
| 25 | +@end | ||
| 26 | + | ||
| 27 | +NS_ASSUME_NONNULL_END |
CNLiveBLoginModule/Classes/BindingManage/CNLiveBindingManageModel.m
0 → 100644
| 1 | +// | ||
| 2 | +// CNLiveBindingManageModel.m | ||
| 3 | +// CNLiveNetAdd | ||
| 4 | +// | ||
| 5 | +// Created by CNLive-zxw on 2019/9/10. | ||
| 6 | +// Copyright © 2019 cnlive. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import "CNLiveBindingManageModel.h" | ||
| 10 | + | ||
| 11 | +@implementation CNLiveBindingManageModel | ||
| 12 | +//- (CNLiveSendAuthResp)type{ | ||
| 13 | +// CNLiveSendAuthResp type = CNLiveSendAuthRespWX; | ||
| 14 | +// | ||
| 15 | +// if([self.thirdPartyPlat isEqualToString:@"1"]){ | ||
| 16 | +// type = CNLiveSendAuthRespWB; | ||
| 17 | +// | ||
| 18 | +// }else if ([self.thirdPartyPlat isEqualToString:@"2"]){ | ||
| 19 | +// type = CNLiveSendAuthRespQQ; | ||
| 20 | +// | ||
| 21 | +// }else if([self.thirdPartyPlat isEqualToString:@"3"]){ | ||
| 22 | +// type = CNLiveSendAuthRespWX; | ||
| 23 | +// | ||
| 24 | +// }else if([self.thirdPartyPlat isEqualToString:@"5"]){ | ||
| 25 | +// type = CNLiveSendAuthRespApple; | ||
| 26 | +// | ||
| 27 | +// } | ||
| 28 | +// return type; | ||
| 29 | +// | ||
| 30 | +//} | ||
| 31 | + | ||
| 32 | +@end |
CNLiveBLoginModule/Classes/BindingManage/CNLiveBindingManageRequest.h
0 → 100644
| 1 | +// | ||
| 2 | +// CNLiveBindingManageRequest.h | ||
| 3 | +// CNLiveNetAdd | ||
| 4 | +// | ||
| 5 | +// Created by CNLive-zxw on 2019/9/10. | ||
| 6 | +// Copyright © 2019 cnlive. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import <Foundation/Foundation.h> | ||
| 10 | +//#import "CNLiveShareImageManager.h" | ||
| 11 | + | ||
| 12 | +NS_ASSUME_NONNULL_BEGIN | ||
| 13 | +@class CNLiveBindingManageModel; | ||
| 14 | +@class CNThreeLoginModel; | ||
| 15 | + | ||
| 16 | +typedef void (^CNLiveBindingResponseBlock)(BOOL isSuccess, CNLiveBindingManageModel * _Nullable model, BOOL isBinding); | ||
| 17 | +typedef void (^CNLiveBindingArrayBlock)(NSArray * _Nullable bindingData, NSArray * _Nullable unBindingData); | ||
| 18 | +typedef void (^CNLiveLoginResponseBlock)(NSURLSessionTask *requestTask, id responseObject, NSError *error); | ||
| 19 | + | ||
| 20 | +@interface CNLiveBindingManageRequest : NSObject | ||
| 21 | +/** | ||
| 22 | + * @abstract 绑定/解除绑定 | ||
| 23 | + * | ||
| 24 | + * @param model 模型 | ||
| 25 | + * @param block 回调 | ||
| 26 | + */ | ||
| 27 | ++ (void)requestModel:(CNLiveBindingManageModel *)model block:(CNLiveBindingResponseBlock)block; | ||
| 28 | + | ||
| 29 | +/** | ||
| 30 | + * @abstract 获取绑定数据 | ||
| 31 | + * | ||
| 32 | + * @param block 回调 | ||
| 33 | + */ | ||
| 34 | ++ (void)requestModels:(CNLiveBindingArrayBlock)block; | ||
| 35 | + | ||
| 36 | +/** | ||
| 37 | + * @abstract 三方登录 | ||
| 38 | + * | ||
| 39 | + * @param type 三方类型 | ||
| 40 | + * @param model 模型 | ||
| 41 | + * @param block 回调 | ||
| 42 | + */ | ||
| 43 | +//+ (void)thirdPartyLoginWithType:(CNLiveSendAuthResp)type model:(CNThreeLoginModel *)model block:(CNLoginResponseBlock)block; | ||
| 44 | + | ||
| 45 | +@end | ||
| 46 | + | ||
| 47 | +NS_ASSUME_NONNULL_END |
CNLiveBLoginModule/Classes/BindingManage/CNLiveBindingManageRequest.m
0 → 100644
| 1 | +// | ||
| 2 | +// CNLiveBindingManageRequest.m | ||
| 3 | +// CNLiveNetAdd | ||
| 4 | +// | ||
| 5 | +// Created by CNLive-zxw on 2019/9/10. | ||
| 6 | +// Copyright © 2019 cnlive. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import "CNLiveBindingManageRequest.h" | ||
| 10 | +#import "QMUIKit.h" | ||
| 11 | +#import <CNLiveRequestBastKit/CNLiveNetworking.h> | ||
| 12 | +#import "CNUserInfoManager.h" | ||
| 13 | + | ||
| 14 | +#import "CNLiveBindingManageModel.h" | ||
| 15 | + | ||
| 16 | +//#import "CNThreeLoginModel.h" | ||
| 17 | +//#import "CNLiveShareImageManager.h" | ||
| 18 | + | ||
| 19 | +@implementation CNLiveBindingManageRequest | ||
| 20 | ++ (void)requestModel:(CNLiveBindingManageModel *)model block:(CNLiveBindingResponseBlock)block{ | ||
| 21 | + if([model.isBinding isEqualToString:@"1"]){ | ||
| 22 | + //解除绑定操作 | ||
| 23 | + [CNLiveBindingManageRequest requestUnBindingModel:model block:^(BOOL isSuccess, CNLiveBindingManageModel * _Nullable model, BOOL isBinding) { | ||
| 24 | + block?block(isSuccess, model, isBinding):@""; | ||
| 25 | + }]; | ||
| 26 | + } | ||
| 27 | + else{ | ||
| 28 | + //绑定操作 | ||
| 29 | + [CNLiveBindingManageRequest requestBindingModel:model block:^(BOOL isSuccess, CNLiveBindingManageModel * _Nullable model, BOOL isBinding) { | ||
| 30 | + block?block(isSuccess, model, isBinding):@""; | ||
| 31 | + }]; | ||
| 32 | + } | ||
| 33 | +} | ||
| 34 | + | ||
| 35 | +//绑定操作 | ||
| 36 | ++ (void)requestBindingModel:(CNLiveBindingManageModel *)model block:(CNLiveBindingResponseBlock)block{ | ||
| 37 | + __weak typeof(self) weakSelf = self; | ||
| 38 | + // 获取第三方id | ||
| 39 | +// [CNLiveShareImageManager send:model.type authRespBlock:^(CNLiveSendAuthResp type, CNLiveThirdPartyModel *userInfo, NSError *error) { | ||
| 40 | +// __strong typeof(weakSelf) strongSelf = weakSelf; | ||
| 41 | +// if(!strongSelf) return; | ||
| 42 | +// if(error){ | ||
| 43 | +// if(error.code == 10000){ | ||
| 44 | +// //用户取消 | ||
| 45 | +// }else{ | ||
| 46 | +// [QMUITips showWithText:@"绑定失败" inView:AppKeyWindow hideAfterDelay:1.5]; | ||
| 47 | +// } | ||
| 48 | +// return ; | ||
| 49 | +// } | ||
| 50 | +// if(userInfo.thirdPartyId&&![userInfo.thirdPartyId isEqualToString:@""]){ | ||
| 51 | +// // 发起绑定请求 | ||
| 52 | +// model.thirdPartyId = userInfo.thirdPartyId; | ||
| 53 | +// [strongSelf sendBindingModel:model block:block]; | ||
| 54 | +// | ||
| 55 | +// }else{ | ||
| 56 | +// [QMUITips showWithText:@"绑定失败" inView:AppKeyWindow hideAfterDelay:1.5]; | ||
| 57 | +// | ||
| 58 | +// } | ||
| 59 | +// | ||
| 60 | +// }]; | ||
| 61 | + | ||
| 62 | +} | ||
| 63 | + | ||
| 64 | ++ (void)sendBindingModel:(CNLiveBindingManageModel *)model block:(CNLiveBindingResponseBlock)block{ | ||
| 65 | +// NSDictionary *params = @{ | ||
| 66 | +// @"uid":CNUserShareModel.uid?CNUserShareModel.uid:@"", | ||
| 67 | +// @"thirdPartyPlat":model.thirdPartyPlat?model.thirdPartyPlat:@"", | ||
| 68 | +// @"thirdPartyId":model.thirdPartyId?model.thirdPartyId:@"", | ||
| 69 | +// @"token":CNUserShareModel.token?CNUserShareModel.token:@"", | ||
| 70 | +// @"clientPlat":@"i"}; | ||
| 71 | +// [CNLiveNetworking setAllowRequestDefaultArgument:YES]; | ||
| 72 | +// [CNLiveNetworking setupShowDataResult:NO]; | ||
| 73 | +// | ||
| 74 | +// __weak typeof(self) weakSelf = self; | ||
| 75 | +// [CNLiveNetworking requestNetworkWithMethod:CNLiveRequestMethodPOST URLString:CNLoginBind3rdUrl Param:params CacheType:CNLiveNetworkCacheTypeNetworkOnly CompletionBlock:^(NSURLSessionTask *requestTask, id responseObject, NSError *error) { | ||
| 76 | +// __strong typeof(weakSelf) strongSelf = weakSelf; | ||
| 77 | +// if(!strongSelf) return; | ||
| 78 | +// | ||
| 79 | +// if ([responseObject isKindOfClass:[NSDictionary class]] && [responseObject[@"errorCode"] isEqualToString:@"0"]) { | ||
| 80 | +// //绑定,并更新本地数据 | ||
| 81 | +// CNBindingManageModel *bindingModel = [strongSelf updateBindingModel:model isBinding:@"1"]; | ||
| 82 | +// block?block(YES, bindingModel, YES):@""; | ||
| 83 | +// } | ||
| 84 | +// else if([responseObject isKindOfClass:[NSDictionary class]]) { | ||
| 85 | +// [QMUITips showWithText:responseObject[@"errorMessage"] inView:AppKeyWindow hideAfterDelay:1.5]; | ||
| 86 | +// block?block(NO, nil, NO):@""; | ||
| 87 | +// } | ||
| 88 | +// else{ | ||
| 89 | +// [QMUITips showWithText:@"绑定失败" inView:AppKeyWindow hideAfterDelay:1.5]; | ||
| 90 | +// block?block(NO, nil, NO):@""; | ||
| 91 | +// } | ||
| 92 | +// | ||
| 93 | +// }]; | ||
| 94 | +} | ||
| 95 | + | ||
| 96 | +//解除绑定操作 | ||
| 97 | ++ (void)requestUnBindingModel:(CNLiveBindingManageModel *)model block:(CNLiveBindingResponseBlock)block{ | ||
| 98 | +// NSDictionary *params = @{ | ||
| 99 | +// @"uid":CNUserShareModel.uid?CNUserShareModel.uid:@"", | ||
| 100 | +// @"thirdPartyPlat":model.thirdPartyPlat?model.thirdPartyPlat:@"", | ||
| 101 | +// @"thirdPartyId":model.thirdPartyId?model.thirdPartyId:@"", | ||
| 102 | +// @"token":CNUserShareModel.token?CNUserShareModel.token:@"", | ||
| 103 | +// @"clientPlat":@"i"}; | ||
| 104 | +// | ||
| 105 | +// [CNLiveNetworking setAllowRequestDefaultArgument:YES]; | ||
| 106 | +// [CNLiveNetworking setupShowDataResult:NO]; | ||
| 107 | +// | ||
| 108 | +// __weak typeof(self) weakSelf = self; | ||
| 109 | +// [CNLiveNetworking requestNetworkWithMethod:CNLiveRequestMethodPOST URLString:CNLoginUnBind3rdUrl Param:params CacheType:CNLiveNetworkCacheTypeNetworkOnly CompletionBlock:^(NSURLSessionTask *requestTask, id responseObject, NSError *error) { | ||
| 110 | +// __strong typeof(weakSelf) strongSelf = weakSelf; | ||
| 111 | +// if(!strongSelf) return; | ||
| 112 | +// | ||
| 113 | +// if ([responseObject isKindOfClass:[NSDictionary class]] && [responseObject[@"errorCode"] isEqualToString:@"0"]) { | ||
| 114 | +// //解除绑定,并更新本地数据 | ||
| 115 | +// CNBindingManageModel *unbindingModel = [strongSelf updateBindingModel:model isBinding:@"0"]; | ||
| 116 | +// block?block(YES, unbindingModel, NO):@""; | ||
| 117 | +// } | ||
| 118 | +// else if ([responseObject isKindOfClass:[NSDictionary class]]) { | ||
| 119 | +// [QMUITips showWithText:responseObject[@"errorMessage"] inView:AppKeyWindow hideAfterDelay:1.5]; | ||
| 120 | +// block?block(NO, nil, NO):@""; | ||
| 121 | +// } | ||
| 122 | +// else{ | ||
| 123 | +// [QMUITips showWithText:@"解除绑定失败" inView:AppKeyWindow hideAfterDelay:1.5]; | ||
| 124 | +// block?block(NO, nil, NO):@""; | ||
| 125 | +// } | ||
| 126 | +// | ||
| 127 | +// }]; | ||
| 128 | + | ||
| 129 | +} | ||
| 130 | + | ||
| 131 | +//改变绑定数据 | ||
| 132 | ++ (CNLiveBindingManageModel *)updateBindingModel:(CNLiveBindingManageModel *)model isBinding:(NSString *)isBinding{ | ||
| 133 | + if([isBinding isEqualToString:@"0"]){ | ||
| 134 | + //解除绑定 | ||
| 135 | + model.isBinding = @"0"; | ||
| 136 | + //微博 | ||
| 137 | + if([model.thirdPartyPlat isEqualToString:@"1"]){ | ||
| 138 | + CNUserShareModel.sinaUid = @""; | ||
| 139 | + | ||
| 140 | + } | ||
| 141 | |||
| 142 | + else if([model.thirdPartyPlat isEqualToString:@"2"]){ | ||
| 143 | + CNUserShareModel.qqUid = @""; | ||
| 144 | + | ||
| 145 | + } | ||
| 146 | + //微信 | ||
| 147 | + else if([model.thirdPartyPlat isEqualToString:@"3"]){ | ||
| 148 | + CNUserShareModel.wxUid = @""; | ||
| 149 | + | ||
| 150 | + } | ||
| 151 | + //苹果 | ||
| 152 | + else if([model.thirdPartyPlat isEqualToString:@"5"]){ | ||
| 153 | + CNUserShareModel.appleUid = @""; | ||
| 154 | + | ||
| 155 | + } | ||
| 156 | + [QMUITips showWithText:@"解除绑定成功" inView:([UIApplication sharedApplication].delegate).window hideAfterDelay:1.5]; | ||
| 157 | + return model; | ||
| 158 | + } | ||
| 159 | + else if ([isBinding isEqualToString:@"1"]){ | ||
| 160 | + //添加绑定 | ||
| 161 | + model.isBinding = @"1"; | ||
| 162 | + //微博 | ||
| 163 | + if([model.thirdPartyPlat isEqualToString:@"1"]){ | ||
| 164 | + CNUserShareModel.sinaUid = model.thirdPartyId; | ||
| 165 | + | ||
| 166 | + } | ||
| 167 | |||
| 168 | + else if([model.thirdPartyPlat isEqualToString:@"2"]){ | ||
| 169 | + CNUserShareModel.qqUid = model.thirdPartyId; | ||
| 170 | + | ||
| 171 | + } | ||
| 172 | + //微信 | ||
| 173 | + else if([model.thirdPartyPlat isEqualToString:@"3"]){ | ||
| 174 | + CNUserShareModel.wxUid = model.thirdPartyId; | ||
| 175 | + | ||
| 176 | + } | ||
| 177 | + //苹果 | ||
| 178 | + else if([model.thirdPartyPlat isEqualToString:@"5"]){ | ||
| 179 | + CNUserShareModel.appleUid = model.thirdPartyId; | ||
| 180 | + | ||
| 181 | + } | ||
| 182 | + [QMUITips showWithText:@"绑定成功" inView:([UIApplication sharedApplication].delegate).window hideAfterDelay:1.5]; | ||
| 183 | + return model; | ||
| 184 | + | ||
| 185 | + } | ||
| 186 | + return nil; | ||
| 187 | + | ||
| 188 | +} | ||
| 189 | + | ||
| 190 | +//请求绑定数据 | ||
| 191 | ++ (void)requestModels:(CNLiveBindingArrayBlock)block{ | ||
| 192 | + NSMutableArray *bindingData = [[NSMutableArray alloc] init]; | ||
| 193 | + NSMutableArray *unBindingData = [[NSMutableArray alloc] init]; | ||
| 194 | + CNLiveBindingManageModel *tmodel = [[CNLiveBindingManageModel alloc]init]; | ||
| 195 | + tmodel.title = @"手机号"; | ||
| 196 | + tmodel.image = @"login_telephone"; | ||
| 197 | + NSString *mobile = [CNUserShareModel.mobile stringByReplacingCharactersInRange:NSMakeRange(3, 4) withString:@"****"]; | ||
| 198 | + tmodel.desc = mobile; | ||
| 199 | + tmodel.isBinding = @"1"; | ||
| 200 | + tmodel.thirdPartyPlat = @"10"; | ||
| 201 | + tmodel.thirdPartyId = CNUserShareModel.uid; | ||
| 202 | + [bindingData addObject:tmodel]; | ||
| 203 | + | ||
| 204 | + CNLiveBindingManageModel *wmodel = [[CNLiveBindingManageModel alloc]init]; | ||
| 205 | + wmodel.title = @"微信"; | ||
| 206 | + wmodel.image = @"login_wechat"; | ||
| 207 | + wmodel.thirdPartyPlat = @"3"; | ||
| 208 | + | ||
| 209 | + if(CNUserShareModel.wxUid&&![CNUserShareModel.wxUid isEqualToString:@""]){ | ||
| 210 | + wmodel.desc = @"已绑定微信"; | ||
| 211 | + wmodel.thirdPartyId = CNUserShareModel.wxUid; | ||
| 212 | + wmodel.isBinding = @"1"; | ||
| 213 | + }else{ | ||
| 214 | + wmodel.desc = @"未绑定微信"; | ||
| 215 | + wmodel.isBinding = @"0"; | ||
| 216 | + } | ||
| 217 | + [unBindingData addObject:wmodel]; | ||
| 218 | + | ||
| 219 | + CNLiveBindingManageModel *qmodel = [[CNLiveBindingManageModel alloc]init]; | ||
| 220 | + qmodel.title = @"QQ"; | ||
| 221 | + qmodel.image = @"login_qq"; | ||
| 222 | + qmodel.thirdPartyPlat = @"2"; | ||
| 223 | + if(CNUserShareModel.qqUid&&![CNUserShareModel.qqUid isEqualToString:@""]){ | ||
| 224 | + qmodel.desc = @"已绑定QQ"; | ||
| 225 | + qmodel.thirdPartyId = CNUserShareModel.qqUid; | ||
| 226 | + qmodel.isBinding = @"1"; | ||
| 227 | + }else{ | ||
| 228 | + qmodel.desc = @"未绑定QQ"; | ||
| 229 | + qmodel.isBinding = @"0"; | ||
| 230 | + } | ||
| 231 | + [unBindingData addObject:qmodel]; | ||
| 232 | + | ||
| 233 | + CNLiveBindingManageModel *smodel = [[CNLiveBindingManageModel alloc]init]; | ||
| 234 | + smodel.title = @"微博"; | ||
| 235 | + smodel.image = @"login_weibo"; | ||
| 236 | + smodel.thirdPartyPlat = @"1"; | ||
| 237 | + if(CNUserShareModel.sinaUid&&![CNUserShareModel.sinaUid isEqualToString:@""]){ | ||
| 238 | + smodel.desc = @"已绑定微博"; | ||
| 239 | + smodel.thirdPartyId = CNUserShareModel.sinaUid; | ||
| 240 | + smodel.isBinding = @"1"; | ||
| 241 | + }else{ | ||
| 242 | + smodel.desc = @"未绑定微博"; | ||
| 243 | + smodel.isBinding = @"0"; | ||
| 244 | + } | ||
| 245 | + [unBindingData addObject:smodel]; | ||
| 246 | + | ||
| 247 | + CNLiveBindingManageModel *amodel = [[CNLiveBindingManageModel alloc]init]; | ||
| 248 | + amodel.title = @"苹果账号"; | ||
| 249 | + amodel.image = @"login_apple_icon"; | ||
| 250 | + amodel.thirdPartyPlat = @"5"; | ||
| 251 | + if(CNUserShareModel.appleUid&&![CNUserShareModel.appleUid isEqualToString:@""]){ | ||
| 252 | + amodel.desc = @"已绑定苹果账号"; | ||
| 253 | + amodel.thirdPartyId = CNUserShareModel.appleUid; | ||
| 254 | + amodel.isBinding = @"1"; | ||
| 255 | + }else{ | ||
| 256 | + amodel.desc = @"未绑定苹果账号"; | ||
| 257 | + amodel.isBinding = @"0"; | ||
| 258 | + } | ||
| 259 | + [unBindingData addObject:amodel]; | ||
| 260 | + | ||
| 261 | + block?block(bindingData,unBindingData):@""; | ||
| 262 | +} | ||
| 263 | + | ||
| 264 | +//三方登录 | ||
| 265 | +//+ (void)thirdPartyLoginWithType:(CNLiveSendAuthResp)type model:(CNThreeLoginModel *)model block:(CNLoginResponseBlock)block{ | ||
| 266 | +// NSDictionary *params = @{@"thirdPartyPlat":model.thirdPartyPlat?model.thirdPartyPlat:@"", | ||
| 267 | +// @"thirdPartyId":model.thirdPartyId?model.thirdPartyId:@"", | ||
| 268 | +// @"frmId":model.frmId?model.frmId:@"", | ||
| 269 | +// @"clientPlat":@"i"}; | ||
| 270 | +// [CNLiveNetworking setAllowRequestDefaultArgument:YES]; | ||
| 271 | +// [CNLiveNetworking setupShowDataResult:NO]; | ||
| 272 | +// | ||
| 273 | +// [CNLiveNetworking requestNetworkWithMethod:CNLiveRequestMethodPOST URLString:CNLoginIn3rdForWJJUrl Param:params CacheType:CNLiveNetworkCacheTypeNetworkOnly CompletionBlock:^(NSURLSessionTask *requestTask, id responseObject, NSError *error) { | ||
| 274 | +// block?block(requestTask, responseObject, error):@""; | ||
| 275 | +// | ||
| 276 | +// }]; | ||
| 277 | +// | ||
| 278 | +// | ||
| 279 | +//} | ||
| 280 | + | ||
| 281 | +@end |
CNLiveBLoginModule/Classes/Controller/CNLiveCompleteInfoController.h
0 → 100644
| 1 | +// | ||
| 2 | +// CNLiveCompleteInfoController.h | ||
| 3 | +// CNLiveLoginModule | ||
| 4 | +// | ||
| 5 | +// Created by 153993236@qq.com on 11/12/2019. | ||
| 6 | +// Copyright (c) 2019 153993236@qq.com. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import <UIKit/UIKit.h> | ||
| 10 | + | ||
| 11 | +NS_ASSUME_NONNULL_BEGIN | ||
| 12 | + | ||
| 13 | +@interface CNLiveCompleteInfoController : UIViewController | ||
| 14 | +@property (nonatomic, assign) BOOL isShow; | ||
| 15 | + | ||
| 16 | +@end | ||
| 17 | + | ||
| 18 | +NS_ASSUME_NONNULL_END |
CNLiveBLoginModule/Classes/Controller/CNLiveCompleteInfoController.m
0 → 100644
| 1 | +// | ||
| 2 | +// CNLiveCompleteInfoController.m | ||
| 3 | +// CNLiveLoginModule | ||
| 4 | +// | ||
| 5 | +// Created by 153993236@qq.com on 11/12/2019. | ||
| 6 | +// Copyright (c) 2019 153993236@qq.com. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import "CNLiveCompleteInfoController.h" | ||
| 10 | + | ||
| 11 | +#import "MJExtension.h" | ||
| 12 | +#import "QMUIKit.h" | ||
| 13 | +#import "YYKit.h" | ||
| 14 | + | ||
| 15 | +#import "CNLiveNavigationBar.h" | ||
| 16 | +#import "CNLiveCompleteInfoView.h" | ||
| 17 | + | ||
| 18 | +@interface CNLiveCompleteInfoController()<CNLiveCompleteInfoViewDelegate> | ||
| 19 | +@property (nonatomic, strong) CNLiveCompleteInfoView *infoView; | ||
| 20 | +@property (nonatomic, strong) CNLiveNavigationBar *navigationBar; | ||
| 21 | + | ||
| 22 | +@end | ||
| 23 | + | ||
| 24 | +@implementation CNLiveCompleteInfoController | ||
| 25 | +#pragma mark - 生命周期 | ||
| 26 | +- (void)viewWillAppear:(BOOL)animated{ | ||
| 27 | + [super viewWillAppear:animated]; | ||
| 28 | + self.navigationController.navigationBarHidden = YES; | ||
| 29 | +} | ||
| 30 | + | ||
| 31 | +- (void)viewDidLoad { | ||
| 32 | + [super viewDidLoad]; | ||
| 33 | + // Do any additional setup after loading the view. | ||
| 34 | + self.automaticallyAdjustsScrollViewInsets = NO; | ||
| 35 | + self.view.backgroundColor = [UIColor whiteColor]; | ||
| 36 | + [self createUI]; | ||
| 37 | +} | ||
| 38 | + | ||
| 39 | +- (void)createUI{ | ||
| 40 | + [self.view addSubview:self.navigationBar]; | ||
| 41 | + [self.view addSubview:self.infoView]; | ||
| 42 | +} | ||
| 43 | + | ||
| 44 | +- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { | ||
| 45 | + [self.view endEditing:YES]; | ||
| 46 | +} | ||
| 47 | + | ||
| 48 | +#pragma mark - CNLiveCompleteInfoViewDelegate | ||
| 49 | +- (void)loginSuccess:(CNLiveCompleteInfoView *)view result:(id _Nonnull)result{ | ||
| 50 | + // 进入tabbar | ||
| 51 | + | ||
| 52 | +} | ||
| 53 | + | ||
| 54 | +/* | ||
| 55 | +#pragma mark - Navigation | ||
| 56 | + | ||
| 57 | +// In a storyboard-based application, you will often want to do a little preparation before navigation | ||
| 58 | +- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { | ||
| 59 | + // Get the new view controller using [segue destinationViewController]. | ||
| 60 | + // Pass the selected object to the new view controller. | ||
| 61 | +} | ||
| 62 | +*/ | ||
| 63 | + | ||
| 64 | +#pragma mark - 懒加载 | ||
| 65 | +- (CNLiveNavigationBar *)navigationBar { | ||
| 66 | + if (!_navigationBar) { | ||
| 67 | + _navigationBar = [CNLiveNavigationBar navigationBar]; | ||
| 68 | + _navigationBar.backgroundColor = [UIColor whiteColor]; | ||
| 69 | + _navigationBar.title.text = @"完善信息"; | ||
| 70 | + __weak typeof(self) weakSelf = self; | ||
| 71 | + _navigationBar.onClickLeftButton = ^{ | ||
| 72 | + [weakSelf.navigationController popViewControllerAnimated:YES]; | ||
| 73 | + }; | ||
| 74 | + _navigationBar.right = nil; | ||
| 75 | + } | ||
| 76 | + return _navigationBar; | ||
| 77 | +} | ||
| 78 | + | ||
| 79 | +- (CNLiveCompleteInfoView *)infoView{ | ||
| 80 | + if(!_infoView){ | ||
| 81 | + _infoView = [[CNLiveCompleteInfoView alloc] initWithFrame:CGRectMake(self.view.frame.size.width/8.0, NavigationContentTop+40, self.view.frame.size.width*3/4.0, 250)]; | ||
| 82 | + _infoView.center = CGPointMake(self.view.center.x, self.view.center.y-50); | ||
| 83 | + _infoView.delegate = self; | ||
| 84 | + } | ||
| 85 | + return _infoView; | ||
| 86 | +} | ||
| 87 | + | ||
| 88 | +@end |
CNLiveBLoginModule/Classes/Controller/CNLiveLoginController.h
0 → 100644
| 1 | +// | ||
| 2 | +// CNLiveLoginController.h | ||
| 3 | +// CNLiveLoginModule | ||
| 4 | +// | ||
| 5 | +// Created by 153993236@qq.com on 11/12/2019. | ||
| 6 | +// Copyright (c) 2019 153993236@qq.com. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import <UIKit/UIKit.h> | ||
| 10 | + | ||
| 11 | +NS_ASSUME_NONNULL_BEGIN | ||
| 12 | + | ||
| 13 | +@interface CNLiveLoginController : UIViewController | ||
| 14 | +@property (nonatomic, assign) BOOL isShowClose; | ||
| 15 | + | ||
| 16 | +@end | ||
| 17 | + | ||
| 18 | +NS_ASSUME_NONNULL_END |
CNLiveBLoginModule/Classes/Controller/CNLiveLoginController.m
0 → 100644
| 1 | +// | ||
| 2 | +// CNLiveLoginController.m | ||
| 3 | +// CNLiveLoginModule | ||
| 4 | +// | ||
| 5 | +// Created by 153993236@qq.com on 11/12/2019. | ||
| 6 | +// Copyright (c) 2019 153993236@qq.com. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import "CNLiveLoginController.h" | ||
| 10 | + | ||
| 11 | +#import "MJExtension.h" | ||
| 12 | +#import "QMUIKit.h" | ||
| 13 | +#import "YYKit.h" | ||
| 14 | + | ||
| 15 | +#import "CNLiveUserAgreementManager.h" | ||
| 16 | +#import "CNLiveCategory.h" | ||
| 17 | +#import "CNUserInfoManager.h" | ||
| 18 | +#import "CNLiveEnvironment.h" | ||
| 19 | + | ||
| 20 | +#import "CNLiveLoginView.h" | ||
| 21 | +#import "CNLiveThreeLoginView.h" | ||
| 22 | +#import "CNLiveBindingTelController.h"//绑定手机号 | ||
| 23 | +#import "CNLiveCompleteInfoController.h"//修改昵称 | ||
| 24 | +#import "CNLiveLoginRequest.h" | ||
| 25 | + | ||
| 26 | +@interface CNLiveLoginController()<CNLiveLoginViewDelegate, CNLiveThreeLoginViewDelegate> | ||
| 27 | +@property (nonatomic, weak) CNLiveLoginView *loginView; | ||
| 28 | +@property (nonatomic, weak) CNLiveThreeLoginView *threeLoginView; | ||
| 29 | +@property (nonatomic, weak) YYLabel *protocol; | ||
| 30 | +@property (nonatomic, strong) UIButton *close; | ||
| 31 | + | ||
| 32 | +@end | ||
| 33 | + | ||
| 34 | +@implementation CNLiveLoginController | ||
| 35 | + | ||
| 36 | +#pragma mark - 生命周期 | ||
| 37 | +- (void)viewWillAppear:(BOOL)animated{ | ||
| 38 | + [super viewWillAppear:animated]; | ||
| 39 | + self.navigationController.navigationBarHidden = YES; | ||
| 40 | +} | ||
| 41 | + | ||
| 42 | +- (void)viewDidLoad { | ||
| 43 | + [super viewDidLoad]; | ||
| 44 | + // Do any additional setup after loading the view. | ||
| 45 | + self.automaticallyAdjustsScrollViewInsets = NO; | ||
| 46 | + self.view.backgroundColor = [UIColor whiteColor]; | ||
| 47 | + [self createUI]; | ||
| 48 | +} | ||
| 49 | + | ||
| 50 | +- (void)createUI{ | ||
| 51 | + | ||
| 52 | + [self.view addSubview:self.close]; | ||
| 53 | + | ||
| 54 | + CNLiveLoginView *loginView = [[CNLiveLoginView alloc] initWithFrame:CGRectMake(SCREEN_WIDTH/8.0, NavigationContentTop+20, SCREEN_WIDTH*3/4.0, 380)]; | ||
| 55 | + loginView.delegate = self; | ||
| 56 | + [self.view addSubview:loginView]; | ||
| 57 | + self.loginView = loginView; | ||
| 58 | + | ||
| 59 | + YYLabel *protocol = [[YYLabel alloc] initWithFrame:CGRectMake(0, SCREEN_HEIGHT-30-SafeAreaInsetsConstantForDeviceWithNotch.bottom, SCREEN_WIDTH, 30)]; | ||
| 60 | + protocol.textAlignment = NSTextAlignmentCenter; | ||
| 61 | + protocol.textColor = [UIColor colorWithRed:173/255.0 green:173/255.0 blue:173/255.0 alpha:1.0]; | ||
| 62 | + protocol.font = [UIFont systemFontOfSize:14.0]; | ||
| 63 | + NSMutableAttributedString *text = [[NSMutableAttributedString alloc] initWithString:@"登录即代表阅读并同意《用户协议》及《隐私政策》"]; | ||
| 64 | + NSMutableParagraphStyle *style = [[NSParagraphStyle defaultParagraphStyle] mutableCopy]; | ||
| 65 | + style.alignment = NSTextAlignmentCenter;//对齐方式 | ||
| 66 | + [text addAttribute:NSParagraphStyleAttributeName value:style range:NSMakeRange(0, text.length)]; | ||
| 67 | + text.color = [UIColor colorWithRed:173/255.0 green:173/255.0 blue:173/255.0 alpha:1.0]; | ||
| 68 | + text.font = [UIFont systemFontOfSize:14.0]; | ||
| 69 | + __weak typeof(self) weakSelf = self; | ||
| 70 | + UIColor *color = Business?[UIColor colorWithRed:72/255.0 green:168/255.0 blue:249/255.0 alpha:1.0]:[UIColor colorWithRed:35/255.0 green:212/255.0 blue:30/255.0 alpha:1.0]; | ||
| 71 | + [text setTextHighlightRange:NSMakeRange(11, 4) color:color backgroundColor:[UIColor clearColor] tapAction:^(UIView * _Nonnull containerView, NSAttributedString * _Nonnull text, NSRange range, CGRect rect) { | ||
| 72 | + [weakSelf.view endEditing:YES]; | ||
| 73 | + [CNLiveUserAgreementManager jumpToAgreementH5WithType:CNLiveUserAgreementUser]; | ||
| 74 | + }]; | ||
| 75 | + [text setTextHighlightRange:NSMakeRange(text.length-5, 4) color:color backgroundColor:[UIColor clearColor] tapAction:^(UIView * _Nonnull containerView, NSAttributedString * _Nonnull text, NSRange range, CGRect rect) { | ||
| 76 | + [weakSelf.view endEditing:YES]; | ||
| 77 | + [CNLiveUserAgreementManager jumpToAgreementH5WithType:CNLiveUserAgreementPrivacy]; | ||
| 78 | + }]; | ||
| 79 | + protocol.attributedText = text; | ||
| 80 | + [self.view addSubview:protocol]; | ||
| 81 | + self.protocol = protocol; | ||
| 82 | + | ||
| 83 | + CNLiveThreeLoginView *threeLoginView = [[CNLiveThreeLoginView alloc] initWithFrame:CGRectMake(20, SCREEN_HEIGHT-30-SafeAreaInsetsConstantForDeviceWithNotch.bottom-80-10, SCREEN_WIDTH-40, 80)]; | ||
| 84 | + threeLoginView.delegate = self; | ||
| 85 | + [self.view addSubview:threeLoginView]; | ||
| 86 | + self.threeLoginView = threeLoginView; | ||
| 87 | + | ||
| 88 | +} | ||
| 89 | + | ||
| 90 | +- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { | ||
| 91 | + [self.view endEditing:YES]; | ||
| 92 | + | ||
| 93 | +} | ||
| 94 | + | ||
| 95 | +#pragma mark - CNLiveLoginViewDelegate | ||
| 96 | +- (void)loginSuccess:(CNLiveLoginView *)view isNewUser:(BOOL)isNewUser result:(id _Nonnull)result{ | ||
| 97 | + if (!isNewUser) { | ||
| 98 | + // 新用户 -> 设置昵称和头像 | ||
| 99 | + CNLiveCompleteInfoController *vc = [[CNLiveCompleteInfoController alloc]init]; | ||
| 100 | + vc.hidesBottomBarWhenPushed = YES; | ||
| 101 | + [self.navigationController pushViewController:vc animated:YES]; | ||
| 102 | + | ||
| 103 | + }else{ | ||
| 104 | + // 老用户 -> home | ||
| 105 | + [[CNLiveLoginRequest manager] loginTIM:CNUserShareModel.uid success:^{ | ||
| 106 | + // 进入tabbar | ||
| 107 | + | ||
| 108 | + } failed:^(int code, NSString * _Nonnull msg) { | ||
| 109 | + // 错误逻辑 | ||
| 110 | + | ||
| 111 | + }]; | ||
| 112 | + | ||
| 113 | + } | ||
| 114 | + | ||
| 115 | +} | ||
| 116 | + | ||
| 117 | +#pragma mark - CNLiveThreeLoginViewDelegate | ||
| 118 | +- (void)clickedButton:(CNLiveThreeLoginView *)view type:(CNLiveThreeLoginType)type{ | ||
| 119 | + // 1.请求三方平台 | ||
| 120 | + | ||
| 121 | + // 2.绑定手机号 | ||
| 122 | + [self jumpToBindingTelController:type]; | ||
| 123 | + | ||
| 124 | +} | ||
| 125 | + | ||
| 126 | +- (void)jumpToBindingTelController:(CNLiveThreeLoginType)type{ | ||
| 127 | + CNLiveBindingTelController *vc = [[CNLiveBindingTelController alloc]initWithType:type]; | ||
| 128 | + [self.navigationController pushViewController:vc animated:YES]; | ||
| 129 | + | ||
| 130 | +} | ||
| 131 | + | ||
| 132 | +/* | ||
| 133 | +#pragma mark - Navigation | ||
| 134 | + | ||
| 135 | +// In a storyboard-based application, you will often want to do a little preparation before navigation | ||
| 136 | +- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { | ||
| 137 | + // Get the new view controller using [segue destinationViewController]. | ||
| 138 | + // Pass the selected object to the new view controller. | ||
| 139 | +} | ||
| 140 | +*/ | ||
| 141 | +#pragma mark - 响应事件 | ||
| 142 | +- (void)closeDidSelected:(UIButton *)btn{ | ||
| 143 | + if (self.navigationController.topViewController == self) { | ||
| 144 | + [self.navigationController popViewControllerAnimated:YES]; | ||
| 145 | + }else{ | ||
| 146 | + [self dismissViewControllerAnimated:YES completion:nil]; | ||
| 147 | + } | ||
| 148 | +} | ||
| 149 | + | ||
| 150 | +#pragma mark - 懒加载 | ||
| 151 | +- (UIButton *)close{ | ||
| 152 | + if (!_close) { | ||
| 153 | + _close = [UIButton buttonWithType:UIButtonTypeCustom]; | ||
| 154 | + _close.frame = CGRectMake(SCREEN_WIDTH-NavigationBarHeight-10, StatusBarHeight, NavigationBarHeight, NavigationBarHeight); | ||
| 155 | + _close.hidden = !self.isShowClose; | ||
| 156 | + UIImage *image = [self getImageWithImageName:@"login_close" bundleName:@"CNLiveBLoginModule" targetClass:[self class]]; | ||
| 157 | + [_close setImage:image forState:UIControlStateNormal]; | ||
| 158 | + [_close addTarget:self action:@selector(closeDidSelected:) forControlEvents:UIControlEventTouchUpInside]; | ||
| 159 | + _close.adjustsImageWhenHighlighted = NO; | ||
| 160 | + } | ||
| 161 | + return _close; | ||
| 162 | + | ||
| 163 | +} | ||
| 164 | + | ||
| 165 | +@end |
CNLiveBLoginModule/Classes/Model/CNLiveClassifyOffsetManager.h
0 → 100644
| 1 | +// | ||
| 2 | +// CNLiveClassifyOffsetManager.h | ||
| 3 | +// CNLiveLoginModule | ||
| 4 | +// | ||
| 5 | +// Created by CNLive-zxw on 2019/3/27. | ||
| 6 | +// Copyright © 2019年 cnlive. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import <Foundation/Foundation.h> | ||
| 10 | + | ||
| 11 | +NS_ASSUME_NONNULL_BEGIN | ||
| 12 | + | ||
| 13 | +@interface CNLiveClassifyOffsetManager : NSObject | ||
| 14 | ++ (instancetype)manager; | ||
| 15 | + | ||
| 16 | + | ||
| 17 | +@end | ||
| 18 | + | ||
| 19 | +NS_ASSUME_NONNULL_END |
CNLiveBLoginModule/Classes/Model/CNLiveClassifyOffsetManager.m
0 → 100644
| 1 | +// | ||
| 2 | +// CNLiveClassifyOffsetManager.m | ||
| 3 | +// CNLiveLoginModule | ||
| 4 | +// | ||
| 5 | +// Created by CNLive-zxw on 2019/3/27. | ||
| 6 | +// Copyright © 2019年 cnlive. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import "CNLiveClassifyOffsetManager.h" | ||
| 10 | + | ||
| 11 | +@interface CNLiveClassifyOffsetManager () | ||
| 12 | + | ||
| 13 | +@end | ||
| 14 | + | ||
| 15 | +@implementation CNLiveClassifyOffsetManager | ||
| 16 | +#pragma mark - 单例 | ||
| 17 | ++ (instancetype)manager { | ||
| 18 | + static CNLiveClassifyOffsetManager *_singleton = nil; | ||
| 19 | + static dispatch_once_t onceToken; | ||
| 20 | + dispatch_once(&onceToken, ^{ | ||
| 21 | + //不能再使用alloc方法 | ||
| 22 | + //因为已经重写了allocWithZone方法,所以这里要调用父类的分配空间的方法 | ||
| 23 | + _singleton = [[super allocWithZone:NULL] init]; | ||
| 24 | + }); | ||
| 25 | + return _singleton; | ||
| 26 | + | ||
| 27 | +} | ||
| 28 | + | ||
| 29 | +// 防止外部调用alloc 或者 new | ||
| 30 | ++ (instancetype)allocWithZone:(struct _NSZone *)zone { | ||
| 31 | + return [CNLiveClassifyOffsetManager manager]; | ||
| 32 | + | ||
| 33 | +} | ||
| 34 | + | ||
| 35 | +// 防止外部调用copy | ||
| 36 | +- (id)copyWithZone:(nullable NSZone *)zone { | ||
| 37 | + return [CNLiveClassifyOffsetManager manager]; | ||
| 38 | + | ||
| 39 | +} | ||
| 40 | + | ||
| 41 | +// 防止外部调用mutableCopy | ||
| 42 | +- (id)mutableCopyWithZone:(nullable NSZone *)zone { | ||
| 43 | + return [CNLiveClassifyOffsetManager manager]; | ||
| 44 | + | ||
| 45 | +} | ||
| 46 | + | ||
| 47 | +@end |
CNLiveBLoginModule/Classes/Model/CNLiveLoginModel.h
0 → 100644
| 1 | +// | ||
| 2 | +// CNLiveLoginModel.h | ||
| 3 | +// CNLiveLoginModule | ||
| 4 | +// | ||
| 5 | +// Created by 153993236@qq.com on 11/12/2019. | ||
| 6 | +// Copyright (c) 2019 153993236@qq.com. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import <Foundation/Foundation.h> | ||
| 10 | + | ||
| 11 | +NS_ASSUME_NONNULL_BEGIN | ||
| 12 | + | ||
| 13 | +@interface CNLiveLoginModel : NSObject | ||
| 14 | + | ||
| 15 | + | ||
| 16 | +@end | ||
| 17 | + | ||
| 18 | +NS_ASSUME_NONNULL_END |
CNLiveBLoginModule/Classes/Model/CNLiveLoginModel.m
0 → 100644
CNLiveBLoginModule/Classes/Model/CNLiveLoginRequest.h
0 → 100644
| 1 | +// | ||
| 2 | +// CNLiveLoginRequest.h | ||
| 3 | +// CNLiveLoginModule | ||
| 4 | +// | ||
| 5 | +// Created by 153993236@qq.com on 11/12/2019. | ||
| 6 | +// Copyright (c) 2019 153993236@qq.com. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import <Foundation/Foundation.h> | ||
| 10 | + | ||
| 11 | +NS_ASSUME_NONNULL_BEGIN | ||
| 12 | + | ||
| 13 | +@interface CNLiveLoginRequest : NSObject | ||
| 14 | + | ||
| 15 | ++ (instancetype)manager; | ||
| 16 | + | ||
| 17 | +- (void)getTIMLoginToken:(NSString *)identifier success:(void (^)(NSString * token))success failed:(void (^)(int code, NSString * msg))failed; | ||
| 18 | + | ||
| 19 | + | ||
| 20 | +- (void)loginTIM:(NSString *)uid success:(void (^)(void))success failed:(void (^)(int code, NSString * msg))failed; | ||
| 21 | + | ||
| 22 | +- (void)resumeLogin; | ||
| 23 | + | ||
| 24 | +@end | ||
| 25 | + | ||
| 26 | +NS_ASSUME_NONNULL_END |
CNLiveBLoginModule/Classes/Model/CNLiveLoginRequest.m
0 → 100644
| 1 | +// | ||
| 2 | +// CNLiveLoginRequest.m | ||
| 3 | +// CNLiveLoginModule | ||
| 4 | +// | ||
| 5 | +// Created by 153993236@qq.com on 11/12/2019. | ||
| 6 | +// Copyright (c) 2019 153993236@qq.com. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import "CNLiveLoginRequest.h" | ||
| 10 | +#import <UIKit/UIKit.h> | ||
| 11 | +#import "QMUIKit.h" | ||
| 12 | + | ||
| 13 | +#import "CNLiveEnvironment.h" | ||
| 14 | +#import <CNLiveRequestBastKit/CNLiveNetworking.h> | ||
| 15 | +#import "TIMAdapter.h" | ||
| 16 | +#import "CommonLibrary.h" | ||
| 17 | + | ||
| 18 | +#import "NBSAppAgent.h" | ||
| 19 | +#import "CNLiveBusinessTools.h" | ||
| 20 | + | ||
| 21 | +@interface CNLiveLoginRequest() | ||
| 22 | +@property (nonatomic, strong) IMALoginParam *loginParam; | ||
| 23 | + | ||
| 24 | +@end | ||
| 25 | + | ||
| 26 | +@implementation CNLiveLoginRequest | ||
| 27 | +static const NSInteger timeValue = 1.5; | ||
| 28 | +#define XWKeyWindow [UIApplication sharedApplication].keyWindow | ||
| 29 | +#pragma mark - 单例 | ||
| 30 | ++ (instancetype)manager { | ||
| 31 | + static CNLiveLoginRequest *_singleton = nil; | ||
| 32 | + static dispatch_once_t onceToken; | ||
| 33 | + dispatch_once(&onceToken, ^{ | ||
| 34 | + _singleton = [[super allocWithZone:NULL] init]; | ||
| 35 | + BOOL isAutoLogin = [IMAPlatform isAutoLogin]; | ||
| 36 | + | ||
| 37 | + if (isAutoLogin) { | ||
| 38 | + _singleton.loginParam = [IMALoginParam loadFromLocal]; | ||
| 39 | + | ||
| 40 | + } else { | ||
| 41 | + _singleton.loginParam = [[IMALoginParam alloc] init]; | ||
| 42 | + | ||
| 43 | + } | ||
| 44 | + [IMAPlatform configWith:_singleton.loginParam.config]; | ||
| 45 | + | ||
| 46 | + }); | ||
| 47 | + return _singleton; | ||
| 48 | + | ||
| 49 | +} | ||
| 50 | + | ||
| 51 | +// 防止外部调用alloc 或者 new | ||
| 52 | ++ (instancetype)allocWithZone:(struct _NSZone *)zone { | ||
| 53 | + return [CNLiveLoginRequest manager]; | ||
| 54 | +} | ||
| 55 | + | ||
| 56 | +// 防止外部调用copy | ||
| 57 | +- (id)copyWithZone:(nullable NSZone *)zone { | ||
| 58 | + return [CNLiveLoginRequest manager]; | ||
| 59 | +} | ||
| 60 | + | ||
| 61 | +// 防止外部调用mutableCopy | ||
| 62 | +- (id)mutableCopyWithZone:(nullable NSZone *)zone { | ||
| 63 | + return [CNLiveLoginRequest manager]; | ||
| 64 | +} | ||
| 65 | + | ||
| 66 | +// 获取token | ||
| 67 | +- (void)getTIMLoginToken:(NSString *)identifier success:(void (^)(NSString * token))success failed:(void (^)(int code, NSString * msg))failed{ | ||
| 68 | + NSDictionary *params = @{@"appId":AppId, | ||
| 69 | + @"plat":@"i", | ||
| 70 | + @"sdkAppId":SdkAppId, | ||
| 71 | + @"identifier":identifier}; | ||
| 72 | + [CNLiveNetworking setupShowDataResult:NO]; | ||
| 73 | + [CNLiveNetworking setAllowRequestDefaultArgument:YES]; | ||
| 74 | + [CNLiveNetworking requestNetworkWithMethod:CNLiveRequestMethodPOST URLString:TIM_GetTokenUrl Param:params CacheType:CNLiveNetworkCacheTypeNetworkOnly CompletionBlock:^(NSURLSessionTask *requestTask, id responseObject, NSError *error) { | ||
| 75 | + if (!error) { | ||
| 76 | + if (responseObject && [responseObject isKindOfClass:[NSDictionary class]] && [[responseObject allKeys] containsObject:@"data"] && [[responseObject objectForKey:@"data"] isKindOfClass:[NSDictionary class]]) { | ||
| 77 | + NSNumber *code = responseObject[@"errorCode"]; | ||
| 78 | + if (code && code.intValue == 0) { | ||
| 79 | + if (success) { | ||
| 80 | + success(responseObject[@"data"][@"token"]); | ||
| 81 | + } | ||
| 82 | + } else { | ||
| 83 | + if (failed) { | ||
| 84 | + failed(31012, @"获取token失败"); | ||
| 85 | + } | ||
| 86 | + } | ||
| 87 | + } | ||
| 88 | + }else{ | ||
| 89 | + if (failed) failed(31012, @"获取token失败"); | ||
| 90 | + } | ||
| 91 | + }]; | ||
| 92 | + | ||
| 93 | +} | ||
| 94 | + | ||
| 95 | +// 登录IM | ||
| 96 | +- (void)loginTIM:(NSString *)uid success:(void (^)(void))success failed:(void (^)(int code, NSString * msg))failed{ | ||
| 97 | + [QMUITips showLoading:@"正在连接服务器..." inView:XWKeyWindow]; | ||
| 98 | + // 1.获取token | ||
| 99 | + [self getTIMLoginToken:uid success:^(NSString * _Nonnull token) { | ||
| 100 | + | ||
| 101 | + self.loginParam.identifier = uid; | ||
| 102 | + self.loginParam.userSig = token; | ||
| 103 | + self.loginParam.tokenTime = [[NSDate date] timeIntervalSince1970]; | ||
| 104 | + | ||
| 105 | + // 2.登录im | ||
| 106 | + [[IMAPlatform sharedInstance] login:self.loginParam succ:^{ | ||
| 107 | + [QMUITips hideAllToastInView:XWKeyWindow animated:YES]; | ||
| 108 | + | ||
| 109 | + [self.loginParam saveToLocal]; | ||
| 110 | + | ||
| 111 | + [[IMAPlatform sharedInstance].contactMgr asyncUpdateContact]; | ||
| 112 | + [[IMAPlatform sharedInstance].contactMgr saveGroupIdList:YES]; | ||
| 113 | + [[IMAPlatform sharedInstance] configHost:self.loginParam]; | ||
| 114 | + [IMAPlatform sharedInstance].didConnectSuccess = YES; | ||
| 115 | + | ||
| 116 | + // 听云 | ||
| 117 | + [NBSAppAgent setUserIdentifier:[CNLiveBusinessTools getSidIdfv]]; | ||
| 118 | + | ||
| 119 | + // 设置电商sdk | ||
| 120 | +// [[DSCnliveShopSDKManager sharedManager] loginUser:uid]; | ||
| 121 | + | ||
| 122 | + //设置APP已活跃 | ||
| 123 | + [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"is_Active_Application"]; | ||
| 124 | + [[NSUserDefaults standardUserDefaults] synchronize]; | ||
| 125 | + | ||
| 126 | + [QMUITips showSucceed:@"登录成功" inView:XWKeyWindow hideAfterDelay:timeValue]; | ||
| 127 | + success?success():@""; | ||
| 128 | + | ||
| 129 | + // 3.im配置信息 | ||
| 130 | + [[IMAPlatform sharedInstance].host asyncSetAllowType:TIM_FRIEND_NEED_CONFIRM succ:^{ | ||
| 131 | + NSLog(@"asyncSetAllowType Suc"); | ||
| 132 | + [self.loginParam saveToLocal]; | ||
| 133 | + | ||
| 134 | + } fail:^(int code, NSString *msg) { | ||
| 135 | + NSLog(@"asyncSetAllowType failed : %@", msg); | ||
| 136 | + | ||
| 137 | + }]; | ||
| 138 | + | ||
| 139 | + } fail:^(int code, NSString *msg) { | ||
| 140 | + NSLog(@"login failed : %@", msg); | ||
| 141 | + [QMUITips hideAllToastInView:XWKeyWindow animated:YES]; | ||
| 142 | + if (code == 6208) { | ||
| 143 | + // 离线被踢下线重新登录 | ||
| 144 | + [self resumeLogin]; | ||
| 145 | + } | ||
| 146 | + else{ | ||
| 147 | + [QMUITips showError:msg inView:XWKeyWindow hideAfterDelay:timeValue]; | ||
| 148 | + failed?failed(code, msg):@""; | ||
| 149 | + } | ||
| 150 | + }]; | ||
| 151 | + | ||
| 152 | + } failed:^(int code, NSString * _Nonnull msg) { | ||
| 153 | + NSLog(@"token code:%d msg:%@", code, msg); | ||
| 154 | + [QMUITips hideAllToastInView:XWKeyWindow animated:YES]; | ||
| 155 | + [QMUITips showError:msg inView:XWKeyWindow hideAfterDelay:timeValue]; | ||
| 156 | + failed?failed(code, msg):@""; | ||
| 157 | + | ||
| 158 | + }]; | ||
| 159 | + | ||
| 160 | +} | ||
| 161 | + | ||
| 162 | +// 如果遇到离线被踢下线重新登录 | ||
| 163 | +- (void)resumeLogin { | ||
| 164 | + __weak typeof(self)weakSelf = self; | ||
| 165 | + [[IMAPlatform sharedInstance] login:self.loginParam succ:^{ | ||
| 166 | + [QMUITips hideAllToastInView:XWKeyWindow animated:YES]; | ||
| 167 | + [QMUITips showSucceed:@"登录成功" inView:XWKeyWindow hideAfterDelay:timeValue]; | ||
| 168 | + [self.loginParam saveToLocal]; | ||
| 169 | + | ||
| 170 | + [[IMAPlatform sharedInstance] configHost:self.loginParam]; | ||
| 171 | + [IMAPlatform sharedInstance].didConnectSuccess = YES; | ||
| 172 | + | ||
| 173 | + [[IMAPlatform sharedInstance].host asyncSetAllowType:TIM_FRIEND_NEED_CONFIRM succ:^{ | ||
| 174 | + NSLog(@"asyncSetAllowType Suc"); | ||
| 175 | + [self.loginParam saveToLocal]; | ||
| 176 | + | ||
| 177 | + } fail:^(int code, NSString *msg) { | ||
| 178 | + NSLog(@"asyncSetAllowType failed : %@", msg); | ||
| 179 | + }]; | ||
| 180 | + | ||
| 181 | + } fail:^(int code, NSString *msg) { | ||
| 182 | + NSLog(@"tokenCode login failed : %@", msg); | ||
| 183 | + if (code == 6028) { | ||
| 184 | + dispatch_async(dispatch_get_main_queue(), ^{ | ||
| 185 | + QMUIAlertAction *action = [QMUIAlertAction actionWithTitle:@"重试" style:QMUIAlertActionStyleDefault handler:^(__kindof QMUIAlertController *aAlertController, QMUIAlertAction *action) { | ||
| 186 | + [weakSelf resumeLogin]; | ||
| 187 | + }]; | ||
| 188 | + QMUIAlertController *alertController = [QMUIAlertController alertControllerWithTitle:@"连接服务器失败,请点击重试" message:@"" preferredStyle:QMUIAlertControllerStyleActionSheet]; | ||
| 189 | + [alertController addAction:action]; | ||
| 190 | + | ||
| 191 | + NSMutableDictionary *titleAttributs = [[NSMutableDictionary alloc] initWithDictionary:alertController.alertTitleAttributes]; | ||
| 192 | + | ||
| 193 | + titleAttributs[NSForegroundColorAttributeName] = [UIColor colorWithRed:35/255.0 green:212/255.0 blue:30/255.0 alpha:1.0]; | ||
| 194 | + | ||
| 195 | + action.buttonAttributes = titleAttributs; | ||
| 196 | + [alertController showWithAnimated:YES]; | ||
| 197 | + | ||
| 198 | + }); | ||
| 199 | + } | ||
| 200 | + }]; | ||
| 201 | +} | ||
| 202 | + | ||
| 203 | +@end |
CNLiveBLoginModule/Classes/Module/CNLiveLoginModule.h
0 → 100644
| 1 | +// | ||
| 2 | +// CNLiveLoginModule.h | ||
| 3 | +// CNLiveLoginModule | ||
| 4 | +// | ||
| 5 | +// Created by 153993236@qq.com on 11/12/2019. | ||
| 6 | +// Copyright (c) 2019 153993236@qq.com. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import <Foundation/Foundation.h> | ||
| 10 | + | ||
| 11 | +NS_ASSUME_NONNULL_BEGIN | ||
| 12 | + | ||
| 13 | +@interface CNLiveLoginModule : NSObject | ||
| 14 | + | ||
| 15 | +@end | ||
| 16 | + | ||
| 17 | +NS_ASSUME_NONNULL_END |
CNLiveBLoginModule/Classes/Module/CNLiveLoginModule.m
0 → 100644
| 1 | +// | ||
| 2 | +// CNLiveLoginModule.m | ||
| 3 | +// CNLiveLoginModule | ||
| 4 | +// | ||
| 5 | +// Created by 153993236@qq.com on 11/12/2019. | ||
| 6 | +// Copyright (c) 2019 153993236@qq.com. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import "CNLiveLoginModule.h" | ||
| 10 | +#import "CNLiveServices.h" | ||
| 11 | + | ||
| 12 | +@BeeHiveMod(CNLiveLoginModule) | ||
| 13 | +@interface CNLiveLoginModule()<BHModuleProtocol> | ||
| 14 | + | ||
| 15 | +@end | ||
| 16 | + | ||
| 17 | +@implementation CNLiveLoginModule | ||
| 18 | +- (id)init { | ||
| 19 | + if (self = [super init]) { | ||
| 20 | + | ||
| 21 | + } | ||
| 22 | + return self; | ||
| 23 | + | ||
| 24 | +} | ||
| 25 | + | ||
| 26 | +- (NSUInteger)moduleLevel { | ||
| 27 | + return 0; | ||
| 28 | + | ||
| 29 | +} | ||
| 30 | + | ||
| 31 | +- (void)modSetUp:(BHContext *)context { | ||
| 32 | + switch (context.env) { | ||
| 33 | + case BHEnvironmentDev: | ||
| 34 | + //....初始化开发环境 | ||
| 35 | + break; | ||
| 36 | + case BHEnvironmentProd: | ||
| 37 | + //....初始化生产环境 | ||
| 38 | + default: | ||
| 39 | + break; | ||
| 40 | + } | ||
| 41 | + | ||
| 42 | +} | ||
| 43 | + | ||
| 44 | +- (void)modInit:(BHContext *)context { | ||
| 45 | + | ||
| 46 | +} | ||
| 47 | + | ||
| 48 | +@end |
CNLiveBLoginModule/Classes/Module/CNLiveLoginService.h
0 → 100644
| 1 | +// | ||
| 2 | +// CNLiveLoginService.h | ||
| 3 | +// CNLiveLoginModule | ||
| 4 | +// | ||
| 5 | +// Created by 153993236@qq.com on 11/12/2019. | ||
| 6 | +// Copyright (c) 2019 153993236@qq.com. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import <Foundation/Foundation.h> | ||
| 10 | + | ||
| 11 | +NS_ASSUME_NONNULL_BEGIN | ||
| 12 | + | ||
| 13 | +@interface CNLiveLoginService : NSObject | ||
| 14 | + | ||
| 15 | +@end | ||
| 16 | + | ||
| 17 | +NS_ASSUME_NONNULL_END |
CNLiveBLoginModule/Classes/Module/CNLiveLoginService.m
0 → 100644
| 1 | +// | ||
| 2 | +// CNLiveLoginService.m | ||
| 3 | +// CNLiveLoginModule | ||
| 4 | +// | ||
| 5 | +// Created by 153993236@qq.com on 11/12/2019. | ||
| 6 | +// Copyright (c) 2019 153993236@qq.com. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import "CNLiveLoginService.h" | ||
| 10 | +#import "CNLiveServices.h" | ||
| 11 | +#import "CNLiveManager.h" | ||
| 12 | +#import "CNUserInfoManager.h" | ||
| 13 | + | ||
| 14 | +#import "CNLiveLoginController.h" | ||
| 15 | + | ||
| 16 | +@BeeHiveService(CNLiveLoginServiceProtocol,CNLiveLoginService) | ||
| 17 | +@interface CNLiveLoginService ()<CNLiveLoginServiceProtocol> | ||
| 18 | + | ||
| 19 | +@end | ||
| 20 | + | ||
| 21 | +@implementation CNLiveLoginService | ||
| 22 | + | ||
| 23 | +- (UIViewController *)getLoginViewController{ | ||
| 24 | + return [CNLiveLoginController new]; | ||
| 25 | +} | ||
| 26 | + | ||
| 27 | +- (void)pushToLoginViewController{ | ||
| 28 | + [self pushToLoginViewController:NO]; | ||
| 29 | +} | ||
| 30 | + | ||
| 31 | +- (void)pushToLoginViewController:(BOOL)isShowClose{ | ||
| 32 | + CNLiveLoginController *vc = [[CNLiveLoginController alloc]init]; | ||
| 33 | + vc.isShowClose = isShowClose; | ||
| 34 | + vc.modalPresentationStyle = UIModalPresentationOverFullScreen; | ||
| 35 | + vc.hidesBottomBarWhenPushed = YES; | ||
| 36 | + [CNLivePageJumpManager pushViewController:vc]; | ||
| 37 | +} | ||
| 38 | + | ||
| 39 | +- (void)presentToLoginViewController{ | ||
| 40 | + [self presentToLoginViewController:NO]; | ||
| 41 | +} | ||
| 42 | + | ||
| 43 | +- (void)presentToLoginViewController:(BOOL)isShowClose{ | ||
| 44 | + CNLiveLoginController *vc = [[CNLiveLoginController alloc]init]; | ||
| 45 | + vc.isShowClose = isShowClose; | ||
| 46 | + vc.modalPresentationStyle = UIModalPresentationOverFullScreen; | ||
| 47 | + vc.hidesBottomBarWhenPushed = YES; | ||
| 48 | + [CNLivePageJumpManager presentViewController:vc]; | ||
| 49 | +} | ||
| 50 | + | ||
| 51 | +- (void)loginIfNeedWithCompleteBlock:(void (^)(BOOL))completeBlock{ | ||
| 52 | + if(CNUserShareManager.isLogin){ | ||
| 53 | + completeBlock(YES); | ||
| 54 | + }else{ | ||
| 55 | + [self presentToLoginViewController:YES]; | ||
| 56 | + } | ||
| 57 | +} | ||
| 58 | + | ||
| 59 | +@end |
CNLiveBLoginModule/Classes/ThreeLogin/CNLiveBindingTelController.h
0 → 100644
| 1 | +// | ||
| 2 | +// CNLiveBindingTelController.h | ||
| 3 | +// CNLiveLoginModule | ||
| 4 | +// | ||
| 5 | +// Created by CNLive-zxw on 2019/9/9. | ||
| 6 | +// Copyright © 2019 153993236@qq.com. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import <UIKit/UIKit.h> | ||
| 10 | +#import "CNLiveThreeLoginType.h" | ||
| 11 | + | ||
| 12 | +NS_ASSUME_NONNULL_BEGIN | ||
| 13 | + | ||
| 14 | +@interface CNLiveBindingTelController : UIViewController | ||
| 15 | +- (instancetype)initWithType:(CNLiveThreeLoginType)type; | ||
| 16 | + | ||
| 17 | + | ||
| 18 | +@end | ||
| 19 | + | ||
| 20 | +NS_ASSUME_NONNULL_END |
CNLiveBLoginModule/Classes/ThreeLogin/CNLiveBindingTelController.m
0 → 100644
| 1 | +// | ||
| 2 | +// CNLiveBindingTelController.m | ||
| 3 | +// CNLiveLoginModule | ||
| 4 | +// | ||
| 5 | +// Created by CNLive-zxw on 2019/9/9. | ||
| 6 | +// Copyright © 2019 153993236@qq.com. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import "CNLiveBindingTelController.h" | ||
| 10 | + | ||
| 11 | +#import "YYKit.h" | ||
| 12 | +#import "NSAttributedString+YYText.h" | ||
| 13 | +#import "QMUIKit.h" | ||
| 14 | +#import "CNLiveEnvironment.h" | ||
| 15 | +#import "CNLiveUserAgreementManager.h" | ||
| 16 | + | ||
| 17 | +#import "CNLiveNavigationBar.h" | ||
| 18 | +#import "CNLiveBindingTelView.h" | ||
| 19 | + | ||
| 20 | +@interface CNLiveBindingTelController()<CNLiveBindingTelViewDelegate> | ||
| 21 | +@property (nonatomic, assign) CNLiveThreeLoginType type; | ||
| 22 | +@property (nonatomic, strong) CNLiveNavigationBar *navigationBar; | ||
| 23 | + | ||
| 24 | +@property (nonatomic, strong) CNLiveBindingTelView *bindingTelView; | ||
| 25 | +@property (nonatomic, strong) YYLabel *protocol; | ||
| 26 | + | ||
| 27 | +@end | ||
| 28 | + | ||
| 29 | +@implementation CNLiveBindingTelController | ||
| 30 | +- (instancetype)initWithType:(CNLiveThreeLoginType)type{ | ||
| 31 | + self = [super init]; | ||
| 32 | + if (self) { | ||
| 33 | + self.type = type; | ||
| 34 | + } | ||
| 35 | + return self; | ||
| 36 | + | ||
| 37 | +} | ||
| 38 | +#pragma mark - 生命周期 | ||
| 39 | +- (void)viewWillAppear:(BOOL)animated{ | ||
| 40 | + [super viewWillAppear:animated]; | ||
| 41 | + self.navigationController.navigationBarHidden = YES; | ||
| 42 | +} | ||
| 43 | + | ||
| 44 | +- (void)viewDidLoad { | ||
| 45 | + [super viewDidLoad]; | ||
| 46 | + // Do any additional setup after loading the view. | ||
| 47 | + self.automaticallyAdjustsScrollViewInsets = NO; | ||
| 48 | + self.navigationController.navigationBar.translucent = NO; | ||
| 49 | + self.extendedLayoutIncludesOpaqueBars = YES; | ||
| 50 | + self.edgesForExtendedLayout = UIRectEdgeBottom; | ||
| 51 | + self.view.backgroundColor = [UIColor whiteColor]; | ||
| 52 | + | ||
| 53 | + [self.view addSubview:self.navigationBar]; | ||
| 54 | + [self.view addSubview:self.bindingTelView]; | ||
| 55 | + [self.view addSubview:self.protocol]; | ||
| 56 | + | ||
| 57 | +} | ||
| 58 | + | ||
| 59 | +- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { | ||
| 60 | + [self.view endEditing:YES]; | ||
| 61 | + | ||
| 62 | +} | ||
| 63 | + | ||
| 64 | +#pragma mark - CNLiveBindingTelViewDelegate | ||
| 65 | +- (void)bindingSuccess:(CNLiveBindingTelView *)view type:(CNLiveThreeLoginType)type{ | ||
| 66 | + | ||
| 67 | +} | ||
| 68 | + | ||
| 69 | +/* | ||
| 70 | +#pragma mark - Navigation | ||
| 71 | + | ||
| 72 | +// In a storyboard-based application, you will often want to do a little preparation before navigation | ||
| 73 | +- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { | ||
| 74 | + // Get the new view controller using [segue destinationViewController]. | ||
| 75 | + // Pass the selected object to the new view controller. | ||
| 76 | +} | ||
| 77 | +*/ | ||
| 78 | +#pragma mark - 懒加载 | ||
| 79 | +- (CNLiveNavigationBar *)navigationBar { | ||
| 80 | + if (!_navigationBar) { | ||
| 81 | + _navigationBar = [CNLiveNavigationBar navigationBar]; | ||
| 82 | + _navigationBar.backgroundColor = [UIColor whiteColor]; | ||
| 83 | + _navigationBar.title.text = @"绑定手机号"; | ||
| 84 | + __weak typeof(self) weakSelf = self; | ||
| 85 | + _navigationBar.onClickLeftButton = ^{ | ||
| 86 | + [weakSelf.navigationController popViewControllerAnimated:YES]; | ||
| 87 | + }; | ||
| 88 | + _navigationBar.right = nil; | ||
| 89 | + } | ||
| 90 | + return _navigationBar; | ||
| 91 | +} | ||
| 92 | + | ||
| 93 | +- (CNLiveBindingTelView *)bindingTelView { | ||
| 94 | + if (!_bindingTelView) { | ||
| 95 | + _bindingTelView = [[CNLiveBindingTelView alloc] initWithFrame:CGRectMake(self.view.frame.size.width/8.0, NavigationContentTop, self.view.frame.size.width*3/4.0, 400) type:self.type]; | ||
| 96 | + _bindingTelView.delegate = self; | ||
| 97 | + } | ||
| 98 | + return _bindingTelView; | ||
| 99 | +} | ||
| 100 | + | ||
| 101 | +- (YYLabel *)protocol { | ||
| 102 | + if (!_protocol) { | ||
| 103 | + _protocol = [[YYLabel alloc] initWithFrame:CGRectMake(0, self.view.frame.size.height-30-NavigationContentTop-SafeAreaInsetsConstantForDeviceWithNotch.bottom, self.view.frame.size.width, 30)]; | ||
| 104 | + _protocol.textAlignment = NSTextAlignmentCenter; | ||
| 105 | + _protocol.textColor = [UIColor colorWithRed:173/255.0 green:173/255.0 blue:173/255.0 alpha:1.0]; | ||
| 106 | + _protocol.font = [UIFont systemFontOfSize:14.0]; | ||
| 107 | + NSMutableAttributedString *text = [[NSMutableAttributedString alloc] initWithString:@"已阅读并同意《账户绑定确认书(网家家)》"]; | ||
| 108 | + NSMutableParagraphStyle *style = [[NSParagraphStyle defaultParagraphStyle] mutableCopy]; | ||
| 109 | + style.alignment = NSTextAlignmentCenter;//对齐方式 | ||
| 110 | + [text addAttribute:NSParagraphStyleAttributeName value:style range:NSMakeRange(0, text.length)]; | ||
| 111 | + text.color = [UIColor colorWithRed:173/255.0 green:173/255.0 blue:173/255.0 alpha:1.0]; | ||
| 112 | + text.font = [UIFont systemFontOfSize:14.0]; | ||
| 113 | + __weak typeof(self) weakSelf = self; | ||
| 114 | + UIColor *color = Business?[UIColor colorWithRed:72/255.0 green:168/255.0 blue:249/255.0 alpha:1.0]:[UIColor colorWithRed:35/255.0 green:212/255.0 blue:30/255.0 alpha:1.0]; | ||
| 115 | + [text setTextHighlightRange:NSMakeRange(7, 12) color:color backgroundColor:[UIColor clearColor] tapAction:^(UIView * _Nonnull containerView, NSAttributedString * _Nonnull text, NSRange range, CGRect rect) { | ||
| 116 | + __strong typeof(weakSelf) strongSelf = weakSelf; | ||
| 117 | + if(!strongSelf) return; | ||
| 118 | + [strongSelf.view endEditing:YES]; | ||
| 119 | + [CNLiveUserAgreementManager jumpToAgreementH5WithType:CNLiveUserAgreementUser]; | ||
| 120 | + | ||
| 121 | + }]; | ||
| 122 | + _protocol.attributedText = text; | ||
| 123 | + | ||
| 124 | + } | ||
| 125 | + return _protocol; | ||
| 126 | +} | ||
| 127 | + | ||
| 128 | +@end |
CNLiveBLoginModule/Classes/ThreeLogin/CNLiveBindingTelView.h
0 → 100644
| 1 | +// | ||
| 2 | +// CNLiveBindingTelView.h | ||
| 3 | +// CNLiveLoginModule | ||
| 4 | +// | ||
| 5 | +// Created by CNLive-zxw on 2019/9/6. | ||
| 6 | +// Copyright © 2019 153993236@qq.com. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import <UIKit/UIKit.h> | ||
| 10 | +#import "CNLiveThreeLoginType.h" | ||
| 11 | + | ||
| 12 | +NS_ASSUME_NONNULL_BEGIN | ||
| 13 | + | ||
| 14 | +@class CNLiveBindingTelView; | ||
| 15 | +@protocol CNLiveBindingTelViewDelegate <NSObject> | ||
| 16 | +- (void)bindingSuccess:(CNLiveBindingTelView *)view type:(CNLiveThreeLoginType)type; | ||
| 17 | + | ||
| 18 | +@end | ||
| 19 | + | ||
| 20 | +@interface CNLiveBindingTelView : UIView | ||
| 21 | +@property (nonatomic, weak) id<CNLiveBindingTelViewDelegate> delegate; | ||
| 22 | +- (instancetype)initWithFrame:(CGRect)frame type:(CNLiveThreeLoginType)type; | ||
| 23 | + | ||
| 24 | +@end | ||
| 25 | + | ||
| 26 | +NS_ASSUME_NONNULL_END |
CNLiveBLoginModule/Classes/ThreeLogin/CNLiveBindingTelView.m
0 → 100644
| 1 | +// | ||
| 2 | +// CNLiveBindingTelView.m | ||
| 3 | +// CNLiveLoginModule | ||
| 4 | +// | ||
| 5 | +// Created by CNLive-zxw on 2019/9/6. | ||
| 6 | +// Copyright © 2019 153993236@qq.com. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import "CNLiveBindingTelView.h" | ||
| 10 | +#import "YYKit.h" | ||
| 11 | +#import "QMUIKit.h" | ||
| 12 | +#import <CNLiveRequestBastKit/CNLiveNetworking.h> | ||
| 13 | + | ||
| 14 | +#import "CNLiveCategory.h" | ||
| 15 | +#import "CNLiveEnvironment.h" | ||
| 16 | +#import <CNLiveUserSystemSDK/CNLiveUserSystemCenter.h> | ||
| 17 | +#import <CNLiveUserSystemSDK/CNLiveUserSystemTypeDef.h> | ||
| 18 | +#import "CNUserInfoManager.h" | ||
| 19 | + | ||
| 20 | +#import "CNLiveLoginCountryView.h" | ||
| 21 | +#import "CNLiveLoginTextField.h" | ||
| 22 | +#import "CNLiveCountDownButton.h" | ||
| 23 | + | ||
| 24 | +@interface CNLiveBindingTelView()<UITextFieldDelegate,CNLiveCountDownButtonDataSource, CNLiveCountDownButtonDelegate> | ||
| 25 | +{ | ||
| 26 | + NSString *_countryCode; // 国家Code | ||
| 27 | + NSString *_verificationCode; // 验证码 | ||
| 28 | +} | ||
| 29 | + | ||
| 30 | +@property (nonatomic, weak) CNLiveLoginTextField *account; | ||
| 31 | +@property (nonatomic, weak) CNLiveLoginTextField *code; | ||
| 32 | +@property (nonatomic, strong) CNLiveCountDownButton *countDown; | ||
| 33 | +@property (nonatomic, weak) UIButton *binding; | ||
| 34 | +@property (nonatomic, assign) CNLiveThreeLoginType type; | ||
| 35 | + | ||
| 36 | +@end | ||
| 37 | + | ||
| 38 | +@implementation CNLiveBindingTelView | ||
| 39 | +#define XWKeyWindow [UIApplication sharedApplication].keyWindow | ||
| 40 | +static NSInteger const rowHeight = 40; | ||
| 41 | +static NSInteger const space = 40; | ||
| 42 | +static const NSInteger timeValue = 1.5; | ||
| 43 | + | ||
| 44 | +- (instancetype)initWithFrame:(CGRect)frame type:(CNLiveThreeLoginType)type{ | ||
| 45 | + | ||
| 46 | + self = [super initWithFrame:frame]; | ||
| 47 | + if (self) { | ||
| 48 | + self.userInteractionEnabled = YES; | ||
| 49 | + _countryCode = @"86"; | ||
| 50 | + self.type = type; | ||
| 51 | + [self createSubviews:frame]; | ||
| 52 | + | ||
| 53 | + } | ||
| 54 | + return self; | ||
| 55 | + | ||
| 56 | +} | ||
| 57 | +- (void)createSubviews:(CGRect)frame{ | ||
| 58 | + | ||
| 59 | + CNLiveLoginTextField *account = [[CNLiveLoginTextField alloc] initWithFrame:CGRectMake(0, 0, frame.size.width, rowHeight)]; | ||
| 60 | + account.keyboardType = UIKeyboardTypeNumberPad; | ||
| 61 | + account.placeholder = @"请输入手机号"; | ||
| 62 | + account.textColor = [UIColor colorWithRed:51/255.0 green:51/255.0 blue:51/255.0 alpha:1.0]; | ||
| 63 | + account.placeholderColor = [UIColor colorWithRed:173/255.0 green:173/255.0 blue:173/255.0 alpha:1.0]; | ||
| 64 | + account.font = [UIFont systemFontOfSize:16]; | ||
| 65 | + account.textAlignment = NSTextAlignmentLeft; | ||
| 66 | + [account addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged]; | ||
| 67 | + account.clearButtonMode = UITextFieldViewModeWhileEditing; | ||
| 68 | + account.delegate = self; | ||
| 69 | + [self addSubview:account]; | ||
| 70 | + self.account = account; | ||
| 71 | + | ||
| 72 | + CNLiveLoginTextField *code = [[CNLiveLoginTextField alloc] initWithFrame:CGRectMake(account.left, account.bottom+space, frame.size.width/2.0, rowHeight)]; | ||
| 73 | + code.keyboardType = UIKeyboardTypeNumberPad; | ||
| 74 | + code.placeholder = @"请输入验证码"; | ||
| 75 | + code.textColor = [UIColor colorWithRed:51/255.0 green:51/255.0 blue:51/255.0 alpha:1.0]; | ||
| 76 | + code.placeholderColor = [UIColor colorWithRed:173/255.0 green:173/255.0 blue:173/255.0 alpha:1.0]; | ||
| 77 | + code.font = [UIFont systemFontOfSize:16]; | ||
| 78 | + code.textAlignment = NSTextAlignmentLeft; | ||
| 79 | + [code addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged]; | ||
| 80 | + code.clearButtonMode = UITextFieldViewModeWhileEditing; | ||
| 81 | + code.delegate = self; | ||
| 82 | + [self addSubview:code]; | ||
| 83 | + self.code = code; | ||
| 84 | + | ||
| 85 | + CNLiveCountDownButton *countDown = [CNLiveCountDownButton buttonWithType:UIButtonTypeCustom]; | ||
| 86 | + countDown.dataSource = self; | ||
| 87 | + countDown.delegate = self; | ||
| 88 | + countDown.frame = CGRectMake(frame.size.width-80, account.bottom+space+10, 80, rowHeight-10); | ||
| 89 | + UIImage *image2 = [self getImageWithImageName:Business?@"login_get_code_b":@"login_get_code" bundleName:@"CNLiveBLoginModule" targetClass:[self class]]; | ||
| 90 | + [countDown setImage:image2 forState:UIControlStateNormal]; | ||
| 91 | + countDown.adjustsImageWhenHighlighted = NO; | ||
| 92 | + [countDown setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; | ||
| 93 | + countDown.titleLabel.font = [UIFont systemFontOfSize:12.0]; | ||
| 94 | + countDown.layer.cornerRadius = 15; | ||
| 95 | + countDown.layer.masksToBounds = YES; | ||
| 96 | + [self addSubview:countDown]; | ||
| 97 | + self.countDown = countDown; | ||
| 98 | + | ||
| 99 | + UIButton *binding = [UIButton buttonWithType:UIButtonTypeCustom]; | ||
| 100 | + binding.frame = CGRectMake(5, code.bottom+space, frame.size.width-10, rowHeight); | ||
| 101 | + [binding setTitle:@"确认手机绑定并同意协议" forState:UIControlStateNormal]; | ||
| 102 | + [binding setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; | ||
| 103 | + binding.titleLabel.font = [UIFont systemFontOfSize:15.0]; | ||
| 104 | + UIColor *color = Business?[UIColor colorWithRed:72/255.0 green:168/255.0 blue:249/255.0 alpha:1.0]:[UIColor colorWithRed:35/255.0 green:212/255.0 blue:30/255.0 alpha:1.0]; | ||
| 105 | + binding.backgroundColor = color; | ||
| 106 | + binding.layer.cornerRadius = 20; | ||
| 107 | + binding.layer.masksToBounds = YES; | ||
| 108 | + binding.adjustsImageWhenHighlighted = NO; | ||
| 109 | + [binding addTarget:self action:@selector(bindingDidClicked:) forControlEvents:UIControlEventTouchUpInside]; | ||
| 110 | + [self addSubview:binding]; | ||
| 111 | + self.binding = binding; | ||
| 112 | + | ||
| 113 | +} | ||
| 114 | + | ||
| 115 | +#pragma mark - UITextFieldDelegate | ||
| 116 | +- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{ | ||
| 117 | + if ([textField isEqual:_account] || [textField isEqual:_code]) { | ||
| 118 | + return YES; | ||
| 119 | + } | ||
| 120 | + else { | ||
| 121 | + return YES; | ||
| 122 | + | ||
| 123 | + } | ||
| 124 | +} | ||
| 125 | + | ||
| 126 | +- (void)textFieldDidChange:(UITextField *)textField { | ||
| 127 | + if (![_account.text isEqualToString:@""] && ![_code.text isEqualToString:@""]) { | ||
| 128 | + _binding.enabled = YES; | ||
| 129 | + | ||
| 130 | + } | ||
| 131 | + else { | ||
| 132 | + _binding.enabled = NO; | ||
| 133 | + | ||
| 134 | + } | ||
| 135 | + | ||
| 136 | +} | ||
| 137 | + | ||
| 138 | +- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { | ||
| 139 | + if ([textField isEqual:_account]) { | ||
| 140 | + NSInteger maxTextLength = 20; | ||
| 141 | + if(string.length == 0) { | ||
| 142 | + //判断是不是删除键 | ||
| 143 | + return YES; | ||
| 144 | + } | ||
| 145 | + else if(textField.text.length >= maxTextLength) { | ||
| 146 | + NSLog(@"输入的字符个数大于20,忽略输入"); | ||
| 147 | + return NO; | ||
| 148 | + } | ||
| 149 | + else if (![self isNum:string]) { | ||
| 150 | + return NO; | ||
| 151 | + } | ||
| 152 | + else if (textField.text.length + string.length > maxTextLength){ | ||
| 153 | + NSInteger length = textField.text.length; | ||
| 154 | + NSInteger needLen = maxTextLength - length; | ||
| 155 | + textField.text = [textField.text stringByAppendingString:[string substringToIndex:needLen]]; | ||
| 156 | + return NO; | ||
| 157 | + } | ||
| 158 | + else{ | ||
| 159 | + return YES; | ||
| 160 | + } | ||
| 161 | + } | ||
| 162 | + else if ([textField isEqual:self.code]){ | ||
| 163 | + NSInteger maxTextLength = 6; | ||
| 164 | + if(string.length == 0) { | ||
| 165 | + //判断是不是删除键 | ||
| 166 | + return YES; | ||
| 167 | + } | ||
| 168 | + else if(textField.text.length >= maxTextLength) { | ||
| 169 | + NSLog(@"输入的字符个数大于6,忽略输入"); | ||
| 170 | + return NO; | ||
| 171 | + } | ||
| 172 | + else if (![self isNum:string]) { | ||
| 173 | + return NO; | ||
| 174 | + } | ||
| 175 | + else if (textField.text.length + string.length > maxTextLength){ | ||
| 176 | + NSInteger length = textField.text.length; | ||
| 177 | + NSInteger needLen = maxTextLength - length; | ||
| 178 | + textField.text = [textField.text stringByAppendingString:[string substringToIndex:needLen]]; | ||
| 179 | + return NO; | ||
| 180 | + } | ||
| 181 | + else{ | ||
| 182 | + return YES; | ||
| 183 | + } | ||
| 184 | + } | ||
| 185 | + else{ | ||
| 186 | + return YES; | ||
| 187 | + } | ||
| 188 | +} | ||
| 189 | + | ||
| 190 | +/** 判断是否为纯数字 */ | ||
| 191 | +- (BOOL)isNum:(NSString *)checkedNumString { | ||
| 192 | + checkedNumString = [checkedNumString stringByTrimmingCharactersInSet:[NSCharacterSet decimalDigitCharacterSet]]; | ||
| 193 | + if(checkedNumString.length > 0) { | ||
| 194 | + return NO; | ||
| 195 | + } | ||
| 196 | + return YES; | ||
| 197 | +} | ||
| 198 | + | ||
| 199 | +/* | ||
| 200 | + // Only override drawRect: if you perform custom drawing. | ||
| 201 | + // An empty implementation adversely affects performance during animation. | ||
| 202 | + - (void)drawRect:(CGRect)rect { | ||
| 203 | + // Drawing code | ||
| 204 | + } | ||
| 205 | + */ | ||
| 206 | + | ||
| 207 | +#pragma mark - CNLiveCountdownButton DataSource | ||
| 208 | +// 设置倒计时总秒数 | ||
| 209 | +- (NSInteger)startCountDownNumOfCountDownButton:(CNLiveCountDownButton *)countdownButton { | ||
| 210 | + return 60; | ||
| 211 | +} | ||
| 212 | + | ||
| 213 | +#pragma mark - CNLiveCountdownButton Delegate | ||
| 214 | +// 倒计时按钮点击 | ||
| 215 | +- (void)countDownButtonDidClick:(CNLiveCountDownButton *)button { | ||
| 216 | + //获取验证码 | ||
| 217 | + if ([_account.text isEqualToString:@""]) { | ||
| 218 | + [QMUITips showWithText:@"请输入手机号"]; | ||
| 219 | + return; | ||
| 220 | + } | ||
| 221 | + if(![CNLiveNetworking isNetworking]){ | ||
| 222 | + [QMUITips showError:@"无法连接网络" inView:XWKeyWindow hideAfterDelay:timeValue]; | ||
| 223 | + return ; | ||
| 224 | + } | ||
| 225 | + _code.text = @""; | ||
| 226 | + [_code becomeFirstResponder]; | ||
| 227 | + | ||
| 228 | + button.userInteractionEnabled = NO; | ||
| 229 | + [QMUITips showLoadingInView:XWKeyWindow]; | ||
| 230 | + | ||
| 231 | + [CNLiveUserSystemCenter verificationCodeType:VerificationCodeTypeShortcutLogin mobile:_account.text countryCode:@"86" success:^(id result) { | ||
| 232 | + [QMUITips hideAllToastInView:XWKeyWindow animated:YES]; | ||
| 233 | + [QMUITips showWithText:@"验证码已发送"]; | ||
| 234 | + | ||
| 235 | +// button.backgroundColor = HexColor(0xdedede); | ||
| 236 | + button.frame = CGRectMake(self.frame.size.width-110, self.account.bottom+space+10, 110, rowHeight-10); | ||
| 237 | + [button setImage:nil forState:UIControlStateNormal]; | ||
| 238 | + NSString *title = [NSString stringWithFormat:@"%d秒后重新发送", 60]; | ||
| 239 | + [button setTitle:title forState:UIControlStateNormal]; | ||
| 240 | + [button startCountDown]; | ||
| 241 | + | ||
| 242 | + | ||
| 243 | + } failure:^(NSDictionary *errorDic) { | ||
| 244 | + [QMUITips hideAllToastInView:XWKeyWindow animated:YES]; | ||
| 245 | + if ([errorDic[@"errorCode"] integerValue] == 408) { | ||
| 246 | + [QMUITips showWithText:@"请输入正确的手机号"]; | ||
| 247 | + } | ||
| 248 | + else{ | ||
| 249 | + [QMUITips showWithText:errorDic[@"errorMessage"]]; | ||
| 250 | + } | ||
| 251 | + button.userInteractionEnabled = YES; | ||
| 252 | + | ||
| 253 | + }]; | ||
| 254 | + | ||
| 255 | +} | ||
| 256 | + | ||
| 257 | +// 倒计时进行中 | ||
| 258 | +- (void)countDownButtonDidCountDown:(CNLiveCountDownButton *)button countDownNum:(NSInteger)countDownNum { | ||
| 259 | + if(button.frame.size.width != 110){ | ||
| 260 | + button.frame = CGRectMake(self.frame.size.width-110, self.account.bottom+space+10, 110, rowHeight-10); | ||
| 261 | + } | ||
| 262 | + NSString *title = [NSString stringWithFormat:@"%ld秒后重新发送", countDownNum]; | ||
| 263 | + [button setTitle:title forState:UIControlStateNormal]; | ||
| 264 | + | ||
| 265 | +} | ||
| 266 | + | ||
| 267 | +// 倒计时结束 | ||
| 268 | +- (void)countDownButtonDidEndCountDown:(CNLiveCountDownButton *)button { | ||
| 269 | + button.frame = CGRectMake(self.frame.size.width-80, self.account.bottom+space+10, 80, rowHeight-10); | ||
| 270 | + button.backgroundColor = [UIColor whiteColor]; | ||
| 271 | + button.userInteractionEnabled = YES; | ||
| 272 | + [button setTitle:@"" forState:UIControlStateNormal]; | ||
| 273 | + UIImage *image2 = [self getImageWithImageName:Business?@"login_get_code_b":@"login_get_code" bundleName:@"CNLiveBLoginModule" targetClass:[self class]]; | ||
| 274 | + [button setImage:image2 forState:UIControlStateNormal]; | ||
| 275 | +} | ||
| 276 | + | ||
| 277 | +#pragma mark - Action | ||
| 278 | +- (void)bindingDidClicked:(UIButton *)btn{ | ||
| 279 | + if ([self.account.text isEqualToString:@""]) { | ||
| 280 | + [QMUITips showWithText:@"请输入手机号" inView:XWKeyWindow hideAfterDelay:1.5]; | ||
| 281 | + return; | ||
| 282 | + } | ||
| 283 | + if ([self.code.text isEqualToString:@""]) { | ||
| 284 | + [QMUITips showWithText:@"请输入验证码" inView:XWKeyWindow hideAfterDelay:1.5]; | ||
| 285 | + return; | ||
| 286 | + } | ||
| 287 | + [self endEditing:YES]; | ||
| 288 | + if(![CNLiveNetworking isNetworking]){ | ||
| 289 | + [QMUITips showError:@"无法连接网络" inView:XWKeyWindow hideAfterDelay:1.5]; | ||
| 290 | + return ; | ||
| 291 | + } | ||
| 292 | + btn.userInteractionEnabled = NO; | ||
| 293 | + // 绑定手机号请求登录 | ||
| 294 | + [self thirdPartyLoginBindingTel]; | ||
| 295 | + | ||
| 296 | +} | ||
| 297 | + | ||
| 298 | +// 绑定手机号请求登录 | ||
| 299 | +- (void)thirdPartyLoginBindingTel{ | ||
| 300 | + NSDictionary *params = @{ | ||
| 301 | + @"mobile":self.account.text, | ||
| 302 | +// @"countryCode":self.model.countryCode?self.model.countryCode:@"", | ||
| 303 | +// @"verificationCode":self.code.text, | ||
| 304 | +// @"thirdPartyPlat":self.model.thirdPartyPlat?self.model.thirdPartyPlat:@"", | ||
| 305 | +// @"thirdPartyId":self.model.thirdPartyId?self.model.thirdPartyId:@"", | ||
| 306 | +// @"frmId":self.model.frmId?self.model.frmId:@"", | ||
| 307 | +// @"clientPlat":@"i", | ||
| 308 | +// @"nickName":self.model.nickName?self.model.nickName:@"", | ||
| 309 | +// @"gender":self.model.gender?self.model.gender:@"", | ||
| 310 | +// @"location":self.model.location?self.model.location:@"", | ||
| 311 | +// @"faceUrl":self.model.faceUrl?self.model.faceUrl:@"" | ||
| 312 | + }; | ||
| 313 | + [CNLiveNetworking setAllowRequestDefaultArgument:YES]; | ||
| 314 | + [CNLiveNetworking setupShowDataResult:NO]; | ||
| 315 | + | ||
| 316 | + [QMUITips showLoadingInView:XWKeyWindow]; | ||
| 317 | + __weak typeof(self) weakSelf = self; | ||
| 318 | + [CNLiveNetworking requestNetworkWithMethod:CNLiveRequestMethodPOST URLString:CNLoginIn3rdAndMobileForWJJUrl Param:params CacheType:CNLiveNetworkCacheTypeNetworkOnly CompletionBlock:^(NSURLSessionTask *requestTask, id responseObject, NSError *error) { | ||
| 319 | + __strong typeof(weakSelf) strongSelf = weakSelf; | ||
| 320 | + if(!strongSelf) return; | ||
| 321 | + [QMUITips hideAllToastInView:XWKeyWindow animated:YES]; | ||
| 322 | + strongSelf.binding.userInteractionEnabled = YES; | ||
| 323 | + if (error.code == -1001 || error.code == -1009) { | ||
| 324 | + [QMUITips showError:@"无法连接网络" inView:XWKeyWindow hideAfterDelay:1.5]; | ||
| 325 | + return ; | ||
| 326 | + } | ||
| 327 | + if ([responseObject isKindOfClass:[NSDictionary class]] && [responseObject[@"errorCode"] isEqualToString:@"0"]) { | ||
| 328 | + | ||
| 329 | + // 给用户库使用 | ||
| 330 | + NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; | ||
| 331 | + [userDefaults setObject:responseObject[@"data"][@"token"] forKey:@"CNLiveAuthToken"]; | ||
| 332 | + [userDefaults setObject:responseObject[@"data"][@"uid"] forKey:@"CNLiveUserSid"]; | ||
| 333 | + [userDefaults synchronize]; | ||
| 334 | + | ||
| 335 | + //登录成功,连接IM | ||
| 336 | + [strongSelf connectionIM:responseObject[@"data"]]; | ||
| 337 | + } | ||
| 338 | + else if ([responseObject isKindOfClass:[NSDictionary class]]) { | ||
| 339 | + [QMUITips showError:responseObject[@"errorMessage"] inView:XWKeyWindow hideAfterDelay:1.5]; | ||
| 340 | + } | ||
| 341 | + else{ | ||
| 342 | + [QMUITips showError:@"登录失败" inView:XWKeyWindow hideAfterDelay:1.5]; | ||
| 343 | + } | ||
| 344 | + | ||
| 345 | + }]; | ||
| 346 | + | ||
| 347 | +} | ||
| 348 | +- (void)connectionIM:(id)result{ | ||
| 349 | + NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithDictionary:result[@"data"]]; | ||
| 350 | + NSString *faceUrl = [dic objectForKey:@"faceUrl"]; | ||
| 351 | + if ([faceUrl containsString:@"/mobile/images/mobilehead/default/"]) { | ||
| 352 | + //网家家默认头像地址 | ||
| 353 | + [dic setValue:CNLiveNetAddDefaultHead forKey:@"faceUrl"]; | ||
| 354 | + } | ||
| 355 | + [CNUserInfoManager saveUserinfoDic:dic]; | ||
| 356 | + if (self.delegate && [self.delegate respondsToSelector:@selector(bindingSuccess:type:)]) { | ||
| 357 | + [self.delegate bindingSuccess:self type:self.type]; | ||
| 358 | + } | ||
| 359 | +} | ||
| 360 | + | ||
| 361 | +@end |
CNLiveBLoginModule/Classes/ThreeLogin/CNLiveThreeLoginType.h
0 → 100644
| 1 | +// | ||
| 2 | +// CNLiveThreeLoginType.h | ||
| 3 | +// CNLiveLoginModule | ||
| 4 | +// | ||
| 5 | +// Created by CNLive-zxw on 2019/9/9. | ||
| 6 | +// Copyright © 2019 153993236@qq.com. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#ifndef CNLiveThreeLoginType_h | ||
| 10 | +#define CNLiveThreeLoginType_h | ||
| 11 | + | ||
| 12 | +typedef NS_ENUM(NSInteger,CNLiveThreeLoginType) | ||
| 13 | +{ | ||
| 14 | + CNLiveThreeLoginType_UnKnown = -2, | ||
| 15 | + //预定义的平台 | ||
| 16 | + CNLiveThreeLoginType_Predefine_Begin = -1, | ||
| 17 | + CNLiveThreeLoginType_Sina = 0, //新浪 | ||
| 18 | + CNLiveThreeLoginType_WechatSession = 1, //微信聊天 | ||
| 19 | + CNLiveThreeLoginType_WechatTimeLine = 2, //微信朋友圈 | ||
| 20 | + CNLiveThreeLoginType_WechatFavorite = 3, //微信收藏 | ||
| 21 | + CNLiveThreeLoginType_QQ = 4, //QQ聊天页面 | ||
| 22 | + CNLiveThreeLoginType_Qzone = 5, //qq空间 | ||
| 23 | +}; | ||
| 24 | + | ||
| 25 | +#endif /* CNLiveThreeLoginType_h */ |
CNLiveBLoginModule/Classes/ThreeLogin/CNLiveThreeLoginView.h
0 → 100644
| 1 | +// | ||
| 2 | +// CNLiveThreeLoginView.h | ||
| 3 | +// CNLiveLoginModule | ||
| 4 | +// | ||
| 5 | +// Created by CNLive-zxw on 2019/9/6. | ||
| 6 | +// Copyright © 2019 153993236@qq.com. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import <UIKit/UIKit.h> | ||
| 10 | +//#import "CNLiveShareImageManager.h" | ||
| 11 | + | ||
| 12 | +NS_ASSUME_NONNULL_BEGIN | ||
| 13 | + | ||
| 14 | +@class CNLiveThreeLoginView; | ||
| 15 | +@protocol CNLiveThreeLoginViewDelegate <NSObject> | ||
| 16 | +//- (void)clickedButton:(CNLiveThreeLoginView *)view type:(CNLiveSendAuthResp)type; | ||
| 17 | + | ||
| 18 | +@end | ||
| 19 | +@interface CNLiveThreeLoginView : UIView | ||
| 20 | +@property (nonatomic, weak) id<CNLiveThreeLoginViewDelegate> delegate; | ||
| 21 | + | ||
| 22 | +@end | ||
| 23 | + | ||
| 24 | +NS_ASSUME_NONNULL_END |
CNLiveBLoginModule/Classes/ThreeLogin/CNLiveThreeLoginView.m
0 → 100644
| 1 | +// | ||
| 2 | +// CNLiveThreeLoginView.m | ||
| 3 | +// CNLiveLoginModule | ||
| 4 | +// | ||
| 5 | +// Created by CNLive-zxw on 2019/9/6. | ||
| 6 | +// Copyright © 2019 153993236@qq.com. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import "CNLiveThreeLoginView.h" | ||
| 10 | +#import "YYKit.h" | ||
| 11 | +#import "CNLiveCategory.h" | ||
| 12 | +//#import "CNLiveShareManager.h" | ||
| 13 | +//#import "WXApi.h" | ||
| 14 | + | ||
| 15 | +@interface CNLiveThreeLoginView() | ||
| 16 | + | ||
| 17 | +@end | ||
| 18 | +@implementation CNLiveThreeLoginView | ||
| 19 | +static NSInteger const rowHeight = 60; | ||
| 20 | +//- (instancetype)initWithFrame:(CGRect)frame{ | ||
| 21 | +// self = [super initWithFrame:frame]; | ||
| 22 | +// if (self) { | ||
| 23 | +// [self createSubviews:frame]; | ||
| 24 | +// | ||
| 25 | +// } | ||
| 26 | +// return self; | ||
| 27 | +// | ||
| 28 | +//} | ||
| 29 | +//- (void)createSubviews:(CGRect)frame{ | ||
| 30 | +// CGFloat width = frame.size.width; | ||
| 31 | +// CGFloat nameWidth = width/3.0; | ||
| 32 | +// CGFloat lineLeft = 15; | ||
| 33 | +// CGFloat lineWidth = nameWidth - lineLeft*2; | ||
| 34 | +// | ||
| 35 | +// UIView *leftLine = [[UIView alloc] initWithFrame:CGRectMake(lineLeft, (rowHeight/3.0-1)/2.0, lineWidth, 1)]; | ||
| 36 | +// leftLine.backgroundColor = [UIColor colorWithRed:173/255.0 green:173/255.0 blue:173/255.0 alpha:1.0]; | ||
| 37 | +// [self addSubview:leftLine]; | ||
| 38 | +// | ||
| 39 | +// UILabel *name = [[UILabel alloc] initWithFrame:CGRectMake(nameWidth, 0, nameWidth, rowHeight/3.0)]; | ||
| 40 | +// name.textColor = [UIColor colorWithRed:173/255.0 green:173/255.0 blue:173/255.0 alpha:1.0]; | ||
| 41 | +// name.font = [UIFont systemFontOfSize:14]; | ||
| 42 | +// name.textAlignment = NSTextAlignmentCenter; | ||
| 43 | +// name.text = @"第三方账号登录"; | ||
| 44 | +// [self addSubview:name]; | ||
| 45 | +// | ||
| 46 | +// UILabel *rightLine = [[UILabel alloc] initWithFrame:CGRectMake(name.right+15, leftLine.top, leftLine.width, 1)]; | ||
| 47 | +// rightLine.backgroundColor = [UIColor colorWithRed:173/255.0 green:173/255.0 blue:173/255.0 alpha:1.0]; | ||
| 48 | +// [self addSubview:rightLine]; | ||
| 49 | +// | ||
| 50 | +// NSMutableArray *pics = [NSMutableArray arrayWithArray:@[@"login_qq",@"login_weibo"]]; | ||
| 51 | +// if([WXApi isWXAppInstalled]||[[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"wechat://"]]){ | ||
| 52 | +// [pics insertObject:@"login_wechat" atIndex:0]; | ||
| 53 | +// } | ||
| 54 | +// NSUInteger number = pics.count; | ||
| 55 | +// if (@available(iOS 13, *)) { | ||
| 56 | +// [pics addObject:@"login_apple"]; | ||
| 57 | +// number = pics.count + 1; | ||
| 58 | +// } | ||
| 59 | +// CGFloat btnWidth = width/number*1.0; | ||
| 60 | +// | ||
| 61 | +// for(int i = 0; i < pics.count; i++){ | ||
| 62 | +// UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom]; | ||
| 63 | +// btn.tag = 10000+i; | ||
| 64 | +// btn.frame = CGRectMake(btnWidth*i, name.bottom, btnWidth, rowHeight); | ||
| 65 | +// if (@available(iOS 13, *)) { | ||
| 66 | +// if (i == pics.count-1) { | ||
| 67 | +// btn.frame = CGRectMake(btnWidth*i, name.bottom, 2*btnWidth, rowHeight); | ||
| 68 | +// } | ||
| 69 | +// } | ||
| 70 | +// UIImage *image = [self getImageWithImageName:pics[i] bundleName:@"CNLiveBLoginModule" targetClass:[self class]]; | ||
| 71 | +// [btn setImage:image forState:UIControlStateNormal]; | ||
| 72 | +// btn.adjustsImageWhenHighlighted = NO; | ||
| 73 | +// [btn addTarget:self action:@selector(btnDidClicked:) forControlEvents:UIControlEventTouchUpInside]; | ||
| 74 | +// [self addSubview:btn]; | ||
| 75 | +// | ||
| 76 | +// } | ||
| 77 | +// | ||
| 78 | +//} | ||
| 79 | +//- (void)btnDidClicked:(UIButton *)btn{ | ||
| 80 | +// if([WXApi isWXAppInstalled]||[[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"wechat://"]]){ | ||
| 81 | +// if (self.delegate && [self.delegate respondsToSelector:@selector(clickedButton:type:)]) { | ||
| 82 | +// if(btn.tag == 10000){ | ||
| 83 | +// [self.delegate clickedButton:self type:CNLiveSendAuthRespWX]; | ||
| 84 | +// | ||
| 85 | +// }else if (btn.tag == 10001){ | ||
| 86 | +// [self.delegate clickedButton:self type:CNLiveSendAuthRespQQ]; | ||
| 87 | +// | ||
| 88 | +// }else if(btn.tag == 10002){ | ||
| 89 | +// [self.delegate clickedButton:self type:CNLiveSendAuthRespWB]; | ||
| 90 | +// | ||
| 91 | +// }else if(btn.tag == 10003){ | ||
| 92 | +// [self.delegate clickedButton:self type:CNLiveSendAuthRespApple]; | ||
| 93 | +// | ||
| 94 | +// } | ||
| 95 | +// } | ||
| 96 | +// }else{ | ||
| 97 | +// if (self.delegate && [self.delegate respondsToSelector:@selector(clickedButton:type:)]) { | ||
| 98 | +// if(btn.tag == 10000){ | ||
| 99 | +// [self.delegate clickedButton:self type:CNLiveSendAuthRespQQ]; | ||
| 100 | +// | ||
| 101 | +// }else if(btn.tag == 10001){ | ||
| 102 | +// [self.delegate clickedButton:self type:CNLiveSendAuthRespWB]; | ||
| 103 | +// | ||
| 104 | +// }else if(btn.tag == 10002){ | ||
| 105 | +// [self.delegate clickedButton:self type:CNLiveSendAuthRespApple]; | ||
| 106 | +// | ||
| 107 | +// } | ||
| 108 | +// } | ||
| 109 | +// } | ||
| 110 | +// | ||
| 111 | +//} | ||
| 112 | + | ||
| 113 | +/* | ||
| 114 | +// Only override drawRect: if you perform custom drawing. | ||
| 115 | +// An empty implementation adversely affects performance during animation. | ||
| 116 | +- (void)drawRect:(CGRect)rect { | ||
| 117 | + // Drawing code | ||
| 118 | +} | ||
| 119 | +*/ | ||
| 120 | + | ||
| 121 | +@end |
CNLiveBLoginModule/Classes/View/CNLiveCompleteInfoView.h
0 → 100644
| 1 | +// | ||
| 2 | +// CNLiveCompleteInfoView.h | ||
| 3 | +// CNLiveLoginModule | ||
| 4 | +// | ||
| 5 | +// Created by 153993236@qq.com on 11/12/2019. | ||
| 6 | +// Copyright (c) 2019 153993236@qq.com. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import <UIKit/UIKit.h> | ||
| 10 | + | ||
| 11 | +NS_ASSUME_NONNULL_BEGIN | ||
| 12 | +@class CNLiveCompleteInfoView; | ||
| 13 | +@protocol CNLiveCompleteInfoViewDelegate <NSObject> | ||
| 14 | +- (void)loginSuccess:(CNLiveCompleteInfoView *)view result:(id _Nonnull)result; | ||
| 15 | + | ||
| 16 | +@end | ||
| 17 | +@interface CNLiveCompleteInfoView : UIView | ||
| 18 | +@property (nonatomic, weak) id<CNLiveCompleteInfoViewDelegate> delegate; | ||
| 19 | + | ||
| 20 | +@end | ||
| 21 | + | ||
| 22 | +NS_ASSUME_NONNULL_END |
CNLiveBLoginModule/Classes/View/CNLiveCompleteInfoView.m
0 → 100644
| 1 | +// | ||
| 2 | +// CNLiveCompleteInfoView.m | ||
| 3 | +// CNLiveLoginModule | ||
| 4 | +// | ||
| 5 | +// Created by 153993236@qq.com on 11/12/2019. | ||
| 6 | +// Copyright (c) 2019 153993236@qq.com. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import "CNLiveCompleteInfoView.h" | ||
| 10 | +#import "CNLiveLoginTextField.h" | ||
| 11 | +#import "YYKit.h" | ||
| 12 | +#import "QMUIKit.h" | ||
| 13 | + | ||
| 14 | +#import <CNLiveUserSystemSDK/CNLiveUserSystemCenter.h> | ||
| 15 | +#import <CNLiveUserSystemSDK/CNLiveUserSystemTypeDef.h> | ||
| 16 | +#import "CNUserInfoManager.h" | ||
| 17 | +#import "CNLiveEnvironment.h" | ||
| 18 | +#import "CNLiveManager.h" | ||
| 19 | +#import <AVFoundation/AVCaptureDevice.h> | ||
| 20 | +#import <AVFoundation/AVMediaFormat.h> | ||
| 21 | +#import "XFCameraController.h" | ||
| 22 | +#import "TZImagePickerController.h" | ||
| 23 | + | ||
| 24 | +#import "TIMAdapter.h" | ||
| 25 | +#import "CommonLibrary.h" | ||
| 26 | +#import "CNLiveCategory.h" | ||
| 27 | + | ||
| 28 | +#import "CNLiveLoginRequest.h" | ||
| 29 | + | ||
| 30 | +@interface CNLiveCompleteInfoView()<UITextFieldDelegate,UIImagePickerControllerDelegate,UINavigationControllerDelegate,TZImagePickerControllerDelegate,QMUIAlertControllerDelegate>{ | ||
| 31 | + UIImage *_image; | ||
| 32 | +} | ||
| 33 | + | ||
| 34 | +@property (nonatomic, weak) UIButton *head; | ||
| 35 | +@property (nonatomic, weak) CNLiveLoginTextField *nickname; | ||
| 36 | +@property (nonatomic, weak) UIButton *next; | ||
| 37 | +@property (nonatomic, strong) IMALoginParam *loginParam; | ||
| 38 | + | ||
| 39 | +@end | ||
| 40 | +@implementation CNLiveCompleteInfoView | ||
| 41 | + | ||
| 42 | +static NSInteger const rowHeight = 40; | ||
| 43 | +static NSInteger const space = 40; | ||
| 44 | +static const NSInteger timeValue = 1.5; | ||
| 45 | + | ||
| 46 | +- (instancetype)initWithFrame:(CGRect)frame{ | ||
| 47 | + self = [super initWithFrame:frame]; | ||
| 48 | + if (self) { | ||
| 49 | + self.userInteractionEnabled = YES; | ||
| 50 | + [self createSubviews:frame]; | ||
| 51 | + _loginParam = [[IMALoginParam alloc] init]; | ||
| 52 | + _image = nil; | ||
| 53 | + } | ||
| 54 | + return self; | ||
| 55 | + | ||
| 56 | +} | ||
| 57 | + | ||
| 58 | +- (void)createSubviews:(CGRect)frame{ | ||
| 59 | + UIButton *head = [UIButton buttonWithType:UIButtonTypeCustom]; | ||
| 60 | + head.frame = CGRectMake((frame.size.width-80)/2.0, 0, 80, 80); | ||
| 61 | + head.layer.cornerRadius = 40; | ||
| 62 | + head.layer.masksToBounds = YES; | ||
| 63 | + head.adjustsImageWhenHighlighted = NO; | ||
| 64 | + UIImage *image = [self getImageWithImageName:@"login_camera" bundleName:@"CNLiveBLoginModule" targetClass:[self class]]; | ||
| 65 | + [head setImage:image forState:UIControlStateNormal]; | ||
| 66 | + [head addTarget:self action:@selector(headDidClicked:) forControlEvents:UIControlEventTouchUpInside]; | ||
| 67 | + [self addSubview:head]; | ||
| 68 | + self.head = head; | ||
| 69 | + | ||
| 70 | + CNLiveLoginTextField *nickname = [[CNLiveLoginTextField alloc] initWithFrame:CGRectMake(0, head.bottom+space, frame.size.width, rowHeight)]; | ||
| 71 | + nickname.keyboardType = UIKeyboardTypeNumberPad; | ||
| 72 | + if(CNUserShareManager.isLogin&&CNUserShareModel.mobile.length >= 11){ | ||
| 73 | + nickname.text = [CNUserShareModel.mobile stringByReplacingCharactersInRange:NSMakeRange(3, 4) withString:@"****"]; | ||
| 74 | + } | ||
| 75 | + | ||
| 76 | + nickname.placeholder = @"请输入昵称"; | ||
| 77 | + nickname.textColor = [UIColor colorWithRed:51/255.0 green:51/255.0 blue:51/255.0 alpha:1.0]; | ||
| 78 | + nickname.placeholderColor = [UIColor colorWithRed:173/255.0 green:173/255.0 blue:173/255.0 alpha:1.0]; | ||
| 79 | + nickname.font = [UIFont systemFontOfSize:16]; | ||
| 80 | + nickname.textAlignment = NSTextAlignmentLeft; | ||
| 81 | + [nickname addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged]; | ||
| 82 | + nickname.clearButtonMode = UITextFieldViewModeWhileEditing; | ||
| 83 | + nickname.delegate = self; | ||
| 84 | + [self addSubview:nickname]; | ||
| 85 | + self.nickname = nickname; | ||
| 86 | + | ||
| 87 | + UIButton *next = [UIButton buttonWithType:UIButtonTypeCustom]; | ||
| 88 | + next.frame = CGRectMake(nickname.left, nickname.bottom+space, nickname.width, rowHeight); | ||
| 89 | + [next setTitle:@"下一步" forState:UIControlStateNormal]; | ||
| 90 | + [next setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; | ||
| 91 | + next.titleLabel.font = [UIFont systemFontOfSize:15.0]; | ||
| 92 | + UIColor *color = Business?[UIColor colorWithRed:72/255.0 green:168/255.0 blue:249/255.0 alpha:1.0]:[UIColor colorWithRed:35/255.0 green:212/255.0 blue:30/255.0 alpha:1.0]; | ||
| 93 | + next.backgroundColor = color; | ||
| 94 | + next.layer.cornerRadius = 20; | ||
| 95 | + next.layer.masksToBounds = YES; | ||
| 96 | + next.adjustsImageWhenHighlighted = NO; | ||
| 97 | + [next addTarget:self action:@selector(nextDidClicked:) forControlEvents:UIControlEventTouchUpInside]; | ||
| 98 | + [self addSubview:next]; | ||
| 99 | + self.next = next; | ||
| 100 | + | ||
| 101 | +} | ||
| 102 | + | ||
| 103 | +- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { | ||
| 104 | + [self endEditing:YES]; | ||
| 105 | + | ||
| 106 | +} | ||
| 107 | + | ||
| 108 | +#pragma mark - UITextFieldDelegate | ||
| 109 | +- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{ | ||
| 110 | + if ([textField isEqual:_nickname]) { | ||
| 111 | + return YES; | ||
| 112 | + } | ||
| 113 | + else { | ||
| 114 | + return YES; | ||
| 115 | + } | ||
| 116 | +} | ||
| 117 | + | ||
| 118 | +- (void)textFieldDidChange:(UITextField *)textField { | ||
| 119 | + if (![_nickname.text isEqualToString:@""]) { | ||
| 120 | + _next.enabled = YES; | ||
| 121 | + } | ||
| 122 | + else { | ||
| 123 | + _next.enabled = NO; | ||
| 124 | + } | ||
| 125 | + | ||
| 126 | +} | ||
| 127 | + | ||
| 128 | +- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { | ||
| 129 | + if ([textField isEqual:_nickname]) { | ||
| 130 | + NSInteger maxTextLength = 20; | ||
| 131 | + if(string.length == 0) { | ||
| 132 | + //判断是不是删除键 | ||
| 133 | + return YES; | ||
| 134 | + } | ||
| 135 | + else if(textField.text.length >= maxTextLength) { | ||
| 136 | + NSLog(@"输入的字符个数大于20,忽略输入"); | ||
| 137 | + return NO; | ||
| 138 | + } | ||
| 139 | + else if (textField.text.length + string.length > maxTextLength){ | ||
| 140 | + NSInteger length = textField.text.length; | ||
| 141 | + NSInteger needLen = maxTextLength - length; | ||
| 142 | + textField.text = [textField.text stringByAppendingString:[string substringToIndex:needLen]]; | ||
| 143 | + return NO; | ||
| 144 | + } | ||
| 145 | + else{ | ||
| 146 | + return YES; | ||
| 147 | + } | ||
| 148 | + } | ||
| 149 | + else{ | ||
| 150 | + return YES; | ||
| 151 | + } | ||
| 152 | +} | ||
| 153 | + | ||
| 154 | +#pragma mark - Action | ||
| 155 | +- (void)headDidClicked:(UIButton *)btn{ | ||
| 156 | + btn.userInteractionEnabled = NO; | ||
| 157 | + __weak typeof(self) weakSelf = self; | ||
| 158 | + QMUIAlertAction *action1 = [QMUIAlertAction actionWithTitle:@"拍照" style:QMUIAlertActionStyleDefault handler:^(__kindof QMUIAlertController *aAlertController, QMUIAlertAction *action) { | ||
| 159 | + btn.userInteractionEnabled = YES; | ||
| 160 | + __strong typeof(weakSelf) strongSelf = weakSelf; | ||
| 161 | + if(!strongSelf) return ; | ||
| 162 | + __strong typeof(strongSelf) weakSelf = strongSelf; | ||
| 163 | + [CNLiveAuthorizationManager getAVAuthorizationStatus:^{ | ||
| 164 | + __strong typeof(weakSelf) strongSelf = weakSelf; | ||
| 165 | + if(!strongSelf) return ; | ||
| 166 | + XFCameraController *cameraController = [[XFCameraController alloc] init]; | ||
| 167 | + cameraController.isCanShootVideo = NO; | ||
| 168 | + cameraController.modalPresentationStyle = UIModalPresentationFullScreen; | ||
| 169 | + __weak XFCameraController *weakCameraController = cameraController; | ||
| 170 | + __weak typeof(strongSelf) weakSelf = strongSelf; | ||
| 171 | + cameraController.takePhotosCompletionBlock = ^(UIImage *image, NSError *error) { | ||
| 172 | + __strong typeof(weakSelf) strongSelf = weakSelf; | ||
| 173 | + if(!strongSelf) return ; | ||
| 174 | + strongSelf->_image = image; | ||
| 175 | + [strongSelf.head setImage:strongSelf->_image forState:UIControlStateNormal]; | ||
| 176 | + dispatch_async(dispatch_get_main_queue(), ^{ | ||
| 177 | + [weakCameraController dismissViewControllerAnimated:YES completion:nil]; | ||
| 178 | + }); | ||
| 179 | + }; | ||
| 180 | + [(UIViewController *)self.delegate presentViewController:cameraController animated:YES completion:nil]; | ||
| 181 | + }]; | ||
| 182 | + | ||
| 183 | + }]; | ||
| 184 | + QMUIAlertAction *action2 = [QMUIAlertAction actionWithTitle:@"从手机相册中选择" style:QMUIAlertActionStyleDefault handler:^(__kindof QMUIAlertController *aAlertController, QMUIAlertAction *action) { | ||
| 185 | + btn.userInteractionEnabled = YES; | ||
| 186 | + __strong typeof(weakSelf) strongSelf = weakSelf; | ||
| 187 | + if(!strongSelf) return ; | ||
| 188 | + __strong typeof(strongSelf) weakSelf = strongSelf; | ||
| 189 | + [CNLiveAuthorizationManager getPHAuthorizationStatus:^{ | ||
| 190 | + __strong typeof(weakSelf) strongSelf = weakSelf; | ||
| 191 | + if(!strongSelf) return ; | ||
| 192 | + TZImagePickerController *picker = [[TZImagePickerController alloc] initWithMaxImagesCount:1 delegate:strongSelf]; | ||
| 193 | + picker.modalPresentationStyle = UIModalPresentationFullScreen; | ||
| 194 | + picker.allowPickingVideo = NO; | ||
| 195 | + picker.allowPreview = NO; | ||
| 196 | + __weak typeof(strongSelf) weakSelf = strongSelf; | ||
| 197 | + [picker setDidFinishPickingPhotosHandle:^(NSArray<UIImage *> *photos, NSArray *assets, BOOL isSelectOriginalPhoto) { | ||
| 198 | + __strong typeof(weakSelf) strongSelf = weakSelf; | ||
| 199 | + if(!strongSelf) return ; | ||
| 200 | + strongSelf->_image = [photos firstObject]; | ||
| 201 | + [strongSelf.head setImage:strongSelf->_image forState:UIControlStateNormal]; | ||
| 202 | + }]; | ||
| 203 | + [(UIViewController *)strongSelf.delegate presentViewController:picker animated:YES completion:nil]; | ||
| 204 | + }]; | ||
| 205 | + | ||
| 206 | + }]; | ||
| 207 | + QMUIAlertAction *cancel = [QMUIAlertAction actionWithTitle:@"取消" style:QMUIAlertActionStyleCancel handler:^(__kindof QMUIAlertController *aAlertController, QMUIAlertAction *action) { | ||
| 208 | + __strong typeof(weakSelf) strongSelf = weakSelf; | ||
| 209 | + if(!strongSelf) return ; | ||
| 210 | + | ||
| 211 | + }]; | ||
| 212 | + | ||
| 213 | + QMUIAlertController *alertController = [QMUIAlertController alertControllerWithTitle:@"" message:@"" preferredStyle:QMUIAlertControllerStyleActionSheet]; | ||
| 214 | + alertController.delegate = self; | ||
| 215 | + [alertController addAction:action1]; | ||
| 216 | + [alertController addAction:action2]; | ||
| 217 | + [alertController addAction:cancel]; | ||
| 218 | + | ||
| 219 | + NSMutableDictionary *titleAttributs = [[NSMutableDictionary alloc] initWithDictionary:alertController.alertTitleAttributes]; | ||
| 220 | + UIColor *color = Business?[UIColor colorWithRed:72/255.0 green:168/255.0 blue:249/255.0 alpha:1.0]:[UIColor colorWithRed:35/255.0 green:212/255.0 blue:30/255.0 alpha:1.0]; | ||
| 221 | + | ||
| 222 | + titleAttributs[NSForegroundColorAttributeName] = color; | ||
| 223 | + | ||
| 224 | + NSMutableDictionary *cancelAttributs = [[NSMutableDictionary alloc] initWithDictionary:alertController.alertTitleAttributes]; | ||
| 225 | + cancelAttributs[NSForegroundColorAttributeName] = [UIColor colorWithRed:51/255.0 green:51/255.0 blue:51/255.0 alpha:1.0]; | ||
| 226 | + | ||
| 227 | + action1.buttonAttributes = titleAttributs; | ||
| 228 | + action2.buttonAttributes = titleAttributs; | ||
| 229 | + cancel.buttonAttributes = cancelAttributs; | ||
| 230 | + | ||
| 231 | + [alertController showWithAnimated:YES]; | ||
| 232 | + | ||
| 233 | +} | ||
| 234 | + | ||
| 235 | +- (void)didHideAlertController:(QMUIAlertController *)alertController{ | ||
| 236 | + self.head.userInteractionEnabled = YES; | ||
| 237 | +} | ||
| 238 | + | ||
| 239 | +#pragma mark - 响应方法 | ||
| 240 | +- (void)nextDidClicked:(UIButton *)btn{ | ||
| 241 | + [_nickname resignFirstResponder]; | ||
| 242 | + if ([_nickname.text isEqualToString:@""]) { | ||
| 243 | + [QMUITips showError:@"请输入昵称" inView:self.superview hideAfterDelay:timeValue]; | ||
| 244 | + return; | ||
| 245 | + } | ||
| 246 | + self.next.userInteractionEnabled = NO; | ||
| 247 | + [self.superview endEditing:YES]; | ||
| 248 | + [self modifyNickName]; | ||
| 249 | +} | ||
| 250 | + | ||
| 251 | +// 修改名字 | ||
| 252 | +- (void)modifyNickName { | ||
| 253 | + [QMUITips showLoading:@"修改中" inView:self.superview]; | ||
| 254 | + __weak typeof(self) weakSelf = self; | ||
| 255 | + [CNLiveUserSystemCenter modifyUserInfoType:UserInfoTypeNickName uid:CNUserShareModel.uid modifyInfo:_nickname.text success:^(id result) { | ||
| 256 | + __strong typeof(weakSelf) strongSelf = weakSelf; | ||
| 257 | + if(!strongSelf) return; | ||
| 258 | + strongSelf.next.userInteractionEnabled = YES; | ||
| 259 | + CNUserShareModel.nickname = strongSelf.nickname.text; | ||
| 260 | + [QMUITips hideAllToastInView:strongSelf.superview animated:YES]; | ||
| 261 | + | ||
| 262 | + if (!strongSelf->_image) { | ||
| 263 | + [strongSelf connectionIM:result]; | ||
| 264 | + | ||
| 265 | + }else{ | ||
| 266 | + [strongSelf modifyIcon]; | ||
| 267 | + } | ||
| 268 | + | ||
| 269 | + } failure:^(NSDictionary *errorDic) { | ||
| 270 | + __strong typeof(weakSelf) strongSelf = weakSelf; | ||
| 271 | + if(!strongSelf) return; | ||
| 272 | + strongSelf.next.userInteractionEnabled = YES; | ||
| 273 | + [QMUITips hideAllToastInView:strongSelf.superview animated:YES]; | ||
| 274 | + [QMUITips showError:[errorDic objectForKey:@"errorMessage"] inView:strongSelf.superview hideAfterDelay:timeValue]; | ||
| 275 | + }]; | ||
| 276 | + | ||
| 277 | +} | ||
| 278 | + | ||
| 279 | +// 修改头像 | ||
| 280 | +- (void)modifyIcon { | ||
| 281 | + [QMUITips showLoading:@"修改中" inView:self.superview]; | ||
| 282 | + __weak typeof(self) weakSelf = self; | ||
| 283 | + [CNLiveUserSystemCenter uploadIconWithUid:CNUserShareModel.uid icon:_image success:^(id result) { | ||
| 284 | + __strong typeof(weakSelf) strongSelf = weakSelf; | ||
| 285 | + if(!strongSelf) return; | ||
| 286 | + strongSelf.next.userInteractionEnabled = YES; | ||
| 287 | + [QMUITips hideAllToastInView:strongSelf.superview animated:YES]; | ||
| 288 | + NSLog(@"result:%@",result); | ||
| 289 | + NSString *deFaceUrl = result[@"data"][@"faceUrl"]; | ||
| 290 | + NSString *faceUrl = @""; | ||
| 291 | + if ([deFaceUrl containsString:@"/mobile/images/mobilehead/default/"]) { | ||
| 292 | + faceUrl = CNLiveNetAddDefaultHead; | ||
| 293 | + }else{ | ||
| 294 | + faceUrl = deFaceUrl; | ||
| 295 | + } | ||
| 296 | + CNUserShareModel.faceUrl = faceUrl; | ||
| 297 | + [strongSelf connectionIM:result]; | ||
| 298 | + | ||
| 299 | + } failure:^(NSDictionary *errorDic) { | ||
| 300 | + __strong typeof(weakSelf) strongSelf = weakSelf; | ||
| 301 | + if(!strongSelf) return; | ||
| 302 | + strongSelf.next.userInteractionEnabled = YES; | ||
| 303 | + [QMUITips hideAllToastInView:strongSelf.superview animated:YES]; | ||
| 304 | + [QMUITips showError:errorDic[@"errorMessage"] inView:strongSelf.superview hideAfterDelay:timeValue]; | ||
| 305 | + }]; | ||
| 306 | + | ||
| 307 | +} | ||
| 308 | + | ||
| 309 | +// 连接IM | ||
| 310 | +- (void)connectionIM:(id)result{ | ||
| 311 | + NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithDictionary:result[@"data"]]; | ||
| 312 | + NSString *faceUrl = [dic objectForKey:@"faceUrl"]; | ||
| 313 | + if ([faceUrl containsString:@"/mobile/images/mobilehead/default/"]) { | ||
| 314 | + //网家家默认头像地址 | ||
| 315 | + [dic setValue:CNLiveNetAddDefaultHead forKey:@"faceUrl"]; | ||
| 316 | + } | ||
| 317 | + [CNUserInfoManager saveUserinfoDic:dic]; | ||
| 318 | + | ||
| 319 | + __weak typeof(self) weakSelf = self; | ||
| 320 | + [[CNLiveLoginRequest manager] loginTIM:CNUserShareModel.uid success:^{ | ||
| 321 | + __strong typeof(weakSelf) strongSelf = weakSelf; | ||
| 322 | + if(!strongSelf) return; | ||
| 323 | + // 进入tabbar | ||
| 324 | + if (strongSelf.delegate && [strongSelf.delegate respondsToSelector:@selector(loginSuccess:result:)]) { | ||
| 325 | + [strongSelf.delegate loginSuccess:strongSelf result:result]; | ||
| 326 | + } | ||
| 327 | + | ||
| 328 | + } failed:^(int code, NSString * _Nonnull msg) { | ||
| 329 | + __strong typeof(weakSelf) strongSelf = weakSelf; | ||
| 330 | + if(!strongSelf) return; | ||
| 331 | + // 错误逻辑 | ||
| 332 | + [QMUITips showError:msg inView:strongSelf.superview hideAfterDelay:timeValue]; | ||
| 333 | + | ||
| 334 | + }]; | ||
| 335 | + | ||
| 336 | +} | ||
| 337 | + | ||
| 338 | +/* | ||
| 339 | +// Only override drawRect: if you perform custom drawing. | ||
| 340 | +// An empty implementation adversely affects performance during animation. | ||
| 341 | +- (void)drawRect:(CGRect)rect { | ||
| 342 | + // Drawing code | ||
| 343 | +} | ||
| 344 | +*/ | ||
| 345 | + | ||
| 346 | +@end |
CNLiveBLoginModule/Classes/View/CNLiveLoginCountryView.h
0 → 100644
| 1 | +// | ||
| 2 | +// CNLiveLoginCountryView.h | ||
| 3 | +// CNLiveLoginModule | ||
| 4 | +// | ||
| 5 | +// Created by 153993236@qq.com on 11/12/2019. | ||
| 6 | +// Copyright (c) 2019 153993236@qq.com. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import <UIKit/UIKit.h> | ||
| 10 | + | ||
| 11 | +NS_ASSUME_NONNULL_BEGIN | ||
| 12 | +@protocol CNLiveLoginCountryViewDelegate <NSObject> | ||
| 13 | +- (void)chooseCountryName:(NSString *)countryName countryCode:(NSString *)countryCode; | ||
| 14 | + | ||
| 15 | +@end | ||
| 16 | +@interface CNLiveLoginCountryView : UIView | ||
| 17 | +@property (nonatomic, weak) id<CNLiveLoginCountryViewDelegate> delegate; | ||
| 18 | + | ||
| 19 | +@end | ||
| 20 | + | ||
| 21 | +NS_ASSUME_NONNULL_END |
CNLiveBLoginModule/Classes/View/CNLiveLoginCountryView.m
0 → 100644
| 1 | +// | ||
| 2 | +// CNLiveLoginCountryView.m | ||
| 3 | +// CNLiveLoginModule | ||
| 4 | +// | ||
| 5 | +// Created by 153993236@qq.com on 11/12/2019. | ||
| 6 | +// Copyright (c) 2019 153993236@qq.com. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import "CNLiveLoginCountryView.h" | ||
| 10 | +#import "YYKit.h" | ||
| 11 | +#import "CNLiveCategory.h" | ||
| 12 | + | ||
| 13 | +#import "CNLiveChooseCountryController.h" | ||
| 14 | + | ||
| 15 | +@interface CNLiveLoginCountryView()<ChooseCountriesDelegate> | ||
| 16 | +{ | ||
| 17 | + NSString *_countryName; | ||
| 18 | + NSString *_countryCode; | ||
| 19 | +} | ||
| 20 | +@property (nonatomic, weak) UILabel *name; | ||
| 21 | +@property (nonatomic, weak) UIButton *code; | ||
| 22 | + | ||
| 23 | +@end | ||
| 24 | +@implementation CNLiveLoginCountryView | ||
| 25 | + | ||
| 26 | +- (instancetype)initWithFrame:(CGRect)frame{ | ||
| 27 | + self = [super initWithFrame:frame]; | ||
| 28 | + if (self) { | ||
| 29 | + _countryName = @"中国大陆"; | ||
| 30 | + _countryCode = @"86"; | ||
| 31 | + [self createSubviews:frame]; | ||
| 32 | + } | ||
| 33 | + return self; | ||
| 34 | + | ||
| 35 | +} | ||
| 36 | +- (void)createSubviews:(CGRect)frame{ | ||
| 37 | + UILabel *name = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, frame.size.width-70, frame.size.height)]; | ||
| 38 | + name.textColor = [UIColor colorWithRed:173/255.0 green:173/255.0 blue:173/255.0 alpha:1.0]; | ||
| 39 | + name.font = [UIFont systemFontOfSize:16]; | ||
| 40 | + name.textAlignment = NSTextAlignmentLeft; | ||
| 41 | + name.text = _countryName; | ||
| 42 | + [self addSubview:name]; | ||
| 43 | + self.name = name; | ||
| 44 | + | ||
| 45 | + UIButton *code = [UIButton buttonWithType:UIButtonTypeCustom]; | ||
| 46 | + code.frame = CGRectMake(name.right, 0, 70, frame.size.height); | ||
| 47 | + [code setTitle:[NSString stringWithFormat:@"+%@",_countryCode] forState:UIControlStateNormal]; | ||
| 48 | + [code setTitleColor:[UIColor colorWithRed:51/255.0 green:51/255.0 blue:51/255.0 alpha:1.0] forState:UIControlStateNormal]; | ||
| 49 | + code.titleLabel.font = [UIFont systemFontOfSize:14]; | ||
| 50 | + UIImage *image = [self getImageWithImageName:@"login_country" bundleName:@"CNLiveBLoginModule" targetClass:[self class]]; | ||
| 51 | + [code setImage:image forState:UIControlStateNormal]; | ||
| 52 | + code.adjustsImageWhenHighlighted = NO; | ||
| 53 | + //button图片的偏移量,距上左下右分别(0, 0, 0, 0)像素点 | ||
| 54 | + code.imageEdgeInsets = UIEdgeInsetsMake(0, 60, 0, 0); | ||
| 55 | + //button标题的偏移量,这个偏移量是相对于图片的 | ||
| 56 | + code.titleEdgeInsets = UIEdgeInsetsMake(0, 0, 0, 10); | ||
| 57 | + [code addTarget:self action:@selector(countryCodeDidClicked:) forControlEvents:UIControlEventTouchUpInside]; | ||
| 58 | + [self addSubview:code]; | ||
| 59 | + self.code = code; | ||
| 60 | + | ||
| 61 | +} | ||
| 62 | + | ||
| 63 | +/* | ||
| 64 | +// Only override drawRect: if you perform custom drawing. | ||
| 65 | +// An empty implementation adversely affects performance during animation. | ||
| 66 | +- (void)drawRect:(CGRect)rect { | ||
| 67 | + // Drawing code | ||
| 68 | +} | ||
| 69 | +*/ | ||
| 70 | +#pragma mark - Action | ||
| 71 | +- (void)countryCodeDidClicked:(UIButton *)btn{ | ||
| 72 | + UIViewController *root = [UIApplication sharedApplication].delegate.window.rootViewController; | ||
| 73 | + CNLiveChooseCountryController *vc = [[CNLiveChooseCountryController alloc] init]; | ||
| 74 | + vc.delegate = self; | ||
| 75 | + vc.modalPresentationStyle = UIModalPresentationFullScreen; | ||
| 76 | + [root presentViewController:vc animated:YES completion:nil]; | ||
| 77 | +} | ||
| 78 | + | ||
| 79 | +#pragma mark - CNLiveSelectCountryViewDelegate | ||
| 80 | +- (void)chooseViewController:(CNLiveChooseCountryController *)controller countryName:(NSString *)countryName countryCode:(NSString *)countryCode{ | ||
| 81 | + if(![_countryName isEqualToString:countryName]&&![_countryCode isEqualToString:countryCode]){ | ||
| 82 | + _countryName = countryName; | ||
| 83 | + _countryCode = countryCode; | ||
| 84 | + _name.text = countryName; | ||
| 85 | + [_code setTitle:[NSString stringWithFormat:@"+%@",countryCode] forState:UIControlStateNormal]; | ||
| 86 | + } | ||
| 87 | + if (self.delegate && [self.delegate respondsToSelector:@selector(chooseCountryName:countryCode:)]) { | ||
| 88 | + [self.delegate chooseCountryName:countryName countryCode:countryCode]; | ||
| 89 | + } | ||
| 90 | +} | ||
| 91 | + | ||
| 92 | +@end |
CNLiveBLoginModule/Classes/View/CNLiveLoginTextField.h
0 → 100644
| 1 | +// | ||
| 2 | +// CNLiveLoginTextField.h | ||
| 3 | +// CNLiveLoginModule | ||
| 4 | +// | ||
| 5 | +// Created by 153993236@qq.com on 11/12/2019. | ||
| 6 | +// Copyright (c) 2019 153993236@qq.com. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import <UIKit/UIKit.h> | ||
| 10 | + | ||
| 11 | +NS_ASSUME_NONNULL_BEGIN | ||
| 12 | + | ||
| 13 | +@interface CNLiveLoginTextField : UITextField | ||
| 14 | +@property (nonatomic, strong) UIColor *lineColor; | ||
| 15 | +@property (nonatomic, strong) UIColor *placeholderColor; | ||
| 16 | + | ||
| 17 | +@end | ||
| 18 | + | ||
| 19 | +NS_ASSUME_NONNULL_END |
CNLiveBLoginModule/Classes/View/CNLiveLoginTextField.m
0 → 100644
| 1 | +// | ||
| 2 | +// XWLoginTextField.m | ||
| 3 | +// CNLiveLoginModule | ||
| 4 | +// | ||
| 5 | +// Created by 153993236@qq.com on 11/12/2019. | ||
| 6 | +// Copyright (c) 2019 153993236@qq.com. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import "CNLiveLoginTextField.h" | ||
| 10 | +#import <objc/runtime.h> | ||
| 11 | +//#import "XWColorHeader.h" | ||
| 12 | + | ||
| 13 | +@interface CNLiveLoginTextField() | ||
| 14 | +@property (nonatomic, weak) UIView *line; | ||
| 15 | +@property (nonatomic, strong) UIColor *color; | ||
| 16 | + | ||
| 17 | +@end | ||
| 18 | + | ||
| 19 | +@implementation CNLiveLoginTextField | ||
| 20 | +static NSString * const CNLivePlaceholderTextColor = @"_placeholderLabel.textColor"; | ||
| 21 | + | ||
| 22 | +- (instancetype)initWithFrame:(CGRect)frame{ | ||
| 23 | + | ||
| 24 | + self = [super initWithFrame:frame]; | ||
| 25 | + if (self) { | ||
| 26 | + [self createSubviews:frame]; | ||
| 27 | + | ||
| 28 | + } | ||
| 29 | + return self; | ||
| 30 | + | ||
| 31 | +} | ||
| 32 | +- (void)createSubviews:(CGRect)frame{ | ||
| 33 | + UIView *line = [[UIView alloc] initWithFrame:CGRectMake(0, frame.size.height-1, frame.size.width, 0.5)]; | ||
| 34 | + line.backgroundColor = [UIColor colorWithRed:173/255.0 green:173/255.0 blue:173/255.0 alpha:1.0]; | ||
| 35 | + [self addSubview:line]; | ||
| 36 | + self.line = line; | ||
| 37 | +} | ||
| 38 | +- (void)setLineColor:(UIColor *)lineColor{ | ||
| 39 | + _lineColor = lineColor; | ||
| 40 | + self.line.backgroundColor = lineColor; | ||
| 41 | +} | ||
| 42 | +/* | ||
| 43 | +// Only override drawRect: if you perform custom drawing. | ||
| 44 | +// An empty implementation adversely affects performance during animation. | ||
| 45 | +- (void)drawRect:(CGRect)rect { | ||
| 46 | + // Drawing code | ||
| 47 | +} | ||
| 48 | +*/ | ||
| 49 | + | ||
| 50 | ++ (void)initialize { | ||
| 51 | + if (@available(iOS 13.0, *)) { | ||
| 52 | + | ||
| 53 | + }else{ | ||
| 54 | + [self getIvars]; | ||
| 55 | + } | ||
| 56 | +} | ||
| 57 | + | ||
| 58 | +// 获取私有变量名称 | ||
| 59 | ++ (void)getIvars { | ||
| 60 | + unsigned int count = 0; | ||
| 61 | + Ivar *ivars = class_copyIvarList([UITextField class], &count); | ||
| 62 | + for (int i = 0; i < count; i++) { | ||
| 63 | + Ivar ivar = ivars[i]; | ||
| 64 | + NSLog(@"%s----%s", ivar_getName(ivar), ivar_getTypeEncoding(ivar)); | ||
| 65 | + } | ||
| 66 | + | ||
| 67 | +} | ||
| 68 | + | ||
| 69 | +- (void)awakeFromNib { | ||
| 70 | + // 设置光标的颜色 | ||
| 71 | + self.tintColor = self.textColor; | ||
| 72 | + [super awakeFromNib]; | ||
| 73 | +} | ||
| 74 | + | ||
| 75 | +// 获取到焦点 | ||
| 76 | +- (BOOL)becomeFirstResponder { | ||
| 77 | + if (@available(iOS 13.0, *)) { | ||
| 78 | + | ||
| 79 | + }else{ | ||
| 80 | + // 利用运行时获取key,设置占位文字的颜色 | ||
| 81 | + [self setValue:self.textColor forKeyPath:CNLivePlaceholderTextColor]; | ||
| 82 | + | ||
| 83 | + } | ||
| 84 | + return [super becomeFirstResponder]; | ||
| 85 | +} | ||
| 86 | + | ||
| 87 | +// 失去焦点 | ||
| 88 | +- (BOOL)resignFirstResponder { | ||
| 89 | + if (@available(iOS 13.0, *)) { | ||
| 90 | + }else{ | ||
| 91 | + // 利用运行时获取key,设置占位文字的颜色 | ||
| 92 | + [self setValue:self.color forKeyPath:CNLivePlaceholderTextColor]; | ||
| 93 | + } | ||
| 94 | + return [super resignFirstResponder]; | ||
| 95 | + | ||
| 96 | +} | ||
| 97 | +- (void)setPlaceholderColor:(UIColor *)placeholderColor{ | ||
| 98 | + _color = placeholderColor; | ||
| 99 | + if (_color) { | ||
| 100 | + _color = placeholderColor; | ||
| 101 | + } else { | ||
| 102 | + _color = [UIColor whiteColor]; | ||
| 103 | + } | ||
| 104 | + if (@available(iOS 13.0, *)) { | ||
| 105 | + self.attributedPlaceholder = [[NSAttributedString alloc] initWithString:self.placeholder attributes:@{NSFontAttributeName:self.font, NSForegroundColorAttributeName:_color}]; | ||
| 106 | + | ||
| 107 | + }else{ | ||
| 108 | + [self setValue:_color forKeyPath:CNLivePlaceholderTextColor]; | ||
| 109 | + } | ||
| 110 | + | ||
| 111 | +} | ||
| 112 | + | ||
| 113 | +- (UIColor *)placeholderColor{ | ||
| 114 | + return [self valueForKeyPath:CNLivePlaceholderTextColor]; | ||
| 115 | + | ||
| 116 | +} | ||
| 117 | + | ||
| 118 | +@end |
CNLiveBLoginModule/Classes/View/CNLiveLoginTipsView.h
0 → 100644
| 1 | +// | ||
| 2 | +// CNLiveLoginTipsView.h | ||
| 3 | +// CNLiveLoginModule | ||
| 4 | +// | ||
| 5 | +// Created by CNLive-zxw on 2019/11/11. | ||
| 6 | +// Copyright © 2019 cnlive. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import <UIKit/UIKit.h> | ||
| 10 | + | ||
| 11 | +NS_ASSUME_NONNULL_BEGIN | ||
| 12 | + | ||
| 13 | +@interface CNLiveLoginTipsView : UIView | ||
| 14 | + | ||
| 15 | ++ (void)showCenterLoginViewWithVC:(UIViewController *)controller; | ||
| 16 | ++ (void)hide; | ||
| 17 | + | ||
| 18 | +@end | ||
| 19 | + | ||
| 20 | +NS_ASSUME_NONNULL_END |
CNLiveBLoginModule/Classes/View/CNLiveLoginTipsView.m
0 → 100644
| 1 | +// | ||
| 2 | +// CNLiveLoginTipsView.m | ||
| 3 | +// CNLiveLoginModule | ||
| 4 | +// | ||
| 5 | +// Created by CNLive-zxw on 2019/11/11. | ||
| 6 | +// Copyright © 2019 cnlive. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import "CNLiveLoginTipsView.h" | ||
| 10 | +#import "CNLiveLoginTextField.h" | ||
| 11 | +#import "NSString+CNLiveExtension.h" | ||
| 12 | +#import "NSString+Category.h" | ||
| 13 | +#import "CNLiveUserAgreementManager.h" | ||
| 14 | +#import "CNLiveCategory.h" | ||
| 15 | + | ||
| 16 | +#import "MJExtension.h" | ||
| 17 | +#import "QMUIKit.h" | ||
| 18 | +#import "YYKit.h" | ||
| 19 | +#import "TIMAdapter.h" | ||
| 20 | +#import "CommonLibrary.h" | ||
| 21 | +#import <Masonry/Masonry.h> | ||
| 22 | + | ||
| 23 | +//#import "CNNavigationController.h" | ||
| 24 | +#import "CNLiveChooseCountryController.h" | ||
| 25 | +#import <CNLiveUserSystemSDK/CNLiveUserSystemCenter.h> | ||
| 26 | +#import <CNLiveUserSystemSDK/CNLiveUserSystemTypeDef.h> | ||
| 27 | +#import "CNUserInfoManager.h" | ||
| 28 | +#import "CNLiveEnvironment.h" | ||
| 29 | + | ||
| 30 | + | ||
| 31 | +#import "CNLiveThreeLoginView.h" | ||
| 32 | + | ||
| 33 | + | ||
| 34 | +//三方登录 | ||
| 35 | +//#import "CNThreeLoginViewController.h" | ||
| 36 | +//#import "CNLiveShareImageManager.h" | ||
| 37 | +//#import "CNThreeLoginModel.h" | ||
| 38 | +//#import "CNBindingManageRequest.h" | ||
| 39 | +//#import "NSObject+TransformModel.h" | ||
| 40 | +//#import "CNShareExtensionGroup.h" | ||
| 41 | +//#import "CNLoginIUsernfoViewController.h" | ||
| 42 | + | ||
| 43 | +@interface CNLiveLoginTipsView()<UITextFieldDelegate,ChooseCountriesDelegate,CNLiveThreeLoginViewDelegate>{ | ||
| 44 | + dispatch_source_t _timer; | ||
| 45 | + NSString * _codeStr; | ||
| 46 | + NSString * _countryStr; | ||
| 47 | +} | ||
| 48 | +@property (nonatomic, strong) IMALoginParam *loginParam; | ||
| 49 | + | ||
| 50 | +@property (nonatomic, strong) UIImageView *whiteView; | ||
| 51 | +@property (nonatomic, strong) UIButton *close; | ||
| 52 | + | ||
| 53 | +@property (nonatomic, strong) QMUILabel *countryLbl; | ||
| 54 | +@property (nonatomic, strong) UIButton *countryBtn; | ||
| 55 | +@property (nonatomic, strong) UIView *line; | ||
| 56 | + | ||
| 57 | +@property (nonatomic, strong) CNLiveLoginTextField *telTF; | ||
| 58 | +@property (nonatomic, strong) CNLiveLoginTextField *codeTF; | ||
| 59 | +@property (nonatomic, strong) UIButton *codeBtn; | ||
| 60 | +@property (nonatomic, strong) YYLabel *protocolLab; | ||
| 61 | +@property (nonatomic, strong) UIButton *login; | ||
| 62 | +@property (nonatomic, strong) CNLiveThreeLoginView *threeLoginView; | ||
| 63 | +@property (nonatomic, strong) CNLiveLoginTipsView *loginView; | ||
| 64 | + | ||
| 65 | +@end | ||
| 66 | + | ||
| 67 | +@implementation CNLiveLoginTipsView | ||
| 68 | +#define XWKeyWindow [UIApplication sharedApplication].keyWindow | ||
| 69 | + | ||
| 70 | +static const CGFloat rowHeight = 30; | ||
| 71 | +static const CGFloat margin = 15; | ||
| 72 | + | ||
| 73 | +#pragma mark - 单例 | ||
| 74 | ++ (instancetype)manager { | ||
| 75 | + static CNLiveLoginTipsView *_singleton = nil; | ||
| 76 | + static dispatch_once_t onceToken; | ||
| 77 | + dispatch_once(&onceToken, ^{ | ||
| 78 | + //不能再使用alloc方法 | ||
| 79 | + //因为已经重写了allocWithZone方法,所以这里要调用父类的分配空间的方法 | ||
| 80 | + _singleton = [[super allocWithZone:NULL] init]; | ||
| 81 | + }); | ||
| 82 | + return _singleton; | ||
| 83 | + | ||
| 84 | +} | ||
| 85 | + | ||
| 86 | ++ (void)showCenterLoginViewWithVC:(UIViewController *)controller { | ||
| 87 | + [CNLiveLoginTipsView manager].loginView = [[CNLiveLoginTipsView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height)]; | ||
| 88 | + [CNLiveLoginTipsView manager].loginView.backgroundColor = [UIColor colorWithWhite:0.2f alpha:0.4f]; | ||
| 89 | + [controller.view addSubview:[CNLiveLoginTipsView manager].loginView]; | ||
| 90 | +} | ||
| 91 | + | ||
| 92 | +#pragma mark - Init | ||
| 93 | +- (instancetype)initWithFrame:(CGRect)frame{ | ||
| 94 | + if(self = [super initWithFrame:frame]){ | ||
| 95 | + _codeStr = @"86"; | ||
| 96 | + _countryStr = @"中国大陆"; | ||
| 97 | + | ||
| 98 | + BOOL isAutoLogin = [IMAPlatform isAutoLogin]; | ||
| 99 | + if (isAutoLogin) { | ||
| 100 | + _loginParam = [IMALoginParam loadFromLocal]; | ||
| 101 | + | ||
| 102 | + } else { | ||
| 103 | + _loginParam = [[IMALoginParam alloc] init]; | ||
| 104 | + | ||
| 105 | + } | ||
| 106 | + | ||
| 107 | + [IMAPlatform configWith:_loginParam.config]; | ||
| 108 | + [self setUpUI]; | ||
| 109 | +// UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(closeBtn:)]; | ||
| 110 | +// [self addGestureRecognizer:tap]; | ||
| 111 | + | ||
| 112 | + } | ||
| 113 | + return self; | ||
| 114 | + | ||
| 115 | +} | ||
| 116 | +#pragma mark - UI | ||
| 117 | +- (void)setUpUI{ | ||
| 118 | + [self addSubview:self.whiteView]; | ||
| 119 | + [self addSubview:self.close]; | ||
| 120 | + | ||
| 121 | + [self addSubview:self.countryLbl]; | ||
| 122 | + [self addSubview:self.countryBtn]; | ||
| 123 | + [self addSubview:self.line]; | ||
| 124 | + | ||
| 125 | + [self addSubview:self.telTF]; | ||
| 126 | + [self addSubview:self.codeTF]; | ||
| 127 | + [self addSubview:self.codeBtn]; | ||
| 128 | + | ||
| 129 | + [self addSubview:self.login]; | ||
| 130 | + [self addSubview:self.threeLoginView]; | ||
| 131 | + [self addSubview:self.protocolLab]; | ||
| 132 | + [self.protocolLab mas_makeConstraints:^(MASConstraintMaker *make) { | ||
| 133 | + make.top.mas_equalTo(self.threeLoginView.mas_bottom).mas_offset(0); | ||
| 134 | + make.bottom.mas_equalTo(self.whiteView.mas_bottom).mas_offset(-0); | ||
| 135 | + make.left.mas_equalTo(self.countryLbl.mas_left).mas_offset(0); | ||
| 136 | + make.right.mas_equalTo(self.countryBtn.mas_right).mas_offset(-0); | ||
| 137 | + | ||
| 138 | + }]; | ||
| 139 | + | ||
| 140 | +} | ||
| 141 | +- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { | ||
| 142 | + [self endEditing:YES]; | ||
| 143 | +} | ||
| 144 | + | ||
| 145 | +#pragma mark - UITextFieldDelegate | ||
| 146 | +- (void)textFieldDidChange:(UITextField *)textField { | ||
| 147 | + if (![NSString isEmpty:_telTF.text] && ![NSString isEmpty:_codeTF.text]) { | ||
| 148 | + _login.enabled = YES; | ||
| 149 | + | ||
| 150 | + } | ||
| 151 | + else { | ||
| 152 | + _login.enabled = NO; | ||
| 153 | + | ||
| 154 | + } | ||
| 155 | + | ||
| 156 | +} | ||
| 157 | + | ||
| 158 | +- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { | ||
| 159 | + if ([textField isEqual:self.telTF]) { | ||
| 160 | + NSInteger maxTextLength = 20; | ||
| 161 | + if(string.length == 0) { | ||
| 162 | + //判断是不是删除键 | ||
| 163 | + return YES; | ||
| 164 | + } | ||
| 165 | + else if(textField.text.length >= maxTextLength) { | ||
| 166 | + //输入的字符个数大于11,则无法继续输入,返回NO表示禁止输入 | ||
| 167 | + NSLog(@"输入的字符个数大于20,忽略输入"); | ||
| 168 | + return NO; | ||
| 169 | + } | ||
| 170 | +// else if (!CNLiveStringIsNumber(string)) { | ||
| 171 | +// //string复制的可能为特殊字符,过滤 | ||
| 172 | +// return NO; | ||
| 173 | +// } | ||
| 174 | + else if (textField.text.length + string.length > maxTextLength){ | ||
| 175 | + NSInteger length = textField.text.length; | ||
| 176 | + NSInteger needLen = maxTextLength - length; | ||
| 177 | + textField.text = [textField.text stringByAppendingString:[string substringToIndex:needLen]]; | ||
| 178 | + return NO; | ||
| 179 | + } | ||
| 180 | + else{ | ||
| 181 | + return YES; | ||
| 182 | + } | ||
| 183 | + }else if ([textField isEqual:self.codeTF]){ | ||
| 184 | + NSInteger maxTextLength = 6; | ||
| 185 | + if(string.length == 0) { | ||
| 186 | + //判断是不是删除键 | ||
| 187 | + return YES; | ||
| 188 | + } | ||
| 189 | + else if(textField.text.length >= maxTextLength) { | ||
| 190 | + //输入的字符个数大于6,则无法继续输入,返回NO表示禁止输入 | ||
| 191 | + return NO; | ||
| 192 | + } | ||
| 193 | +// else if (!CNLiveStringIsNumber(string)) { | ||
| 194 | +// //string复制的可能为特殊字符,过滤 | ||
| 195 | +// return NO; | ||
| 196 | +// } | ||
| 197 | + else if (textField.text.length + string.length > maxTextLength){ | ||
| 198 | + //如果textF.text + string > 6 截取6位 | ||
| 199 | +#warning 有个问题,光标没有及时更新到最后一位 | ||
| 200 | + NSInteger length = textField.text.length; | ||
| 201 | + NSInteger needLen = maxTextLength - length; | ||
| 202 | + textField.text = [textField.text stringByAppendingString:[string substringToIndex:needLen]]; | ||
| 203 | + return NO; | ||
| 204 | + } | ||
| 205 | + else{ | ||
| 206 | + return YES; | ||
| 207 | + } | ||
| 208 | + }else | ||
| 209 | + { | ||
| 210 | + return YES; | ||
| 211 | + } | ||
| 212 | +} | ||
| 213 | +/* | ||
| 214 | +// Only override drawRect: if you perform custom drawing. | ||
| 215 | +// An empty implementation adversely affects performance during animation. | ||
| 216 | +- (void)drawRect:(CGRect)rect { | ||
| 217 | + // Drawing code | ||
| 218 | +} | ||
| 219 | +*/ | ||
| 220 | +#pragma mark - Lazy Loading | ||
| 221 | +- (UIImageView *)whiteView{ | ||
| 222 | + if (!_whiteView) { | ||
| 223 | + _whiteView = [[UIImageView alloc] initWithFrame:CGRectMake(([UIScreen mainScreen].bounds.size.width-287)/2.0, ([UIScreen mainScreen].bounds.size.height-396)/2.0, 287, 396)]; | ||
| 224 | + _whiteView.image = [UIImage imageNamed:@"tourists_login_bg"]; | ||
| 225 | + } | ||
| 226 | + return _whiteView; | ||
| 227 | +} | ||
| 228 | + | ||
| 229 | +- (UIButton *)close{ | ||
| 230 | + if (!_close) { | ||
| 231 | + _close = [[UIButton alloc]initWithFrame:CGRectMake(CGRectGetMaxX(_whiteView.frame)-25-10, CGRectGetMinY(_whiteView.frame)+10, 25, 25)]; | ||
| 232 | + [_close setImage:[UIImage imageNamed:@"tourists_login_close"] forState:UIControlStateNormal]; | ||
| 233 | + [_close addTarget:self action:@selector(closeBtn:) forControlEvents:UIControlEventTouchUpInside]; | ||
| 234 | + } | ||
| 235 | + return _close; | ||
| 236 | +} | ||
| 237 | + | ||
| 238 | +- (QMUILabel *)countryLbl{ | ||
| 239 | + if (!_countryLbl){ | ||
| 240 | + _countryLbl = [[QMUILabel alloc] initWithFrame:CGRectMake(_whiteView.left+margin, _whiteView.top+100, 80, rowHeight)]; | ||
| 241 | + [_countryLbl setFont:UIFontMake(13)]; | ||
| 242 | + _countryLbl.textColor = [UIColor colorWithRed:49/255.0 green:49/255.0 blue:49/255.0 alpha:1.0]; | ||
| 243 | + _countryLbl.text = _countryStr; | ||
| 244 | + _countryLbl.userInteractionEnabled = YES; | ||
| 245 | + } | ||
| 246 | + return _countryLbl; | ||
| 247 | +} | ||
| 248 | + | ||
| 249 | +- (UIButton *)countryBtn{ | ||
| 250 | + if (!_countryBtn){ | ||
| 251 | + _countryBtn = [[UIButton alloc]initWithFrame:CGRectMake(kScreenWidth-_whiteView.left-15-70, _countryLbl.top, 70, _countryLbl.height)]; | ||
| 252 | + _countryBtn.titleLabel.font = UIFontMake(13); | ||
| 253 | + [_countryBtn setTitleColor:[UIColor colorWithRed:49/255.0 green:49/255.0 blue:49/255.0 alpha:1.0] forState:UIControlStateNormal]; | ||
| 254 | + [_countryBtn setTitle:[NSString stringWithFormat:@"+%@", _codeStr] forState:UIControlStateNormal]; | ||
| 255 | + UIImage *image = [self getImageWithImageName:@"login_country" bundleName:@"CNLiveBLoginModule" targetClass:[self class]]; | ||
| 256 | + [_countryBtn setImage:image forState:UIControlStateNormal]; | ||
| 257 | + [_countryBtn addTarget:self action:@selector(countryBtn:) forControlEvents:UIControlEventTouchUpInside]; | ||
| 258 | + _countryBtn.userInteractionEnabled = YES; | ||
| 259 | + //button图片的偏移量,距上左下右分别(0, 0, 0, 0)像素点 | ||
| 260 | + _countryBtn.imageEdgeInsets = UIEdgeInsetsMake(0, 60, 0, 0); | ||
| 261 | + //button标题的偏移量,这个偏移量是相对于图片的 | ||
| 262 | + _countryBtn.titleEdgeInsets = UIEdgeInsetsMake(0, 0, 0, 10); | ||
| 263 | + } | ||
| 264 | + return _countryBtn; | ||
| 265 | +} | ||
| 266 | +- (UIView *)line{ | ||
| 267 | + if(!_line){ | ||
| 268 | + _line = [[UIView alloc] initWithFrame:CGRectMake(_countryLbl.left, _countryBtn.bottom, KScreenWidth - (2*_countryLbl.left), 0.5)]; | ||
| 269 | + _line.backgroundColor = [UIColor colorWithRed:235/255.0 green:235/255.0 blue:235/255.0 alpha:1.0]; | ||
| 270 | + } | ||
| 271 | + return _line; | ||
| 272 | +} | ||
| 273 | +- (CNLiveLoginTextField *)telTF{ | ||
| 274 | + if (!_telTF) { | ||
| 275 | + _telTF = [[CNLiveLoginTextField alloc] initWithFrame:CGRectMake(_countryLbl.left, _countryLbl.bottom + margin, KScreenWidth - (2*_countryLbl.left), rowHeight)]; | ||
| 276 | + _telTF.placeholderColor = KGray173Color; | ||
| 277 | + _telTF.textColor = [UIColor blackColor]; | ||
| 278 | + _telTF.keyboardType = UIKeyboardTypeNumberPad; | ||
| 279 | + _telTF.placeholder = @"请输入手机号号码"; | ||
| 280 | + _telTF.font = UIFontMake(13); | ||
| 281 | + _telTF.clearButtonMode = UITextFieldViewModeAlways; | ||
| 282 | + _telTF.textAlignment = NSTextAlignmentLeft; | ||
| 283 | + [_telTF addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged]; | ||
| 284 | + _telTF.delegate = self; | ||
| 285 | + } | ||
| 286 | + return _telTF; | ||
| 287 | +} | ||
| 288 | +- (CNLiveLoginTextField *)codeTF { | ||
| 289 | + if (!_codeTF) { | ||
| 290 | + _codeTF = [[CNLiveLoginTextField alloc] initWithFrame:CGRectMake(_telTF.left, _telTF.bottom + margin, 120, _telTF.height)]; | ||
| 291 | + _codeTF.keyboardType = UIKeyboardTypeNumberPad; | ||
| 292 | + _codeTF.placeholder = @"请输入验证码"; | ||
| 293 | + _codeTF.textColor = [UIColor blackColor]; | ||
| 294 | + _codeTF.placeholderColor = KGray173Color; | ||
| 295 | + _codeTF.font = UIFontMake(13); | ||
| 296 | + _codeTF.textAlignment = NSTextAlignmentLeft; | ||
| 297 | + [_codeTF addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged]; | ||
| 298 | + _codeTF.clearButtonMode = UITextFieldViewModeWhileEditing; | ||
| 299 | + _codeTF.delegate = self; | ||
| 300 | + } | ||
| 301 | + return _codeTF; | ||
| 302 | +} | ||
| 303 | +- (UIButton *)codeBtn{ | ||
| 304 | + if (!_codeBtn) { | ||
| 305 | + _codeBtn = [[UIButton alloc]initWithFrame:CGRectMake(kScreenWidth-_whiteView.left-margin-58, _codeTF.top+(rowHeight-22)/2.0, 58, 22)]; | ||
| 306 | + _codeBtn.titleLabel.font = [UIFont systemFontOfSize:10.0]; | ||
| 307 | + [_codeBtn setBackgroundImage:[UIImage imageNamed:@"dl_yzman"] forState:UIControlStateNormal]; | ||
| 308 | + [_codeBtn setTitleColor:[UIColor colorWithRed:35/255.0 green:212/255.0 blue:30/255.0 alpha:1.0] forState:UIControlStateNormal]; | ||
| 309 | + [_codeBtn setBackgroundImage:nil forState:UIControlStateSelected]; | ||
| 310 | + [_codeBtn setTitleColor:[UIColor colorWithRed:35/255.0 green:212/255.0 blue:30/255.0 alpha:1.0] forState:UIControlStateSelected]; | ||
| 311 | + [_codeBtn addTarget:self action:@selector(codeBtn:) forControlEvents:UIControlEventTouchUpInside]; | ||
| 312 | + [_codeBtn setAdjustsImageWhenHighlighted:NO]; | ||
| 313 | + } | ||
| 314 | + return _codeBtn; | ||
| 315 | +} | ||
| 316 | +- (UIButton *)login{ | ||
| 317 | + if (!_login) { | ||
| 318 | + _login = [[UIButton alloc]initWithFrame:CGRectMake(([UIScreen mainScreen].bounds.size.width-180)/2.0, _codeTF.bottom + margin, 180, rowHeight)]; | ||
| 319 | + _login.backgroundColor = [UIColor colorWithRed:35/255.0 green:212/255.0 blue:30/255.0 alpha:1.0]; | ||
| 320 | + _login.titleLabel.font = [UIFont systemFontOfSize:14.0]; | ||
| 321 | + _login.layer.cornerRadius = 15; | ||
| 322 | + _login.layer.masksToBounds = YES; | ||
| 323 | + [_login setTitle:@"登录" forState:UIControlStateNormal]; | ||
| 324 | + [_login setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; | ||
| 325 | + [_login addTarget:self action:@selector(loginBtn:) forControlEvents:UIControlEventTouchUpInside]; | ||
| 326 | + } | ||
| 327 | + return _login; | ||
| 328 | +} | ||
| 329 | + | ||
| 330 | +- (CNLiveThreeLoginView *)threeLoginView{ | ||
| 331 | + if (!_threeLoginView) { | ||
| 332 | + _threeLoginView = [[CNLiveThreeLoginView alloc]initWithFrame:CGRectMake(_whiteView.left, _login.bottom+margin, _whiteView.width, 80)]; | ||
| 333 | + _threeLoginView.delegate = self; | ||
| 334 | + } | ||
| 335 | + return _threeLoginView; | ||
| 336 | +} | ||
| 337 | + | ||
| 338 | +- (YYLabel *)protocolLab { | ||
| 339 | + if (!_protocolLab) { | ||
| 340 | + _protocolLab = [[YYLabel alloc] init]; | ||
| 341 | + _protocolLab.textAlignment = NSTextAlignmentCenter; | ||
| 342 | + | ||
| 343 | + NSMutableAttributedString *text = [[NSMutableAttributedString alloc] initWithString:@"登录即代表阅读并同意《用户协议》及《隐私政策》"]; | ||
| 344 | + NSMutableParagraphStyle *style = [[NSParagraphStyle defaultParagraphStyle] mutableCopy]; | ||
| 345 | + style.alignment = NSTextAlignmentCenter;//对齐方式 | ||
| 346 | + [text addAttribute:NSParagraphStyleAttributeName value:style range:NSMakeRange(0, text.length)]; | ||
| 347 | + | ||
| 348 | + text.color = UIColorMake(201, 202, 203); | ||
| 349 | + text.font = UIFontMake(10); | ||
| 350 | + | ||
| 351 | + __weak typeof(self) weakSelf = self; | ||
| 352 | + [text setTextHighlightRange:NSMakeRange(11, 4) color:[UIColor colorWithRed:35/255.0 green:212/255.0 blue:30/255.0 alpha:1.0] backgroundColor:[UIColor clearColor] tapAction:^(UIView * _Nonnull containerView, NSAttributedString * _Nonnull text, NSRange range, CGRect rect) { | ||
| 353 | + [weakSelf endEditing:YES]; | ||
| 354 | + [CNLiveUserAgreementManager jumpToAgreementH5WithType:CNLiveUserAgreementUser]; | ||
| 355 | + }]; | ||
| 356 | + [text setTextHighlightRange:NSMakeRange(text.length-5, 4) color:[UIColor colorWithRed:35/255.0 green:212/255.0 blue:30/255.0 alpha:1.0] backgroundColor:[UIColor clearColor] tapAction:^(UIView * _Nonnull containerView, NSAttributedString * _Nonnull text, NSRange range, CGRect rect) { | ||
| 357 | + [weakSelf endEditing:YES]; | ||
| 358 | + [CNLiveUserAgreementManager jumpToAgreementH5WithType:CNLiveUserAgreementPrivacy]; | ||
| 359 | + }]; | ||
| 360 | + | ||
| 361 | + _protocolLab.attributedText = text; | ||
| 362 | + | ||
| 363 | + } | ||
| 364 | + | ||
| 365 | + | ||
| 366 | + return _protocolLab; | ||
| 367 | +} | ||
| 368 | + | ||
| 369 | + | ||
| 370 | +#pragma mark - Action | ||
| 371 | +//点击✘按钮调用方法 | ||
| 372 | +- (void)closeBtn:(UIButton *)btn { | ||
| 373 | + [[CNLiveLoginTipsView manager].loginView removeFromSuperview]; | ||
| 374 | +} | ||
| 375 | + | ||
| 376 | ++ (void)hide { | ||
| 377 | + [[CNLiveLoginTipsView manager].loginView removeFromSuperview]; | ||
| 378 | +} | ||
| 379 | +- (void)codeBtn:(UIButton *)btn { | ||
| 380 | +// [CNTools setFrmId]; | ||
| 381 | + if ([self.telTF.text isEqualToString:@""]) { | ||
| 382 | + [QMUITips showWithText:@"请输入手机号" inView:XWKeyWindow hideAfterDelay:1.5]; | ||
| 383 | + [self cancelVerBtnChange]; | ||
| 384 | + return; | ||
| 385 | + } | ||
| 386 | + | ||
| 387 | + [_codeTF becomeFirstResponder]; | ||
| 388 | + _codeTF.text = nil; | ||
| 389 | + _codeBtn.userInteractionEnabled = NO; | ||
| 390 | + [QMUITips showLoadingInView:XWKeyWindow]; | ||
| 391 | + [CNLiveUserSystemCenter verificationCodeType:VerificationCodeTypeShortcutLogin mobile:_telTF.text countryCode:_codeStr success:^(id result) { | ||
| 392 | + _codeBtn.selected = YES; | ||
| 393 | + [self startTimer];//倒计时结束,打开交互性 | ||
| 394 | + [QMUITips hideAllToastInView:XWKeyWindow animated:YES]; | ||
| 395 | + [QMUITips showWithText:@"验证码已发送" inView:XWKeyWindow hideAfterDelay:1.5]; | ||
| 396 | + | ||
| 397 | + } failure:^(NSDictionary *errorDic) { | ||
| 398 | + [QMUITips hideAllToastInView:XWKeyWindow animated:YES]; | ||
| 399 | + if ([errorDic[@"errorCode"] integerValue] == 408) { | ||
| 400 | + [QMUITips showError:@"请输入正确的手机号" inView:XWKeyWindow hideAfterDelay:1.5]; | ||
| 401 | + | ||
| 402 | + }else{ | ||
| 403 | + [QMUITips showError:errorDic[@"errorMessage"] inView:XWKeyWindow hideAfterDelay:1.5]; | ||
| 404 | + } | ||
| 405 | + [self cancelVerBtnChange];//请求失败,复原按钮,打开交互性 | ||
| 406 | + | ||
| 407 | + }]; | ||
| 408 | + | ||
| 409 | +} | ||
| 410 | +#pragma mark - 倒计时 | ||
| 411 | +//恢复原状 | ||
| 412 | +- (void)cancelVerBtnChange { | ||
| 413 | + dispatch_async(dispatch_get_main_queue(), ^{ | ||
| 414 | + _codeBtn.selected = NO; | ||
| 415 | + [_codeBtn setTitle:@"" forState:UIControlStateNormal]; | ||
| 416 | + [_codeBtn setBackgroundImage:[UIImage imageNamed:@"dl_yzman"] forState:UIControlStateNormal]; | ||
| 417 | + //设置界面的按钮显示 | ||
| 418 | + _codeBtn.layer.borderWidth = 0; | ||
| 419 | + _codeBtn.userInteractionEnabled = YES; | ||
| 420 | + }); | ||
| 421 | + if (_timer) { | ||
| 422 | + dispatch_source_cancel(_timer);//取消定时器 | ||
| 423 | + } | ||
| 424 | +} | ||
| 425 | + | ||
| 426 | +//开始倒计时 | ||
| 427 | +- (void)startTimer { | ||
| 428 | + __block int timeout = 60; //倒计时时间 | ||
| 429 | + | ||
| 430 | + dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); | ||
| 431 | + | ||
| 432 | + _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,queue); | ||
| 433 | + | ||
| 434 | + dispatch_source_set_timer(_timer,dispatch_walltime(NULL, 0),1.0*NSEC_PER_SEC, 0); //每秒执行 | ||
| 435 | + | ||
| 436 | + dispatch_source_set_event_handler(_timer, ^{ | ||
| 437 | + | ||
| 438 | + if(timeout<=0){ //倒计时结束,关闭 | ||
| 439 | + | ||
| 440 | + dispatch_source_cancel(_timer); | ||
| 441 | + | ||
| 442 | + dispatch_async(dispatch_get_main_queue(), ^{ | ||
| 443 | + _codeBtn.selected = NO; | ||
| 444 | + [_codeBtn setTitle:@"" forState:UIControlStateNormal]; | ||
| 445 | + [_codeBtn setBackgroundImage:[UIImage imageNamed:@"dl_yzman"] forState:UIControlStateNormal]; | ||
| 446 | + //设置界面的按钮显示 根据自己需求设置 | ||
| 447 | + _codeBtn.layer.borderWidth = 0; | ||
| 448 | + _codeBtn.userInteractionEnabled = YES; | ||
| 449 | + | ||
| 450 | + }); | ||
| 451 | + | ||
| 452 | + }else{ | ||
| 453 | + | ||
| 454 | + int seconds = timeout % 60; | ||
| 455 | + NSString *strTime = [NSString stringWithFormat:@"%.2d", seconds]; | ||
| 456 | + | ||
| 457 | + if(seconds == 0)strTime = [NSString stringWithFormat:@"%d",timeout]; | ||
| 458 | + dispatch_async(dispatch_get_main_queue(), ^{ | ||
| 459 | + //设置界面的按钮显示 根据自己需求设置 | ||
| 460 | + _codeBtn.selected = YES; | ||
| 461 | + [_codeBtn setBackgroundImage:nil forState:UIControlStateNormal]; | ||
| 462 | + [_codeBtn setTitle:[NSString stringWithFormat:@"%@s",strTime] forState:UIControlStateSelected]; | ||
| 463 | + _codeBtn.layer.borderColor = UIColorMake(89, 210, 75).CGColor; | ||
| 464 | + _codeBtn.layer.borderWidth = 1; | ||
| 465 | + _codeBtn.layer.masksToBounds = YES; | ||
| 466 | + _codeBtn.layer.cornerRadius = 11.0; | ||
| 467 | + _codeBtn.userInteractionEnabled = NO; | ||
| 468 | + }); | ||
| 469 | + timeout--; | ||
| 470 | + | ||
| 471 | + } | ||
| 472 | + }); | ||
| 473 | + | ||
| 474 | + dispatch_resume(_timer); | ||
| 475 | +} | ||
| 476 | + | ||
| 477 | +- (void)countryBtn:(UIButton *)btn { | ||
| 478 | + UIViewController *root = [UIApplication sharedApplication].delegate.window.rootViewController; | ||
| 479 | + CNLiveChooseCountryController *vc = [[CNLiveChooseCountryController alloc] init]; | ||
| 480 | + vc.delegate = self; | ||
| 481 | + vc.modalPresentationStyle = UIModalPresentationFullScreen; | ||
| 482 | + [root presentViewController:vc animated:YES completion:nil]; | ||
| 483 | + | ||
| 484 | +} | ||
| 485 | +#pragma mark - CNLiveSelectCountryViewDelegate | ||
| 486 | +- (void)chooseViewController:(CNLiveChooseCountryController *)controller countryName:(NSString *)countryName countryCode:(NSString *)countryCode{ | ||
| 487 | + _countryLbl.text = countryName; | ||
| 488 | + _countryStr = countryName; | ||
| 489 | + [_countryBtn setTitle:[NSString stringWithFormat:@"+%@",countryCode] forState:UIControlStateNormal]; | ||
| 490 | + _codeStr = countryCode; | ||
| 491 | + NSLog(@"%@---%@",countryName,countryCode); | ||
| 492 | + | ||
| 493 | +} | ||
| 494 | + | ||
| 495 | +- (void)loginBtn:(UIButton *)btn { | ||
| 496 | + if ([_telTF.text isEqualToString:@""]) { | ||
| 497 | + [QMUITips showWithText:@"请输入手机号" inView:XWKeyWindow hideAfterDelay:1.5]; | ||
| 498 | + return; | ||
| 499 | + } | ||
| 500 | + | ||
| 501 | + if ([_codeTF.text isEqualToString:@""]) { | ||
| 502 | + [QMUITips showWithText:@"请输入验证码" inView:XWKeyWindow hideAfterDelay:1.5]; | ||
| 503 | + return; | ||
| 504 | + } | ||
| 505 | + | ||
| 506 | + [self endEditing:YES]; | ||
| 507 | + | ||
| 508 | + [QMUITips showLoading:@"登录中" inView:XWKeyWindow]; | ||
| 509 | + | ||
| 510 | + __weak typeof(self) weakSelf = self; | ||
| 511 | +// [CNLiveUserSystemCenter shortcutLoginWithUserName:_telTF.text countryCode:_codeStr verificationCode:_codeTF.text frmId:[CNTools getFrmId] success:^(id result) { | ||
| 512 | +// __strong typeof(weakSelf) strongSelf = weakSelf; | ||
| 513 | +// if(!strongSelf) return; | ||
| 514 | +// // 连接IM | ||
| 515 | +// [strongSelf connectionIM:result]; | ||
| 516 | +// | ||
| 517 | +// } failure:^(NSDictionary *errorDic) { | ||
| 518 | +// [QMUITips hideAllToastInView:AppKeyWindow animated:YES]; | ||
| 519 | +// [QMUITips showError:[errorDic objectForKey:@"errorMessage"] inView:AppKeyWindow hideAfterDelay:1.5]; | ||
| 520 | +// | ||
| 521 | +// }]; | ||
| 522 | + | ||
| 523 | +} | ||
| 524 | + | ||
| 525 | +#pragma mark - CNLiveThreeLoginViewDelegate | ||
| 526 | +//- (void)clickedButton:(CNLiveThreeLoginView *)view type:(CNLiveSendAuthResp)type{ | ||
| 527 | +// if(![CNLiveNetworking isNetworking]){ | ||
| 528 | +// [QMUITips showError:@"无法连接网络" inView:AppKeyWindow hideAfterDelay:1.5]; | ||
| 529 | +// return ; | ||
| 530 | +// } | ||
| 531 | +// [self endEditing:YES]; | ||
| 532 | +// __weak typeof(self) weakSelf = self; | ||
| 533 | +// [CNLiveShareImageManager send:type authRespBlock:^(CNLiveSendAuthResp type, CNLiveThirdPartyModel *userInfo, NSError *error) { | ||
| 534 | +// __strong typeof(weakSelf) strongSelf = weakSelf; | ||
| 535 | +// if(!strongSelf) return; | ||
| 536 | +// if(error){ | ||
| 537 | +// [QMUITips hideAllToastInView:AppKeyWindow animated:YES]; | ||
| 538 | +// if(error.code == 10000){ | ||
| 539 | +// //用户取消 | ||
| 540 | +// }else{ | ||
| 541 | +// [QMUITips showError:@"登录失败" inView:AppKeyWindow hideAfterDelay:1.5]; | ||
| 542 | +// } | ||
| 543 | +// return ; | ||
| 544 | +// } | ||
| 545 | +// CNThreeLoginModel *model = [CNThreeLoginModel cn_transformModelFromModel:userInfo]; | ||
| 546 | +// model.countryName = strongSelf->_countryStr; | ||
| 547 | +// model.countryCode = strongSelf->_codeStr; | ||
| 548 | +// model.frmId = [CNTools getFrmId]; | ||
| 549 | +// switch (type) { | ||
| 550 | +// case CNLiveSendAuthRespWX: | ||
| 551 | +// { | ||
| 552 | +// model.thirdPartyPlat = @"3"; | ||
| 553 | +// } | ||
| 554 | +// break; | ||
| 555 | +// case CNLiveSendAuthRespQQ: | ||
| 556 | +// { | ||
| 557 | +// model.thirdPartyPlat = @"2"; | ||
| 558 | +// } | ||
| 559 | +// break; | ||
| 560 | +// case CNLiveSendAuthRespWB: | ||
| 561 | +// { | ||
| 562 | +// model.thirdPartyPlat = @"1"; | ||
| 563 | +// } | ||
| 564 | +// break; | ||
| 565 | +// } | ||
| 566 | +// [strongSelf thirdPartyLoginWithType:type model:model]; | ||
| 567 | +// | ||
| 568 | +// }]; | ||
| 569 | +// | ||
| 570 | +//} | ||
| 571 | + | ||
| 572 | +//- (void)thirdPartyLoginWithType:(CNLiveSendAuthResp)type model:(CNThreeLoginModel *)model{ | ||
| 573 | +// [QMUITips showLoadingInView:AppKeyWindow]; | ||
| 574 | +// __weak typeof(self) weakSelf = self; | ||
| 575 | +// [CNBindingManageRequest thirdPartyLoginWithType:type model:model block:^(NSURLSessionTask * _Nonnull requestTask, id _Nonnull responseObject, NSError * _Nonnull error) { | ||
| 576 | +// __strong typeof(weakSelf) strongSelf = weakSelf; | ||
| 577 | +// if(!strongSelf) return; | ||
| 578 | +// [QMUITips hideAllToastInView:AppKeyWindow animated:YES]; | ||
| 579 | +// if ([responseObject isKindOfClass:[NSDictionary class]] && [responseObject[@"errorCode"] isEqualToString:@"42013"]) { | ||
| 580 | +// //未注册 | ||
| 581 | +// CNThreeLoginViewController *vc = [[CNThreeLoginViewController alloc]initWithModel:model]; | ||
| 582 | +// __weak typeof(strongSelf) weakSelf = strongSelf; | ||
| 583 | +// vc.block = ^(NSString * _Nonnull countryName, NSString * _Nonnull countryCode) { | ||
| 584 | +// __strong typeof(weakSelf) strongSelf = weakSelf; | ||
| 585 | +// if(!strongSelf) return; | ||
| 586 | +// strongSelf->_countryLbl.text = countryName; | ||
| 587 | +// strongSelf->_countryStr = countryName; | ||
| 588 | +// strongSelf->_countryLbl.text = [NSString stringWithFormat:@"+%@",countryCode]; | ||
| 589 | +// strongSelf->_codeStr = countryCode; | ||
| 590 | +// }; | ||
| 591 | +// vc.hidesBottomBarWhenPushed = YES; | ||
| 592 | +// CNNavigationController *nav = [[CNNavigationController alloc] initWithRootViewController:vc]; | ||
| 593 | +// [[AppDelegate sharedAppDelegate].topViewController presentViewController:nav animated:YES completion:^{ | ||
| 594 | +// | ||
| 595 | +// }]; | ||
| 596 | +// | ||
| 597 | +// } | ||
| 598 | +// else if ([responseObject isKindOfClass:[NSDictionary class]] && [responseObject[@"errorCode"] isEqualToString:@"0"]) { | ||
| 599 | +// //登录成功 | ||
| 600 | +// // 连接IM | ||
| 601 | +// [strongSelf connectionIM:responseObject]; | ||
| 602 | +// } | ||
| 603 | +// else if ([responseObject isKindOfClass:[NSDictionary class]] ) { | ||
| 604 | +// [QMUITips showError:responseObject[@"errorMessage"] inView:AppKeyWindow hideAfterDelay:1.5]; | ||
| 605 | +// } | ||
| 606 | +// else{ | ||
| 607 | +// [QMUITips hideAllToastInView:AppKeyWindow animated:YES]; | ||
| 608 | +// [QMUITips showError:@"登录失败" inView:AppKeyWindow hideAfterDelay:1.5]; | ||
| 609 | +// } | ||
| 610 | +// }]; | ||
| 611 | +// | ||
| 612 | +//} | ||
| 613 | +//- (void)connectionIM:(id)result{ | ||
| 614 | +// weakself | ||
| 615 | +// NSLog(@"result:%@",result); | ||
| 616 | +// | ||
| 617 | +// NSMutableDictionary *resDic = [NSMutableDictionary dictionaryWithDictionary:result[@"data"]]; | ||
| 618 | +// NSString *deFaceUrl = [resDic objectForKey:@"faceUrl"]; | ||
| 619 | +// NSString *faceUrl = @""; | ||
| 620 | +// if ([deFaceUrl containsString:@"/mobile/images/mobilehead/default/"]) { | ||
| 621 | +// faceUrl = CNLiveNetAddDefaultHead;//网家家默认头像地址 | ||
| 622 | +// [resDic setValue:faceUrl forKey:@"faceUrl"]; | ||
| 623 | +// } | ||
| 624 | +// [CNUserInfoManager saveUserinfoDic:resDic]; | ||
| 625 | +// [CNShareExtensionGroup writeMyInfoToShareGroup]; | ||
| 626 | +// //连接IM | ||
| 627 | +// [_loginParam getTIMLoginToken:CNUserShareModel.uid successBlock:^(NSString *token) { | ||
| 628 | +// | ||
| 629 | +// _loginParam.identifier = CNUserShareModel.uid; | ||
| 630 | +// _loginParam.userSig = token; | ||
| 631 | +// _loginParam.tokenTime = [[NSDate date] timeIntervalSince1970]; | ||
| 632 | +// | ||
| 633 | +// [[IMAPlatform sharedInstance] login:_loginParam succ:^{ | ||
| 634 | +// [NBSAppAgent setUserIdentifier:[CNLiveBusinessTools getSidIdfv]]; | ||
| 635 | +// [QMUITips hideAllToastInView:AppKeyWindow animated:YES]; | ||
| 636 | +// [AppDelegate sharedAppDelegate].loginPrepositionUrl = @"judgeGiftUrl"; | ||
| 637 | +// [QMUITips showSucceed:@"登录成功" inView:AppKeyWindow hideAfterDelay:1.5]; | ||
| 638 | +// [_loginParam saveToLocal]; | ||
| 639 | +// [[AppDelegate sharedAppDelegate] registNotification]; | ||
| 640 | +// [[IMAPlatform sharedInstance] configHost:_loginParam]; | ||
| 641 | +// [IMAPlatform sharedInstance].didConnectSuccess = YES; | ||
| 642 | +// //电商 | ||
| 643 | +// NSString *userID = CNUserShareModel.uid; | ||
| 644 | +// [[DSCnliveShopSDKManager sharedManager] loginUser:userID]; | ||
| 645 | +// //设置APP已活跃 | ||
| 646 | +// [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"is_Active_Application"]; | ||
| 647 | +// [[NSUserDefaults standardUserDefaults] synchronize]; | ||
| 648 | +// | ||
| 649 | +// | ||
| 650 | +// [AppDelegate sharedAppDelegate].loginAlert = YES; | ||
| 651 | +// if ([result[@"data"][@"isNewUser"] intValue] == 0) { | ||
| 652 | +// //老用户 | ||
| 653 | +// [[AppDelegate sharedAppDelegate] enterMainUI]; | ||
| 654 | +// [[AppDelegate sharedAppDelegate] registNotification]; | ||
| 655 | +// | ||
| 656 | +// } | ||
| 657 | +// else { | ||
| 658 | +// //新用户 | ||
| 659 | +// [OpenInstallSDK reportRegister]; | ||
| 660 | +// CNLoginIUsernfoViewController *vc = [[CNLoginIUsernfoViewController alloc] init]; | ||
| 661 | +// NSString *tel = _telTF.text; | ||
| 662 | +// if(_telTF.text.length == 11){ | ||
| 663 | +// tel = [_telTF.text stringByReplacingCharactersInRange:NSMakeRange(3, 4) withString:@"XXXX"]; | ||
| 664 | +// } | ||
| 665 | +// NSLog(@"tel:%@",tel); | ||
| 666 | +// vc.mobileStr = tel; | ||
| 667 | +// [[AppDelegate sharedAppDelegate] presentViewController:vc animated:NO completion:NULL]; | ||
| 668 | +// } | ||
| 669 | +// [[NSNotificationCenter defaultCenter] postNotificationName:kCNLive_LoginSuccess object:nil]; | ||
| 670 | +// | ||
| 671 | +// [CNDSShopActionViewModel networkParamAction]; | ||
| 672 | +// | ||
| 673 | +// [[IMAPlatform sharedInstance].host asyncSetAllowType:TIM_FRIEND_NEED_CONFIRM succ:^{ | ||
| 674 | +// NSLog(@"asyncSetAllowType Suc"); | ||
| 675 | +// [_loginParam saveToLocal]; | ||
| 676 | +// | ||
| 677 | +// } fail:^(int code, NSString *msg) { | ||
| 678 | +// NSLog(@"asyncSetAllowType failed : %@", msg); | ||
| 679 | +// }]; | ||
| 680 | +// | ||
| 681 | +// } fail:^(int code, NSString *msg) { | ||
| 682 | +// NSLog(@"login failed : %@", msg); | ||
| 683 | +// if (code == 6208) { | ||
| 684 | +// //离线被踢下线重新登录 | ||
| 685 | +//// [weakSelf resumeLogin]; | ||
| 686 | +// } | ||
| 687 | +// else | ||
| 688 | +// [QMUITips showError:msg inView:AppKeyWindow hideAfterDelay:1.5]; | ||
| 689 | +// [QMUITips hideAllToastInView:AppKeyWindow animated:YES]; | ||
| 690 | +// }]; | ||
| 691 | +// | ||
| 692 | +// } failedBlock:^(int code, NSString *errorMsg) { | ||
| 693 | +// [QMUITips hideAllToastInView:AppKeyWindow animated:YES]; | ||
| 694 | +// | ||
| 695 | +// }]; | ||
| 696 | +//} | ||
| 697 | + | ||
| 698 | +@end |
CNLiveBLoginModule/Classes/View/CNLiveLoginView.h
0 → 100644
| 1 | +// | ||
| 2 | +// CNLiveLoginView.h | ||
| 3 | +// CNLiveLoginModule | ||
| 4 | +// | ||
| 5 | +// Created by 153993236@qq.com on 11/12/2019. | ||
| 6 | +// Copyright (c) 2019 153993236@qq.com. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import <UIKit/UIKit.h> | ||
| 10 | + | ||
| 11 | +NS_ASSUME_NONNULL_BEGIN | ||
| 12 | +@class CNLiveLoginView; | ||
| 13 | +@protocol CNLiveLoginViewDelegate <NSObject> | ||
| 14 | +- (void)loginSuccess:(CNLiveLoginView *)view isNewUser:(BOOL)isNewUser result:(id _Nonnull)result; | ||
| 15 | + | ||
| 16 | +@end | ||
| 17 | +@interface CNLiveLoginView : UIView | ||
| 18 | +@property (nonatomic, weak) id<CNLiveLoginViewDelegate> delegate; | ||
| 19 | + | ||
| 20 | +@end | ||
| 21 | + | ||
| 22 | +NS_ASSUME_NONNULL_END |
CNLiveBLoginModule/Classes/View/CNLiveLoginView.m
0 → 100644
| 1 | +// | ||
| 2 | +// CNLiveLoginView.m | ||
| 3 | +// CNLiveLoginModule | ||
| 4 | +// | ||
| 5 | +// Created by 153993236@qq.com on 11/12/2019. | ||
| 6 | +// Copyright (c) 2019 153993236@qq.com. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import "CNLiveLoginView.h" | ||
| 10 | + | ||
| 11 | +#import "YYKit.h" | ||
| 12 | +#import "QMUIKit.h" | ||
| 13 | + | ||
| 14 | +#import <CNLiveUserSystemSDK/CNLiveUserSystemCenter.h> | ||
| 15 | +#import <CNLiveUserSystemSDK/CNLiveUserSystemTypeDef.h> | ||
| 16 | +#import "CNUserInfoManager.h" | ||
| 17 | +#import "CNLiveEnvironment.h" | ||
| 18 | +#import "CNLiveCategory.h" | ||
| 19 | +#import "TIMAdapter.h" | ||
| 20 | +#import "CommonLibrary.h" | ||
| 21 | + | ||
| 22 | +#import "CNLiveLoginRequest.h" | ||
| 23 | + | ||
| 24 | +#import "CNLiveLoginCountryView.h" | ||
| 25 | +#import "CNLiveLoginTextField.h" | ||
| 26 | +#import "CNLiveCountDownButton.h" | ||
| 27 | +//#import "XWLoginNotification.h" | ||
| 28 | + | ||
| 29 | +@interface CNLiveLoginView()<UITextFieldDelegate, CNLiveLoginCountryViewDelegate,CNLiveCountDownButtonDataSource, CNLiveCountDownButtonDelegate> | ||
| 30 | +{ | ||
| 31 | + NSString *_countryCode; // 国家Code | ||
| 32 | + NSString *_verificationCode; // 验证码 | ||
| 33 | +} | ||
| 34 | +@property (nonatomic, weak) UIImageView *logo; | ||
| 35 | +@property (nonatomic, weak) CNLiveLoginCountryView *country; | ||
| 36 | +@property (nonatomic, weak) CNLiveLoginTextField *account; | ||
| 37 | +@property (nonatomic, weak) CNLiveLoginTextField *code; | ||
| 38 | +@property (nonatomic, strong) CNLiveCountDownButton *countDown; | ||
| 39 | + | ||
| 40 | +@property (nonatomic, weak) UILabel *tips; | ||
| 41 | +@property (nonatomic, weak) UIButton *login; | ||
| 42 | + | ||
| 43 | +@end | ||
| 44 | + | ||
| 45 | +@implementation CNLiveLoginView | ||
| 46 | +#define XWKeyWindow [UIApplication sharedApplication].keyWindow | ||
| 47 | + | ||
| 48 | +static NSInteger const rowHeight = 40; | ||
| 49 | +static NSInteger const space = 16; | ||
| 50 | +static const NSInteger timeValue = 1.5; | ||
| 51 | + | ||
| 52 | +- (instancetype)initWithFrame:(CGRect)frame{ | ||
| 53 | + | ||
| 54 | + self = [super initWithFrame:frame]; | ||
| 55 | + if (self) { | ||
| 56 | + self.userInteractionEnabled = YES; | ||
| 57 | + _countryCode = @"86"; | ||
| 58 | + [self createSubviews:frame]; | ||
| 59 | + | ||
| 60 | + } | ||
| 61 | + return self; | ||
| 62 | + | ||
| 63 | +} | ||
| 64 | +- (void)createSubviews:(CGRect)frame{ | ||
| 65 | + UIImageView *logo = [[UIImageView alloc] initWithFrame:CGRectMake((frame.size.width-75)/2.0, 0, 75, 100)]; | ||
| 66 | + UIImage *image = [self getImageWithImageName:Business?@"login_logo_b":@"login_logo" bundleName:@"CNLiveBLoginModule" targetClass:[self class]]; | ||
| 67 | + logo.image = image; | ||
| 68 | + [self addSubview:logo]; | ||
| 69 | + self.logo = logo; | ||
| 70 | + | ||
| 71 | + CNLiveLoginCountryView *country = [[CNLiveLoginCountryView alloc] initWithFrame:CGRectMake(0, logo.bottom+space, frame.size.width, rowHeight)]; | ||
| 72 | + country.delegate = self; | ||
| 73 | + [self addSubview:country]; | ||
| 74 | + self.country = country; | ||
| 75 | + | ||
| 76 | + CNLiveLoginTextField *account = [[CNLiveLoginTextField alloc] initWithFrame:CGRectMake(country.left, country.bottom+space, frame.size.width, rowHeight)]; | ||
| 77 | + account.keyboardType = UIKeyboardTypeNumberPad; | ||
| 78 | + account.placeholder = @"请输入手机号"; | ||
| 79 | + account.textColor = [UIColor colorWithRed:51/255.0 green:51/255.0 blue:51/255.0 alpha:1.0]; | ||
| 80 | + account.placeholderColor = [UIColor colorWithRed:173/255.0 green:173/255.0 blue:173/255.0 alpha:1.0]; | ||
| 81 | + account.font = [UIFont systemFontOfSize:14]; | ||
| 82 | + account.textAlignment = NSTextAlignmentLeft; | ||
| 83 | + [account addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged]; | ||
| 84 | + account.clearButtonMode = UITextFieldViewModeWhileEditing; | ||
| 85 | + account.delegate = self; | ||
| 86 | + [self addSubview:account]; | ||
| 87 | + self.account = account; | ||
| 88 | + | ||
| 89 | + CNLiveLoginTextField *code = [[CNLiveLoginTextField alloc] initWithFrame:CGRectMake(country.left, account.bottom+space, frame.size.width/2.0, rowHeight)]; | ||
| 90 | + code.keyboardType = UIKeyboardTypeNumberPad; | ||
| 91 | + code.placeholder = @"请输入验证码"; | ||
| 92 | + code.textColor = [UIColor colorWithRed:51/255.0 green:51/255.0 blue:51/255.0 alpha:1.0]; | ||
| 93 | + code.placeholderColor = [UIColor colorWithRed:173/255.0 green:173/255.0 blue:173/255.0 alpha:1.0]; | ||
| 94 | + code.font = [UIFont systemFontOfSize:14]; | ||
| 95 | + code.textAlignment = NSTextAlignmentLeft; | ||
| 96 | + [code addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged]; | ||
| 97 | + code.clearButtonMode = UITextFieldViewModeWhileEditing; | ||
| 98 | + code.delegate = self; | ||
| 99 | + [self addSubview:code]; | ||
| 100 | + self.code = code; | ||
| 101 | + | ||
| 102 | + CNLiveCountDownButton *countDown = [CNLiveCountDownButton buttonWithType:UIButtonTypeCustom]; | ||
| 103 | + countDown.dataSource = self; | ||
| 104 | + countDown.delegate = self; | ||
| 105 | + countDown.frame = CGRectMake(frame.size.width-80, account.bottom+space+10, 80, rowHeight-10); | ||
| 106 | + UIImage *image2 = [self getImageWithImageName:Business?@"login_get_code_b":@"login_get_code" bundleName:@"CNLiveBLoginModule" targetClass:[self class]]; | ||
| 107 | + [countDown setImage:image2 forState:UIControlStateNormal]; | ||
| 108 | + countDown.adjustsImageWhenHighlighted = NO; | ||
| 109 | + [countDown setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; | ||
| 110 | + countDown.titleLabel.font = [UIFont systemFontOfSize:12.0]; | ||
| 111 | + countDown.layer.cornerRadius = 15; | ||
| 112 | + countDown.layer.masksToBounds = YES; | ||
| 113 | + [self addSubview:countDown]; | ||
| 114 | + self.countDown = countDown; | ||
| 115 | + | ||
| 116 | + UILabel *tips = [[UILabel alloc] initWithFrame:CGRectMake(0, code.bottom+space, frame.size.width, rowHeight/4.0)]; | ||
| 117 | + tips.textColor = [UIColor colorWithRed:153/255.0 green:153/255.0 blue:153/255.0 alpha:1.0]; | ||
| 118 | + tips.font = [UIFont systemFontOfSize:10]; | ||
| 119 | + tips.textAlignment = NSTextAlignmentCenter; | ||
| 120 | + tips.text = @"为了保证您的支付安全及个人信息隐私,请使用手机号码登录"; | ||
| 121 | + [self addSubview:tips]; | ||
| 122 | + self.tips = tips; | ||
| 123 | + | ||
| 124 | + UIButton *login = [UIButton buttonWithType:UIButtonTypeCustom]; | ||
| 125 | + login.frame = CGRectMake(5, tips.bottom+space, frame.size.width-10, rowHeight); | ||
| 126 | + [login setTitle:@"登录" forState:UIControlStateNormal]; | ||
| 127 | + [login setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; | ||
| 128 | + login.titleLabel.font = [UIFont systemFontOfSize:15.0]; | ||
| 129 | + UIColor *color = Business?[UIColor colorWithRed:72/255.0 green:168/255.0 blue:249/255.0 alpha:1.0]:[UIColor colorWithRed:35/255.0 green:212/255.0 blue:30/255.0 alpha:1.0]; | ||
| 130 | + login.backgroundColor = color; | ||
| 131 | + login.layer.cornerRadius = 20; | ||
| 132 | + login.layer.masksToBounds = YES; | ||
| 133 | + login.adjustsImageWhenHighlighted = NO; | ||
| 134 | + [login addTarget:self action:@selector(loginDidClicked:) forControlEvents:UIControlEventTouchUpInside]; | ||
| 135 | + [self addSubview:login]; | ||
| 136 | + self.login = login; | ||
| 137 | + | ||
| 138 | +} | ||
| 139 | + | ||
| 140 | +#pragma mark - UITextFieldDelegate | ||
| 141 | +- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{ | ||
| 142 | + if ([textField isEqual:_account] || [textField isEqual:_code]) { | ||
| 143 | + return YES; | ||
| 144 | + } | ||
| 145 | + else { | ||
| 146 | + return YES; | ||
| 147 | + } | ||
| 148 | +} | ||
| 149 | + | ||
| 150 | +- (void)textFieldDidChange:(UITextField *)textField { | ||
| 151 | + if (![_account.text isEqualToString:@""] && ![_code.text isEqualToString:@""]) { | ||
| 152 | + _login.enabled = YES; | ||
| 153 | + } | ||
| 154 | + else { | ||
| 155 | + _login.enabled = NO; | ||
| 156 | + } | ||
| 157 | +} | ||
| 158 | + | ||
| 159 | +- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { | ||
| 160 | + if ([textField isEqual:_account]) { | ||
| 161 | + NSInteger maxTextLength = 20; | ||
| 162 | + if(string.length == 0) { | ||
| 163 | + //判断是不是删除键 | ||
| 164 | + return YES; | ||
| 165 | + } | ||
| 166 | + else if(textField.text.length >= maxTextLength) { | ||
| 167 | + NSLog(@"输入的字符个数大于20,忽略输入"); | ||
| 168 | + return NO; | ||
| 169 | + } | ||
| 170 | + else if (![self isNum:string]) { | ||
| 171 | + return NO; | ||
| 172 | + } | ||
| 173 | + else if (textField.text.length + string.length > maxTextLength){ | ||
| 174 | + NSInteger length = textField.text.length; | ||
| 175 | + NSInteger needLen = maxTextLength - length; | ||
| 176 | + textField.text = [textField.text stringByAppendingString:[string substringToIndex:needLen]]; | ||
| 177 | + return NO; | ||
| 178 | + } | ||
| 179 | + else{ | ||
| 180 | + return YES; | ||
| 181 | + } | ||
| 182 | + } | ||
| 183 | + else if ([textField isEqual:self.code]){ | ||
| 184 | + NSInteger maxTextLength = 6; | ||
| 185 | + if(string.length == 0) { | ||
| 186 | + //判断是不是删除键 | ||
| 187 | + return YES; | ||
| 188 | + } | ||
| 189 | + else if(textField.text.length >= maxTextLength) { | ||
| 190 | + NSLog(@"输入的字符个数大于6,忽略输入"); | ||
| 191 | + return NO; | ||
| 192 | + } | ||
| 193 | + else if (![self isNum:string]) { | ||
| 194 | + return NO; | ||
| 195 | + } | ||
| 196 | + else if (textField.text.length + string.length > maxTextLength){ | ||
| 197 | + NSInteger length = textField.text.length; | ||
| 198 | + NSInteger needLen = maxTextLength - length; | ||
| 199 | + textField.text = [textField.text stringByAppendingString:[string substringToIndex:needLen]]; | ||
| 200 | + return NO; | ||
| 201 | + } | ||
| 202 | + else{ | ||
| 203 | + return YES; | ||
| 204 | + } | ||
| 205 | + } | ||
| 206 | + else{ | ||
| 207 | + return YES; | ||
| 208 | + } | ||
| 209 | +} | ||
| 210 | + | ||
| 211 | +/** 判断是否为纯数字 */ | ||
| 212 | +- (BOOL)isNum:(NSString *)checkedNumString { | ||
| 213 | + checkedNumString = [checkedNumString stringByTrimmingCharactersInSet:[NSCharacterSet decimalDigitCharacterSet]]; | ||
| 214 | + if(checkedNumString.length > 0) { | ||
| 215 | + return NO; | ||
| 216 | + } | ||
| 217 | + return YES; | ||
| 218 | +} | ||
| 219 | + | ||
| 220 | +/* | ||
| 221 | +// Only override drawRect: if you perform custom drawing. | ||
| 222 | +// An empty implementation adversely affects performance during animation. | ||
| 223 | +- (void)drawRect:(CGRect)rect { | ||
| 224 | + // Drawing code | ||
| 225 | +} | ||
| 226 | +*/ | ||
| 227 | + | ||
| 228 | +#pragma mark - CNLiveLoginCountryViewDelegate | ||
| 229 | +- (void)chooseCountryName:(NSString *)countryName countryCode:(NSString *)countryCode{ | ||
| 230 | + [_account resignFirstResponder]; | ||
| 231 | + [_code resignFirstResponder]; | ||
| 232 | + if(![_countryCode isEqualToString:countryCode]){ | ||
| 233 | + _countryCode = countryCode; | ||
| 234 | + } | ||
| 235 | +} | ||
| 236 | +#pragma mark - CNLiveCountDownButton DataSource | ||
| 237 | +// 设置倒计时总秒数 | ||
| 238 | +- (NSInteger)startCountDownNumOfCountDownButton:(CNLiveCountDownButton *)countdownButton { | ||
| 239 | + return 60; | ||
| 240 | +} | ||
| 241 | + | ||
| 242 | +#pragma mark - CNLiveCountDownButton Delegate | ||
| 243 | +// 倒计时按钮点击 | ||
| 244 | +- (void)countDownButtonDidClick:(CNLiveCountDownButton *)button { | ||
| 245 | + [_account resignFirstResponder]; | ||
| 246 | + [_code resignFirstResponder]; | ||
| 247 | + //获取验证码 | ||
| 248 | + if ([_account.text isEqualToString:@""]) { | ||
| 249 | + [QMUITips showError:@"请输入手机号" inView:XWKeyWindow hideAfterDelay:timeValue]; | ||
| 250 | + return; | ||
| 251 | + } | ||
| 252 | + // 按钮点击后将enabled设置为NO | ||
| 253 | + button.userInteractionEnabled = NO; | ||
| 254 | + | ||
| 255 | + __weak typeof(self) weakSelf = self; | ||
| 256 | + [QMUITips showLoadingInView:XWKeyWindow]; | ||
| 257 | + [CNLiveUserSystemCenter verificationCodeType:VerificationCodeTypeShortcutLogin mobile:_account.text countryCode:_countryCode success:^(id result) { | ||
| 258 | + button.userInteractionEnabled = YES; | ||
| 259 | + __strong typeof(weakSelf) strongSelf = weakSelf; | ||
| 260 | + if(!strongSelf) return; | ||
| 261 | + [QMUITips hideAllToastInView:XWKeyWindow animated:YES]; | ||
| 262 | + [QMUITips showSucceed:@"验证码已发送" inView:XWKeyWindow hideAfterDelay:timeValue]; | ||
| 263 | + button.backgroundColor = [UIColor colorWithRed:222/255.0 green:222/255.0 blue:222/255.0 alpha:1.0]; | ||
| 264 | + button.frame = CGRectMake(self.frame.size.width-110, self.account.bottom+space+10, 110, rowHeight-10); | ||
| 265 | + [button setImage:nil forState:UIControlStateNormal]; | ||
| 266 | + [button setTitle:[NSString stringWithFormat:@"%d秒后重新发送", 60] forState:UIControlStateNormal]; | ||
| 267 | + [button startCountDown]; | ||
| 268 | + | ||
| 269 | + } failure:^(NSDictionary *errorDic) { | ||
| 270 | + button.userInteractionEnabled = YES; | ||
| 271 | + __strong typeof(weakSelf) strongSelf = weakSelf; | ||
| 272 | + if(!strongSelf) return; | ||
| 273 | + [QMUITips hideAllToastInView:XWKeyWindow animated:YES]; | ||
| 274 | + if ([errorDic[@"errorCode"] integerValue] == 408) { | ||
| 275 | + [QMUITips showError:@"请输入正确的手机号" inView:XWKeyWindow hideAfterDelay:timeValue]; | ||
| 276 | + }else{ | ||
| 277 | + [QMUITips showError:[errorDic objectForKey:@"errorMessage"] inView:XWKeyWindow hideAfterDelay:timeValue]; | ||
| 278 | + } | ||
| 279 | + | ||
| 280 | + }]; | ||
| 281 | + | ||
| 282 | +} | ||
| 283 | + | ||
| 284 | +// 倒计时进行中 | ||
| 285 | +- (void)countDownButtonDidCountDown:(CNLiveCountDownButton *)button countDownNum:(NSInteger)countDownNum { | ||
| 286 | + if(button.frame.size.width != 110){ | ||
| 287 | + button.frame = CGRectMake(self.frame.size.width-110, self.account.bottom+space+10, 110, rowHeight-10); | ||
| 288 | + } | ||
| 289 | + NSString *title = [NSString stringWithFormat:@"%ld秒后重新发送", countDownNum]; | ||
| 290 | + [button setTitle:title forState:UIControlStateNormal]; | ||
| 291 | + | ||
| 292 | +} | ||
| 293 | + | ||
| 294 | +// 倒计时结束 | ||
| 295 | +- (void)countDownButtonDidEndCountDown:(CNLiveCountDownButton *)button { | ||
| 296 | + button.frame = CGRectMake(self.frame.size.width-80, self.account.bottom+space+10, 80, rowHeight-10); | ||
| 297 | + button.backgroundColor = [UIColor whiteColor]; | ||
| 298 | + button.userInteractionEnabled = YES; | ||
| 299 | + [button setTitle:@"" forState:UIControlStateNormal]; | ||
| 300 | + UIImage *image2 = [self getImageWithImageName:Business?@"login_get_code_b":@"login_get_code" bundleName:@"CNLiveBLoginModule" targetClass:[self class]]; | ||
| 301 | + [button setImage:image2 forState:UIControlStateNormal]; | ||
| 302 | +} | ||
| 303 | + | ||
| 304 | +#pragma mark - Action | ||
| 305 | +- (void)loginDidClicked:(UIButton *)btn{ | ||
| 306 | + [_account resignFirstResponder]; | ||
| 307 | + [_code resignFirstResponder]; | ||
| 308 | + //登录 | ||
| 309 | + if ([_account.text isEqualToString:@""]) { | ||
| 310 | + [QMUITips showError:@"请输入手机号" inView:XWKeyWindow hideAfterDelay:timeValue]; | ||
| 311 | + return; | ||
| 312 | + } | ||
| 313 | + if ([_code.text isEqualToString:@""]) { | ||
| 314 | + [QMUITips showError:@"请输入验证码" inView:XWKeyWindow hideAfterDelay:timeValue]; | ||
| 315 | + return; | ||
| 316 | + } | ||
| 317 | + btn.userInteractionEnabled = NO; | ||
| 318 | + // 隐藏键盘 | ||
| 319 | + [self.superview endEditing:YES]; | ||
| 320 | + | ||
| 321 | + [QMUITips showLoading:@"登录中" inView:XWKeyWindow]; | ||
| 322 | + | ||
| 323 | + __weak typeof(self) weakSelf = self; | ||
| 324 | + [CNLiveUserSystemCenter shortcutLoginWithUserName:_account.text countryCode:_countryCode verificationCode:_code.text frmId:@"apple" success:^(id result) { | ||
| 325 | + btn.userInteractionEnabled = YES; | ||
| 326 | + __strong typeof(weakSelf) strongSelf = weakSelf; | ||
| 327 | + if(!strongSelf) return; | ||
| 328 | + [QMUITips hideAllToastInView:XWKeyWindow animated:YES]; | ||
| 329 | + // 连接IM | ||
| 330 | + [strongSelf connectionIM:result]; | ||
| 331 | + | ||
| 332 | + } failure:^(NSDictionary *errorDic) { | ||
| 333 | + btn.userInteractionEnabled = YES; | ||
| 334 | + __strong typeof(weakSelf) strongSelf = weakSelf; | ||
| 335 | + if(!strongSelf) return; | ||
| 336 | + [QMUITips hideAllToastInView:XWKeyWindow animated:YES]; | ||
| 337 | + [QMUITips showError:[errorDic objectForKey:@"errorMessage"] inView:XWKeyWindow hideAfterDelay:timeValue]; | ||
| 338 | + }]; | ||
| 339 | +} | ||
| 340 | + | ||
| 341 | +#pragma mark - 连接IM | ||
| 342 | +- (void)connectionIM:(id)result{ | ||
| 343 | + NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithDictionary:result[@"data"]]; | ||
| 344 | + NSString *faceUrl = [dic objectForKey:@"faceUrl"]; | ||
| 345 | + if ([faceUrl containsString:@"/mobile/images/mobilehead/default/"]) { | ||
| 346 | + //网家家默认头像地址 | ||
| 347 | + [dic setValue:CNLiveNetAddDefaultHead forKey:@"faceUrl"]; | ||
| 348 | + } | ||
| 349 | + [CNUserInfoManager saveUserinfoDic:dic]; | ||
| 350 | + | ||
| 351 | + // YES 新用户 NO 老用户 | ||
| 352 | + BOOL isNewUser = [dic[@"isNewUser"] intValue] != 0; | ||
| 353 | + if (self.delegate && [self.delegate respondsToSelector:@selector(loginSuccess:isNewUser:result:)]) { | ||
| 354 | + [self.delegate loginSuccess:self isNewUser:isNewUser result:result]; | ||
| 355 | + } | ||
| 356 | +} | ||
| 357 | + | ||
| 358 | +@end |