Commit 0cb042ba82b5d8277df11eb0c5dce526d3b2a8d5
1 parent
809f0c69
no message
Showing
108 changed files
with
5856 additions
and
2 deletions
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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | ... | ... |
Example/CNLiveBLoginModule.xcodeproj/project.pbxproj
0 → 100644
| 1 | +// !$*UTF8*$! | |
| 2 | +{ | |
| 3 | + archiveVersion = 1; | |
| 4 | + classes = { | |
| 5 | + }; | |
| 6 | + objectVersion = 46; | |
| 7 | + objects = { | |
| 8 | + | |
| 9 | +/* Begin PBXBuildFile section */ | |
| 10 | + 6003F58E195388D20070C39A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F58D195388D20070C39A /* Foundation.framework */; }; | |
| 11 | + 6003F590195388D20070C39A /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F58F195388D20070C39A /* CoreGraphics.framework */; }; | |
| 12 | + 6003F592195388D20070C39A /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F591195388D20070C39A /* UIKit.framework */; }; | |
| 13 | + 6003F598195388D20070C39A /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 6003F596195388D20070C39A /* InfoPlist.strings */; }; | |
| 14 | + 6003F59A195388D20070C39A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 6003F599195388D20070C39A /* main.m */; }; | |
| 15 | + 6003F59E195388D20070C39A /* CNLIVEAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 6003F59D195388D20070C39A /* CNLIVEAppDelegate.m */; }; | |
| 16 | + 6003F5A7195388D20070C39A /* CNLIVEViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 6003F5A6195388D20070C39A /* CNLIVEViewController.m */; }; | |
| 17 | + 6003F5A9195388D20070C39A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6003F5A8195388D20070C39A /* Images.xcassets */; }; | |
| 18 | + 6003F5B0195388D20070C39A /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F5AF195388D20070C39A /* XCTest.framework */; }; | |
| 19 | + 6003F5B1195388D20070C39A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F58D195388D20070C39A /* Foundation.framework */; }; | |
| 20 | + 6003F5B2195388D20070C39A /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F591195388D20070C39A /* UIKit.framework */; }; | |
| 21 | + 6003F5BA195388D20070C39A /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 6003F5B8195388D20070C39A /* InfoPlist.strings */; }; | |
| 22 | + 6003F5BC195388D20070C39A /* Tests.m in Sources */ = {isa = PBXBuildFile; fileRef = 6003F5BB195388D20070C39A /* Tests.m */; }; | |
| 23 | + 71719F9F1E33DC2100824A3D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 71719F9D1E33DC2100824A3D /* LaunchScreen.storyboard */; }; | |
| 24 | + 873B8AEB1B1F5CCA007FD442 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 873B8AEA1B1F5CCA007FD442 /* Main.storyboard */; }; | |
| 25 | + 927364BFEDE21510FBD81DE4 /* Pods_CNLiveBLoginModule_Tests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F975564B3775482F12E8C1CC /* Pods_CNLiveBLoginModule_Tests.framework */; }; | |
| 26 | + DF7AC64DE95F126ABCAA1ED7 /* Pods_CNLiveBLoginModule_Example.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 52FE5A40A292F15738DED528 /* Pods_CNLiveBLoginModule_Example.framework */; }; | |
| 27 | +/* End PBXBuildFile section */ | |
| 28 | + | |
| 29 | +/* Begin PBXContainerItemProxy section */ | |
| 30 | + 6003F5B3195388D20070C39A /* PBXContainerItemProxy */ = { | |
| 31 | + isa = PBXContainerItemProxy; | |
| 32 | + containerPortal = 6003F582195388D10070C39A /* Project object */; | |
| 33 | + proxyType = 1; | |
| 34 | + remoteGlobalIDString = 6003F589195388D20070C39A; | |
| 35 | + remoteInfo = CNLiveBLoginModule; | |
| 36 | + }; | |
| 37 | +/* End PBXContainerItemProxy section */ | |
| 38 | + | |
| 39 | +/* Begin PBXFileReference section */ | |
| 40 | + 339077DBF7E302620172CBDC /* Pods-CNLiveBLoginModule_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CNLiveBLoginModule_Tests.release.xcconfig"; path = "Target Support Files/Pods-CNLiveBLoginModule_Tests/Pods-CNLiveBLoginModule_Tests.release.xcconfig"; sourceTree = "<group>"; }; | |
| 41 | + 3CD8CE8FD819154568F33724 /* Pods-CNLiveBLoginModule_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CNLiveBLoginModule_Tests.debug.xcconfig"; path = "Target Support Files/Pods-CNLiveBLoginModule_Tests/Pods-CNLiveBLoginModule_Tests.debug.xcconfig"; sourceTree = "<group>"; }; | |
| 42 | + 42B3AF9966C1A3852CBC9E34 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = ../README.md; sourceTree = "<group>"; }; | |
| 43 | + 52FE5A40A292F15738DED528 /* Pods_CNLiveBLoginModule_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_CNLiveBLoginModule_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; }; | |
| 44 | + 54A8334FE7156745AC15CA35 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = LICENSE; path = ../LICENSE; sourceTree = "<group>"; }; | |
| 45 | + 6003F58A195388D20070C39A /* CNLiveBLoginModule_Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = CNLiveBLoginModule_Example.app; sourceTree = BUILT_PRODUCTS_DIR; }; | |
| 46 | + 6003F58D195388D20070C39A /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; | |
| 47 | + 6003F58F195388D20070C39A /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; | |
| 48 | + 6003F591195388D20070C39A /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; | |
| 49 | + 6003F595195388D20070C39A /* CNLiveBLoginModule-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "CNLiveBLoginModule-Info.plist"; sourceTree = "<group>"; }; | |
| 50 | + 6003F597195388D20070C39A /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; }; | |
| 51 | + 6003F599195388D20070C39A /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; }; | |
| 52 | + 6003F59B195388D20070C39A /* CNLiveBLoginModule-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "CNLiveBLoginModule-Prefix.pch"; sourceTree = "<group>"; }; | |
| 53 | + 6003F59C195388D20070C39A /* CNLIVEAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CNLIVEAppDelegate.h; sourceTree = "<group>"; }; | |
| 54 | + 6003F59D195388D20070C39A /* CNLIVEAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CNLIVEAppDelegate.m; sourceTree = "<group>"; }; | |
| 55 | + 6003F5A5195388D20070C39A /* CNLIVEViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CNLIVEViewController.h; sourceTree = "<group>"; }; | |
| 56 | + 6003F5A6195388D20070C39A /* CNLIVEViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CNLIVEViewController.m; sourceTree = "<group>"; }; | |
| 57 | + 6003F5A8195388D20070C39A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = "<group>"; }; | |
| 58 | + 6003F5AE195388D20070C39A /* CNLiveBLoginModule_Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CNLiveBLoginModule_Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; | |
| 59 | + 6003F5AF195388D20070C39A /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; | |
| 60 | + 6003F5B7195388D20070C39A /* Tests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Tests-Info.plist"; sourceTree = "<group>"; }; | |
| 61 | + 6003F5B9195388D20070C39A /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; }; | |
| 62 | + 6003F5BB195388D20070C39A /* Tests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Tests.m; sourceTree = "<group>"; }; | |
| 63 | + 606FC2411953D9B200FFA9A0 /* Tests-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Tests-Prefix.pch"; sourceTree = "<group>"; }; | |
| 64 | + 71719F9E1E33DC2100824A3D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; }; | |
| 65 | + 873B8AEA1B1F5CCA007FD442 /* Main.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = Main.storyboard; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; }; | |
| 66 | + 9CEF25613EE9FE93EABF878B /* Pods-CNLiveBLoginModule_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CNLiveBLoginModule_Example.debug.xcconfig"; path = "Target Support Files/Pods-CNLiveBLoginModule_Example/Pods-CNLiveBLoginModule_Example.debug.xcconfig"; sourceTree = "<group>"; }; | |
| 67 | + DC942002C5B00991698D7E25 /* CNLiveBLoginModule.podspec */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = CNLiveBLoginModule.podspec; path = ../CNLiveBLoginModule.podspec; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; | |
| 68 | + ED3D4B1562BB9FB7F8BA73C6 /* Pods-CNLiveBLoginModule_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CNLiveBLoginModule_Example.release.xcconfig"; path = "Target Support Files/Pods-CNLiveBLoginModule_Example/Pods-CNLiveBLoginModule_Example.release.xcconfig"; sourceTree = "<group>"; }; | |
| 69 | + F975564B3775482F12E8C1CC /* Pods_CNLiveBLoginModule_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_CNLiveBLoginModule_Tests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; | |
| 70 | +/* End PBXFileReference section */ | |
| 71 | + | |
| 72 | +/* Begin PBXFrameworksBuildPhase section */ | |
| 73 | + 6003F587195388D20070C39A /* Frameworks */ = { | |
| 74 | + isa = PBXFrameworksBuildPhase; | |
| 75 | + buildActionMask = 2147483647; | |
| 76 | + files = ( | |
| 77 | + 6003F590195388D20070C39A /* CoreGraphics.framework in Frameworks */, | |
| 78 | + 6003F592195388D20070C39A /* UIKit.framework in Frameworks */, | |
| 79 | + 6003F58E195388D20070C39A /* Foundation.framework in Frameworks */, | |
| 80 | + DF7AC64DE95F126ABCAA1ED7 /* Pods_CNLiveBLoginModule_Example.framework in Frameworks */, | |
| 81 | + ); | |
| 82 | + runOnlyForDeploymentPostprocessing = 0; | |
| 83 | + }; | |
| 84 | + 6003F5AB195388D20070C39A /* Frameworks */ = { | |
| 85 | + isa = PBXFrameworksBuildPhase; | |
| 86 | + buildActionMask = 2147483647; | |
| 87 | + files = ( | |
| 88 | + 6003F5B0195388D20070C39A /* XCTest.framework in Frameworks */, | |
| 89 | + 6003F5B2195388D20070C39A /* UIKit.framework in Frameworks */, | |
| 90 | + 6003F5B1195388D20070C39A /* Foundation.framework in Frameworks */, | |
| 91 | + 927364BFEDE21510FBD81DE4 /* Pods_CNLiveBLoginModule_Tests.framework in Frameworks */, | |
| 92 | + ); | |
| 93 | + runOnlyForDeploymentPostprocessing = 0; | |
| 94 | + }; | |
| 95 | +/* End PBXFrameworksBuildPhase section */ | |
| 96 | + | |
| 97 | +/* Begin PBXGroup section */ | |
| 98 | + 6003F581195388D10070C39A = { | |
| 99 | + isa = PBXGroup; | |
| 100 | + children = ( | |
| 101 | + 60FF7A9C1954A5C5007DD14C /* Podspec Metadata */, | |
| 102 | + 6003F593195388D20070C39A /* Example for CNLiveBLoginModule */, | |
| 103 | + 6003F5B5195388D20070C39A /* Tests */, | |
| 104 | + 6003F58C195388D20070C39A /* Frameworks */, | |
| 105 | + 6003F58B195388D20070C39A /* Products */, | |
| 106 | + 6FC3F0C913C11F47B257C554 /* Pods */, | |
| 107 | + ); | |
| 108 | + sourceTree = "<group>"; | |
| 109 | + }; | |
| 110 | + 6003F58B195388D20070C39A /* Products */ = { | |
| 111 | + isa = PBXGroup; | |
| 112 | + children = ( | |
| 113 | + 6003F58A195388D20070C39A /* CNLiveBLoginModule_Example.app */, | |
| 114 | + 6003F5AE195388D20070C39A /* CNLiveBLoginModule_Tests.xctest */, | |
| 115 | + ); | |
| 116 | + name = Products; | |
| 117 | + sourceTree = "<group>"; | |
| 118 | + }; | |
| 119 | + 6003F58C195388D20070C39A /* Frameworks */ = { | |
| 120 | + isa = PBXGroup; | |
| 121 | + children = ( | |
| 122 | + 6003F58D195388D20070C39A /* Foundation.framework */, | |
| 123 | + 6003F58F195388D20070C39A /* CoreGraphics.framework */, | |
| 124 | + 6003F591195388D20070C39A /* UIKit.framework */, | |
| 125 | + 6003F5AF195388D20070C39A /* XCTest.framework */, | |
| 126 | + 52FE5A40A292F15738DED528 /* Pods_CNLiveBLoginModule_Example.framework */, | |
| 127 | + F975564B3775482F12E8C1CC /* Pods_CNLiveBLoginModule_Tests.framework */, | |
| 128 | + ); | |
| 129 | + name = Frameworks; | |
| 130 | + sourceTree = "<group>"; | |
| 131 | + }; | |
| 132 | + 6003F593195388D20070C39A /* Example for CNLiveBLoginModule */ = { | |
| 133 | + isa = PBXGroup; | |
| 134 | + children = ( | |
| 135 | + 6003F59C195388D20070C39A /* CNLIVEAppDelegate.h */, | |
| 136 | + 6003F59D195388D20070C39A /* CNLIVEAppDelegate.m */, | |
| 137 | + 873B8AEA1B1F5CCA007FD442 /* Main.storyboard */, | |
| 138 | + 6003F5A5195388D20070C39A /* CNLIVEViewController.h */, | |
| 139 | + 6003F5A6195388D20070C39A /* CNLIVEViewController.m */, | |
| 140 | + 71719F9D1E33DC2100824A3D /* LaunchScreen.storyboard */, | |
| 141 | + 6003F5A8195388D20070C39A /* Images.xcassets */, | |
| 142 | + 6003F594195388D20070C39A /* Supporting Files */, | |
| 143 | + ); | |
| 144 | + name = "Example for CNLiveBLoginModule"; | |
| 145 | + path = CNLiveBLoginModule; | |
| 146 | + sourceTree = "<group>"; | |
| 147 | + }; | |
| 148 | + 6003F594195388D20070C39A /* Supporting Files */ = { | |
| 149 | + isa = PBXGroup; | |
| 150 | + children = ( | |
| 151 | + 6003F595195388D20070C39A /* CNLiveBLoginModule-Info.plist */, | |
| 152 | + 6003F596195388D20070C39A /* InfoPlist.strings */, | |
| 153 | + 6003F599195388D20070C39A /* main.m */, | |
| 154 | + 6003F59B195388D20070C39A /* CNLiveBLoginModule-Prefix.pch */, | |
| 155 | + ); | |
| 156 | + name = "Supporting Files"; | |
| 157 | + sourceTree = "<group>"; | |
| 158 | + }; | |
| 159 | + 6003F5B5195388D20070C39A /* Tests */ = { | |
| 160 | + isa = PBXGroup; | |
| 161 | + children = ( | |
| 162 | + 6003F5BB195388D20070C39A /* Tests.m */, | |
| 163 | + 6003F5B6195388D20070C39A /* Supporting Files */, | |
| 164 | + ); | |
| 165 | + path = Tests; | |
| 166 | + sourceTree = "<group>"; | |
| 167 | + }; | |
| 168 | + 6003F5B6195388D20070C39A /* Supporting Files */ = { | |
| 169 | + isa = PBXGroup; | |
| 170 | + children = ( | |
| 171 | + 6003F5B7195388D20070C39A /* Tests-Info.plist */, | |
| 172 | + 6003F5B8195388D20070C39A /* InfoPlist.strings */, | |
| 173 | + 606FC2411953D9B200FFA9A0 /* Tests-Prefix.pch */, | |
| 174 | + ); | |
| 175 | + name = "Supporting Files"; | |
| 176 | + sourceTree = "<group>"; | |
| 177 | + }; | |
| 178 | + 60FF7A9C1954A5C5007DD14C /* Podspec Metadata */ = { | |
| 179 | + isa = PBXGroup; | |
| 180 | + children = ( | |
| 181 | + DC942002C5B00991698D7E25 /* CNLiveBLoginModule.podspec */, | |
| 182 | + 42B3AF9966C1A3852CBC9E34 /* README.md */, | |
| 183 | + 54A8334FE7156745AC15CA35 /* LICENSE */, | |
| 184 | + ); | |
| 185 | + name = "Podspec Metadata"; | |
| 186 | + sourceTree = "<group>"; | |
| 187 | + }; | |
| 188 | + 6FC3F0C913C11F47B257C554 /* Pods */ = { | |
| 189 | + isa = PBXGroup; | |
| 190 | + children = ( | |
| 191 | + 9CEF25613EE9FE93EABF878B /* Pods-CNLiveBLoginModule_Example.debug.xcconfig */, | |
| 192 | + ED3D4B1562BB9FB7F8BA73C6 /* Pods-CNLiveBLoginModule_Example.release.xcconfig */, | |
| 193 | + 3CD8CE8FD819154568F33724 /* Pods-CNLiveBLoginModule_Tests.debug.xcconfig */, | |
| 194 | + 339077DBF7E302620172CBDC /* Pods-CNLiveBLoginModule_Tests.release.xcconfig */, | |
| 195 | + ); | |
| 196 | + path = Pods; | |
| 197 | + sourceTree = "<group>"; | |
| 198 | + }; | |
| 199 | +/* End PBXGroup section */ | |
| 200 | + | |
| 201 | +/* Begin PBXNativeTarget section */ | |
| 202 | + 6003F589195388D20070C39A /* CNLiveBLoginModule_Example */ = { | |
| 203 | + isa = PBXNativeTarget; | |
| 204 | + buildConfigurationList = 6003F5BF195388D20070C39A /* Build configuration list for PBXNativeTarget "CNLiveBLoginModule_Example" */; | |
| 205 | + buildPhases = ( | |
| 206 | + FB82CB4346E92958307849D9 /* [CP] Check Pods Manifest.lock */, | |
| 207 | + 6003F586195388D20070C39A /* Sources */, | |
| 208 | + 6003F587195388D20070C39A /* Frameworks */, | |
| 209 | + 6003F588195388D20070C39A /* Resources */, | |
| 210 | + BBC1C2A08E24C56EDE49DF37 /* [CP] Embed Pods Frameworks */, | |
| 211 | + 15A7BE01FD10924E4F61D6AF /* [CP] Copy Pods Resources */, | |
| 212 | + ); | |
| 213 | + buildRules = ( | |
| 214 | + ); | |
| 215 | + dependencies = ( | |
| 216 | + ); | |
| 217 | + name = CNLiveBLoginModule_Example; | |
| 218 | + productName = CNLiveBLoginModule; | |
| 219 | + productReference = 6003F58A195388D20070C39A /* CNLiveBLoginModule_Example.app */; | |
| 220 | + productType = "com.apple.product-type.application"; | |
| 221 | + }; | |
| 222 | + 6003F5AD195388D20070C39A /* CNLiveBLoginModule_Tests */ = { | |
| 223 | + isa = PBXNativeTarget; | |
| 224 | + buildConfigurationList = 6003F5C2195388D20070C39A /* Build configuration list for PBXNativeTarget "CNLiveBLoginModule_Tests" */; | |
| 225 | + buildPhases = ( | |
| 226 | + 6F4CF912241B66B2163C0256 /* [CP] Check Pods Manifest.lock */, | |
| 227 | + 6003F5AA195388D20070C39A /* Sources */, | |
| 228 | + 6003F5AB195388D20070C39A /* Frameworks */, | |
| 229 | + 6003F5AC195388D20070C39A /* Resources */, | |
| 230 | + ); | |
| 231 | + buildRules = ( | |
| 232 | + ); | |
| 233 | + dependencies = ( | |
| 234 | + 6003F5B4195388D20070C39A /* PBXTargetDependency */, | |
| 235 | + ); | |
| 236 | + name = CNLiveBLoginModule_Tests; | |
| 237 | + productName = CNLiveBLoginModuleTests; | |
| 238 | + productReference = 6003F5AE195388D20070C39A /* CNLiveBLoginModule_Tests.xctest */; | |
| 239 | + productType = "com.apple.product-type.bundle.unit-test"; | |
| 240 | + }; | |
| 241 | +/* End PBXNativeTarget section */ | |
| 242 | + | |
| 243 | +/* Begin PBXProject section */ | |
| 244 | + 6003F582195388D10070C39A /* Project object */ = { | |
| 245 | + isa = PBXProject; | |
| 246 | + attributes = { | |
| 247 | + CLASSPREFIX = CNLIVE; | |
| 248 | + LastUpgradeCheck = 0720; | |
| 249 | + ORGANIZATIONNAME = "iOS-Xiaowen"; | |
| 250 | + TargetAttributes = { | |
| 251 | + 6003F589195388D20070C39A = { | |
| 252 | + DevelopmentTeam = 94X49GG3ZW; | |
| 253 | + }; | |
| 254 | + 6003F5AD195388D20070C39A = { | |
| 255 | + TestTargetID = 6003F589195388D20070C39A; | |
| 256 | + }; | |
| 257 | + }; | |
| 258 | + }; | |
| 259 | + buildConfigurationList = 6003F585195388D10070C39A /* Build configuration list for PBXProject "CNLiveBLoginModule" */; | |
| 260 | + compatibilityVersion = "Xcode 3.2"; | |
| 261 | + developmentRegion = English; | |
| 262 | + hasScannedForEncodings = 0; | |
| 263 | + knownRegions = ( | |
| 264 | + English, | |
| 265 | + en, | |
| 266 | + Base, | |
| 267 | + ); | |
| 268 | + mainGroup = 6003F581195388D10070C39A; | |
| 269 | + productRefGroup = 6003F58B195388D20070C39A /* Products */; | |
| 270 | + projectDirPath = ""; | |
| 271 | + projectRoot = ""; | |
| 272 | + targets = ( | |
| 273 | + 6003F589195388D20070C39A /* CNLiveBLoginModule_Example */, | |
| 274 | + 6003F5AD195388D20070C39A /* CNLiveBLoginModule_Tests */, | |
| 275 | + ); | |
| 276 | + }; | |
| 277 | +/* End PBXProject section */ | |
| 278 | + | |
| 279 | +/* Begin PBXResourcesBuildPhase section */ | |
| 280 | + 6003F588195388D20070C39A /* Resources */ = { | |
| 281 | + isa = PBXResourcesBuildPhase; | |
| 282 | + buildActionMask = 2147483647; | |
| 283 | + files = ( | |
| 284 | + 873B8AEB1B1F5CCA007FD442 /* Main.storyboard in Resources */, | |
| 285 | + 71719F9F1E33DC2100824A3D /* LaunchScreen.storyboard in Resources */, | |
| 286 | + 6003F5A9195388D20070C39A /* Images.xcassets in Resources */, | |
| 287 | + 6003F598195388D20070C39A /* InfoPlist.strings in Resources */, | |
| 288 | + ); | |
| 289 | + runOnlyForDeploymentPostprocessing = 0; | |
| 290 | + }; | |
| 291 | + 6003F5AC195388D20070C39A /* Resources */ = { | |
| 292 | + isa = PBXResourcesBuildPhase; | |
| 293 | + buildActionMask = 2147483647; | |
| 294 | + files = ( | |
| 295 | + 6003F5BA195388D20070C39A /* InfoPlist.strings in Resources */, | |
| 296 | + ); | |
| 297 | + runOnlyForDeploymentPostprocessing = 0; | |
| 298 | + }; | |
| 299 | +/* End PBXResourcesBuildPhase section */ | |
| 300 | + | |
| 301 | +/* Begin PBXShellScriptBuildPhase section */ | |
| 302 | + 15A7BE01FD10924E4F61D6AF /* [CP] Copy Pods Resources */ = { | |
| 303 | + isa = PBXShellScriptBuildPhase; | |
| 304 | + buildActionMask = 2147483647; | |
| 305 | + files = ( | |
| 306 | + ); | |
| 307 | + inputPaths = ( | |
| 308 | + "${PODS_ROOT}/Target Support Files/Pods-CNLiveBLoginModule_Example/Pods-CNLiveBLoginModule_Example-resources.sh", | |
| 309 | + "${PODS_CONFIGURATION_BUILD_DIR}/CNLiveBLoginModule/CNLiveBLoginModule.bundle", | |
| 310 | + "${PODS_CONFIGURATION_BUILD_DIR}/CNLiveUserAgreementManager/CNLiveUserAgreementManager.bundle", | |
| 311 | + ); | |
| 312 | + name = "[CP] Copy Pods Resources"; | |
| 313 | + outputPaths = ( | |
| 314 | + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/CNLiveBLoginModule.bundle", | |
| 315 | + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/CNLiveUserAgreementManager.bundle", | |
| 316 | + ); | |
| 317 | + runOnlyForDeploymentPostprocessing = 0; | |
| 318 | + shellPath = /bin/sh; | |
| 319 | + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-CNLiveBLoginModule_Example/Pods-CNLiveBLoginModule_Example-resources.sh\"\n"; | |
| 320 | + showEnvVarsInLog = 0; | |
| 321 | + }; | |
| 322 | + 6F4CF912241B66B2163C0256 /* [CP] Check Pods Manifest.lock */ = { | |
| 323 | + isa = PBXShellScriptBuildPhase; | |
| 324 | + buildActionMask = 2147483647; | |
| 325 | + files = ( | |
| 326 | + ); | |
| 327 | + inputFileListPaths = ( | |
| 328 | + ); | |
| 329 | + inputPaths = ( | |
| 330 | + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", | |
| 331 | + "${PODS_ROOT}/Manifest.lock", | |
| 332 | + ); | |
| 333 | + name = "[CP] Check Pods Manifest.lock"; | |
| 334 | + outputFileListPaths = ( | |
| 335 | + ); | |
| 336 | + outputPaths = ( | |
| 337 | + "$(DERIVED_FILE_DIR)/Pods-CNLiveBLoginModule_Tests-checkManifestLockResult.txt", | |
| 338 | + ); | |
| 339 | + runOnlyForDeploymentPostprocessing = 0; | |
| 340 | + shellPath = /bin/sh; | |
| 341 | + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; | |
| 342 | + showEnvVarsInLog = 0; | |
| 343 | + }; | |
| 344 | + BBC1C2A08E24C56EDE49DF37 /* [CP] Embed Pods Frameworks */ = { | |
| 345 | + isa = PBXShellScriptBuildPhase; | |
| 346 | + buildActionMask = 2147483647; | |
| 347 | + files = ( | |
| 348 | + ); | |
| 349 | + inputPaths = ( | |
| 350 | + "${PODS_ROOT}/Target Support Files/Pods-CNLiveBLoginModule_Example/Pods-CNLiveBLoginModule_Example-frameworks.sh", | |
| 351 | + "${BUILT_PRODUCTS_DIR}/AFNetworking/AFNetworking.framework", | |
| 352 | + "${BUILT_PRODUCTS_DIR}/CNLiveAVCamera/CNLiveAVCamera.framework", | |
| 353 | + "${BUILT_PRODUCTS_DIR}/CNLiveBaseClass/CNLiveBaseClass.framework", | |
| 354 | + "${BUILT_PRODUCTS_DIR}/CNLiveBaseKit/CNLiveBaseKit.framework", | |
| 355 | + "${BUILT_PRODUCTS_DIR}/CNLiveBaseTools/CNLiveBaseTools.framework", | |
| 356 | + "${BUILT_PRODUCTS_DIR}/CNLiveBeeHive/CNLiveBeeHive.framework", | |
| 357 | + "${BUILT_PRODUCTS_DIR}/CNLiveBusinessBaseModule/CNLiveBusinessBaseModule.framework", | |
| 358 | + "${BUILT_PRODUCTS_DIR}/CNLiveBusinessTools/CNLiveBusinessTools.framework", | |
| 359 | + "${BUILT_PRODUCTS_DIR}/CNLiveCacheManagerKit/CNLiveCacheManagerKit.framework", | |
| 360 | + "${BUILT_PRODUCTS_DIR}/CNLiveCategory/CNLiveCategory.framework", | |
| 361 | + "${BUILT_PRODUCTS_DIR}/CNLiveChooseCountry/CNLiveChooseCountry.framework", | |
| 362 | + "${BUILT_PRODUCTS_DIR}/CNLiveCommonCategory/CNLiveCommonCategory.framework", | |
| 363 | + "${BUILT_PRODUCTS_DIR}/CNLiveCustomControl/CNLiveCustomControl.framework", | |
| 364 | + "${BUILT_PRODUCTS_DIR}/CNLiveEnvironment/CNLiveEnvironment.framework", | |
| 365 | + "${BUILT_PRODUCTS_DIR}/CNLiveImagePickerController/CNLiveImagePickerController.framework", | |
| 366 | + "${BUILT_PRODUCTS_DIR}/CNLiveManager/CNLiveManager.framework", | |
| 367 | + "${BUILT_PRODUCTS_DIR}/CNLiveRequestBastKit/CNLiveRequestBastKit.framework", | |
| 368 | + "${BUILT_PRODUCTS_DIR}/CNLiveTripartiteManagement/CNLiveTripartiteManagement.framework", | |
| 369 | + "${BUILT_PRODUCTS_DIR}/CNLiveUploadManager/CNLiveUploadManager.framework", | |
| 370 | + "${BUILT_PRODUCTS_DIR}/CNLiveUserManagement/CNLiveUserManagement.framework", | |
| 371 | + "${BUILT_PRODUCTS_DIR}/FMDB/FMDB.framework", | |
| 372 | + "${BUILT_PRODUCTS_DIR}/HappyDNS/HappyDNS.framework", | |
| 373 | + "${BUILT_PRODUCTS_DIR}/MJExtension/MJExtension.framework", | |
| 374 | + "${BUILT_PRODUCTS_DIR}/Masonry/Masonry.framework", | |
| 375 | + "${BUILT_PRODUCTS_DIR}/QMUIKit/QMUIKit.framework", | |
| 376 | + "${BUILT_PRODUCTS_DIR}/Qiniu/Qiniu.framework", | |
| 377 | + "${BUILT_PRODUCTS_DIR}/SDAutoLayout/SDAutoLayout.framework", | |
| 378 | + "${BUILT_PRODUCTS_DIR}/SDWebImage/SDWebImage.framework", | |
| 379 | + "${PODS_ROOT}/TXIMSDK_iOS/ImSDK.framework", | |
| 380 | + "${BUILT_PRODUCTS_DIR}/WebViewJavascriptBridge/WebViewJavascriptBridge.framework", | |
| 381 | + "${BUILT_PRODUCTS_DIR}/YYKit/YYKit.framework", | |
| 382 | + ); | |
| 383 | + name = "[CP] Embed Pods Frameworks"; | |
| 384 | + outputPaths = ( | |
| 385 | + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/AFNetworking.framework", | |
| 386 | + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CNLiveAVCamera.framework", | |
| 387 | + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CNLiveBaseClass.framework", | |
| 388 | + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CNLiveBaseKit.framework", | |
| 389 | + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CNLiveBaseTools.framework", | |
| 390 | + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CNLiveBeeHive.framework", | |
| 391 | + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CNLiveBusinessBaseModule.framework", | |
| 392 | + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CNLiveBusinessTools.framework", | |
| 393 | + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CNLiveCacheManagerKit.framework", | |
| 394 | + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CNLiveCategory.framework", | |
| 395 | + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CNLiveChooseCountry.framework", | |
| 396 | + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CNLiveCommonCategory.framework", | |
| 397 | + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CNLiveCustomControl.framework", | |
| 398 | + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CNLiveEnvironment.framework", | |
| 399 | + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CNLiveImagePickerController.framework", | |
| 400 | + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CNLiveManager.framework", | |
| 401 | + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CNLiveRequestBastKit.framework", | |
| 402 | + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CNLiveTripartiteManagement.framework", | |
| 403 | + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CNLiveUploadManager.framework", | |
| 404 | + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CNLiveUserManagement.framework", | |
| 405 | + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FMDB.framework", | |
| 406 | + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/HappyDNS.framework", | |
| 407 | + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MJExtension.framework", | |
| 408 | + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Masonry.framework", | |
| 409 | + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/QMUIKit.framework", | |
| 410 | + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Qiniu.framework", | |
| 411 | + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SDAutoLayout.framework", | |
| 412 | + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SDWebImage.framework", | |
| 413 | + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ImSDK.framework", | |
| 414 | + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/WebViewJavascriptBridge.framework", | |
| 415 | + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/YYKit.framework", | |
| 416 | + ); | |
| 417 | + runOnlyForDeploymentPostprocessing = 0; | |
| 418 | + shellPath = /bin/sh; | |
| 419 | + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-CNLiveBLoginModule_Example/Pods-CNLiveBLoginModule_Example-frameworks.sh\"\n"; | |
| 420 | + showEnvVarsInLog = 0; | |
| 421 | + }; | |
| 422 | + FB82CB4346E92958307849D9 /* [CP] Check Pods Manifest.lock */ = { | |
| 423 | + isa = PBXShellScriptBuildPhase; | |
| 424 | + buildActionMask = 2147483647; | |
| 425 | + files = ( | |
| 426 | + ); | |
| 427 | + inputFileListPaths = ( | |
| 428 | + ); | |
| 429 | + inputPaths = ( | |
| 430 | + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", | |
| 431 | + "${PODS_ROOT}/Manifest.lock", | |
| 432 | + ); | |
| 433 | + name = "[CP] Check Pods Manifest.lock"; | |
| 434 | + outputFileListPaths = ( | |
| 435 | + ); | |
| 436 | + outputPaths = ( | |
| 437 | + "$(DERIVED_FILE_DIR)/Pods-CNLiveBLoginModule_Example-checkManifestLockResult.txt", | |
| 438 | + ); | |
| 439 | + runOnlyForDeploymentPostprocessing = 0; | |
| 440 | + shellPath = /bin/sh; | |
| 441 | + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; | |
| 442 | + showEnvVarsInLog = 0; | |
| 443 | + }; | |
| 444 | +/* End PBXShellScriptBuildPhase section */ | |
| 445 | + | |
| 446 | +/* Begin PBXSourcesBuildPhase section */ | |
| 447 | + 6003F586195388D20070C39A /* Sources */ = { | |
| 448 | + isa = PBXSourcesBuildPhase; | |
| 449 | + buildActionMask = 2147483647; | |
| 450 | + files = ( | |
| 451 | + 6003F59E195388D20070C39A /* CNLIVEAppDelegate.m in Sources */, | |
| 452 | + 6003F5A7195388D20070C39A /* CNLIVEViewController.m in Sources */, | |
| 453 | + 6003F59A195388D20070C39A /* main.m in Sources */, | |
| 454 | + ); | |
| 455 | + runOnlyForDeploymentPostprocessing = 0; | |
| 456 | + }; | |
| 457 | + 6003F5AA195388D20070C39A /* Sources */ = { | |
| 458 | + isa = PBXSourcesBuildPhase; | |
| 459 | + buildActionMask = 2147483647; | |
| 460 | + files = ( | |
| 461 | + 6003F5BC195388D20070C39A /* Tests.m in Sources */, | |
| 462 | + ); | |
| 463 | + runOnlyForDeploymentPostprocessing = 0; | |
| 464 | + }; | |
| 465 | +/* End PBXSourcesBuildPhase section */ | |
| 466 | + | |
| 467 | +/* Begin PBXTargetDependency section */ | |
| 468 | + 6003F5B4195388D20070C39A /* PBXTargetDependency */ = { | |
| 469 | + isa = PBXTargetDependency; | |
| 470 | + target = 6003F589195388D20070C39A /* CNLiveBLoginModule_Example */; | |
| 471 | + targetProxy = 6003F5B3195388D20070C39A /* PBXContainerItemProxy */; | |
| 472 | + }; | |
| 473 | +/* End PBXTargetDependency section */ | |
| 474 | + | |
| 475 | +/* Begin PBXVariantGroup section */ | |
| 476 | + 6003F596195388D20070C39A /* InfoPlist.strings */ = { | |
| 477 | + isa = PBXVariantGroup; | |
| 478 | + children = ( | |
| 479 | + 6003F597195388D20070C39A /* en */, | |
| 480 | + ); | |
| 481 | + name = InfoPlist.strings; | |
| 482 | + sourceTree = "<group>"; | |
| 483 | + }; | |
| 484 | + 6003F5B8195388D20070C39A /* InfoPlist.strings */ = { | |
| 485 | + isa = PBXVariantGroup; | |
| 486 | + children = ( | |
| 487 | + 6003F5B9195388D20070C39A /* en */, | |
| 488 | + ); | |
| 489 | + name = InfoPlist.strings; | |
| 490 | + sourceTree = "<group>"; | |
| 491 | + }; | |
| 492 | + 71719F9D1E33DC2100824A3D /* LaunchScreen.storyboard */ = { | |
| 493 | + isa = PBXVariantGroup; | |
| 494 | + children = ( | |
| 495 | + 71719F9E1E33DC2100824A3D /* Base */, | |
| 496 | + ); | |
| 497 | + name = LaunchScreen.storyboard; | |
| 498 | + sourceTree = "<group>"; | |
| 499 | + }; | |
| 500 | +/* End PBXVariantGroup section */ | |
| 501 | + | |
| 502 | +/* Begin XCBuildConfiguration section */ | |
| 503 | + 6003F5BD195388D20070C39A /* Debug */ = { | |
| 504 | + isa = XCBuildConfiguration; | |
| 505 | + buildSettings = { | |
| 506 | + ALWAYS_SEARCH_USER_PATHS = NO; | |
| 507 | + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; | |
| 508 | + CLANG_CXX_LIBRARY = "libc++"; | |
| 509 | + CLANG_ENABLE_MODULES = YES; | |
| 510 | + CLANG_ENABLE_OBJC_ARC = YES; | |
| 511 | + CLANG_WARN_BOOL_CONVERSION = YES; | |
| 512 | + CLANG_WARN_CONSTANT_CONVERSION = YES; | |
| 513 | + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; | |
| 514 | + CLANG_WARN_EMPTY_BODY = YES; | |
| 515 | + CLANG_WARN_ENUM_CONVERSION = YES; | |
| 516 | + CLANG_WARN_INT_CONVERSION = YES; | |
| 517 | + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; | |
| 518 | + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; | |
| 519 | + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; | |
| 520 | + COPY_PHASE_STRIP = NO; | |
| 521 | + ENABLE_TESTABILITY = YES; | |
| 522 | + GCC_C_LANGUAGE_STANDARD = gnu99; | |
| 523 | + GCC_DYNAMIC_NO_PIC = NO; | |
| 524 | + GCC_OPTIMIZATION_LEVEL = 0; | |
| 525 | + GCC_PREPROCESSOR_DEFINITIONS = ( | |
| 526 | + "DEBUG=1", | |
| 527 | + "$(inherited)", | |
| 528 | + ); | |
| 529 | + GCC_SYMBOLS_PRIVATE_EXTERN = NO; | |
| 530 | + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; | |
| 531 | + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; | |
| 532 | + GCC_WARN_UNDECLARED_SELECTOR = YES; | |
| 533 | + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; | |
| 534 | + GCC_WARN_UNUSED_FUNCTION = YES; | |
| 535 | + GCC_WARN_UNUSED_VARIABLE = YES; | |
| 536 | + IPHONEOS_DEPLOYMENT_TARGET = 9.3; | |
| 537 | + ONLY_ACTIVE_ARCH = YES; | |
| 538 | + SDKROOT = iphoneos; | |
| 539 | + TARGETED_DEVICE_FAMILY = "1,2"; | |
| 540 | + }; | |
| 541 | + name = Debug; | |
| 542 | + }; | |
| 543 | + 6003F5BE195388D20070C39A /* Release */ = { | |
| 544 | + isa = XCBuildConfiguration; | |
| 545 | + buildSettings = { | |
| 546 | + ALWAYS_SEARCH_USER_PATHS = NO; | |
| 547 | + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; | |
| 548 | + CLANG_CXX_LIBRARY = "libc++"; | |
| 549 | + CLANG_ENABLE_MODULES = YES; | |
| 550 | + CLANG_ENABLE_OBJC_ARC = YES; | |
| 551 | + CLANG_WARN_BOOL_CONVERSION = YES; | |
| 552 | + CLANG_WARN_CONSTANT_CONVERSION = YES; | |
| 553 | + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; | |
| 554 | + CLANG_WARN_EMPTY_BODY = YES; | |
| 555 | + CLANG_WARN_ENUM_CONVERSION = YES; | |
| 556 | + CLANG_WARN_INT_CONVERSION = YES; | |
| 557 | + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; | |
| 558 | + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; | |
| 559 | + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; | |
| 560 | + COPY_PHASE_STRIP = YES; | |
| 561 | + ENABLE_NS_ASSERTIONS = NO; | |
| 562 | + GCC_C_LANGUAGE_STANDARD = gnu99; | |
| 563 | + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; | |
| 564 | + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; | |
| 565 | + GCC_WARN_UNDECLARED_SELECTOR = YES; | |
| 566 | + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; | |
| 567 | + GCC_WARN_UNUSED_FUNCTION = YES; | |
| 568 | + GCC_WARN_UNUSED_VARIABLE = YES; | |
| 569 | + IPHONEOS_DEPLOYMENT_TARGET = 9.3; | |
| 570 | + SDKROOT = iphoneos; | |
| 571 | + TARGETED_DEVICE_FAMILY = "1,2"; | |
| 572 | + VALIDATE_PRODUCT = YES; | |
| 573 | + }; | |
| 574 | + name = Release; | |
| 575 | + }; | |
| 576 | + 6003F5C0195388D20070C39A /* Debug */ = { | |
| 577 | + isa = XCBuildConfiguration; | |
| 578 | + baseConfigurationReference = 9CEF25613EE9FE93EABF878B /* Pods-CNLiveBLoginModule_Example.debug.xcconfig */; | |
| 579 | + buildSettings = { | |
| 580 | + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; | |
| 581 | + DEVELOPMENT_TEAM = 94X49GG3ZW; | |
| 582 | + GCC_PRECOMPILE_PREFIX_HEADER = YES; | |
| 583 | + GCC_PREFIX_HEADER = "CNLiveBLoginModule/CNLiveBLoginModule-Prefix.pch"; | |
| 584 | + INFOPLIST_FILE = "CNLiveBLoginModule/CNLiveBLoginModule-Info.plist"; | |
| 585 | + MODULE_NAME = ExampleApp; | |
| 586 | + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.${PRODUCT_NAME:rfc1034identifier}"; | |
| 587 | + PRODUCT_NAME = "$(TARGET_NAME)"; | |
| 588 | + SWIFT_VERSION = 4.0; | |
| 589 | + WRAPPER_EXTENSION = app; | |
| 590 | + }; | |
| 591 | + name = Debug; | |
| 592 | + }; | |
| 593 | + 6003F5C1195388D20070C39A /* Release */ = { | |
| 594 | + isa = XCBuildConfiguration; | |
| 595 | + baseConfigurationReference = ED3D4B1562BB9FB7F8BA73C6 /* Pods-CNLiveBLoginModule_Example.release.xcconfig */; | |
| 596 | + buildSettings = { | |
| 597 | + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; | |
| 598 | + DEVELOPMENT_TEAM = 94X49GG3ZW; | |
| 599 | + GCC_PRECOMPILE_PREFIX_HEADER = YES; | |
| 600 | + GCC_PREFIX_HEADER = "CNLiveBLoginModule/CNLiveBLoginModule-Prefix.pch"; | |
| 601 | + INFOPLIST_FILE = "CNLiveBLoginModule/CNLiveBLoginModule-Info.plist"; | |
| 602 | + MODULE_NAME = ExampleApp; | |
| 603 | + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.${PRODUCT_NAME:rfc1034identifier}"; | |
| 604 | + PRODUCT_NAME = "$(TARGET_NAME)"; | |
| 605 | + SWIFT_VERSION = 4.0; | |
| 606 | + WRAPPER_EXTENSION = app; | |
| 607 | + }; | |
| 608 | + name = Release; | |
| 609 | + }; | |
| 610 | + 6003F5C3195388D20070C39A /* Debug */ = { | |
| 611 | + isa = XCBuildConfiguration; | |
| 612 | + baseConfigurationReference = 3CD8CE8FD819154568F33724 /* Pods-CNLiveBLoginModule_Tests.debug.xcconfig */; | |
| 613 | + buildSettings = { | |
| 614 | + BUNDLE_LOADER = "$(TEST_HOST)"; | |
| 615 | + FRAMEWORK_SEARCH_PATHS = ( | |
| 616 | + "$(PLATFORM_DIR)/Developer/Library/Frameworks", | |
| 617 | + "$(inherited)", | |
| 618 | + "$(DEVELOPER_FRAMEWORKS_DIR)", | |
| 619 | + ); | |
| 620 | + GCC_PRECOMPILE_PREFIX_HEADER = YES; | |
| 621 | + GCC_PREFIX_HEADER = "Tests/Tests-Prefix.pch"; | |
| 622 | + GCC_PREPROCESSOR_DEFINITIONS = ( | |
| 623 | + "DEBUG=1", | |
| 624 | + "$(inherited)", | |
| 625 | + ); | |
| 626 | + INFOPLIST_FILE = "Tests/Tests-Info.plist"; | |
| 627 | + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.${PRODUCT_NAME:rfc1034identifier}"; | |
| 628 | + PRODUCT_NAME = "$(TARGET_NAME)"; | |
| 629 | + SWIFT_VERSION = 4.0; | |
| 630 | + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/CNLiveBLoginModule_Example.app/CNLiveBLoginModule_Example"; | |
| 631 | + WRAPPER_EXTENSION = xctest; | |
| 632 | + }; | |
| 633 | + name = Debug; | |
| 634 | + }; | |
| 635 | + 6003F5C4195388D20070C39A /* Release */ = { | |
| 636 | + isa = XCBuildConfiguration; | |
| 637 | + baseConfigurationReference = 339077DBF7E302620172CBDC /* Pods-CNLiveBLoginModule_Tests.release.xcconfig */; | |
| 638 | + buildSettings = { | |
| 639 | + BUNDLE_LOADER = "$(TEST_HOST)"; | |
| 640 | + FRAMEWORK_SEARCH_PATHS = ( | |
| 641 | + "$(PLATFORM_DIR)/Developer/Library/Frameworks", | |
| 642 | + "$(inherited)", | |
| 643 | + "$(DEVELOPER_FRAMEWORKS_DIR)", | |
| 644 | + ); | |
| 645 | + GCC_PRECOMPILE_PREFIX_HEADER = YES; | |
| 646 | + GCC_PREFIX_HEADER = "Tests/Tests-Prefix.pch"; | |
| 647 | + INFOPLIST_FILE = "Tests/Tests-Info.plist"; | |
| 648 | + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.${PRODUCT_NAME:rfc1034identifier}"; | |
| 649 | + PRODUCT_NAME = "$(TARGET_NAME)"; | |
| 650 | + SWIFT_VERSION = 4.0; | |
| 651 | + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/CNLiveBLoginModule_Example.app/CNLiveBLoginModule_Example"; | |
| 652 | + WRAPPER_EXTENSION = xctest; | |
| 653 | + }; | |
| 654 | + name = Release; | |
| 655 | + }; | |
| 656 | +/* End XCBuildConfiguration section */ | |
| 657 | + | |
| 658 | +/* Begin XCConfigurationList section */ | |
| 659 | + 6003F585195388D10070C39A /* Build configuration list for PBXProject "CNLiveBLoginModule" */ = { | |
| 660 | + isa = XCConfigurationList; | |
| 661 | + buildConfigurations = ( | |
| 662 | + 6003F5BD195388D20070C39A /* Debug */, | |
| 663 | + 6003F5BE195388D20070C39A /* Release */, | |
| 664 | + ); | |
| 665 | + defaultConfigurationIsVisible = 0; | |
| 666 | + defaultConfigurationName = Release; | |
| 667 | + }; | |
| 668 | + 6003F5BF195388D20070C39A /* Build configuration list for PBXNativeTarget "CNLiveBLoginModule_Example" */ = { | |
| 669 | + isa = XCConfigurationList; | |
| 670 | + buildConfigurations = ( | |
| 671 | + 6003F5C0195388D20070C39A /* Debug */, | |
| 672 | + 6003F5C1195388D20070C39A /* Release */, | |
| 673 | + ); | |
| 674 | + defaultConfigurationIsVisible = 0; | |
| 675 | + defaultConfigurationName = Release; | |
| 676 | + }; | |
| 677 | + 6003F5C2195388D20070C39A /* Build configuration list for PBXNativeTarget "CNLiveBLoginModule_Tests" */ = { | |
| 678 | + isa = XCConfigurationList; | |
| 679 | + buildConfigurations = ( | |
| 680 | + 6003F5C3195388D20070C39A /* Debug */, | |
| 681 | + 6003F5C4195388D20070C39A /* Release */, | |
| 682 | + ); | |
| 683 | + defaultConfigurationIsVisible = 0; | |
| 684 | + defaultConfigurationName = Release; | |
| 685 | + }; | |
| 686 | +/* End XCConfigurationList section */ | |
| 687 | + }; | |
| 688 | + rootObject = 6003F582195388D10070C39A /* Project object */; | |
| 689 | +} | ... | ... |
Example/CNLiveBLoginModule.xcodeproj/xcshareddata/xcschemes/CNLiveBLoginModule-Example.xcscheme
0 → 100644
| 1 | +<?xml version="1.0" encoding="UTF-8"?> | |
| 2 | +<Scheme | |
| 3 | + LastUpgradeVersion = "0720" | |
| 4 | + version = "1.3"> | |
| 5 | + <BuildAction | |
| 6 | + parallelizeBuildables = "YES" | |
| 7 | + buildImplicitDependencies = "YES"> | |
| 8 | + <BuildActionEntries> | |
| 9 | + <BuildActionEntry | |
| 10 | + buildForTesting = "YES" | |
| 11 | + buildForRunning = "YES" | |
| 12 | + buildForProfiling = "YES" | |
| 13 | + buildForArchiving = "YES" | |
| 14 | + buildForAnalyzing = "YES"> | |
| 15 | + <BuildableReference | |
| 16 | + BuildableIdentifier = "primary" | |
| 17 | + BlueprintIdentifier = "6003F589195388D20070C39A" | |
| 18 | + BuildableName = "CNLiveBLoginModule_Example.app" | |
| 19 | + BlueprintName = "CNLiveBLoginModule_Example" | |
| 20 | + ReferencedContainer = "container:CNLiveBLoginModule.xcodeproj"> | |
| 21 | + </BuildableReference> | |
| 22 | + </BuildActionEntry> | |
| 23 | + </BuildActionEntries> | |
| 24 | + </BuildAction> | |
| 25 | + <TestAction | |
| 26 | + buildConfiguration = "Debug" | |
| 27 | + selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" | |
| 28 | + selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" | |
| 29 | + shouldUseLaunchSchemeArgsEnv = "YES"> | |
| 30 | + <Testables> | |
| 31 | + <TestableReference | |
| 32 | + skipped = "NO"> | |
| 33 | + <BuildableReference | |
| 34 | + BuildableIdentifier = "primary" | |
| 35 | + BlueprintIdentifier = "6003F5AD195388D20070C39A" | |
| 36 | + BuildableName = "CNLiveBLoginModule_Tests.xctest" | |
| 37 | + BlueprintName = "CNLiveBLoginModule_Tests" | |
| 38 | + ReferencedContainer = "container:CNLiveBLoginModule.xcodeproj"> | |
| 39 | + </BuildableReference> | |
| 40 | + </TestableReference> | |
| 41 | + </Testables> | |
| 42 | + <MacroExpansion> | |
| 43 | + <BuildableReference | |
| 44 | + BuildableIdentifier = "primary" | |
| 45 | + BlueprintIdentifier = "6003F589195388D20070C39A" | |
| 46 | + BuildableName = "CNLiveBLoginModule_Example.app" | |
| 47 | + BlueprintName = "CNLiveBLoginModule_Example" | |
| 48 | + ReferencedContainer = "container:CNLiveBLoginModule.xcodeproj"> | |
| 49 | + </BuildableReference> | |
| 50 | + </MacroExpansion> | |
| 51 | + <AdditionalOptions> | |
| 52 | + </AdditionalOptions> | |
| 53 | + </TestAction> | |
| 54 | + <LaunchAction | |
| 55 | + buildConfiguration = "Debug" | |
| 56 | + selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" | |
| 57 | + selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" | |
| 58 | + launchStyle = "0" | |
| 59 | + useCustomWorkingDirectory = "NO" | |
| 60 | + ignoresPersistentStateOnLaunch = "NO" | |
| 61 | + debugDocumentVersioning = "YES" | |
| 62 | + debugServiceExtension = "internal" | |
| 63 | + allowLocationSimulation = "YES"> | |
| 64 | + <BuildableProductRunnable | |
| 65 | + runnableDebuggingMode = "0"> | |
| 66 | + <BuildableReference | |
| 67 | + BuildableIdentifier = "primary" | |
| 68 | + BlueprintIdentifier = "6003F589195388D20070C39A" | |
| 69 | + BuildableName = "CNLiveBLoginModule_Example.app" | |
| 70 | + BlueprintName = "CNLiveBLoginModule_Example" | |
| 71 | + ReferencedContainer = "container:CNLiveBLoginModule.xcodeproj"> | |
| 72 | + </BuildableReference> | |
| 73 | + </BuildableProductRunnable> | |
| 74 | + <AdditionalOptions> | |
| 75 | + </AdditionalOptions> | |
| 76 | + </LaunchAction> | |
| 77 | + <ProfileAction | |
| 78 | + buildConfiguration = "Release" | |
| 79 | + shouldUseLaunchSchemeArgsEnv = "YES" | |
| 80 | + savedToolIdentifier = "" | |
| 81 | + useCustomWorkingDirectory = "NO" | |
| 82 | + debugDocumentVersioning = "YES"> | |
| 83 | + <BuildableProductRunnable | |
| 84 | + runnableDebuggingMode = "0"> | |
| 85 | + <BuildableReference | |
| 86 | + BuildableIdentifier = "primary" | |
| 87 | + BlueprintIdentifier = "6003F589195388D20070C39A" | |
| 88 | + BuildableName = "CNLiveBLoginModule_Example.app" | |
| 89 | + BlueprintName = "CNLiveBLoginModule_Example" | |
| 90 | + ReferencedContainer = "container:CNLiveBLoginModule.xcodeproj"> | |
| 91 | + </BuildableReference> | |
| 92 | + </BuildableProductRunnable> | |
| 93 | + </ProfileAction> | |
| 94 | + <AnalyzeAction | |
| 95 | + buildConfiguration = "Debug"> | |
| 96 | + </AnalyzeAction> | |
| 97 | + <ArchiveAction | |
| 98 | + buildConfiguration = "Release" | |
| 99 | + revealArchiveInOrganizer = "YES"> | |
| 100 | + </ArchiveAction> | |
| 101 | +</Scheme> | ... | ... |
Example/CNLiveBLoginModule/Base.lproj/LaunchScreen.storyboard
0 → 100644
| 1 | +<?xml version="1.0" encoding="UTF-8"?> | |
| 2 | +<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="13771" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="01J-lp-oVM"> | |
| 3 | + <device id="retina4_7" orientation="portrait"> | |
| 4 | + <adaptation id="fullscreen"/> | |
| 5 | + </device> | |
| 6 | + <dependencies> | |
| 7 | + <deployment identifier="iOS"/> | |
| 8 | + <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13772"/> | |
| 9 | + <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> | |
| 10 | + </dependencies> | |
| 11 | + <scenes> | |
| 12 | + <!--View Controller--> | |
| 13 | + <scene sceneID="EHf-IW-A2E"> | |
| 14 | + <objects> | |
| 15 | + <viewController id="01J-lp-oVM" sceneMemberID="viewController"> | |
| 16 | + <layoutGuides> | |
| 17 | + <viewControllerLayoutGuide type="top" id="Llm-lL-Icb"/> | |
| 18 | + <viewControllerLayoutGuide type="bottom" id="xb3-aO-Qok"/> | |
| 19 | + </layoutGuides> | |
| 20 | + <view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3"> | |
| 21 | + <rect key="frame" x="0.0" y="0.0" width="375" height="667"/> | |
| 22 | + <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> | |
| 23 | + <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> | |
| 24 | + </view> | |
| 25 | + </viewController> | |
| 26 | + <placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/> | |
| 27 | + </objects> | |
| 28 | + <point key="canvasLocation" x="53" y="375"/> | |
| 29 | + </scene> | |
| 30 | + </scenes> | |
| 31 | +</document> | ... | ... |
Example/CNLiveBLoginModule/Base.lproj/Main.storyboard
0 → 100644
| 1 | +<?xml version="1.0" encoding="UTF-8"?> | |
| 2 | +<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="13771" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="whP-gf-Uak"> | |
| 3 | + <device id="retina4_7" orientation="portrait"> | |
| 4 | + <adaptation id="fullscreen"/> | |
| 5 | + </device> | |
| 6 | + <dependencies> | |
| 7 | + <deployment identifier="iOS"/> | |
| 8 | + <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13772"/> | |
| 9 | + <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> | |
| 10 | + </dependencies> | |
| 11 | + <scenes> | |
| 12 | + <!--View Controller--> | |
| 13 | + <scene sceneID="wQg-tq-qST"> | |
| 14 | + <objects> | |
| 15 | + <viewController id="whP-gf-Uak" customClass="CNLIVEViewController" sceneMemberID="viewController"> | |
| 16 | + <layoutGuides> | |
| 17 | + <viewControllerLayoutGuide type="top" id="uEw-UM-LJ8"/> | |
| 18 | + <viewControllerLayoutGuide type="bottom" id="Mvr-aV-6Um"/> | |
| 19 | + </layoutGuides> | |
| 20 | + <view key="view" contentMode="scaleToFill" id="TpU-gO-2f1"> | |
| 21 | + <rect key="frame" x="0.0" y="0.0" width="375" height="667"/> | |
| 22 | + <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> | |
| 23 | + <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> | |
| 24 | + </view> | |
| 25 | + </viewController> | |
| 26 | + <placeholder placeholderIdentifier="IBFirstResponder" id="tc2-Qw-aMS" userLabel="First Responder" sceneMemberID="firstResponder"/> | |
| 27 | + </objects> | |
| 28 | + <point key="canvasLocation" x="305" y="433"/> | |
| 29 | + </scene> | |
| 30 | + </scenes> | |
| 31 | +</document> | ... | ... |
Example/CNLiveBLoginModule/CNLIVEAppDelegate.h
0 → 100644
| 1 | +// | |
| 2 | +// CNLIVEAppDelegate.h | |
| 3 | +// CNLiveBLoginModule | |
| 4 | +// | |
| 5 | +// Created by iOS-Xiaowen on 04/08/2020. | |
| 6 | +// Copyright (c) 2020 iOS-Xiaowen. All rights reserved. | |
| 7 | +// | |
| 8 | + | |
| 9 | +@import UIKit; | |
| 10 | + | |
| 11 | +@interface CNLIVEAppDelegate : UIResponder <UIApplicationDelegate> | |
| 12 | + | |
| 13 | +@property (strong, nonatomic) UIWindow *window; | |
| 14 | + | |
| 15 | +@end | ... | ... |
Example/CNLiveBLoginModule/CNLIVEAppDelegate.m
0 → 100644
| 1 | +// | |
| 2 | +// CNLIVEAppDelegate.m | |
| 3 | +// CNLiveBLoginModule | |
| 4 | +// | |
| 5 | +// Created by iOS-Xiaowen on 04/08/2020. | |
| 6 | +// Copyright (c) 2020 iOS-Xiaowen. All rights reserved. | |
| 7 | +// | |
| 8 | + | |
| 9 | +#import "CNLIVEAppDelegate.h" | |
| 10 | +#import "CNLiveLoginController.h" | |
| 11 | + | |
| 12 | +#import "CNUserInfoManager.h" | |
| 13 | +#import "CNLiveEnvironment.h" | |
| 14 | +#import <CNLiveUserSystemSDK/CNLiveUserSystemCenter.h> | |
| 15 | +#import <CNLiveRequestBastKit/CNLiveNetworking.h> | |
| 16 | +@implementation CNLIVEAppDelegate | |
| 17 | + | |
| 18 | +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions | |
| 19 | +{ | |
| 20 | + // Override point for customization after application launch. | |
| 21 | + self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];//UIScreen mainScreen].bounds个人理解获取屏幕的硬件信息然后设置尺寸大小 | |
| 22 | + [CNLiveEnvironmentManager setAppType:CNLiveAppTypeBusiness environmentType:CNLiveProductionAppStore]; | |
| 23 | + [CNLiveUserSystemCenter setAppId:AppId appKey:APPKey appSecret:AppSecret isTestEnvironment:TestEnvironment]; | |
| 24 | + if ([CNUserShareManager isLogin]) { | |
| 25 | + [CNLiveUserSystemCenter setUserId:CNUserShareModel.uid]; | |
| 26 | + } | |
| 27 | + [self networkParamAction]; | |
| 28 | + | |
| 29 | + CNLiveLoginController *vc = [[CNLiveLoginController alloc] init]; | |
| 30 | + vc.isShowClose = YES; | |
| 31 | + UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController:vc]; | |
| 32 | + self.window.rootViewController = nav;//设置根视图控制器 | |
| 33 | + [self.window makeKeyAndVisible];//设置成为 | |
| 34 | + return YES; | |
| 35 | +} | |
| 36 | + | |
| 37 | +- (void)applicationWillResignActive:(UIApplication *)application | |
| 38 | +{ | |
| 39 | + // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. | |
| 40 | + // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. | |
| 41 | +} | |
| 42 | + | |
| 43 | +- (void)applicationDidEnterBackground:(UIApplication *)application | |
| 44 | +{ | |
| 45 | + // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. | |
| 46 | + // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. | |
| 47 | +} | |
| 48 | + | |
| 49 | +- (void)applicationWillEnterForeground:(UIApplication *)application | |
| 50 | +{ | |
| 51 | + // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. | |
| 52 | +} | |
| 53 | + | |
| 54 | +- (void)applicationDidBecomeActive:(UIApplication *)application | |
| 55 | +{ | |
| 56 | + // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. | |
| 57 | +} | |
| 58 | + | |
| 59 | +- (void)applicationWillTerminate:(UIApplication *)application | |
| 60 | +{ | |
| 61 | + // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. | |
| 62 | +} | |
| 63 | + | |
| 64 | +- (void)networkParamAction{ | |
| 65 | + NSMutableDictionary * mDict = [[NSMutableDictionary alloc] init]; | |
| 66 | + [mDict setValue:@"10514405" forKey:@"loginSid"]; | |
| 67 | + | |
| 68 | + [mDict setValue:BundleId forKey:@"platform_id"]; | |
| 69 | + | |
| 70 | + [mDict setValue:[[[[UIDevice currentDevice] identifierForVendor] UUIDString] stringByReplacingOccurrencesOfString:@"-" withString:@""] forKey:@"uuid"]; | |
| 71 | + [mDict setValue:@"i" forKey:@"plat"]; | |
| 72 | + [mDict setValue:@"1.7.8.19.10.30.15"forKey:@"ver"]; | |
| 73 | + [mDict setObject:AppId forKey:@"appId"]; | |
| 74 | + [CNLiveNetworking setupDefaultParam:mDict]; | |
| 75 | + [CNLiveNetworking setupShowResult:NO]; | |
| 76 | + [CNLiveNetworking setupSignKey:APPKey]; | |
| 77 | + [CNLiveNetworking setAllowRequestDefaultArgument:YES]; | |
| 78 | + [CNLiveNetworking setResponseSerializerType:CNLiveResponseSerializerJSON]; | |
| 79 | + | |
| 80 | +} | |
| 81 | + | |
| 82 | +@end | ... | ... |
Example/CNLiveBLoginModule/CNLIVEViewController.h
0 → 100644
Example/CNLiveBLoginModule/CNLIVEViewController.m
0 → 100644
| 1 | +// | |
| 2 | +// CNLIVEViewController.m | |
| 3 | +// CNLiveBLoginModule | |
| 4 | +// | |
| 5 | +// Created by iOS-Xiaowen on 04/08/2020. | |
| 6 | +// Copyright (c) 2020 iOS-Xiaowen. All rights reserved. | |
| 7 | +// | |
| 8 | + | |
| 9 | +#import "CNLIVEViewController.h" | |
| 10 | + | |
| 11 | +@interface CNLIVEViewController () | |
| 12 | + | |
| 13 | +@end | |
| 14 | + | |
| 15 | +@implementation CNLIVEViewController | |
| 16 | + | |
| 17 | +- (void)viewDidLoad | |
| 18 | +{ | |
| 19 | + [super viewDidLoad]; | |
| 20 | + // Do any additional setup after loading the view, typically from a nib. | |
| 21 | +} | |
| 22 | + | |
| 23 | +- (void)didReceiveMemoryWarning | |
| 24 | +{ | |
| 25 | + [super didReceiveMemoryWarning]; | |
| 26 | + // Dispose of any resources that can be recreated. | |
| 27 | +} | |
| 28 | + | |
| 29 | +@end | ... | ... |
Example/CNLiveBLoginModule/CNLiveBLoginModule-Info.plist
0 → 100644
| 1 | +<?xml version="1.0" encoding="UTF-8"?> | |
| 2 | +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | |
| 3 | +<plist version="1.0"> | |
| 4 | +<dict> | |
| 5 | + <key>CFBundleDevelopmentRegion</key> | |
| 6 | + <string>en</string> | |
| 7 | + <key>CFBundleDisplayName</key> | |
| 8 | + <string>${PRODUCT_NAME}</string> | |
| 9 | + <key>CFBundleExecutable</key> | |
| 10 | + <string>${EXECUTABLE_NAME}</string> | |
| 11 | + <key>CFBundleIdentifier</key> | |
| 12 | + <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string> | |
| 13 | + <key>CFBundleInfoDictionaryVersion</key> | |
| 14 | + <string>6.0</string> | |
| 15 | + <key>CFBundleName</key> | |
| 16 | + <string>${PRODUCT_NAME}</string> | |
| 17 | + <key>CFBundlePackageType</key> | |
| 18 | + <string>APPL</string> | |
| 19 | + <key>CFBundleShortVersionString</key> | |
| 20 | + <string>1.0</string> | |
| 21 | + <key>CFBundleSignature</key> | |
| 22 | + <string>????</string> | |
| 23 | + <key>CFBundleVersion</key> | |
| 24 | + <string>1.0</string> | |
| 25 | + <key>LSRequiresIPhoneOS</key> | |
| 26 | + <true/> | |
| 27 | + <key>UILaunchStoryboardName</key> | |
| 28 | + <string>LaunchScreen</string> | |
| 29 | + <key>UIMainStoryboardFile</key> | |
| 30 | + <string>Main</string> | |
| 31 | + <key>UIRequiredDeviceCapabilities</key> | |
| 32 | + <array> | |
| 33 | + <string>armv7</string> | |
| 34 | + </array> | |
| 35 | + <key>UISupportedInterfaceOrientations</key> | |
| 36 | + <array> | |
| 37 | + <string>UIInterfaceOrientationPortrait</string> | |
| 38 | + <string>UIInterfaceOrientationLandscapeLeft</string> | |
| 39 | + <string>UIInterfaceOrientationLandscapeRight</string> | |
| 40 | + </array> | |
| 41 | + <key>UISupportedInterfaceOrientations~ipad</key> | |
| 42 | + <array> | |
| 43 | + <string>UIInterfaceOrientationPortrait</string> | |
| 44 | + <string>UIInterfaceOrientationPortraitUpsideDown</string> | |
| 45 | + <string>UIInterfaceOrientationLandscapeLeft</string> | |
| 46 | + <string>UIInterfaceOrientationLandscapeRight</string> | |
| 47 | + </array> | |
| 48 | +</dict> | |
| 49 | +</plist> | ... | ... |
Example/CNLiveBLoginModule/CNLiveBLoginModule-Prefix.pch
0 → 100644
| 1 | +// | |
| 2 | +// Prefix header | |
| 3 | +// | |
| 4 | +// The contents of this file are implicitly included at the beginning of every source file. | |
| 5 | +// | |
| 6 | + | |
| 7 | +#import <Availability.h> | |
| 8 | + | |
| 9 | +#ifndef __IPHONE_5_0 | |
| 10 | +#warning "This project uses features only available in iOS SDK 5.0 and later." | |
| 11 | +#endif | |
| 12 | + | |
| 13 | +#ifdef __OBJC__ | |
| 14 | + @import UIKit; | |
| 15 | + @import Foundation; | |
| 16 | +#endif | ... | ... |
Example/CNLiveBLoginModule/Images.xcassets/AppIcon.appiconset/Contents.json
0 → 100644
| 1 | +{ | |
| 2 | + "images" : [ | |
| 3 | + { | |
| 4 | + "idiom" : "iphone", | |
| 5 | + "size" : "20x20", | |
| 6 | + "scale" : "2x" | |
| 7 | + }, | |
| 8 | + { | |
| 9 | + "idiom" : "iphone", | |
| 10 | + "size" : "20x20", | |
| 11 | + "scale" : "3x" | |
| 12 | + }, | |
| 13 | + { | |
| 14 | + "idiom" : "iphone", | |
| 15 | + "size" : "29x29", | |
| 16 | + "scale" : "2x" | |
| 17 | + }, | |
| 18 | + { | |
| 19 | + "idiom" : "iphone", | |
| 20 | + "size" : "29x29", | |
| 21 | + "scale" : "3x" | |
| 22 | + }, | |
| 23 | + { | |
| 24 | + "idiom" : "iphone", | |
| 25 | + "size" : "40x40", | |
| 26 | + "scale" : "2x" | |
| 27 | + }, | |
| 28 | + { | |
| 29 | + "idiom" : "iphone", | |
| 30 | + "size" : "40x40", | |
| 31 | + "scale" : "3x" | |
| 32 | + }, | |
| 33 | + { | |
| 34 | + "idiom" : "iphone", | |
| 35 | + "size" : "60x60", | |
| 36 | + "scale" : "2x" | |
| 37 | + }, | |
| 38 | + { | |
| 39 | + "idiom" : "iphone", | |
| 40 | + "size" : "60x60", | |
| 41 | + "scale" : "3x" | |
| 42 | + }, | |
| 43 | + { | |
| 44 | + "idiom" : "ipad", | |
| 45 | + "size" : "20x20", | |
| 46 | + "scale" : "1x" | |
| 47 | + }, | |
| 48 | + { | |
| 49 | + "idiom" : "ipad", | |
| 50 | + "size" : "20x20", | |
| 51 | + "scale" : "2x" | |
| 52 | + }, | |
| 53 | + { | |
| 54 | + "idiom" : "ipad", | |
| 55 | + "size" : "29x29", | |
| 56 | + "scale" : "1x" | |
| 57 | + }, | |
| 58 | + { | |
| 59 | + "idiom" : "ipad", | |
| 60 | + "size" : "29x29", | |
| 61 | + "scale" : "2x" | |
| 62 | + }, | |
| 63 | + { | |
| 64 | + "idiom" : "ipad", | |
| 65 | + "size" : "40x40", | |
| 66 | + "scale" : "1x" | |
| 67 | + }, | |
| 68 | + { | |
| 69 | + "idiom" : "ipad", | |
| 70 | + "size" : "40x40", | |
| 71 | + "scale" : "2x" | |
| 72 | + }, | |
| 73 | + { | |
| 74 | + "idiom" : "ipad", | |
| 75 | + "size" : "76x76", | |
| 76 | + "scale" : "1x" | |
| 77 | + }, | |
| 78 | + { | |
| 79 | + "idiom" : "ipad", | |
| 80 | + "size" : "76x76", | |
| 81 | + "scale" : "2x" | |
| 82 | + }, | |
| 83 | + { | |
| 84 | + "idiom" : "ipad", | |
| 85 | + "size" : "83.5x83.5", | |
| 86 | + "scale" : "2x" | |
| 87 | + }, | |
| 88 | + { | |
| 89 | + "idiom" : "ios-marketing", | |
| 90 | + "size" : "1024x1024", | |
| 91 | + "scale" : "1x" | |
| 92 | + } | |
| 93 | + ], | |
| 94 | + "info" : { | |
| 95 | + "version" : 1, | |
| 96 | + "author" : "xcode" | |
| 97 | + } | |
| 98 | +} | ... | ... |
Example/CNLiveBLoginModule/en.lproj/InfoPlist.strings
0 → 100644
Example/CNLiveBLoginModule/main.m
0 → 100644
| 1 | +// | |
| 2 | +// main.m | |
| 3 | +// CNLiveBLoginModule | |
| 4 | +// | |
| 5 | +// Created by iOS-Xiaowen on 04/08/2020. | |
| 6 | +// Copyright (c) 2020 iOS-Xiaowen. All rights reserved. | |
| 7 | +// | |
| 8 | + | |
| 9 | +@import UIKit; | |
| 10 | +#import "CNLIVEAppDelegate.h" | |
| 11 | + | |
| 12 | +int main(int argc, char * argv[]) | |
| 13 | +{ | |
| 14 | + @autoreleasepool { | |
| 15 | + return UIApplicationMain(argc, argv, nil, NSStringFromClass([CNLIVEAppDelegate class])); | |
| 16 | + } | |
| 17 | +} | ... | ... |
Example/Podfile
0 → 100644
| 1 | +use_frameworks! | |
| 2 | +source 'https://github.com/CocoaPods/Specs.git' | |
| 3 | +source 'http://bj.gitlab.cnlive.com/ios-team/CNLiveRepos.git' | |
| 4 | +platform :ios, '9.0' | |
| 5 | + | |
| 6 | +target 'CNLiveBLoginModule_Example' do | |
| 7 | + pod 'CNLiveBLoginModule', :path => '../' | |
| 8 | + pre_install do |installer| Pod::Installer::Xcode::TargetValidator.send(:define_method, :verify_no_static_framework_transitive_dependencies) {} | |
| 9 | + end | |
| 10 | + target 'CNLiveBLoginModule_Tests' do | |
| 11 | + inherit! :search_paths | |
| 12 | + | |
| 13 | + | |
| 14 | + end | |
| 15 | +end | ... | ... |
Example/Tests/Tests-Info.plist
0 → 100644
| 1 | +<?xml version="1.0" encoding="UTF-8"?> | |
| 2 | +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | |
| 3 | +<plist version="1.0"> | |
| 4 | +<dict> | |
| 5 | + <key>CFBundleDevelopmentRegion</key> | |
| 6 | + <string>en</string> | |
| 7 | + <key>CFBundleExecutable</key> | |
| 8 | + <string>${EXECUTABLE_NAME}</string> | |
| 9 | + <key>CFBundleIdentifier</key> | |
| 10 | + <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string> | |
| 11 | + <key>CFBundleInfoDictionaryVersion</key> | |
| 12 | + <string>6.0</string> | |
| 13 | + <key>CFBundlePackageType</key> | |
| 14 | + <string>BNDL</string> | |
| 15 | + <key>CFBundleShortVersionString</key> | |
| 16 | + <string>1.0</string> | |
| 17 | + <key>CFBundleSignature</key> | |
| 18 | + <string>????</string> | |
| 19 | + <key>CFBundleVersion</key> | |
| 20 | + <string>1</string> | |
| 21 | +</dict> | |
| 22 | +</plist> | ... | ... |
Example/Tests/Tests-Prefix.pch
0 → 100644
Example/Tests/Tests.m
0 → 100644
| 1 | +// | |
| 2 | +// CNLiveBLoginModuleTests.m | |
| 3 | +// CNLiveBLoginModuleTests | |
| 4 | +// | |
| 5 | +// Created by iOS-Xiaowen on 04/08/2020. | |
| 6 | +// Copyright (c) 2020 iOS-Xiaowen. All rights reserved. | |
| 7 | +// | |
| 8 | + | |
| 9 | +@import XCTest; | |
| 10 | + | |
| 11 | +@interface Tests : XCTestCase | |
| 12 | + | |
| 13 | +@end | |
| 14 | + | |
| 15 | +@implementation Tests | |
| 16 | + | |
| 17 | +- (void)setUp | |
| 18 | +{ | |
| 19 | + [super setUp]; | |
| 20 | + // Put setup code here. This method is called before the invocation of each test method in the class. | |
| 21 | +} | |
| 22 | + | |
| 23 | +- (void)tearDown | |
| 24 | +{ | |
| 25 | + // Put teardown code here. This method is called after the invocation of each test method in the class. | |
| 26 | + [super tearDown]; | |
| 27 | +} | |
| 28 | + | |
| 29 | +- (void)testExample | |
| 30 | +{ | |
| 31 | + XCTFail(@"No implementation for \"%s\"", __PRETTY_FUNCTION__); | |
| 32 | +} | |
| 33 | + | |
| 34 | +@end | |
| 35 | + | ... | ... |
Example/Tests/en.lproj/InfoPlist.strings
0 → 100644
LICENSE
| 1 | -CNLiveBLoginModule | |
| 2 | 1 | \ No newline at end of file |
| 2 | +Copyright (c) 2020 iOS-Xiaowen <153993236@qq.com> | |
| 3 | + | |
| 4 | +Permission is hereby granted, free of charge, to any person obtaining a copy | |
| 5 | +of this software and associated documentation files (the "Software"), to deal | |
| 6 | +in the Software without restriction, including without limitation the rights | |
| 7 | +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |
| 8 | +copies of the Software, and to permit persons to whom the Software is | |
| 9 | +furnished to do so, subject to the following conditions: | |
| 10 | + | |
| 11 | +The above copyright notice and this permission notice shall be included in | |
| 12 | +all copies or substantial portions of the Software. | |
| 13 | + | |
| 14 | +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
| 15 | +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
| 16 | +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
| 17 | +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
| 18 | +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
| 19 | +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |
| 20 | +THE SOFTWARE. | ... | ... |
README.md
| 1 | -CNLiveBLoginModule | |
| 2 | 1 | \ No newline at end of file |
| 2 | +# CNLiveBLoginModule | |
| 3 | + | |
| 4 | +[](https://travis-ci.org/iOS-Xiaowen/CNLiveBLoginModule) | |
| 5 | +[](https://cocoapods.org/pods/CNLiveBLoginModule) | |
| 6 | +[](https://cocoapods.org/pods/CNLiveBLoginModule) | |
| 7 | +[](https://cocoapods.org/pods/CNLiveBLoginModule) | |
| 8 | + | |
| 9 | +## Example | |
| 10 | + | |
| 11 | +To run the example project, clone the repo, and run `pod install` from the Example directory first. | |
| 12 | + | |
| 13 | +## Requirements | |
| 14 | + | |
| 15 | +## Installation | |
| 16 | + | |
| 17 | +CNLiveBLoginModule is available through [CocoaPods](https://cocoapods.org). To install | |
| 18 | +it, simply add the following line to your Podfile: | |
| 19 | + | |
| 20 | +```ruby | |
| 21 | +pod 'CNLiveBLoginModule' | |
| 22 | +``` | |
| 23 | + | |
| 24 | +## Author | |
| 25 | + | |
| 26 | +iOS-Xiaowen, 153993236@qq.com | |
| 27 | + | |
| 28 | +## License | |
| 29 | + | |
| 30 | +CNLiveBLoginModule is available under the MIT license. See the LICENSE file for more info. | ... | ... |
_Pods.xcodeproj
0 → 120000