├── .DS_Store ├── .gitattributes ├── .gitignore ├── AppStore_com.qoli.dailyVerse.mobileprovision ├── Extension ├── Base.lproj │ └── MainInterface.storyboard ├── Info.plist └── TodayViewController.swift ├── Gemfile ├── LICENSE ├── Podfile ├── Podfile.lock ├── README.md ├── README ├── IMAGE.png ├── mockup2.png └── mockup2.psd ├── dailyVerse.xcodeproj ├── project.pbxproj └── project.xcworkspace │ └── contents.xcworkspacedata ├── dailyVerse.xcworkspace ├── contents.xcworkspacedata └── xcshareddata │ ├── IDEWorkspaceChecks.plist │ └── WorkspaceSettings.xcsettings ├── dailyVerse ├── .DS_Store ├── AppDelegate.swift ├── Assets.xcassets │ ├── .DS_Store │ ├── AboutBackgroud.colorset │ │ └── Contents.json │ ├── AppIcon.appiconset │ │ ├── Contents.json │ │ ├── Icon-App-20x20@1x.png │ │ ├── Icon-App-20x20@2x-1.png │ │ ├── Icon-App-20x20@2x.png │ │ ├── Icon-App-20x20@3x.png │ │ ├── Icon-App-29x29@1x.png │ │ ├── Icon-App-29x29@2x-1.png │ │ ├── Icon-App-29x29@2x.png │ │ ├── Icon-App-29x29@3x.png │ │ ├── Icon-App-40x40@1x.png │ │ ├── Icon-App-40x40@2x-1.png │ │ ├── Icon-App-40x40@2x.png │ │ ├── Icon-App-40x40@3x.png │ │ ├── Icon-App-60x60@2x.png │ │ ├── Icon-App-60x60@3x.png │ │ ├── Icon-App-76x76@1x.png │ │ ├── Icon-App-76x76@2x.png │ │ ├── Icon-App-83.5x83.5@2x.png │ │ └── ItunesArtwork@2x.png │ ├── ButtonText.colorset │ │ └── Contents.json │ ├── Contents.json │ ├── TextColor.colorset │ │ └── Contents.json │ ├── backgroudColor.colorset │ │ └── Contents.json │ ├── black12.colorset │ │ └── Contents.json │ ├── black24.colorset │ │ └── Contents.json │ ├── buttonColor.colorset │ │ └── Contents.json │ ├── chapterButtonBg.imageset │ │ ├── Contents.json │ │ ├── chapterButtonBg.pdf │ │ └── chapterButtonBgDark.pdf │ ├── coralPink.colorset │ │ └── Contents.json │ ├── dark.colorset │ │ └── Contents.json │ ├── greyishBrown.colorset │ │ └── Contents.json │ ├── gunmetal.colorset │ │ └── Contents.json │ ├── icClose24Px.imageset │ │ ├── Contents.json │ │ ├── icClose24Px.pdf │ │ └── icClose24PxDark.pdf │ ├── icInfo24Px.imageset │ │ ├── Contents.json │ │ ├── icInfo24Px.pdf │ │ └── icInfo24PxDark.pdf │ ├── icShare24Px.imageset │ │ ├── Contents.json │ │ ├── icShare24Px.png │ │ ├── icShare24Px@2x.png │ │ └── icShare24Px@3x.png │ ├── lanunchImage.imageset │ │ ├── Contents.json │ │ ├── icLanunchScreen.png │ │ ├── icLanunchScreen@2x.png │ │ └── icLanunchScreen@3x.png │ ├── paleBlue.colorset │ │ └── Contents.json │ ├── paleGrey.colorset │ │ └── Contents.json │ ├── softBlue.colorset │ │ └── Contents.json │ ├── white.colorset │ │ └── Contents.json │ ├── white0.colorset │ │ └── Contents.json │ └── white50.colorset │ │ └── Contents.json ├── Base.lproj │ ├── LaunchScreen.storyboard │ └── Main.storyboard ├── ChapterCell.swift ├── DVExtension │ ├── UIColor+Additions.swift │ ├── UIFont+DV.swift │ ├── UILabel+DV.swift │ ├── UITextView+DV.swift │ └── UIView+DV.swift ├── Functions │ ├── GBig.swift │ ├── MyFunctions 2.swift │ └── MyFunctions.swift ├── Info.plist ├── SectionCell.swift ├── SectionText.xib ├── TableViewController.swift ├── ViewController.swift ├── en.lproj │ └── InfoPlist.strings ├── zh-Hans.lproj │ ├── InfoPlist.strings │ ├── LaunchScreen.strings │ └── Main.strings └── zh-Hant.lproj │ ├── InfoPlist.strings │ ├── LaunchScreen.strings │ └── Main.strings └── genstrings.swift /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qoli/dailyVerse/187c166c4a0d52ced5b13726bf567d972f9ae5bb/.DS_Store -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | # 3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 4 | 5 | ## Build generated 6 | build/ 7 | DerivedData/ 8 | 9 | ## Various settings 10 | *.pbxuser 11 | !default.pbxuser 12 | *.mode1v3 13 | !default.mode1v3 14 | *.mode2v3 15 | !default.mode2v3 16 | *.perspectivev3 17 | !default.perspectivev3 18 | xcuserdata/ 19 | 20 | ## Other 21 | *.moved-aside 22 | *.xccheckout 23 | *.xcscmblueprint 24 | 25 | ## Obj-C/Swift specific 26 | *.hmap 27 | *.ipa 28 | *.dSYM.zip 29 | *.dSYM 30 | 31 | ## Playgrounds 32 | timeline.xctimeline 33 | playground.xcworkspace 34 | 35 | # Swift Package Manager 36 | # 37 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. 38 | # Packages/ 39 | # Package.pins 40 | .build/ 41 | 42 | # CocoaPods 43 | # 44 | # We recommend against adding the Pods directory to your .gitignore. However 45 | # you should judge for yourself, the pros and cons are mentioned at: 46 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 47 | # 48 | Pods/ 49 | 50 | Carthage 51 | # 52 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 53 | Carthage/Checkouts 54 | 55 | Carthage/Build 56 | 57 | # fastlane 58 | # 59 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the 60 | # screenshots whenever they are needed. 61 | # For more information about the recommended setup visit: 62 | # https://docs.fastlane.tools/best-practices/source-control/#source-control 63 | 64 | fastlane 65 | fastlane/report.xml 66 | fastlane/Preview.html 67 | fastlane/screenshots 68 | fastlane/test_output 69 | *.cer 70 | *.certSigningRequest 71 | *.p12 72 | fastlane_backup/ 73 | Pods/ 74 | -------------------------------------------------------------------------------- /AppStore_com.qoli.dailyVerse.mobileprovision: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qoli/dailyVerse/187c166c4a0d52ced5b13726bf567d972f9ae5bb/AppStore_com.qoli.dailyVerse.mobileprovision -------------------------------------------------------------------------------- /Extension/Base.lproj/MainInterface.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | -------------------------------------------------------------------------------- /Extension/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleDisplayName 8 | Daily Verse 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | XPC! 19 | CFBundleShortVersionString 20 | $(MARKETING_VERSION) 21 | CFBundleVersion 22 | 64 23 | NSExtension 24 | 25 | NSExtensionMainStoryboard 26 | MainInterface 27 | NSExtensionPointIdentifier 28 | com.apple.widget-extension 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /Extension/TodayViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TodayViewController.swift 3 | // Extension 4 | // 5 | // Created by 庫倪 on 2017/11/12. 6 | // Copyright © 2017年 庫倪. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import NotificationCenter 11 | import Alamofire 12 | 13 | class TodayViewController: UIViewController, NCWidgetProviding { 14 | 15 | @IBOutlet weak var todayWidget: UILabel! 16 | 17 | override func viewDidLoad() { 18 | super.viewDidLoad() 19 | // Do any additional setup after loading the view from its nib. 20 | 21 | init_verse() 22 | 23 | } 24 | 25 | override func didReceiveMemoryWarning() { 26 | super.didReceiveMemoryWarning() 27 | // Dispose of any resources that can be recreated. 28 | } 29 | 30 | func widgetPerformUpdate(completionHandler: (@escaping (NCUpdateResult) -> Void)) { 31 | // Perform any setup necessary in order to update the view. 32 | 33 | // If an error is encountered, use NCUpdateResult.Failed 34 | // If there's no update required, use NCUpdateResult.NoData 35 | // If there's an update, use NCUpdateResult.NewData 36 | 37 | completionHandler(NCUpdateResult.newData) 38 | } 39 | 40 | func init_verse() { 41 | Alamofire.request("https://bible.5mlstudio.com").responseString { response in 42 | if response.result.isSuccess { 43 | var s: String! = response.result.value 44 | s = s.replacingOccurrences(of: "\r", with: "") 45 | s = s.replacingOccurrences(of: "\n", with: "") 46 | s = s.trimmingCharacters(in: .whitespacesAndNewlines) 47 | 48 | self.todayWidget.text = s 49 | self.todayWidget.typesetting(lineSpacing: 1, lineHeightMultiple: 1, characterSpacing: 1.2) 50 | } else { 51 | let urlParams = [ 52 | "text":"[ERROR]\n\r- dailyVerse \n\r- https://bible.5mlstudio.com \n\r- \(response.result.error?.localizedDescription ?? "Error on Today Extension") \n\r- Value: \(response.result.value)" 53 | ] 54 | Alamofire.request("https://tgbot.lbyczf.com/sendMessage/9qvmshonjxf5csk5", method: .get, parameters: urlParams) 55 | } 56 | } 57 | } 58 | 59 | } 60 | 61 | /* 62 | setLineSpacing 設定行高 / lineHeightMultiple / 字距 63 | */ 64 | extension UILabel { 65 | 66 | func typesetting(lineSpacing: CGFloat = 0.0, lineHeightMultiple: CGFloat = 0.0, characterSpacing: CGFloat = 0.0) { 67 | 68 | guard let labelText = self.text else { return } 69 | 70 | let paragraphStyle = NSMutableParagraphStyle() 71 | paragraphStyle.lineSpacing = lineSpacing 72 | paragraphStyle.lineHeightMultiple = lineHeightMultiple 73 | 74 | let attributedString: NSMutableAttributedString 75 | if let labelattributedText = self.attributedText { 76 | attributedString = NSMutableAttributedString(attributedString: labelattributedText) 77 | } else { 78 | attributedString = NSMutableAttributedString(string: labelText) 79 | } 80 | 81 | // 處理字距 82 | attributedString.addAttribute(NSAttributedString.Key.kern, value: characterSpacing, range: NSRange(location: 0, length: attributedString.length - 1)) 83 | 84 | // 處理行高 85 | attributedString.addAttribute(NSAttributedString.Key.paragraphStyle, value: paragraphStyle, range: NSMakeRange(0, attributedString.length)) 86 | 87 | self.attributedText = attributedString 88 | } 89 | } 90 | 91 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source "https://rubygems.org" 2 | 3 | gem "fastlane" 4 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Qoli Wong 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /Podfile: -------------------------------------------------------------------------------- 1 | # Uncomment the next line to define a global platform for your project 2 | platform :ios, '10.0' 3 | 4 | target 'dailyVerse' do 5 | # Comment the next line if you're not using Swift and don't want to use dynamic frameworks 6 | use_frameworks! 7 | 8 | # Pods for dailyVerse 9 | 10 | # UI Labs 11 | pod 'NotificationBannerSwift' 12 | pod 'MMMaterialDesignSpinner' 13 | pod 'DynamicBlurView' 14 | pod 'Spring', :git => 'https://github.com/MengTo/Spring.git' 15 | 16 | # Network & base 17 | pod 'Alamofire' 18 | pod 'SwiftyJSON' 19 | 20 | # 統計 21 | pod 'Bugly' 22 | pod 'BaiduMobStatCodeless' 23 | 24 | pod 'SwiftDate' 25 | 26 | post_install do |installer| 27 | installer.pods_project.targets.each do |target| 28 | if target.name == 'Spring' 29 | target.build_configurations.each do |config| 30 | config.build_settings['SWIFT_VERSION'] = '4.2' 31 | end 32 | end 33 | end 34 | end 35 | 36 | end 37 | 38 | target 'Extension' do 39 | # Comment the next line if you're not using Swift and don't want to use dynamic frameworks 40 | use_frameworks! 41 | 42 | # Pods for Extension 43 | pod 'Alamofire', '~> 4.5' 44 | 45 | end 46 | -------------------------------------------------------------------------------- /Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - Alamofire (4.9.0) 3 | - BaiduMobStatCodeless (5.0.8) 4 | - Bugly (2.5.0) 5 | - DynamicBlurView (4.0.0) 6 | - MarqueeLabel (4.0.0) 7 | - MMMaterialDesignSpinner (0.2.5) 8 | - NotificationBannerSwift (2.5.1): 9 | - MarqueeLabel (~> 4.0.0) 10 | - SnapKit (~> 5.0.0) 11 | - SnapKit (5.0.1) 12 | - Spring (1.0.6) 13 | - SwiftDate (6.1.0) 14 | - SwiftyJSON (5.0.0) 15 | 16 | DEPENDENCIES: 17 | - Alamofire (~> 4.5) 18 | - BaiduMobStatCodeless 19 | - Bugly 20 | - DynamicBlurView 21 | - MMMaterialDesignSpinner 22 | - NotificationBannerSwift 23 | - Spring (from `https://github.com/MengTo/Spring.git`) 24 | - SwiftDate 25 | - SwiftyJSON 26 | 27 | SPEC REPOS: 28 | https://github.com/cocoapods/specs.git: 29 | - Alamofire 30 | - BaiduMobStatCodeless 31 | - Bugly 32 | - DynamicBlurView 33 | - MarqueeLabel 34 | - MMMaterialDesignSpinner 35 | - NotificationBannerSwift 36 | - SnapKit 37 | - SwiftDate 38 | - SwiftyJSON 39 | 40 | EXTERNAL SOURCES: 41 | Spring: 42 | :git: https://github.com/MengTo/Spring.git 43 | 44 | CHECKOUT OPTIONS: 45 | Spring: 46 | :commit: 50d92a5b9e08848387ae95bf44c6ad20834f7083 47 | :git: https://github.com/MengTo/Spring.git 48 | 49 | SPEC CHECKSUMS: 50 | Alamofire: afc3e7c6db61476cb45cdd23fed06bad03bbc321 51 | BaiduMobStatCodeless: a892f5eb0854731ddecf4e334f962f13846d20ee 52 | Bugly: 3ca9f255c01025582df26f9222893b383c7e4b4e 53 | DynamicBlurView: ccf9acd2b20c883cc2c72e3524a04d8d3ee20533 54 | MarqueeLabel: b55b26e690b6ad41faedd95cbf5eae6f1d1735b4 55 | MMMaterialDesignSpinner: a548042720c2e5f04212048483085d7942ac3e81 56 | NotificationBannerSwift: e55dd801b0d78f1a7bacb10d722a935ec95f94a3 57 | SnapKit: 97b92857e3df3a0c71833cce143274bf6ef8e5eb 58 | Spring: 3d113f14575ef79aec9c5f906dfa4f5001c03254 59 | SwiftDate: fa2bb3962056bb44047b4b85a30044e5eae30b03 60 | SwiftyJSON: 36413e04c44ee145039d332b4f4e2d3e8d6c4db7 61 | 62 | PODFILE CHECKSUM: 0ce7c943bd375428f5164db1310b3d9e9017be0b 63 | 64 | COCOAPODS: 1.7.5 65 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # dailyVerse(每日聖經) 2 | 3 | 4 | 5 | ## 已經上架 6 | 7 | https://itunes.apple.com/hk/app/%E6%AF%8F%E6%97%A5%E8%81%96%E7%B6%93%E6%95%85%E4%BA%8B/id1313606731?mt=8 8 | 9 | 10 | 11 | ## Fastlane 12 | 13 | 14 | 15 | ##### Thank 16 | 17 | 感謝參與項目的成員: 18 | 19 | * github.com/itamaker 20 | * github.com/senseiphoneX 21 | 22 | 23 | 24 | 使用了以下開源組件: 25 | 26 | - 'NotificationBannerSwift' 27 | - "MMMaterialDesignSpinner" 28 | - "DynamicBlurView" 29 | - 'Spring' 30 | - 'Alamofire' 31 | - 'SwiftyJSON' 32 | - 'SwiftDate' 33 | - "TouchVisualizer" 34 | 35 | 36 | 37 | ![IMAGE](./README/mockup2.png) 38 | 39 | 40 | 41 | # MIT License 42 | 43 | Copyright 2019 Qoli Wong 44 | 45 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 46 | 47 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 48 | 49 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /README/IMAGE.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qoli/dailyVerse/187c166c4a0d52ced5b13726bf567d972f9ae5bb/README/IMAGE.png -------------------------------------------------------------------------------- /README/mockup2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qoli/dailyVerse/187c166c4a0d52ced5b13726bf567d972f9ae5bb/README/mockup2.png -------------------------------------------------------------------------------- /README/mockup2.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qoli/dailyVerse/187c166c4a0d52ced5b13726bf567d972f9ae5bb/README/mockup2.psd -------------------------------------------------------------------------------- /dailyVerse.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 48; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 0454B265E7A34479269E7346 /* Pods_Extension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E2F789CB57A10423789810CB /* Pods_Extension.framework */; }; 11 | 0A15ED4A1FBABE4D00D2E4DA /* UIFont+DV.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A15ED491FBABE4D00D2E4DA /* UIFont+DV.swift */; }; 12 | 0A15ED4C1FBABE6700D2E4DA /* UILabel+DV.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A15ED4B1FBABE6700D2E4DA /* UILabel+DV.swift */; }; 13 | 0A15ED4E1FBABE8400D2E4DA /* UITextView+DV.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A15ED4D1FBABE8400D2E4DA /* UITextView+DV.swift */; }; 14 | 0A15ED501FBABEA500D2E4DA /* UIView+DV.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A15ED4F1FBABEA500D2E4DA /* UIView+DV.swift */; }; 15 | D034372680A1842250D237AC /* Pods_dailyVerse.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 835843FD393E5A31F06BD0D1 /* Pods_dailyVerse.framework */; }; 16 | F9082A521FB8583E00F1DC15 /* NotificationCenter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F9082A511FB8583E00F1DC15 /* NotificationCenter.framework */; }; 17 | F9082A551FB8583E00F1DC15 /* TodayViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9082A541FB8583E00F1DC15 /* TodayViewController.swift */; }; 18 | F9082A581FB8583E00F1DC15 /* MainInterface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F9082A561FB8583E00F1DC15 /* MainInterface.storyboard */; }; 19 | F9082A5C1FB8583E00F1DC15 /* Extension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = F9082A501FB8583E00F1DC15 /* Extension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 20 | F908D2931FB8A3E6002CEEAD /* ChapterCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F908D2921FB8A3E6002CEEAD /* ChapterCell.swift */; }; 21 | F924C03B1FBAB3E4008B105F /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = F924C03D1FBAB3E4008B105F /* InfoPlist.strings */; }; 22 | F94AB5C62009B8F2006BBF98 /* MyFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = F94AB5C52009B8F2006BBF98 /* MyFunctions.swift */; }; 23 | F98819A622D4548100BCB099 /* GBig.swift in Sources */ = {isa = PBXBuildFile; fileRef = F98819A522D4548100BCB099 /* GBig.swift */; }; 24 | F9B1538322BD2EB400B9DEF5 /* UIColor+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9B1538222BD2EB400B9DEF5 /* UIColor+Additions.swift */; }; 25 | F9E45F761FB7A54B005DE498 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9E45F751FB7A54B005DE498 /* AppDelegate.swift */; }; 26 | F9E45F781FB7A54B005DE498 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9E45F771FB7A54B005DE498 /* ViewController.swift */; }; 27 | F9E45F7B1FB7A54B005DE498 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F9E45F791FB7A54B005DE498 /* Main.storyboard */; }; 28 | F9E45F7D1FB7A54B005DE498 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = F9E45F7C1FB7A54B005DE498 /* Assets.xcassets */; }; 29 | F9E45F801FB7A54B005DE498 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F9E45F7E1FB7A54B005DE498 /* LaunchScreen.storyboard */; }; 30 | F9FB0CE91FB898B900EAB646 /* SectionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9FB0CE81FB898B900EAB646 /* SectionCell.swift */; }; 31 | /* End PBXBuildFile section */ 32 | 33 | /* Begin PBXContainerItemProxy section */ 34 | F9082A5A1FB8583E00F1DC15 /* PBXContainerItemProxy */ = { 35 | isa = PBXContainerItemProxy; 36 | containerPortal = F9E45F6A1FB7A54B005DE498 /* Project object */; 37 | proxyType = 1; 38 | remoteGlobalIDString = F9082A4F1FB8583E00F1DC15; 39 | remoteInfo = Extension; 40 | }; 41 | /* End PBXContainerItemProxy section */ 42 | 43 | /* Begin PBXCopyFilesBuildPhase section */ 44 | F9082A601FB8583E00F1DC15 /* Embed App Extensions */ = { 45 | isa = PBXCopyFilesBuildPhase; 46 | buildActionMask = 2147483647; 47 | dstPath = ""; 48 | dstSubfolderSpec = 13; 49 | files = ( 50 | F9082A5C1FB8583E00F1DC15 /* Extension.appex in Embed App Extensions */, 51 | ); 52 | name = "Embed App Extensions"; 53 | runOnlyForDeploymentPostprocessing = 0; 54 | }; 55 | /* End PBXCopyFilesBuildPhase section */ 56 | 57 | /* Begin PBXFileReference section */ 58 | 0A15ED491FBABE4D00D2E4DA /* UIFont+DV.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIFont+DV.swift"; sourceTree = ""; }; 59 | 0A15ED4B1FBABE6700D2E4DA /* UILabel+DV.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UILabel+DV.swift"; sourceTree = ""; }; 60 | 0A15ED4D1FBABE8400D2E4DA /* UITextView+DV.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UITextView+DV.swift"; sourceTree = ""; }; 61 | 0A15ED4F1FBABEA500D2E4DA /* UIView+DV.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIView+DV.swift"; sourceTree = ""; }; 62 | 377CD6992081B9BC5FE0BB1E /* Pods-dailyVerse.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-dailyVerse.release.xcconfig"; path = "Pods/Target Support Files/Pods-dailyVerse/Pods-dailyVerse.release.xcconfig"; sourceTree = ""; }; 63 | 5D478837BA7F98F6048327BF /* Pods-dailyVerse.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-dailyVerse.debug.xcconfig"; path = "Pods/Target Support Files/Pods-dailyVerse/Pods-dailyVerse.debug.xcconfig"; sourceTree = ""; }; 64 | 835843FD393E5A31F06BD0D1 /* Pods_dailyVerse.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_dailyVerse.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 65 | C34A9305C1CE1DDF39535A54 /* Pods-Extension.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Extension.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Extension/Pods-Extension.debug.xcconfig"; sourceTree = ""; }; 66 | E2F789CB57A10423789810CB /* Pods_Extension.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Extension.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 67 | EB9EAEEC1B778E240E7305EE /* Pods-Extension.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Extension.release.xcconfig"; path = "Pods/Target Support Files/Pods-Extension/Pods-Extension.release.xcconfig"; sourceTree = ""; }; 68 | F9082A491FB848F700F1DC15 /* zh-Hant */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hant"; path = "zh-Hant.lproj/Main.strings"; sourceTree = ""; }; 69 | F9082A4B1FB848F900F1DC15 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Main.strings"; sourceTree = ""; }; 70 | F9082A501FB8583E00F1DC15 /* Extension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = Extension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; 71 | F9082A511FB8583E00F1DC15 /* NotificationCenter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = NotificationCenter.framework; path = System/Library/Frameworks/NotificationCenter.framework; sourceTree = SDKROOT; }; 72 | F9082A541FB8583E00F1DC15 /* TodayViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TodayViewController.swift; sourceTree = ""; }; 73 | F9082A571FB8583E00F1DC15 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/MainInterface.storyboard; sourceTree = ""; }; 74 | F9082A591FB8583E00F1DC15 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 75 | F908D2921FB8A3E6002CEEAD /* ChapterCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChapterCell.swift; sourceTree = ""; }; 76 | F924C03C1FBAB3E4008B105F /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 77 | F924C03E1FBAB3E8008B105F /* zh-Hant */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hant"; path = "zh-Hant.lproj/InfoPlist.strings"; sourceTree = ""; }; 78 | F924C03F1FBAB3E8008B105F /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/InfoPlist.strings"; sourceTree = ""; }; 79 | F94AB5C52009B8F2006BBF98 /* MyFunctions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyFunctions.swift; sourceTree = ""; }; 80 | F98819A522D4548100BCB099 /* GBig.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GBig.swift; sourceTree = ""; }; 81 | F9B1538222BD2EB400B9DEF5 /* UIColor+Additions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIColor+Additions.swift"; sourceTree = ""; }; 82 | F9E45F721FB7A54B005DE498 /* dailyVerse.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = dailyVerse.app; sourceTree = BUILT_PRODUCTS_DIR; }; 83 | F9E45F751FB7A54B005DE498 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 84 | F9E45F771FB7A54B005DE498 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 85 | F9E45F7A1FB7A54B005DE498 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 86 | F9E45F7C1FB7A54B005DE498 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 87 | F9E45F7F1FB7A54B005DE498 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 88 | F9E45F811FB7A54B005DE498 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 89 | F9ED80B81FB80CCD00D8CC70 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/LaunchScreen.strings"; sourceTree = ""; }; 90 | F9ED80BA1FB80CF700D8CC70 /* zh-Hant */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hant"; path = "zh-Hant.lproj/LaunchScreen.strings"; sourceTree = ""; }; 91 | F9FB0CE81FB898B900EAB646 /* SectionCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SectionCell.swift; sourceTree = ""; }; 92 | /* End PBXFileReference section */ 93 | 94 | /* Begin PBXFrameworksBuildPhase section */ 95 | F9082A4D1FB8583E00F1DC15 /* Frameworks */ = { 96 | isa = PBXFrameworksBuildPhase; 97 | buildActionMask = 2147483647; 98 | files = ( 99 | F9082A521FB8583E00F1DC15 /* NotificationCenter.framework in Frameworks */, 100 | 0454B265E7A34479269E7346 /* Pods_Extension.framework in Frameworks */, 101 | ); 102 | runOnlyForDeploymentPostprocessing = 0; 103 | }; 104 | F9E45F6F1FB7A54B005DE498 /* Frameworks */ = { 105 | isa = PBXFrameworksBuildPhase; 106 | buildActionMask = 2147483647; 107 | files = ( 108 | D034372680A1842250D237AC /* Pods_dailyVerse.framework in Frameworks */, 109 | ); 110 | runOnlyForDeploymentPostprocessing = 0; 111 | }; 112 | /* End PBXFrameworksBuildPhase section */ 113 | 114 | /* Begin PBXGroup section */ 115 | 0A15ED461FBABDE000D2E4DA /* DVExtension */ = { 116 | isa = PBXGroup; 117 | children = ( 118 | F9B1538222BD2EB400B9DEF5 /* UIColor+Additions.swift */, 119 | 0A15ED491FBABE4D00D2E4DA /* UIFont+DV.swift */, 120 | 0A15ED4B1FBABE6700D2E4DA /* UILabel+DV.swift */, 121 | 0A15ED4D1FBABE8400D2E4DA /* UITextView+DV.swift */, 122 | 0A15ED4F1FBABEA500D2E4DA /* UIView+DV.swift */, 123 | ); 124 | path = DVExtension; 125 | sourceTree = ""; 126 | }; 127 | C53A089FC94CF999D15FF292 /* Frameworks */ = { 128 | isa = PBXGroup; 129 | children = ( 130 | 835843FD393E5A31F06BD0D1 /* Pods_dailyVerse.framework */, 131 | F9082A511FB8583E00F1DC15 /* NotificationCenter.framework */, 132 | E2F789CB57A10423789810CB /* Pods_Extension.framework */, 133 | ); 134 | name = Frameworks; 135 | sourceTree = ""; 136 | }; 137 | C83A1E60645CC49034F6D5A8 /* Pods */ = { 138 | isa = PBXGroup; 139 | children = ( 140 | 5D478837BA7F98F6048327BF /* Pods-dailyVerse.debug.xcconfig */, 141 | 377CD6992081B9BC5FE0BB1E /* Pods-dailyVerse.release.xcconfig */, 142 | C34A9305C1CE1DDF39535A54 /* Pods-Extension.debug.xcconfig */, 143 | EB9EAEEC1B778E240E7305EE /* Pods-Extension.release.xcconfig */, 144 | ); 145 | name = Pods; 146 | sourceTree = ""; 147 | }; 148 | F9082A531FB8583E00F1DC15 /* Extension */ = { 149 | isa = PBXGroup; 150 | children = ( 151 | F9082A541FB8583E00F1DC15 /* TodayViewController.swift */, 152 | F9082A561FB8583E00F1DC15 /* MainInterface.storyboard */, 153 | F9082A591FB8583E00F1DC15 /* Info.plist */, 154 | ); 155 | path = Extension; 156 | sourceTree = ""; 157 | }; 158 | F94AB5C72009B8FA006BBF98 /* Functions */ = { 159 | isa = PBXGroup; 160 | children = ( 161 | F94AB5C52009B8F2006BBF98 /* MyFunctions.swift */, 162 | F98819A522D4548100BCB099 /* GBig.swift */, 163 | ); 164 | path = Functions; 165 | sourceTree = ""; 166 | }; 167 | F9E45F691FB7A54B005DE498 = { 168 | isa = PBXGroup; 169 | children = ( 170 | F9E45F741FB7A54B005DE498 /* dailyVerse */, 171 | F9082A531FB8583E00F1DC15 /* Extension */, 172 | F9E45F731FB7A54B005DE498 /* Products */, 173 | C83A1E60645CC49034F6D5A8 /* Pods */, 174 | C53A089FC94CF999D15FF292 /* Frameworks */, 175 | ); 176 | sourceTree = ""; 177 | }; 178 | F9E45F731FB7A54B005DE498 /* Products */ = { 179 | isa = PBXGroup; 180 | children = ( 181 | F9E45F721FB7A54B005DE498 /* dailyVerse.app */, 182 | F9082A501FB8583E00F1DC15 /* Extension.appex */, 183 | ); 184 | name = Products; 185 | sourceTree = ""; 186 | }; 187 | F9E45F741FB7A54B005DE498 /* dailyVerse */ = { 188 | isa = PBXGroup; 189 | children = ( 190 | F94AB5C72009B8FA006BBF98 /* Functions */, 191 | 0A15ED461FBABDE000D2E4DA /* DVExtension */, 192 | F9E45F751FB7A54B005DE498 /* AppDelegate.swift */, 193 | F9E45F771FB7A54B005DE498 /* ViewController.swift */, 194 | F924C03D1FBAB3E4008B105F /* InfoPlist.strings */, 195 | F9E45F791FB7A54B005DE498 /* Main.storyboard */, 196 | F9FB0CE81FB898B900EAB646 /* SectionCell.swift */, 197 | F908D2921FB8A3E6002CEEAD /* ChapterCell.swift */, 198 | F9E45F7C1FB7A54B005DE498 /* Assets.xcassets */, 199 | F9E45F7E1FB7A54B005DE498 /* LaunchScreen.storyboard */, 200 | F9E45F811FB7A54B005DE498 /* Info.plist */, 201 | ); 202 | path = dailyVerse; 203 | sourceTree = ""; 204 | }; 205 | /* End PBXGroup section */ 206 | 207 | /* Begin PBXNativeTarget section */ 208 | F9082A4F1FB8583E00F1DC15 /* Extension */ = { 209 | isa = PBXNativeTarget; 210 | buildConfigurationList = F9082A5F1FB8583E00F1DC15 /* Build configuration list for PBXNativeTarget "Extension" */; 211 | buildPhases = ( 212 | 1CFBAFC9E9EA7CC0649E87E7 /* [CP] Check Pods Manifest.lock */, 213 | F9082A4C1FB8583E00F1DC15 /* Sources */, 214 | F9082A4D1FB8583E00F1DC15 /* Frameworks */, 215 | F9082A4E1FB8583E00F1DC15 /* Resources */, 216 | ); 217 | buildRules = ( 218 | ); 219 | dependencies = ( 220 | ); 221 | name = Extension; 222 | productName = Extension; 223 | productReference = F9082A501FB8583E00F1DC15 /* Extension.appex */; 224 | productType = "com.apple.product-type.app-extension"; 225 | }; 226 | F9E45F711FB7A54B005DE498 /* dailyVerse */ = { 227 | isa = PBXNativeTarget; 228 | buildConfigurationList = F9E45F841FB7A54B005DE498 /* Build configuration list for PBXNativeTarget "dailyVerse" */; 229 | buildPhases = ( 230 | B0A5E98C7BCC313729E2DFB5 /* [CP] Check Pods Manifest.lock */, 231 | F9E45F6E1FB7A54B005DE498 /* Sources */, 232 | F9E45F6F1FB7A54B005DE498 /* Frameworks */, 233 | F9E45F701FB7A54B005DE498 /* Resources */, 234 | C8BF1C076227876CD84B2E74 /* [CP] Embed Pods Frameworks */, 235 | F9082A601FB8583E00F1DC15 /* Embed App Extensions */, 236 | F982466A22BD091200ADFFB6 /* 自動上傳 dSYM 到 Bugly */, 237 | ); 238 | buildRules = ( 239 | ); 240 | dependencies = ( 241 | F9082A5B1FB8583E00F1DC15 /* PBXTargetDependency */, 242 | ); 243 | name = dailyVerse; 244 | productName = dailyVerse; 245 | productReference = F9E45F721FB7A54B005DE498 /* dailyVerse.app */; 246 | productType = "com.apple.product-type.application"; 247 | }; 248 | /* End PBXNativeTarget section */ 249 | 250 | /* Begin PBXProject section */ 251 | F9E45F6A1FB7A54B005DE498 /* Project object */ = { 252 | isa = PBXProject; 253 | attributes = { 254 | LastSwiftUpdateCheck = 0910; 255 | LastUpgradeCheck = 0930; 256 | ORGANIZATIONNAME = "庫倪"; 257 | TargetAttributes = { 258 | F9082A4F1FB8583E00F1DC15 = { 259 | CreatedOnToolsVersion = 9.1; 260 | LastSwiftMigration = 1020; 261 | ProvisioningStyle = Automatic; 262 | }; 263 | F9E45F711FB7A54B005DE498 = { 264 | CreatedOnToolsVersion = 9.1; 265 | LastSwiftMigration = 1020; 266 | ProvisioningStyle = Automatic; 267 | SystemCapabilities = { 268 | com.apple.BackgroundModes = { 269 | enabled = 1; 270 | }; 271 | }; 272 | }; 273 | }; 274 | }; 275 | buildConfigurationList = F9E45F6D1FB7A54B005DE498 /* Build configuration list for PBXProject "dailyVerse" */; 276 | compatibilityVersion = "Xcode 8.0"; 277 | developmentRegion = en; 278 | hasScannedForEncodings = 0; 279 | knownRegions = ( 280 | en, 281 | Base, 282 | "zh-Hant", 283 | "zh-Hans", 284 | ); 285 | mainGroup = F9E45F691FB7A54B005DE498; 286 | productRefGroup = F9E45F731FB7A54B005DE498 /* Products */; 287 | projectDirPath = ""; 288 | projectRoot = ""; 289 | targets = ( 290 | F9E45F711FB7A54B005DE498 /* dailyVerse */, 291 | F9082A4F1FB8583E00F1DC15 /* Extension */, 292 | ); 293 | }; 294 | /* End PBXProject section */ 295 | 296 | /* Begin PBXResourcesBuildPhase section */ 297 | F9082A4E1FB8583E00F1DC15 /* Resources */ = { 298 | isa = PBXResourcesBuildPhase; 299 | buildActionMask = 2147483647; 300 | files = ( 301 | F9082A581FB8583E00F1DC15 /* MainInterface.storyboard in Resources */, 302 | ); 303 | runOnlyForDeploymentPostprocessing = 0; 304 | }; 305 | F9E45F701FB7A54B005DE498 /* Resources */ = { 306 | isa = PBXResourcesBuildPhase; 307 | buildActionMask = 2147483647; 308 | files = ( 309 | F9E45F801FB7A54B005DE498 /* LaunchScreen.storyboard in Resources */, 310 | F924C03B1FBAB3E4008B105F /* InfoPlist.strings in Resources */, 311 | F9E45F7D1FB7A54B005DE498 /* Assets.xcassets in Resources */, 312 | F9E45F7B1FB7A54B005DE498 /* Main.storyboard in Resources */, 313 | ); 314 | runOnlyForDeploymentPostprocessing = 0; 315 | }; 316 | /* End PBXResourcesBuildPhase section */ 317 | 318 | /* Begin PBXShellScriptBuildPhase section */ 319 | 1CFBAFC9E9EA7CC0649E87E7 /* [CP] Check Pods Manifest.lock */ = { 320 | isa = PBXShellScriptBuildPhase; 321 | buildActionMask = 2147483647; 322 | files = ( 323 | ); 324 | inputPaths = ( 325 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 326 | "${PODS_ROOT}/Manifest.lock", 327 | ); 328 | name = "[CP] Check Pods Manifest.lock"; 329 | outputPaths = ( 330 | "$(DERIVED_FILE_DIR)/Pods-Extension-checkManifestLockResult.txt", 331 | ); 332 | runOnlyForDeploymentPostprocessing = 0; 333 | shellPath = /bin/sh; 334 | 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"; 335 | showEnvVarsInLog = 0; 336 | }; 337 | B0A5E98C7BCC313729E2DFB5 /* [CP] Check Pods Manifest.lock */ = { 338 | isa = PBXShellScriptBuildPhase; 339 | buildActionMask = 2147483647; 340 | files = ( 341 | ); 342 | inputPaths = ( 343 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 344 | "${PODS_ROOT}/Manifest.lock", 345 | ); 346 | name = "[CP] Check Pods Manifest.lock"; 347 | outputPaths = ( 348 | "$(DERIVED_FILE_DIR)/Pods-dailyVerse-checkManifestLockResult.txt", 349 | ); 350 | runOnlyForDeploymentPostprocessing = 0; 351 | shellPath = /bin/sh; 352 | 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"; 353 | showEnvVarsInLog = 0; 354 | }; 355 | C8BF1C076227876CD84B2E74 /* [CP] Embed Pods Frameworks */ = { 356 | isa = PBXShellScriptBuildPhase; 357 | buildActionMask = 2147483647; 358 | files = ( 359 | ); 360 | inputPaths = ( 361 | "${PODS_ROOT}/Target Support Files/Pods-dailyVerse/Pods-dailyVerse-frameworks.sh", 362 | "${BUILT_PRODUCTS_DIR}/Alamofire/Alamofire.framework", 363 | "${BUILT_PRODUCTS_DIR}/DynamicBlurView/DynamicBlurView.framework", 364 | "${BUILT_PRODUCTS_DIR}/MMMaterialDesignSpinner/MMMaterialDesignSpinner.framework", 365 | "${BUILT_PRODUCTS_DIR}/MarqueeLabel/MarqueeLabel.framework", 366 | "${BUILT_PRODUCTS_DIR}/NotificationBannerSwift/NotificationBannerSwift.framework", 367 | "${BUILT_PRODUCTS_DIR}/SnapKit/SnapKit.framework", 368 | "${BUILT_PRODUCTS_DIR}/Spring/Spring.framework", 369 | "${BUILT_PRODUCTS_DIR}/SwiftDate/SwiftDate.framework", 370 | "${BUILT_PRODUCTS_DIR}/SwiftyJSON/SwiftyJSON.framework", 371 | ); 372 | name = "[CP] Embed Pods Frameworks"; 373 | outputPaths = ( 374 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Alamofire.framework", 375 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/DynamicBlurView.framework", 376 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MMMaterialDesignSpinner.framework", 377 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MarqueeLabel.framework", 378 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/NotificationBannerSwift.framework", 379 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SnapKit.framework", 380 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Spring.framework", 381 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SwiftDate.framework", 382 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SwiftyJSON.framework", 383 | ); 384 | runOnlyForDeploymentPostprocessing = 0; 385 | shellPath = /bin/sh; 386 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-dailyVerse/Pods-dailyVerse-frameworks.sh\"\n"; 387 | showEnvVarsInLog = 0; 388 | }; 389 | F982466A22BD091200ADFFB6 /* 自動上傳 dSYM 到 Bugly */ = { 390 | isa = PBXShellScriptBuildPhase; 391 | buildActionMask = 2147483647; 392 | files = ( 393 | ); 394 | inputFileListPaths = ( 395 | ); 396 | inputPaths = ( 397 | ); 398 | name = "自動上傳 dSYM 到 Bugly"; 399 | outputFileListPaths = ( 400 | ); 401 | outputPaths = ( 402 | ); 403 | runOnlyForDeploymentPostprocessing = 0; 404 | shellPath = /bin/sh; 405 | shellScript = "#!/bin/sh\n#\n# Copyright 2016 Bugly, Tencent. All rights reserved.\n#\n# V1.4.0\n#\n# 2016.08.03\n#\n#\n#\n######################################################\n# 1. 脚本集成到Xcode工程的Target\n######################################################\n#\n# --- Copy the SCRIPT to the Run Script of Build Phases in the Xcode project ---\n#\n# #\nBUGLY_APP_ID=\"b2f3040bce\"\n# #\nBUGLY_APP_KEY=\"5082362c-2967-41ca-a6d2-489c7c485fc8\"\n# #\nBUNDLE_IDENTIFIER=\"com.qoli.dailyVerse\"\n# #\nUPLOAD_DSYM_ONLY=1\n#\n# # 脚本默认配置的版本格式为CFBundleShortVersionString(CFBundleVersion), 如果你修改默认的版本格式, 请设置此变量, 如果不想修改, 请忽略此设置\n# CUSTOMIZED_APP_VERSION=\"\"\n#\n# # Debug模式编译是否上传,1=上传 0=不上传,默认不上传\n# UPLOAD_DEBUG_SYMBOLS=0\n#\n# # 模拟器编译是否上传,1=上传 0=不上传,默认不上传\n# UPLOAD_SIMULATOR_SYMBOLS=0\n#\n# #只有Archive操作时上传, 1=支持Archive上传 0=所有Release模式编译都上传\n# UPLOAD_ARCHIVE_ONLY=0\n#\n# #\n# source dSYMUpload.sh\n#\n# --- END OF SCRIPT ---\n#\n#\n#\n#\n#######################################################\n# 2. 脚本根据输入参数处理\n#######################################################\n#\n# #命令行下输入应用基本信息, .dSYM文件的父目录路径, 输出文件目录即可\n#\n# sh dSYMUpload.sh \n#\n# #\n#\n# #注意:\n# # 1. dSYMUpload.sh会调用buglySymboliOS.jar进行.dSYM解析,所以依赖Java运行时环境\n# # 2. dSYMUpload.sh和buglySymboliOS.jar的文件路径需一致\n#\n#\n\n#\n# --- CONTENT OF SCRIPT ---\n#\n\n# Bugly服务域名\nBUGLY_DSYM_UPLOAD_DOMAIN=\"api.bugly.qq.com\"\n\n# 注意jar工具的路径跟dSYMUpload.sh脚本路径一致, 请务必保证jar路径的正确性\nBUGLY_SYMBOL_JAR_PATH=\"dsymtool/buglySymboliOS.jar\"\n# 查找添加到系统目录的jar工具\nif [ ! -f \"${BUGLY_SYMBOL_JAR_PATH}\" ]; then\nBUGLY_SYMBOL_JAR_PATH=\"$HOME/bin/buglySymboliOS.jar\"\nfi\n\n# 打印错误信息\nfunction exitWithMessage(){\necho \"--------------------------------\"\necho \"${1}\"\necho \"--------------------------------\"\nexit ${2}\n}\n\n# 上传bSYMBOL文件\nfunction dSYMUpload() {\nP_APP_ID=\"$1\"\nP_APP_KEY=\"$2\"\nP_APP_BUNDLE_ID=\"$3\"\nP_APP_VERSION=\"$4\"\nP_BSYMBOL_ZIP_FILE=\"$5\"\n\n#\nP_BSYMBOL_ZIP_FILE_NAME=${P_BSYMBOL_ZIP_FILE##*/}\nP_BSYMBOL_ZIP_FILE_NAME=${P_BSYMBOL_ZIP_FILE_NAME//&/_}\nP_BSYMBOL_ZIP_FILE_NAME=\"${P_BSYMBOL_ZIP_FILE_NAME// /_}\"\n\nDSYM_UPLOAD_URL=\"https://${BUGLY_DSYM_UPLOAD_DOMAIN}/openapi/file/upload/symbol?app_id=${P_APP_ID}&app_key=${P_APP_KEY}\"\necho \"dSYM upload url: ${DSYM_UPLOAD_URL}\"\n\necho \"-----------------------------\"\nSTATUS=$(/usr/bin/curl -k \"${DSYM_UPLOAD_URL}\" --form \"api_version=1\" --form \"app_id=${P_APP_ID}\" --form \"app_key=${P_APP_KEY}\" --form \"symbolType=2\" --form \"bundleId=${BUNDLE_IDENTIFIER}\" --form \"productVersion=${BUGLY_APP_VERSION}\" --form \"fileName=${P_BSYMBOL_ZIP_FILE_NAME}\" --form \"file=@${P_BSYMBOL_ZIP_FILE}\" --verbose)\necho \"-----------------------------\"\n\nUPLOAD_RESULT=\"FAILTURE\"\necho \"Bugly server response: ${STATUS}\"\nif [ ! \"${STATUS}\" ]; then\necho \"Error: Failed to upload the zip archive file.\"\nelif [[ \"${STATUS}\" == *\"{\\\"reponseCode\\\":\\\"0\\\"}\"* ]]; then\necho \"Success to upload the dSYM for the app [${BUNDLE_IDENTIFIER} ${BUGLY_APP_VERSION}]\"\nUPLOAD_RESULT=\"SUCCESS\"\nelse\necho \"Error: Failed to upload the zip archive file to Bugly.\"\nfi\n\n#Remove temp dSYM archive\n#echo \"Remove temporary zip archive: ${DSYM_ZIP_FPATH}\"\n#/bin/rm -f \"${DSYM_ZIP_FPATH}\"\n\nif [ \"$?\" -ne 0 ]; then\nexitWithMessage \"Error: Failed to remove temporary zip archive.\" 0\nfi\n\necho \"--------------------------------\"\necho \"${UPLOAD_RESULT} - dSYM upload complete.\"\n\nif [[ \"${UPLOAD_RESULT}\" == \"FAILTURE\" ]]; then\necho \"--------------------------------\"\necho \"Failed to upload the dSYM\"\necho \"Please check the script and try it again.\"\nfi\n}\n\n# .dSYM解析为bSYMBOL文件\nfunction dSYMParse() {\nDSYM_FILE=\"$1\"\nDSYM_SYMBOL_FILE=\"$2\"\n\necho \"--------------------------------\"\necho \"Extract symbol info from .dSYM file. to ${DSYM_SYMBOL_FILE}\"\n(/usr/bin/java -Xms512m -Xmx1024m -Dfile.encoding=UTF8 -jar \"${BUGLY_SYMBOL_JAR_PATH}\" -i \"${DSYM_FILE}\" -o \"${DSYM_SYMBOL_FILE}\" ) || exitWithMessage \"Error: Failed to extract symbols.\" 1\necho \"--------------------------------\"\n\n}\n\n# 执行\nfunction run() {\n\nCONFIG_BUGLY_APP_ID=\"$1\"\nCONFIG_BUGLY_APP_KEY=\"$2\"\n\nCONFIG_BUGLY_APP_BUNDLE_IDENTIFIER=\"$3\"\nCONFIG_BUGLY_APP_VERSION=\"$4\"\nCONFIG_DSYM_SOURCE_DIR=\"$5\"\nCONFIG_DSYM_DEST_DIR=\"$6\"\nCONFIG_UPLOAD_DSYM_ONLY=\"$7\"\n\n# 检查必须参数是否设置\nif [ ! \"${CONFIG_BUGLY_APP_ID}\" ]; then\nexitWithMessage \"Error: Bugly App ID not defined. Please set 'BUGLY_APP_ID' \" 0\nfi\n\nif [[ \"${CONFIG_BUGLY_APP_ID}\" == *\"App ID\"* ]]; then\nexitWithMessage \"Error: Bugly App ID not defined.\" 0\nfi\n\nif [ ! \"${CONFIG_BUGLY_APP_KEY}\" ]; then\nexitWithMessage \"Error: Bugly App Key not defined.\" 0\nfi\n\nif [ ! \"${CONFIG_BUGLY_APP_BUNDLE_IDENTIFIER}\" ]; then\nexitWithMessage \"Error: Bundle Identifier not defined.\" 0\nfi\n\nif [ ! \"${CONFIG_BUGLY_APP_VERSION}\" ]; then\nexitWithMessage \"Error: App Version not defined.\" 0\nfi\n\nif [ ! -e \"${CONFIG_DSYM_SOURCE_DIR}\" ]; then\nexitWithMessage \"Error: Invalid dir ${CONFIG_DSYM_SOURCE_DIR}\" 0\nfi\n\nif [ ! \"${CONFIG_DSYM_DEST_DIR}\" ]; then\nexitWithMessage \"Error: Invalid dir ${CONFIG_DSYM_DEST_DIR}\" 0\nfi\n\nif [ ! -e \"${CONFIG_DSYM_DEST_DIR}\" ]; then\nmkdir ${CONFIG_DSYM_DEST_DIR}\nfi\n\nDSYM_FOLDER=\"${CONFIG_DSYM_SOURCE_DIR}\"\nIFS=$'\\n'\n\necho \"Scaning dSYM FOLDER: ${DSYM_FOLDER} ...\"\nRET=\"F\"\n\n#\nfor dsymFile in $(find \"$DSYM_FOLDER\" -name '*.dSYM'); do\nRET=\"T\"\necho \"Found dSYM file: $dsymFile\"\n\nDSYM_FILE_NAME=${dsymFile##*/}\nDSYM_SYMBOL_ZIP_FILE_NAME=\"${DSYM_FILE_NAME}.zip\"\nDSYM_SYMBOL_ZIP_FILE_NAME=\"${DSYM_SYMBOL_ZIP_FILE_NAME// /_}\"\nDSYM_SYMBOL_ZIP_FILE=${CONFIG_DSYM_DEST_DIR}/${DSYM_SYMBOL_ZIP_FILE_NAME}\n\nif [ $CONFIG_UPLOAD_DSYM_ONLY -eq 1 ]; then\nif [ -e $DSYM_SYMBOL_ZIP_FILE ]; then\nrm -f $DSYM_SYMBOL_ZIP_FILE\nfi\n# 如果只上传dSYM,直接压缩dSYM目录\nzip -r -j $DSYM_SYMBOL_ZIP_FILE $dsymFile -x *.plist\nelse\n# 使用符号表工具来生成Symbol文件\ndSYMParse $dsymFile $DSYM_SYMBOL_ZIP_FILE\nfi\n\n# 上传\ndSYMUpload $CONFIG_BUGLY_APP_ID $CONFIG_BUGLY_APP_KEY $CONFIG_BUGLY_APP_BUNDLE_IDENTIFIER $CONFIG_BUGLY_APP_VERSION $DSYM_SYMBOL_ZIP_FILE\ndone\n\nif [ $RET = \"F\" ]; then\nexitWithMessage \"No .dSYM found in ${DSYM_FOLDER}\" 0\nfi\n}\n\n# 在Xcode工程中执行\nfunction runInXcode(){\necho \"Uploading dSYM to Bugly in Xcode ...\"\n\necho \"Info.Plist : ${INFOPLIST_FILE}\"\n\nBUNDLE_VERSION=$(/usr/libexec/PlistBuddy -c 'Print CFBundleVersion' \"${INFOPLIST_FILE}\")\nBUNDLE_SHORT_VERSION=$(/usr/libexec/PlistBuddy -c 'Print CFBundleShortVersionString' \"${INFOPLIST_FILE}\")\n\n# 组装Bugly默认识别的版本信息(格式为CFBundleShortVersionString(CFBundleVersion), 例如: 1.0(1))\nif [ ! \"${CUSTOMIZED_APP_VERSION}\" ]; then\nBUGLY_APP_VERSION=\"${BUNDLE_SHORT_VERSION}(${BUNDLE_VERSION})\"\nelse\nBUGLY_APP_VERSION=\"${CUSTOMIZED_APP_VERSION}\"\nfi\n\necho \"--------------------------------\"\necho \"Prepare application information.\"\necho \"--------------------------------\"\n\necho \"Product Name: ${PRODUCT_NAME}\"\necho \"Bundle Identifier: ${BUNDLE_IDENTIFIER}\"\necho \"Version: ${BUNDLE_SHORT_VERSION}\"\necho \"Build: ${BUNDLE_VERSION}\"\n\necho \"Bugly App ID: ${BUGLY_APP_ID}\"\necho \"Bugly App key: ${BUGLY_APP_KEY}\"\necho \"Bugly App Version: ${BUGLY_APP_VERSION}\"\n\necho \"--------------------------------\"\necho \"Check the arguments ...\"\n\n##检查模拟器编译是否允许上传符号\nif [ \"$EFFECTIVE_PLATFORM_NAME\" == \"-iphonesimulator\" ]; then\nif [ $UPLOAD_SIMULATOR_SYMBOLS -eq 0 ]; then\nexitWithMessage \"Warning: Build for simulator and skipping to upload. \\nYou can modify 'UPLOAD_SIMULATOR_SYMBOLS' to 1 in the script.\" 0\nfi\nfi\n\n##检查是否是Release模式编译\nif [ \"${CONFIGURATION=}\" == \"Debug\" ]; then\nif [ $UPLOAD_DEBUG_SYMBOLS -eq 0 ]; then\nexitWithMessage \"Warning: Build for debug mode and skipping to upload. \\nYou can modify 'UPLOAD_DEBUG_SYMBOLS' to 1 in the script.\" 0\nfi\nfi\n\n##检查是否Archive操作\nif [ $UPLOAD_ARCHIVE_ONLY -eq 1 ]; then\nif [[ \"$TARGET_BUILD_DIR\" == *\"/Archive\"* ]]; then\necho \"Archive the package\"\nelse\nexitWithMessage \"Warning: Build for NOT Archive mode and skipping to upload. \\nYou can modify 'UPLOAD_ARCHIVE_ONLY' to 0 in the script.\" 0\nfi\nfi\n\n#\nrun ${BUGLY_APP_ID} ${BUGLY_APP_KEY} ${BUNDLE_IDENTIFIER} ${BUGLY_APP_VERSION} ${DWARF_DSYM_FOLDER_PATH} ${BUILD_DIR}/BuglySymbolTemp ${UPLOAD_DSYM_ONLY}\n}\n\n# 根据Xcode的环境变量判断是否处于Xcode环境\nINFO_PLIST_FILE=\"${INFOPLIST_FILE}\"\n\nBuildInXcode=\"F\"\nif [ -f \"${INFO_PLIST_FILE}\" ]; then\nBuildInXcode=\"T\"\nfi\n\nif [ $BuildInXcode = \"T\" ]; then\nrunInXcode\nelse\necho \"\\nUsage: dSYMUpload.sh [upload_dsym_only]\\n\"\n# 你可以在此处直接设置BuglyAppID和BuglyAppKey,排除不常变参数的输入\nBUGLY_APP_ID=\"$1\"\nBUGLY_APP_KEY=\"$2\"\nBUNDLE_IDENTIFIER=\"$3\"\nBUGLY_APP_VERSION=\"$4\"\nDWARF_DSYM_FOLDER_PATH=\"$5\"\nSYMBOL_OUTPUT_PATH=\"$6\"\nUPLOAD_DSYM_ONLY=$7\nrun ${BUGLY_APP_ID} ${BUGLY_APP_KEY} ${BUNDLE_IDENTIFIER} ${BUGLY_APP_VERSION} ${DWARF_DSYM_FOLDER_PATH} ${SYMBOL_OUTPUT_PATH} ${UPLOAD_DSYM_ONLY}\nfi\n"; 406 | }; 407 | /* End PBXShellScriptBuildPhase section */ 408 | 409 | /* Begin PBXSourcesBuildPhase section */ 410 | F9082A4C1FB8583E00F1DC15 /* Sources */ = { 411 | isa = PBXSourcesBuildPhase; 412 | buildActionMask = 2147483647; 413 | files = ( 414 | F9082A551FB8583E00F1DC15 /* TodayViewController.swift in Sources */, 415 | ); 416 | runOnlyForDeploymentPostprocessing = 0; 417 | }; 418 | F9E45F6E1FB7A54B005DE498 /* Sources */ = { 419 | isa = PBXSourcesBuildPhase; 420 | buildActionMask = 2147483647; 421 | files = ( 422 | F9FB0CE91FB898B900EAB646 /* SectionCell.swift in Sources */, 423 | 0A15ED4E1FBABE8400D2E4DA /* UITextView+DV.swift in Sources */, 424 | 0A15ED4C1FBABE6700D2E4DA /* UILabel+DV.swift in Sources */, 425 | 0A15ED4A1FBABE4D00D2E4DA /* UIFont+DV.swift in Sources */, 426 | F9B1538322BD2EB400B9DEF5 /* UIColor+Additions.swift in Sources */, 427 | F9E45F781FB7A54B005DE498 /* ViewController.swift in Sources */, 428 | 0A15ED501FBABEA500D2E4DA /* UIView+DV.swift in Sources */, 429 | F98819A622D4548100BCB099 /* GBig.swift in Sources */, 430 | F9E45F761FB7A54B005DE498 /* AppDelegate.swift in Sources */, 431 | F908D2931FB8A3E6002CEEAD /* ChapterCell.swift in Sources */, 432 | F94AB5C62009B8F2006BBF98 /* MyFunctions.swift in Sources */, 433 | ); 434 | runOnlyForDeploymentPostprocessing = 0; 435 | }; 436 | /* End PBXSourcesBuildPhase section */ 437 | 438 | /* Begin PBXTargetDependency section */ 439 | F9082A5B1FB8583E00F1DC15 /* PBXTargetDependency */ = { 440 | isa = PBXTargetDependency; 441 | target = F9082A4F1FB8583E00F1DC15 /* Extension */; 442 | targetProxy = F9082A5A1FB8583E00F1DC15 /* PBXContainerItemProxy */; 443 | }; 444 | /* End PBXTargetDependency section */ 445 | 446 | /* Begin PBXVariantGroup section */ 447 | F9082A561FB8583E00F1DC15 /* MainInterface.storyboard */ = { 448 | isa = PBXVariantGroup; 449 | children = ( 450 | F9082A571FB8583E00F1DC15 /* Base */, 451 | ); 452 | name = MainInterface.storyboard; 453 | sourceTree = ""; 454 | }; 455 | F924C03D1FBAB3E4008B105F /* InfoPlist.strings */ = { 456 | isa = PBXVariantGroup; 457 | children = ( 458 | F924C03C1FBAB3E4008B105F /* en */, 459 | F924C03E1FBAB3E8008B105F /* zh-Hant */, 460 | F924C03F1FBAB3E8008B105F /* zh-Hans */, 461 | ); 462 | name = InfoPlist.strings; 463 | sourceTree = ""; 464 | }; 465 | F9E45F791FB7A54B005DE498 /* Main.storyboard */ = { 466 | isa = PBXVariantGroup; 467 | children = ( 468 | F9E45F7A1FB7A54B005DE498 /* Base */, 469 | F9082A491FB848F700F1DC15 /* zh-Hant */, 470 | F9082A4B1FB848F900F1DC15 /* zh-Hans */, 471 | ); 472 | name = Main.storyboard; 473 | sourceTree = ""; 474 | }; 475 | F9E45F7E1FB7A54B005DE498 /* LaunchScreen.storyboard */ = { 476 | isa = PBXVariantGroup; 477 | children = ( 478 | F9E45F7F1FB7A54B005DE498 /* Base */, 479 | F9ED80B81FB80CCD00D8CC70 /* zh-Hans */, 480 | F9ED80BA1FB80CF700D8CC70 /* zh-Hant */, 481 | ); 482 | name = LaunchScreen.storyboard; 483 | sourceTree = ""; 484 | }; 485 | /* End PBXVariantGroup section */ 486 | 487 | /* Begin XCBuildConfiguration section */ 488 | F9082A5D1FB8583E00F1DC15 /* Debug */ = { 489 | isa = XCBuildConfiguration; 490 | baseConfigurationReference = C34A9305C1CE1DDF39535A54 /* Pods-Extension.debug.xcconfig */; 491 | buildSettings = { 492 | CODE_SIGN_IDENTITY = "iPhone Developer"; 493 | CODE_SIGN_STYLE = Automatic; 494 | CURRENT_PROJECT_VERSION = 64; 495 | DEVELOPMENT_TEAM = WQY45CL427; 496 | INFOPLIST_FILE = Extension/Info.plist; 497 | IPHONEOS_DEPLOYMENT_TARGET = 11.1; 498 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; 499 | MARKETING_VERSION = 1.50; 500 | PRODUCT_BUNDLE_IDENTIFIER = com.qoli.dailyVerse.Extension; 501 | PRODUCT_NAME = "$(TARGET_NAME)"; 502 | PROVISIONING_PROFILE_SPECIFIER = ""; 503 | SKIP_INSTALL = YES; 504 | SWIFT_VERSION = 5.0; 505 | TARGETED_DEVICE_FAMILY = 1; 506 | }; 507 | name = Debug; 508 | }; 509 | F9082A5E1FB8583E00F1DC15 /* Release */ = { 510 | isa = XCBuildConfiguration; 511 | baseConfigurationReference = EB9EAEEC1B778E240E7305EE /* Pods-Extension.release.xcconfig */; 512 | buildSettings = { 513 | CODE_SIGN_IDENTITY = "iPhone Developer"; 514 | CODE_SIGN_STYLE = Automatic; 515 | CURRENT_PROJECT_VERSION = 64; 516 | DEVELOPMENT_TEAM = WQY45CL427; 517 | INFOPLIST_FILE = Extension/Info.plist; 518 | IPHONEOS_DEPLOYMENT_TARGET = 11.1; 519 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; 520 | MARKETING_VERSION = 1.50; 521 | PRODUCT_BUNDLE_IDENTIFIER = com.qoli.dailyVerse.Extension; 522 | PRODUCT_NAME = "$(TARGET_NAME)"; 523 | PROVISIONING_PROFILE_SPECIFIER = ""; 524 | SKIP_INSTALL = YES; 525 | SWIFT_VERSION = 5.0; 526 | TARGETED_DEVICE_FAMILY = 1; 527 | }; 528 | name = Release; 529 | }; 530 | F9E45F821FB7A54B005DE498 /* Debug */ = { 531 | isa = XCBuildConfiguration; 532 | buildSettings = { 533 | ALWAYS_SEARCH_USER_PATHS = NO; 534 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 535 | CLANG_ANALYZER_NONNULL = YES; 536 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 537 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 538 | CLANG_CXX_LIBRARY = "libc++"; 539 | CLANG_ENABLE_MODULES = YES; 540 | CLANG_ENABLE_OBJC_ARC = YES; 541 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 542 | CLANG_WARN_BOOL_CONVERSION = YES; 543 | CLANG_WARN_COMMA = YES; 544 | CLANG_WARN_CONSTANT_CONVERSION = YES; 545 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 546 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 547 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 548 | CLANG_WARN_EMPTY_BODY = YES; 549 | CLANG_WARN_ENUM_CONVERSION = YES; 550 | CLANG_WARN_INFINITE_RECURSION = YES; 551 | CLANG_WARN_INT_CONVERSION = YES; 552 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 553 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 554 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 555 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 556 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 557 | CLANG_WARN_STRICT_PROTOTYPES = YES; 558 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 559 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 560 | CLANG_WARN_UNREACHABLE_CODE = YES; 561 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 562 | CODE_SIGN_IDENTITY = "iPhone Developer"; 563 | COPY_PHASE_STRIP = NO; 564 | DEBUG_INFORMATION_FORMAT = dwarf; 565 | ENABLE_STRICT_OBJC_MSGSEND = YES; 566 | ENABLE_TESTABILITY = YES; 567 | GCC_C_LANGUAGE_STANDARD = gnu11; 568 | GCC_DYNAMIC_NO_PIC = NO; 569 | GCC_NO_COMMON_BLOCKS = YES; 570 | GCC_OPTIMIZATION_LEVEL = 0; 571 | GCC_PREPROCESSOR_DEFINITIONS = ( 572 | "DEBUG=1", 573 | "$(inherited)", 574 | ); 575 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 576 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 577 | GCC_WARN_UNDECLARED_SELECTOR = YES; 578 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 579 | GCC_WARN_UNUSED_FUNCTION = YES; 580 | GCC_WARN_UNUSED_VARIABLE = YES; 581 | IPHONEOS_DEPLOYMENT_TARGET = 11.1; 582 | MTL_ENABLE_DEBUG_INFO = YES; 583 | ONLY_ACTIVE_ARCH = YES; 584 | SDKROOT = iphoneos; 585 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 586 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 587 | SWIFT_VERSION = 5.0; 588 | }; 589 | name = Debug; 590 | }; 591 | F9E45F831FB7A54B005DE498 /* Release */ = { 592 | isa = XCBuildConfiguration; 593 | buildSettings = { 594 | ALWAYS_SEARCH_USER_PATHS = NO; 595 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 596 | CLANG_ANALYZER_NONNULL = YES; 597 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 598 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 599 | CLANG_CXX_LIBRARY = "libc++"; 600 | CLANG_ENABLE_MODULES = YES; 601 | CLANG_ENABLE_OBJC_ARC = YES; 602 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 603 | CLANG_WARN_BOOL_CONVERSION = YES; 604 | CLANG_WARN_COMMA = YES; 605 | CLANG_WARN_CONSTANT_CONVERSION = YES; 606 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 607 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 608 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 609 | CLANG_WARN_EMPTY_BODY = YES; 610 | CLANG_WARN_ENUM_CONVERSION = YES; 611 | CLANG_WARN_INFINITE_RECURSION = YES; 612 | CLANG_WARN_INT_CONVERSION = YES; 613 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 614 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 615 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 616 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 617 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 618 | CLANG_WARN_STRICT_PROTOTYPES = YES; 619 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 620 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 621 | CLANG_WARN_UNREACHABLE_CODE = YES; 622 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 623 | CODE_SIGN_IDENTITY = "iPhone Developer"; 624 | COPY_PHASE_STRIP = NO; 625 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 626 | ENABLE_NS_ASSERTIONS = NO; 627 | ENABLE_STRICT_OBJC_MSGSEND = YES; 628 | GCC_C_LANGUAGE_STANDARD = gnu11; 629 | GCC_NO_COMMON_BLOCKS = YES; 630 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 631 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 632 | GCC_WARN_UNDECLARED_SELECTOR = YES; 633 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 634 | GCC_WARN_UNUSED_FUNCTION = YES; 635 | GCC_WARN_UNUSED_VARIABLE = YES; 636 | IPHONEOS_DEPLOYMENT_TARGET = 11.1; 637 | MTL_ENABLE_DEBUG_INFO = NO; 638 | SDKROOT = iphoneos; 639 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 640 | SWIFT_VERSION = 5.0; 641 | VALIDATE_PRODUCT = YES; 642 | }; 643 | name = Release; 644 | }; 645 | F9E45F851FB7A54B005DE498 /* Debug */ = { 646 | isa = XCBuildConfiguration; 647 | baseConfigurationReference = 5D478837BA7F98F6048327BF /* Pods-dailyVerse.debug.xcconfig */; 648 | buildSettings = { 649 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = "$(inherited)"; 650 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 651 | CODE_SIGN_STYLE = Automatic; 652 | CURRENT_PROJECT_VERSION = 64; 653 | DEVELOPMENT_TEAM = WQY45CL427; 654 | INFOPLIST_FILE = dailyVerse/Info.plist; 655 | IPHONEOS_DEPLOYMENT_TARGET = 11.1; 656 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 657 | MARKETING_VERSION = 1.50; 658 | PRODUCT_BUNDLE_IDENTIFIER = com.qoli.dailyVerse; 659 | PRODUCT_NAME = "$(TARGET_NAME)"; 660 | SWIFT_VERSION = 5.0; 661 | TARGETED_DEVICE_FAMILY = 1; 662 | VERSIONING_SYSTEM = "apple-generic"; 663 | }; 664 | name = Debug; 665 | }; 666 | F9E45F861FB7A54B005DE498 /* Release */ = { 667 | isa = XCBuildConfiguration; 668 | baseConfigurationReference = 377CD6992081B9BC5FE0BB1E /* Pods-dailyVerse.release.xcconfig */; 669 | buildSettings = { 670 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = "$(inherited)"; 671 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 672 | CODE_SIGN_STYLE = Automatic; 673 | CURRENT_PROJECT_VERSION = 64; 674 | DEVELOPMENT_TEAM = WQY45CL427; 675 | INFOPLIST_FILE = dailyVerse/Info.plist; 676 | IPHONEOS_DEPLOYMENT_TARGET = 11.1; 677 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 678 | MARKETING_VERSION = 1.50; 679 | PRODUCT_BUNDLE_IDENTIFIER = com.qoli.dailyVerse; 680 | PRODUCT_NAME = "$(TARGET_NAME)"; 681 | SWIFT_VERSION = 5.0; 682 | TARGETED_DEVICE_FAMILY = 1; 683 | VERSIONING_SYSTEM = "apple-generic"; 684 | }; 685 | name = Release; 686 | }; 687 | /* End XCBuildConfiguration section */ 688 | 689 | /* Begin XCConfigurationList section */ 690 | F9082A5F1FB8583E00F1DC15 /* Build configuration list for PBXNativeTarget "Extension" */ = { 691 | isa = XCConfigurationList; 692 | buildConfigurations = ( 693 | F9082A5D1FB8583E00F1DC15 /* Debug */, 694 | F9082A5E1FB8583E00F1DC15 /* Release */, 695 | ); 696 | defaultConfigurationIsVisible = 0; 697 | defaultConfigurationName = Release; 698 | }; 699 | F9E45F6D1FB7A54B005DE498 /* Build configuration list for PBXProject "dailyVerse" */ = { 700 | isa = XCConfigurationList; 701 | buildConfigurations = ( 702 | F9E45F821FB7A54B005DE498 /* Debug */, 703 | F9E45F831FB7A54B005DE498 /* Release */, 704 | ); 705 | defaultConfigurationIsVisible = 0; 706 | defaultConfigurationName = Release; 707 | }; 708 | F9E45F841FB7A54B005DE498 /* Build configuration list for PBXNativeTarget "dailyVerse" */ = { 709 | isa = XCConfigurationList; 710 | buildConfigurations = ( 711 | F9E45F851FB7A54B005DE498 /* Debug */, 712 | F9E45F861FB7A54B005DE498 /* Release */, 713 | ); 714 | defaultConfigurationIsVisible = 0; 715 | defaultConfigurationName = Release; 716 | }; 717 | /* End XCConfigurationList section */ 718 | }; 719 | rootObject = F9E45F6A1FB7A54B005DE498 /* Project object */; 720 | } 721 | -------------------------------------------------------------------------------- /dailyVerse.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /dailyVerse.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /dailyVerse.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /dailyVerse.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /dailyVerse/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qoli/dailyVerse/187c166c4a0d52ced5b13726bf567d972f9ae5bb/dailyVerse/.DS_Store -------------------------------------------------------------------------------- /dailyVerse/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | //dailyVerse 2 | // 3 | //Copyright (c) 2017 Qoli Wong - https://github.com/qoli/dailyVerse 4 | // 5 | //Permission is hereby granted, free of charge, to any person obtaining a copy 6 | //of this software and associated documentation files (the "Software"), to deal 7 | //in the Software without restriction, including without limitation the rights 8 | //to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | //copies of the Software, and to permit persons to whom the Software is 10 | //furnished to do so, subject to the following conditions: 11 | // 12 | //The above copyright notice and this permission notice shall be included in all 13 | //copies or substantial portions of the Software. 14 | // 15 | //THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | //IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | //FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | //AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | //LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | //OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | //SOFTWARE. 22 | 23 | import UIKit 24 | import Bugly 25 | 26 | @UIApplicationMain 27 | class AppDelegate: UIResponder, UIApplicationDelegate { 28 | 29 | var window: UIWindow? 30 | 31 | 32 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 33 | 34 | Bugly.start(withAppId: "b2f3040bce") 35 | return true 36 | } 37 | 38 | func applicationWillResignActive(_ application: UIApplication) { 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 invalidate graphics rendering callbacks. Games should use this method to pause the game. 41 | } 42 | 43 | func applicationDidEnterBackground(_ application: UIApplication) { 44 | // 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. 45 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 46 | } 47 | 48 | func applicationWillEnterForeground(_ application: UIApplication) { 49 | // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. 50 | } 51 | 52 | func applicationDidBecomeActive(_ application: UIApplication) { 53 | // 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. 54 | } 55 | 56 | func applicationWillTerminate(_ application: UIApplication) { 57 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 58 | } 59 | 60 | 61 | } 62 | 63 | -------------------------------------------------------------------------------- /dailyVerse/Assets.xcassets/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qoli/dailyVerse/187c166c4a0d52ced5b13726bf567d972f9ae5bb/dailyVerse/Assets.xcassets/.DS_Store -------------------------------------------------------------------------------- /dailyVerse/Assets.xcassets/AboutBackgroud.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | }, 6 | "colors" : [ 7 | { 8 | "idiom" : "universal", 9 | "color" : { 10 | "color-space" : "srgb", 11 | "components" : { 12 | "red" : "1.000", 13 | "alpha" : "1.000", 14 | "blue" : "1.000", 15 | "green" : "1.000" 16 | } 17 | } 18 | }, 19 | { 20 | "idiom" : "universal", 21 | "appearances" : [ 22 | { 23 | "appearance" : "luminosity", 24 | "value" : "dark" 25 | } 26 | ], 27 | "color" : { 28 | "color-space" : "srgb", 29 | "components" : { 30 | "red" : "0x1A", 31 | "alpha" : "1.000", 32 | "blue" : "0x1A", 33 | "green" : "0x1A" 34 | } 35 | } 36 | } 37 | ] 38 | } -------------------------------------------------------------------------------- /dailyVerse/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "20x20", 5 | "idiom" : "iphone", 6 | "filename" : "Icon-App-20x20@2x.png", 7 | "scale" : "2x" 8 | }, 9 | { 10 | "size" : "20x20", 11 | "idiom" : "iphone", 12 | "filename" : "Icon-App-20x20@3x.png", 13 | "scale" : "3x" 14 | }, 15 | { 16 | "size" : "29x29", 17 | "idiom" : "iphone", 18 | "filename" : "Icon-App-29x29@2x.png", 19 | "scale" : "2x" 20 | }, 21 | { 22 | "size" : "29x29", 23 | "idiom" : "iphone", 24 | "filename" : "Icon-App-29x29@3x.png", 25 | "scale" : "3x" 26 | }, 27 | { 28 | "size" : "40x40", 29 | "idiom" : "iphone", 30 | "filename" : "Icon-App-40x40@2x.png", 31 | "scale" : "2x" 32 | }, 33 | { 34 | "size" : "40x40", 35 | "idiom" : "iphone", 36 | "filename" : "Icon-App-40x40@3x.png", 37 | "scale" : "3x" 38 | }, 39 | { 40 | "size" : "60x60", 41 | "idiom" : "iphone", 42 | "filename" : "Icon-App-60x60@2x.png", 43 | "scale" : "2x" 44 | }, 45 | { 46 | "size" : "60x60", 47 | "idiom" : "iphone", 48 | "filename" : "Icon-App-60x60@3x.png", 49 | "scale" : "3x" 50 | }, 51 | { 52 | "size" : "20x20", 53 | "idiom" : "ipad", 54 | "filename" : "Icon-App-20x20@1x.png", 55 | "scale" : "1x" 56 | }, 57 | { 58 | "size" : "20x20", 59 | "idiom" : "ipad", 60 | "filename" : "Icon-App-20x20@2x-1.png", 61 | "scale" : "2x" 62 | }, 63 | { 64 | "size" : "29x29", 65 | "idiom" : "ipad", 66 | "filename" : "Icon-App-29x29@1x.png", 67 | "scale" : "1x" 68 | }, 69 | { 70 | "size" : "29x29", 71 | "idiom" : "ipad", 72 | "filename" : "Icon-App-29x29@2x-1.png", 73 | "scale" : "2x" 74 | }, 75 | { 76 | "size" : "40x40", 77 | "idiom" : "ipad", 78 | "filename" : "Icon-App-40x40@1x.png", 79 | "scale" : "1x" 80 | }, 81 | { 82 | "size" : "40x40", 83 | "idiom" : "ipad", 84 | "filename" : "Icon-App-40x40@2x-1.png", 85 | "scale" : "2x" 86 | }, 87 | { 88 | "size" : "76x76", 89 | "idiom" : "ipad", 90 | "filename" : "Icon-App-76x76@1x.png", 91 | "scale" : "1x" 92 | }, 93 | { 94 | "size" : "76x76", 95 | "idiom" : "ipad", 96 | "filename" : "Icon-App-76x76@2x.png", 97 | "scale" : "2x" 98 | }, 99 | { 100 | "size" : "83.5x83.5", 101 | "idiom" : "ipad", 102 | "filename" : "Icon-App-83.5x83.5@2x.png", 103 | "scale" : "2x" 104 | }, 105 | { 106 | "size" : "1024x1024", 107 | "idiom" : "ios-marketing", 108 | "filename" : "ItunesArtwork@2x.png", 109 | "scale" : "1x" 110 | } 111 | ], 112 | "info" : { 113 | "version" : 1, 114 | "author" : "xcode" 115 | } 116 | } -------------------------------------------------------------------------------- /dailyVerse/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qoli/dailyVerse/187c166c4a0d52ced5b13726bf567d972f9ae5bb/dailyVerse/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png -------------------------------------------------------------------------------- /dailyVerse/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qoli/dailyVerse/187c166c4a0d52ced5b13726bf567d972f9ae5bb/dailyVerse/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x-1.png -------------------------------------------------------------------------------- /dailyVerse/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qoli/dailyVerse/187c166c4a0d52ced5b13726bf567d972f9ae5bb/dailyVerse/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png -------------------------------------------------------------------------------- /dailyVerse/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qoli/dailyVerse/187c166c4a0d52ced5b13726bf567d972f9ae5bb/dailyVerse/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png -------------------------------------------------------------------------------- /dailyVerse/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qoli/dailyVerse/187c166c4a0d52ced5b13726bf567d972f9ae5bb/dailyVerse/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png -------------------------------------------------------------------------------- /dailyVerse/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qoli/dailyVerse/187c166c4a0d52ced5b13726bf567d972f9ae5bb/dailyVerse/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x-1.png -------------------------------------------------------------------------------- /dailyVerse/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qoli/dailyVerse/187c166c4a0d52ced5b13726bf567d972f9ae5bb/dailyVerse/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png -------------------------------------------------------------------------------- /dailyVerse/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qoli/dailyVerse/187c166c4a0d52ced5b13726bf567d972f9ae5bb/dailyVerse/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png -------------------------------------------------------------------------------- /dailyVerse/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qoli/dailyVerse/187c166c4a0d52ced5b13726bf567d972f9ae5bb/dailyVerse/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png -------------------------------------------------------------------------------- /dailyVerse/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qoli/dailyVerse/187c166c4a0d52ced5b13726bf567d972f9ae5bb/dailyVerse/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x-1.png -------------------------------------------------------------------------------- /dailyVerse/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qoli/dailyVerse/187c166c4a0d52ced5b13726bf567d972f9ae5bb/dailyVerse/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png -------------------------------------------------------------------------------- /dailyVerse/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qoli/dailyVerse/187c166c4a0d52ced5b13726bf567d972f9ae5bb/dailyVerse/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png -------------------------------------------------------------------------------- /dailyVerse/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qoli/dailyVerse/187c166c4a0d52ced5b13726bf567d972f9ae5bb/dailyVerse/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png -------------------------------------------------------------------------------- /dailyVerse/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qoli/dailyVerse/187c166c4a0d52ced5b13726bf567d972f9ae5bb/dailyVerse/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png -------------------------------------------------------------------------------- /dailyVerse/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qoli/dailyVerse/187c166c4a0d52ced5b13726bf567d972f9ae5bb/dailyVerse/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png -------------------------------------------------------------------------------- /dailyVerse/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qoli/dailyVerse/187c166c4a0d52ced5b13726bf567d972f9ae5bb/dailyVerse/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png -------------------------------------------------------------------------------- /dailyVerse/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qoli/dailyVerse/187c166c4a0d52ced5b13726bf567d972f9ae5bb/dailyVerse/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png -------------------------------------------------------------------------------- /dailyVerse/Assets.xcassets/AppIcon.appiconset/ItunesArtwork@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qoli/dailyVerse/187c166c4a0d52ced5b13726bf567d972f9ae5bb/dailyVerse/Assets.xcassets/AppIcon.appiconset/ItunesArtwork@2x.png -------------------------------------------------------------------------------- /dailyVerse/Assets.xcassets/ButtonText.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | }, 6 | "colors" : [ 7 | { 8 | "idiom" : "universal", 9 | "color" : { 10 | "color-space" : "srgb", 11 | "components" : { 12 | "red" : "1.000", 13 | "alpha" : "1.000", 14 | "blue" : "1.000", 15 | "green" : "1.000" 16 | } 17 | } 18 | }, 19 | { 20 | "idiom" : "universal", 21 | "appearances" : [ 22 | { 23 | "appearance" : "luminosity", 24 | "value" : "dark" 25 | } 26 | ], 27 | "color" : { 28 | "color-space" : "srgb", 29 | "components" : { 30 | "red" : "0.000", 31 | "alpha" : "1.000", 32 | "blue" : "0.000", 33 | "green" : "0.000" 34 | } 35 | } 36 | } 37 | ] 38 | } -------------------------------------------------------------------------------- /dailyVerse/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /dailyVerse/Assets.xcassets/TextColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | }, 6 | "colors" : [ 7 | { 8 | "idiom" : "universal", 9 | "color" : { 10 | "color-space" : "srgb", 11 | "components" : { 12 | "red" : "0.325", 13 | "alpha" : "1.000", 14 | "blue" : "0.361", 15 | "green" : "0.353" 16 | } 17 | } 18 | }, 19 | { 20 | "idiom" : "universal", 21 | "appearances" : [ 22 | { 23 | "appearance" : "luminosity", 24 | "value" : "dark" 25 | } 26 | ], 27 | "color" : { 28 | "color-space" : "srgb", 29 | "components" : { 30 | "red" : "0.710", 31 | "alpha" : "1.000", 32 | "blue" : "0.710", 33 | "green" : "0.710" 34 | } 35 | } 36 | } 37 | ] 38 | } -------------------------------------------------------------------------------- /dailyVerse/Assets.xcassets/backgroudColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | }, 6 | "colors" : [ 7 | { 8 | "idiom" : "universal", 9 | "color" : { 10 | "color-space" : "srgb", 11 | "components" : { 12 | "red" : "0.980", 13 | "alpha" : "1.000", 14 | "blue" : "0.988", 15 | "green" : "0.984" 16 | } 17 | } 18 | }, 19 | { 20 | "idiom" : "universal", 21 | "appearances" : [ 22 | { 23 | "appearance" : "luminosity", 24 | "value" : "dark" 25 | } 26 | ], 27 | "color" : { 28 | "color-space" : "srgb", 29 | "components" : { 30 | "red" : "0x00", 31 | "alpha" : "1.000", 32 | "blue" : "0x00", 33 | "green" : "0x00" 34 | } 35 | } 36 | } 37 | ] 38 | } -------------------------------------------------------------------------------- /dailyVerse/Assets.xcassets/black12.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "zeplin" 5 | }, 6 | "colors" : [ 7 | { 8 | "color" : { 9 | "components" : { 10 | "blue" : "0.000", 11 | "red" : "0.000", 12 | "alpha" : "0.120", 13 | "green" : "0.000" 14 | }, 15 | "color-space" : "srgb" 16 | }, 17 | "idiom" : "universal" 18 | } 19 | ] 20 | } -------------------------------------------------------------------------------- /dailyVerse/Assets.xcassets/black24.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "zeplin" 5 | }, 6 | "colors" : [ 7 | { 8 | "color" : { 9 | "components" : { 10 | "blue" : "0.000", 11 | "red" : "0.000", 12 | "alpha" : "0.240", 13 | "green" : "0.000" 14 | }, 15 | "color-space" : "srgb" 16 | }, 17 | "idiom" : "universal" 18 | } 19 | ] 20 | } -------------------------------------------------------------------------------- /dailyVerse/Assets.xcassets/buttonColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | }, 6 | "colors" : [ 7 | { 8 | "idiom" : "universal", 9 | "color" : { 10 | "color-space" : "srgb", 11 | "components" : { 12 | "red" : "0.875", 13 | "alpha" : "1.000", 14 | "blue" : "0.922", 15 | "green" : "0.898" 16 | } 17 | } 18 | }, 19 | { 20 | "idiom" : "universal", 21 | "appearances" : [ 22 | { 23 | "appearance" : "luminosity", 24 | "value" : "dark" 25 | } 26 | ], 27 | "color" : { 28 | "color-space" : "srgb", 29 | "components" : { 30 | "red" : "0.220", 31 | "alpha" : "1.000", 32 | "blue" : "0.251", 33 | "green" : "0.235" 34 | } 35 | } 36 | } 37 | ] 38 | } -------------------------------------------------------------------------------- /dailyVerse/Assets.xcassets/chapterButtonBg.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "chapterButtonBg.pdf" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "chapterButtonBgDark.pdf", 10 | "appearances" : [ 11 | { 12 | "appearance" : "luminosity", 13 | "value" : "dark" 14 | } 15 | ] 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /dailyVerse/Assets.xcassets/chapterButtonBg.imageset/chapterButtonBg.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qoli/dailyVerse/187c166c4a0d52ced5b13726bf567d972f9ae5bb/dailyVerse/Assets.xcassets/chapterButtonBg.imageset/chapterButtonBg.pdf -------------------------------------------------------------------------------- /dailyVerse/Assets.xcassets/chapterButtonBg.imageset/chapterButtonBgDark.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qoli/dailyVerse/187c166c4a0d52ced5b13726bf567d972f9ae5bb/dailyVerse/Assets.xcassets/chapterButtonBg.imageset/chapterButtonBgDark.pdf -------------------------------------------------------------------------------- /dailyVerse/Assets.xcassets/coralPink.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "zeplin" 5 | }, 6 | "colors" : [ 7 | { 8 | "idiom" : "universal", 9 | "color" : { 10 | "components" : { 11 | "alpha" : "1.000", 12 | "red" : "0.980", 13 | "green" : "0.392", 14 | "blue" : "0.400" 15 | }, 16 | "color-space" : "srgb" 17 | } 18 | } 19 | ] 20 | } -------------------------------------------------------------------------------- /dailyVerse/Assets.xcassets/dark.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "zeplin" 5 | }, 6 | "colors" : [ 7 | { 8 | "color" : { 9 | "components" : { 10 | "blue" : "0.204", 11 | "red" : "0.129", 12 | "alpha" : "1.000", 13 | "green" : "0.149" 14 | }, 15 | "color-space" : "srgb" 16 | }, 17 | "idiom" : "universal" 18 | } 19 | ] 20 | } -------------------------------------------------------------------------------- /dailyVerse/Assets.xcassets/greyishBrown.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "zeplin" 5 | }, 6 | "colors" : [ 7 | { 8 | "idiom" : "universal", 9 | "color" : { 10 | "components" : { 11 | "blue" : "0.290", 12 | "red" : "0.290", 13 | "alpha" : "1.000", 14 | "green" : "0.290" 15 | }, 16 | "color-space" : "srgb" 17 | } 18 | } 19 | ] 20 | } -------------------------------------------------------------------------------- /dailyVerse/Assets.xcassets/gunmetal.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "idiom" : "universal", 5 | "color" : { 6 | "components" : { 7 | "alpha" : "1.000", 8 | "red" : "0.325", 9 | "blue" : "0.361", 10 | "green" : "0.353" 11 | }, 12 | "color-space" : "srgb" 13 | } 14 | } 15 | ], 16 | "info" : { 17 | "version" : 1, 18 | "author" : "zeplin" 19 | } 20 | } -------------------------------------------------------------------------------- /dailyVerse/Assets.xcassets/icClose24Px.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "icClose24Px.pdf" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "icClose24PxDark.pdf", 10 | "appearances" : [ 11 | { 12 | "appearance" : "luminosity", 13 | "value" : "dark" 14 | } 15 | ] 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /dailyVerse/Assets.xcassets/icClose24Px.imageset/icClose24Px.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qoli/dailyVerse/187c166c4a0d52ced5b13726bf567d972f9ae5bb/dailyVerse/Assets.xcassets/icClose24Px.imageset/icClose24Px.pdf -------------------------------------------------------------------------------- /dailyVerse/Assets.xcassets/icClose24Px.imageset/icClose24PxDark.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qoli/dailyVerse/187c166c4a0d52ced5b13726bf567d972f9ae5bb/dailyVerse/Assets.xcassets/icClose24Px.imageset/icClose24PxDark.pdf -------------------------------------------------------------------------------- /dailyVerse/Assets.xcassets/icInfo24Px.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "icInfo24Px.pdf" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "icInfo24PxDark.pdf", 10 | "appearances" : [ 11 | { 12 | "appearance" : "luminosity", 13 | "value" : "dark" 14 | } 15 | ] 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /dailyVerse/Assets.xcassets/icInfo24Px.imageset/icInfo24Px.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qoli/dailyVerse/187c166c4a0d52ced5b13726bf567d972f9ae5bb/dailyVerse/Assets.xcassets/icInfo24Px.imageset/icInfo24Px.pdf -------------------------------------------------------------------------------- /dailyVerse/Assets.xcassets/icInfo24Px.imageset/icInfo24PxDark.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qoli/dailyVerse/187c166c4a0d52ced5b13726bf567d972f9ae5bb/dailyVerse/Assets.xcassets/icInfo24Px.imageset/icInfo24PxDark.pdf -------------------------------------------------------------------------------- /dailyVerse/Assets.xcassets/icShare24Px.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "zeplin", 4 | "version" : 1 5 | }, 6 | "images" : [ 7 | { 8 | "idiom" : "universal", 9 | "filename" : "icShare24Px.png", 10 | "scale" : "1x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "icShare24Px@2x.png", 15 | "scale" : "2x" 16 | }, 17 | { 18 | "idiom" : "universal", 19 | "filename" : "icShare24Px@3x.png", 20 | "scale" : "3x" 21 | } 22 | ] 23 | } -------------------------------------------------------------------------------- /dailyVerse/Assets.xcassets/icShare24Px.imageset/icShare24Px.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qoli/dailyVerse/187c166c4a0d52ced5b13726bf567d972f9ae5bb/dailyVerse/Assets.xcassets/icShare24Px.imageset/icShare24Px.png -------------------------------------------------------------------------------- /dailyVerse/Assets.xcassets/icShare24Px.imageset/icShare24Px@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qoli/dailyVerse/187c166c4a0d52ced5b13726bf567d972f9ae5bb/dailyVerse/Assets.xcassets/icShare24Px.imageset/icShare24Px@2x.png -------------------------------------------------------------------------------- /dailyVerse/Assets.xcassets/icShare24Px.imageset/icShare24Px@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qoli/dailyVerse/187c166c4a0d52ced5b13726bf567d972f9ae5bb/dailyVerse/Assets.xcassets/icShare24Px.imageset/icShare24Px@3x.png -------------------------------------------------------------------------------- /dailyVerse/Assets.xcassets/lanunchImage.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "zeplin", 4 | "version" : 1 5 | }, 6 | "images" : [ 7 | { 8 | "idiom" : "universal", 9 | "filename" : "icLanunchScreen.png", 10 | "scale" : "1x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "icLanunchScreen@2x.png", 15 | "scale" : "2x" 16 | }, 17 | { 18 | "idiom" : "universal", 19 | "filename" : "icLanunchScreen@3x.png", 20 | "scale" : "3x" 21 | } 22 | ] 23 | } -------------------------------------------------------------------------------- /dailyVerse/Assets.xcassets/lanunchImage.imageset/icLanunchScreen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qoli/dailyVerse/187c166c4a0d52ced5b13726bf567d972f9ae5bb/dailyVerse/Assets.xcassets/lanunchImage.imageset/icLanunchScreen.png -------------------------------------------------------------------------------- /dailyVerse/Assets.xcassets/lanunchImage.imageset/icLanunchScreen@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qoli/dailyVerse/187c166c4a0d52ced5b13726bf567d972f9ae5bb/dailyVerse/Assets.xcassets/lanunchImage.imageset/icLanunchScreen@2x.png -------------------------------------------------------------------------------- /dailyVerse/Assets.xcassets/lanunchImage.imageset/icLanunchScreen@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qoli/dailyVerse/187c166c4a0d52ced5b13726bf567d972f9ae5bb/dailyVerse/Assets.xcassets/lanunchImage.imageset/icLanunchScreen@3x.png -------------------------------------------------------------------------------- /dailyVerse/Assets.xcassets/paleBlue.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "red" : "0.875", 9 | "green" : "0.898", 10 | "blue" : "0.922" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "version" : 1, 18 | "author" : "xcode" 19 | } 20 | } -------------------------------------------------------------------------------- /dailyVerse/Assets.xcassets/paleGrey.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "zeplin" 5 | }, 6 | "colors" : [ 7 | { 8 | "idiom" : "universal", 9 | "color" : { 10 | "components" : { 11 | "green" : "0.984", 12 | "blue" : "0.988", 13 | "alpha" : "1.000", 14 | "red" : "0.980" 15 | }, 16 | "color-space" : "srgb" 17 | } 18 | } 19 | ] 20 | } -------------------------------------------------------------------------------- /dailyVerse/Assets.xcassets/softBlue.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "zeplin" 5 | }, 6 | "colors" : [ 7 | { 8 | "color" : { 9 | "color-space" : "srgb", 10 | "components" : { 11 | "blue" : "0.941", 12 | "red" : "0.408", 13 | "green" : "0.671", 14 | "alpha" : "1.000" 15 | } 16 | }, 17 | "idiom" : "universal" 18 | } 19 | ] 20 | } -------------------------------------------------------------------------------- /dailyVerse/Assets.xcassets/white.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | }, 6 | "colors" : [ 7 | { 8 | "color" : { 9 | "color-space" : "srgb", 10 | "components" : { 11 | "blue" : "0.922", 12 | "red" : "0.922", 13 | "green" : "0.922", 14 | "alpha" : "1.000" 15 | } 16 | }, 17 | "idiom" : "universal" 18 | } 19 | ] 20 | } -------------------------------------------------------------------------------- /dailyVerse/Assets.xcassets/white0.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | }, 6 | "colors" : [ 7 | { 8 | "idiom" : "universal", 9 | "color" : { 10 | "color-space" : "srgb", 11 | "components" : { 12 | "red" : "1.000", 13 | "alpha" : "0.000", 14 | "blue" : "1.000", 15 | "green" : "1.000" 16 | } 17 | } 18 | }, 19 | { 20 | "idiom" : "universal", 21 | "appearances" : [ 22 | { 23 | "appearance" : "luminosity", 24 | "value" : "dark" 25 | } 26 | ], 27 | "color" : { 28 | "color-space" : "srgb", 29 | "components" : { 30 | "red" : "0x00", 31 | "alpha" : "0.000", 32 | "blue" : "0x00", 33 | "green" : "0x00" 34 | } 35 | } 36 | } 37 | ] 38 | } -------------------------------------------------------------------------------- /dailyVerse/Assets.xcassets/white50.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | }, 6 | "colors" : [ 7 | { 8 | "idiom" : "universal", 9 | "color" : { 10 | "color-space" : "srgb", 11 | "components" : { 12 | "red" : "1.000", 13 | "alpha" : "0.500", 14 | "blue" : "1.000", 15 | "green" : "1.000" 16 | } 17 | } 18 | }, 19 | { 20 | "idiom" : "universal", 21 | "appearances" : [ 22 | { 23 | "appearance" : "luminosity", 24 | "value" : "dark" 25 | } 26 | ], 27 | "color" : { 28 | "color-space" : "srgb", 29 | "components" : { 30 | "red" : "0x00", 31 | "alpha" : "0.500", 32 | "blue" : "0x00", 33 | "green" : "0x00" 34 | } 35 | } 36 | } 37 | ] 38 | } -------------------------------------------------------------------------------- /dailyVerse/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /dailyVerse/ChapterCell.swift: -------------------------------------------------------------------------------- 1 | //dailyVerse 2 | // 3 | //Copyright (c) 2017 Qoli Wong - https://github.com/qoli/dailyVerse 4 | // 5 | //Permission is hereby granted, free of charge, to any person obtaining a copy 6 | //of this software and associated documentation files (the "Software"), to deal 7 | //in the Software without restriction, including without limitation the rights 8 | //to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | //copies of the Software, and to permit persons to whom the Software is 10 | //furnished to do so, subject to the following conditions: 11 | // 12 | //The above copyright notice and this permission notice shall be included in all 13 | //copies or substantial portions of the Software. 14 | // 15 | //THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | //IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | //FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | //AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | //LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | //OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | //SOFTWARE. 22 | 23 | import UIKit 24 | 25 | class ChapterCell: UITableViewCell { 26 | 27 | 28 | @IBOutlet weak var ChapterLaberTitle: UILabel! 29 | 30 | override func awakeFromNib() { 31 | super.awakeFromNib() 32 | // Initialization code 33 | } 34 | 35 | override func setSelected(_ selected: Bool, animated: Bool) { 36 | super.setSelected(selected, animated: animated) 37 | 38 | // Configure the view for the selected state 39 | } 40 | 41 | } 42 | -------------------------------------------------------------------------------- /dailyVerse/DVExtension/UIColor+Additions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIColor+Additions.swift 3 | // dailyVerse 4 | // 5 | // Generated on Zeplin. (2019/6/21). 6 | // Copyright (c) 2019 __MyCompanyName__. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | extension UIColor { 12 | 13 | @nonobjc class var dlyCoralPink: UIColor { 14 | return UIColor(red: 250.0 / 255.0, green: 100.0 / 255.0, blue: 102.0 / 255.0, alpha: 1.0) 15 | } 16 | 17 | @nonobjc class var dlySoftBlue: UIColor { 18 | return UIColor(red: 104.0 / 255.0, green: 171.0 / 255.0, blue: 240.0 / 255.0, alpha: 1.0) 19 | } 20 | 21 | @nonobjc class var dlyBlack12: UIColor { 22 | return UIColor(white: 0.0, alpha: 0.12) 23 | } 24 | 25 | @nonobjc class var dlyGunmetal: UIColor { 26 | return UIColor(red: 83.0 / 255.0, green: 90.0 / 255.0, blue: 92.0 / 255.0, alpha: 1.0) 27 | } 28 | 29 | @nonobjc class var dlyGreyishBrown: UIColor { 30 | return UIColor(white: 74.0 / 255.0, alpha: 1.0) 31 | } 32 | 33 | @nonobjc class var dlyDark: UIColor { 34 | return UIColor(red: 33.0 / 255.0, green: 38.0 / 255.0, blue: 52.0 / 255.0, alpha: 1.0) 35 | } 36 | 37 | @nonobjc class var dlyBlack24: UIColor { 38 | return UIColor(white: 0.0, alpha: 0.24) 39 | } 40 | 41 | @nonobjc class var dlyWhite50: UIColor { 42 | return UIColor(white: 1.0, alpha: 0.5) 43 | } 44 | 45 | @nonobjc class var dlyWhite: UIColor { 46 | return UIColor(white: 235.0 / 255.0, alpha: 1.0) 47 | } 48 | 49 | @nonobjc class var dlyWhite0: UIColor { 50 | return UIColor(white: 1.0, alpha: 0.0) 51 | } 52 | 53 | @nonobjc class var dlyBackgroudColor: UIColor { 54 | return UIColor(red: 250.0 / 255.0, green: 251.0 / 255.0, blue: 252.0 / 255.0, alpha: 1.0) 55 | } 56 | 57 | @nonobjc class var dlyPaleBlue: UIColor { 58 | return UIColor(red: 223.0 / 255.0, green: 229.0 / 255.0, blue: 235.0 / 255.0, alpha: 1.0) 59 | } 60 | 61 | @nonobjc class var dlyButtonColorDark: UIColor { 62 | return UIColor(red: 56.0 / 255.0, green: 60.0 / 255.0, blue: 64.0 / 255.0, alpha: 1.0) 63 | } 64 | 65 | @nonobjc class var dlyTextColorDark: UIColor { 66 | return UIColor(white: 181.0 / 255.0, alpha: 1.0) 67 | } 68 | 69 | } -------------------------------------------------------------------------------- /dailyVerse/DVExtension/UIFont+DV.swift: -------------------------------------------------------------------------------- 1 | //dailyVerse 2 | // 3 | //Copyright (c) 2017 Qoli Wong - https://github.com/qoli/dailyVerse 4 | // 5 | //Permission is hereby granted, free of charge, to any person obtaining a copy 6 | //of this software and associated documentation files (the "Software"), to deal 7 | //in the Software without restriction, including without limitation the rights 8 | //to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | //copies of the Software, and to permit persons to whom the Software is 10 | //furnished to do so, subject to the following conditions: 11 | // 12 | //The above copyright notice and this permission notice shall be included in all 13 | //copies or substantial portions of the Software. 14 | // 15 | //THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | //IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | //FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | //AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | //LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | //OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | //SOFTWARE. 22 | 23 | import UIKit 24 | 25 | /* 26 | 文字樣式 27 | */ 28 | extension UIFont { 29 | 30 | @nonobjc class var dlyMainTextStyle: UIFont { 31 | return UIFont(name: "PingFangTC-Light", size: 16.0)! 32 | } 33 | 34 | @nonobjc class var dlyTodayTextStyle: UIFont { 35 | return UIFont(name: "PingFangTC-Semibold", size: 10.0)! 36 | } 37 | 38 | @nonobjc class var dlyDateTextStyle: UIFont { 39 | return UIFont(name: "PingFangTC-Regular", size: 10.0)! 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /dailyVerse/DVExtension/UILabel+DV.swift: -------------------------------------------------------------------------------- 1 | //dailyVerse 2 | // 3 | //Copyright (c) 2017 Qoli Wong - https://github.com/qoli/dailyVerse 4 | // 5 | //Permission is hereby granted, free of charge, to any person obtaining a copy 6 | //of this software and associated documentation files (the "Software"), to deal 7 | //in the Software without restriction, including without limitation the rights 8 | //to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | //copies of the Software, and to permit persons to whom the Software is 10 | //furnished to do so, subject to the following conditions: 11 | // 12 | //The above copyright notice and this permission notice shall be included in all 13 | //copies or substantial portions of the Software. 14 | // 15 | //THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | //IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | //FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | //AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | //LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | //OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | //SOFTWARE. 22 | 23 | import UIKit 24 | 25 | /* 26 | setLineSpacing 設定行高 / lineHeightMultiple / 字距 27 | */ 28 | extension UILabel { 29 | 30 | func typesetting(lineSpacing: CGFloat = 0.0, lineHeightMultiple: CGFloat = 0.0, characterSpacing: CGFloat = 0.0) { 31 | 32 | guard let labelText = self.text else { return } 33 | 34 | let paragraphStyle = NSMutableParagraphStyle() 35 | paragraphStyle.lineSpacing = lineSpacing 36 | paragraphStyle.lineHeightMultiple = lineHeightMultiple 37 | 38 | let attributedString: NSMutableAttributedString 39 | if let labelattributedText = self.attributedText { 40 | attributedString = NSMutableAttributedString(attributedString: labelattributedText) 41 | } else { 42 | attributedString = NSMutableAttributedString(string: labelText) 43 | } 44 | 45 | // 處理字距 46 | attributedString.addAttribute(NSAttributedString.Key.kern, value: characterSpacing, range: NSRange(location: 0, length: attributedString.length - 1)) 47 | 48 | // 處理行高 49 | attributedString.addAttribute(NSAttributedString.Key.paragraphStyle, value: paragraphStyle, range: NSMakeRange(0, attributedString.length)) 50 | 51 | self.attributedText = attributedString 52 | } 53 | } 54 | 55 | -------------------------------------------------------------------------------- /dailyVerse/DVExtension/UITextView+DV.swift: -------------------------------------------------------------------------------- 1 | //dailyVerse 2 | // 3 | //Copyright (c) 2017 Qoli Wong - https://github.com/qoli/dailyVerse 4 | // 5 | //Permission is hereby granted, free of charge, to any person obtaining a copy 6 | //of this software and associated documentation files (the "Software"), to deal 7 | //in the Software without restriction, including without limitation the rights 8 | //to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | //copies of the Software, and to permit persons to whom the Software is 10 | //furnished to do so, subject to the following conditions: 11 | // 12 | //The above copyright notice and this permission notice shall be included in all 13 | //copies or substantial portions of the Software. 14 | // 15 | //THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | //IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | //FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | //AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | //LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | //OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | //SOFTWARE. 22 | 23 | import UIKit 24 | 25 | /* 26 | UI Text View 垂直居中 27 | */ 28 | 29 | extension UITextView { 30 | func centerVertically() { 31 | let fittingSize = CGSize(width: bounds.width, height: CGFloat.greatestFiniteMagnitude) 32 | let size = sizeThatFits(fittingSize) 33 | let topOffset = (bounds.size.height - size.height * zoomScale) / 2 34 | let positiveTopOffset = max(1, topOffset) 35 | contentOffset.y = -positiveTopOffset 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /dailyVerse/DVExtension/UIView+DV.swift: -------------------------------------------------------------------------------- 1 | //dailyVerse 2 | // 3 | //Copyright (c) 2017 Qoli Wong - https://github.com/qoli/dailyVerse 4 | // 5 | //Permission is hereby granted, free of charge, to any person obtaining a copy 6 | //of this software and associated documentation files (the "Software"), to deal 7 | //in the Software without restriction, including without limitation the rights 8 | //to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | //copies of the Software, and to permit persons to whom the Software is 10 | //furnished to do so, subject to the following conditions: 11 | // 12 | //The above copyright notice and this permission notice shall be included in all 13 | //copies or substantial portions of the Software. 14 | // 15 | //THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | //IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | //FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | //AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | //LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | //OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | //SOFTWARE. 22 | 23 | import UIKit 24 | 25 | extension UIView { 26 | 27 | @IBInspectable 28 | var cornerRadius: CGFloat { 29 | get { 30 | return layer.cornerRadius 31 | } 32 | set { 33 | layer.cornerRadius = newValue 34 | } 35 | } 36 | 37 | @IBInspectable 38 | var borderWidth: CGFloat { 39 | get { 40 | return layer.borderWidth 41 | } 42 | set { 43 | layer.borderWidth = newValue 44 | } 45 | } 46 | 47 | @IBInspectable 48 | var borderColor: UIColor? { 49 | get { 50 | if let color = layer.borderColor { 51 | return UIColor(cgColor: color) 52 | } 53 | return nil 54 | } 55 | set { 56 | if let color = newValue { 57 | layer.borderColor = color.cgColor 58 | } else { 59 | layer.borderColor = nil 60 | } 61 | } 62 | } 63 | 64 | @IBInspectable 65 | var shadowRadius: CGFloat { 66 | get { 67 | return layer.shadowRadius 68 | } 69 | set { 70 | layer.shadowRadius = newValue 71 | } 72 | } 73 | 74 | @IBInspectable 75 | var shadowOpacity: Float { 76 | get { 77 | return layer.shadowOpacity 78 | } 79 | set { 80 | layer.shadowOpacity = newValue 81 | } 82 | } 83 | 84 | @IBInspectable 85 | var shadowOffset: CGSize { 86 | get { 87 | return layer.shadowOffset 88 | } 89 | set { 90 | layer.shadowOffset = newValue 91 | } 92 | } 93 | 94 | @IBInspectable 95 | var shadowColor: UIColor? { 96 | get { 97 | if let color = layer.shadowColor { 98 | return UIColor(cgColor: color) 99 | } 100 | return nil 101 | } 102 | set { 103 | if let color = newValue { 104 | layer.shadowColor = color.cgColor 105 | } else { 106 | layer.shadowColor = nil 107 | } 108 | } 109 | } 110 | } 111 | -------------------------------------------------------------------------------- /dailyVerse/Functions/GBig.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | public class GBig { 4 | public static let big5 = 5 | "萬與醜專業叢東絲丟兩嚴喪個爿豐臨為麗舉麼義烏樂喬習鄉書買亂爭於虧雲亙亞產畝親褻嚲億僅從侖倉儀們價眾優夥會傴傘偉傳傷倀倫傖偽佇體餘傭僉俠侶僥偵側僑儈儕儂俁儔儼倆儷儉債傾傯僂僨償儻儐儲儺兒兌兗黨蘭關興茲養獸囅內岡冊寫軍農塚馮衝決況凍淨淒涼淩減湊凜幾鳳鳧憑凱擊氹鑿芻劃劉則剛創刪別剗剄劊劌剴劑剮劍剝劇勸辦務勱動勵勁勞勢勳猛勩勻匭匱區醫華協單賣盧鹵臥衛卻巹廠廳曆厲壓厭厙廁廂厴廈廚廄廝縣參靉靆雙發變敘疊葉號歎嘰籲後嚇呂嗎唚噸聽啟吳嘸囈嘔嚦唄員咼嗆嗚詠哢嚨嚀噝吒噅鹹呱響啞噠嘵嗶噦嘩噲嚌噥喲嘜嗊嘮啢嗩唕喚呼嘖嗇囀齧囉嘽嘯噴嘍嚳囁嗬噯噓嚶囑嚕劈囂謔團園囪圍圇國圖圓聖壙場阪壞塊堅壇壢壩塢墳墜壟壟壚壘墾坰堊墊埡墶壋塏堖塒塤堝墊垵塹墮壪牆壯聲殼壺壼處備複夠頭誇夾奪奩奐奮獎奧妝婦媽嫵嫗媯姍薑婁婭嬈嬌孌娛媧嫻嫿嬰嬋嬸媼嬡嬪嬙嬤孫學孿寧寶實寵審憲宮寬賓寢對尋導壽將爾塵堯尷屍盡層屭屜屆屬屢屨嶼歲豈嶇崗峴嶴嵐島嶺嶽崠巋嶨嶧峽嶢嶠崢巒嶗崍嶮嶄嶸嶔崳嶁脊巔鞏巰幣帥師幃帳簾幟帶幀幫幬幘幗冪襆幹並廣莊慶廬廡庫應廟龐廢廎廩開異棄張彌弳彎彈強歸當錄彠彥徹徑徠禦憶懺憂愾懷態慫憮慪悵愴憐總懟懌戀懇惡慟懨愷惻惱惲悅愨懸慳憫驚懼慘懲憊愜慚憚慣湣慍憤憒願懾憖怵懣懶懍戇戔戲戧戰戩戶紮撲扡執擴捫掃揚擾撫拋摶摳掄搶護報擔擬攏揀擁攔擰撥擇掛摯攣掗撾撻挾撓擋撟掙擠揮撏撈損撿換搗據撚擄摑擲撣摻摜摣攬撳攙擱摟攪攜攝攄擺搖擯攤攖撐攆擷擼攛擻攢敵斂數齋斕鬥斬斷無舊時曠暘曇晝曨顯晉曬曉曄暈暉暫曖劄術樸機殺雜權條來楊榪傑極構樅樞棗櫪梘棖槍楓梟櫃檸檉梔柵標棧櫛櫳棟櫨櫟欄樹棲樣欒棬椏橈楨檔榿橋樺檜槳樁夢檮棶檢欞槨櫝槧欏橢樓欖櫬櫚櫸檟檻檳櫧橫檣櫻櫫櫥櫓櫞簷檁歡歟歐殲歿殤殘殞殮殫殯毆毀轂畢斃氈毿氌氣氫氬氳彙漢汙湯洶遝溝沒灃漚瀝淪滄渢溈滬濔濘淚澩瀧瀘濼瀉潑澤涇潔灑窪浹淺漿澆湞溮濁測澮濟瀏滻渾滸濃潯濜塗湧濤澇淶漣潿渦溳渙滌潤澗漲澀澱淵淥漬瀆漸澠漁瀋滲溫遊灣濕潰濺漵漊潷滾滯灩灄滿瀅濾濫灤濱灘澦濫瀠瀟瀲濰潛瀦瀾瀨瀕灝滅燈靈災燦煬爐燉煒熗點煉熾爍爛烴燭煙煩燒燁燴燙燼熱煥燜燾煆糊溜愛爺牘犛牽犧犢強狀獷獁猶狽麅獮獰獨狹獅獪猙獄猻獫獵獼玀豬貓蝟獻獺璣璵瑒瑪瑋環現瑲璽瑉玨琺瓏璫琿璡璉瑣瓊瑤璦璿瓔瓚甕甌電畫暢佘疇癤療瘧癘瘍鬁瘡瘋皰屙癰痙癢瘂癆瘓癇癡癉瘮瘞瘺癟癱癮癭癩癬癲臒皚皺皸盞鹽監蓋盜盤瞘眥矓著睜睞瞼瞞矚矯磯礬礦碭碼磚硨硯碸礪礱礫礎硜矽碩硤磽磑礄確鹼礙磧磣堿镟滾禮禕禰禎禱禍稟祿禪離禿稈種積稱穢穠穭稅穌穩穡窮竊竅窯竄窩窺竇窶豎競篤筍筆筧箋籠籩築篳篩簹箏籌簽簡籙簀篋籜籮簞簫簣簍籃籬籪籟糴類秈糶糲粵糞糧糝餱緊縶糸糾紆紅紂纖紇約級紈纊紀紉緯紜紘純紕紗綱納紝縱綸紛紙紋紡紵紖紐紓線紺絏紱練組紳細織終縐絆紼絀紹繹經紿綁絨結絝繞絰絎繪給絢絳絡絕絞統綆綃絹繡綌綏絛繼綈績緒綾緓續綺緋綽緔緄繩維綿綬繃綢綯綹綣綜綻綰綠綴緇緙緗緘緬纜緹緲緝縕繢緦綞緞緶線緱縋緩締縷編緡緣縉縛縟縝縫縗縞纏縭縊縑繽縹縵縲纓縮繆繅纈繚繕繒韁繾繰繯繳纘罌網羅罰罷羆羈羥羨翹翽翬耮耬聳恥聶聾職聹聯聵聰肅腸膚膁腎腫脹脅膽勝朧腖臚脛膠脈膾髒臍腦膿臠腳脫腡臉臘醃膕齶膩靦膃騰臏臢輿艤艦艙艫艱豔艸藝節羋薌蕪蘆蓯葦藶莧萇蒼苧蘇檾蘋莖蘢蔦塋煢繭荊薦薘莢蕘蓽蕎薈薺蕩榮葷滎犖熒蕁藎蓀蔭蕒葒葤藥蒞蓧萊蓮蒔萵薟獲蕕瑩鶯蓴蘀蘿螢營縈蕭薩蔥蕆蕢蔣蔞藍薊蘺蕷鎣驀薔蘞藺藹蘄蘊藪槁蘚虜慮虛蟲虯蟣雖蝦蠆蝕蟻螞蠶蠔蜆蠱蠣蟶蠻蟄蛺蟯螄蠐蛻蝸蠟蠅蟈蟬蠍螻蠑螿蟎蠨釁銜補襯袞襖嫋褘襪襲襏裝襠褌褳襝褲襇褸襤繈襴見觀覎規覓視覘覽覺覬覡覿覥覦覯覲覷觴觸觶讋譽謄訁計訂訃認譏訐訌討讓訕訖訓議訊記訒講諱謳詎訝訥許訛論訩訟諷設訪訣證詁訶評詛識詗詐訴診詆謅詞詘詔詖譯詒誆誄試詿詩詰詼誠誅詵話誕詬詮詭詢詣諍該詳詫諢詡譸誡誣語誚誤誥誘誨誑說誦誒請諸諏諾讀諑誹課諉諛誰諗調諂諒諄誶談誼謀諶諜謊諫諧謔謁謂諤諭諼讒諮諳諺諦謎諞諝謨讜謖謝謠謗諡謙謐謹謾謫譾謬譚譖譙讕譜譎讞譴譫讖穀豶貝貞負貟貢財責賢敗賬貨質販貪貧貶購貯貫貳賤賁貰貼貴貺貸貿費賀貽賊贄賈賄貲賃賂贓資賅贐賕賑賚賒賦賭齎贖賞賜贔賙賡賠賧賴賵贅賻賺賽賾贗讚贇贈贍贏贛赬趙趕趨趲躉躍蹌蹠躒踐躂蹺蹕躚躋踴躊蹤躓躑躡蹣躕躥躪躦軀車軋軌軒軑軔轉軛輪軟轟軲軻轤軸軹軼軤軫轢軺輕軾載輊轎輈輇輅較輒輔輛輦輩輝輥輞輬輟輜輳輻輯轀輸轡轅轄輾轆轍轔辭辯辮邊遼達遷過邁運還這進遠違連遲邇逕跡適選遜遞邐邏遺遙鄧鄺鄔郵鄒鄴鄰鬱郤郟鄶鄭鄆酈鄖鄲醞醱醬釅釃釀釋裏钜鑒鑾鏨釓釔針釘釗釙釕釷釺釧釤鈒釩釣鍆釹鍚釵鈃鈣鈈鈦鈍鈔鍾鈉鋇鋼鈑鈐鑰欽鈞鎢鉤鈧鈁鈥鈄鈕鈀鈺錢鉦鉗鈷缽鈳鉕鈽鈸鉞鑽鉬鉭鉀鈿鈾鐵鉑鈴鑠鉛鉚鈰鉉鉈鉍鈹鐸鉶銬銠鉺銪鋏鋣鐃銍鐺銅鋁銱銦鎧鍘銖銑鋌銩銛鏵銓鉿銚鉻銘錚銫鉸銥鏟銃鐋銨銀銣鑄鐒鋪鋙錸鋱鏈鏗銷鎖鋰鋥鋤鍋鋯鋨鏽銼鋝鋒鋅鋶鐦鐧銳銻鋃鋟鋦錒錆鍺錯錨錡錁錕錩錫錮鑼錘錐錦鍁錈錇錟錠鍵鋸錳錙鍥鍈鍇鏘鍶鍔鍤鍬鍾鍛鎪鍠鍰鎄鍍鎂鏤鎡鏌鎮鎛鎘鑷鐫鎳鎿鎦鎬鎊鎰鎔鏢鏜鏍鏰鏞鏡鏑鏃鏇鏐鐔钁鐐鏷鑥鐓鑭鐠鑹鏹鐙鑊鐳鐶鐲鐮鐿鑔鑣鑞鑲長門閂閃閆閈閉問闖閏闈閑閎間閔閌悶閘鬧閨聞闥閩閭闓閥閣閡閫鬮閱閬闍閾閹閶鬩閿閽閻閼闡闌闃闠闊闋闔闐闒闕闞闤隊陽陰陣階際陸隴陳陘陝隉隕險隨隱隸雋難雛讎靂霧霽黴靄靚靜靨韃鞽韉韝韋韌韍韓韙韞韜韻頁頂頃頇項順須頊頑顧頓頎頒頌頏預顱領頗頸頡頰頲頜潁熲頦頤頻頮頹頷頴穎顆題顒顎顓顏額顳顢顛顙顥纇顫顬顰顴風颺颭颮颯颶颸颼颻飀飄飆飆飛饗饜飣饑飥餳飩餼飪飫飭飯飲餞飾飽飼飿飴餌饒餉餄餎餃餏餅餑餖餓餘餒餕餜餛餡館餷饋餶餿饞饁饃餺餾饈饉饅饊饌饢馬馭馱馴馳驅馹駁驢駔駛駟駙駒騶駐駝駑駕驛駘驍罵駰驕驊駱駭駢驫驪騁驗騂駸駿騏騎騍騅騌驌驂騙騭騤騷騖驁騮騫騸驃騾驄驏驟驥驦驤髏髖髕鬢魘魎魚魛魢魷魨魯魴魺鮁鮃鯰鱸鮋鮓鮒鮊鮑鱟鮍鮐鮭鮚鮳鮪鮞鮦鰂鮜鱠鱭鮫鮮鮺鯗鱘鯁鱺鰱鰹鯉鰣鰷鯀鯊鯇鮶鯽鯒鯖鯪鯕鯫鯡鯤鯧鯝鯢鯰鯛鯨鯵鯴鯔鱝鰈鰏鱨鯷鰮鰃鰓鱷鰍鰒鰉鰁鱂鯿鰠鼇鰭鰨鰥鰩鰟鰜鰳鰾鱈鱉鰻鰵鱅鰼鱖鱔鱗鱒鱯鱤鱧鱣鳥鳩雞鳶鳴鳲鷗鴉鶬鴇鴆鴣鶇鸕鴨鴞鴦鴒鴟鴝鴛鴬鴕鷥鷙鴯鴰鵂鴴鵃鴿鸞鴻鵐鵓鸝鵑鵠鵝鵒鷳鵜鵡鵲鶓鵪鶤鵯鵬鵮鶉鶊鵷鷫鶘鶡鶚鶻鶿鶥鶩鷊鷂鶲鶹鶺鷁鶼鶴鷖鸚鷓鷚鷯鷦鷲鷸鷺鸇鷹鸌鸏鸛鸘鹺麥麩黃黌黶黷黲黽黿鼂鼉鞀鼴齇齊齏齒齔齕齗齟齡齙齠齜齦齬齪齲齷龍龔龕龜誌製谘隻裡係範鬆冇嚐嘗鬨麵準鐘彆閒乾儘臟拚" 6 | public static let gb = 7 | "万与丑专业丛东丝丢两严丧个丬丰临为丽举么义乌乐乔习乡书买乱争于亏云亘亚产亩亲亵亸亿仅从仑仓仪们价众优伙会伛伞伟传伤伥伦伧伪伫体余佣佥侠侣侥侦侧侨侩侪侬俣俦俨俩俪俭债倾偬偻偾偿傥傧储傩儿兑兖党兰关兴兹养兽冁内冈册写军农冢冯冲决况冻净凄凉凌减凑凛几凤凫凭凯击凼凿刍划刘则刚创删别刬刭刽刿剀剂剐剑剥剧劝办务劢动励劲劳势勋勐勚匀匦匮区医华协单卖卢卤卧卫却卺厂厅历厉压厌厍厕厢厣厦厨厩厮县参叆叇双发变叙叠叶号叹叽吁后吓吕吗吣吨听启吴呒呓呕呖呗员呙呛呜咏咔咙咛咝咤咴咸哌响哑哒哓哔哕哗哙哜哝哟唛唝唠唡唢唣唤唿啧啬啭啮啰啴啸喷喽喾嗫呵嗳嘘嘤嘱噜噼嚣嚯团园囱围囵国图圆圣圹场坂坏块坚坛坜坝坞坟坠垄垅垆垒垦垧垩垫垭垯垱垲垴埘埙埚埝埯堑堕塆墙壮声壳壶壸处备复够头夸夹夺奁奂奋奖奥妆妇妈妩妪妫姗姜娄娅娆娇娈娱娲娴婳婴婵婶媪嫒嫔嫱嬷孙学孪宁宝实宠审宪宫宽宾寝对寻导寿将尔尘尧尴尸尽层屃屉届属屡屦屿岁岂岖岗岘岙岚岛岭岳岽岿峃峄峡峣峤峥峦崂崃崄崭嵘嵚嵛嵝嵴巅巩巯币帅师帏帐帘帜带帧帮帱帻帼幂幞干并广庄庆庐庑库应庙庞废庼廪开异弃张弥弪弯弹强归当录彟彦彻径徕御忆忏忧忾怀态怂怃怄怅怆怜总怼怿恋恳恶恸恹恺恻恼恽悦悫悬悭悯惊惧惨惩惫惬惭惮惯愍愠愤愦愿慑慭憷懑懒懔戆戋戏戗战戬户扎扑扦执扩扪扫扬扰抚抛抟抠抡抢护报担拟拢拣拥拦拧拨择挂挚挛挜挝挞挟挠挡挢挣挤挥挦捞损捡换捣据捻掳掴掷掸掺掼揸揽揿搀搁搂搅携摄摅摆摇摈摊撄撑撵撷撸撺擞攒敌敛数斋斓斗斩断无旧时旷旸昙昼昽显晋晒晓晔晕晖暂暧札术朴机杀杂权条来杨杩杰极构枞枢枣枥枧枨枪枫枭柜柠柽栀栅标栈栉栊栋栌栎栏树栖样栾桊桠桡桢档桤桥桦桧桨桩梦梼梾检棂椁椟椠椤椭楼榄榇榈榉槚槛槟槠横樯樱橥橱橹橼檐檩欢欤欧歼殁殇残殒殓殚殡殴毁毂毕毙毡毵氇气氢氩氲汇汉污汤汹沓沟没沣沤沥沦沧沨沩沪沵泞泪泶泷泸泺泻泼泽泾洁洒洼浃浅浆浇浈浉浊测浍济浏浐浑浒浓浔浕涂涌涛涝涞涟涠涡涢涣涤润涧涨涩淀渊渌渍渎渐渑渔渖渗温游湾湿溃溅溆溇滗滚滞滟滠满滢滤滥滦滨滩滪漤潆潇潋潍潜潴澜濑濒灏灭灯灵灾灿炀炉炖炜炝点炼炽烁烂烃烛烟烦烧烨烩烫烬热焕焖焘煅煳熘爱爷牍牦牵牺犊犟状犷犸犹狈狍狝狞独狭狮狯狰狱狲猃猎猕猡猪猫猬献獭玑玙玚玛玮环现玱玺珉珏珐珑珰珲琎琏琐琼瑶瑷璇璎瓒瓮瓯电画畅畲畴疖疗疟疠疡疬疮疯疱疴痈痉痒痖痨痪痫痴瘅瘆瘗瘘瘪瘫瘾瘿癞癣癫癯皑皱皲盏盐监盖盗盘眍眦眬着睁睐睑瞒瞩矫矶矾矿砀码砖砗砚砜砺砻砾础硁硅硕硖硗硙硚确硷碍碛碜碱碹磙礼祎祢祯祷祸禀禄禅离秃秆种积称秽秾稆税稣稳穑穷窃窍窑窜窝窥窦窭竖竞笃笋笔笕笺笼笾筑筚筛筜筝筹签简箓箦箧箨箩箪箫篑篓篮篱簖籁籴类籼粜粝粤粪粮糁糇紧絷纟纠纡红纣纤纥约级纨纩纪纫纬纭纮纯纰纱纲纳纴纵纶纷纸纹纺纻纼纽纾线绀绁绂练组绅细织终绉绊绋绌绍绎经绐绑绒结绔绕绖绗绘给绚绛络绝绞统绠绡绢绣绤绥绦继绨绩绪绫绬续绮绯绰绱绲绳维绵绶绷绸绹绺绻综绽绾绿缀缁缂缃缄缅缆缇缈缉缊缋缌缍缎缏缐缑缒缓缔缕编缗缘缙缚缛缜缝缞缟缠缡缢缣缤缥缦缧缨缩缪缫缬缭缮缯缰缱缲缳缴缵罂网罗罚罢罴羁羟羡翘翙翚耢耧耸耻聂聋职聍联聩聪肃肠肤肷肾肿胀胁胆胜胧胨胪胫胶脉脍脏脐脑脓脔脚脱脶脸腊腌腘腭腻腼腽腾膑臜舆舣舰舱舻艰艳艹艺节芈芗芜芦苁苇苈苋苌苍苎苏苘苹茎茏茑茔茕茧荆荐荙荚荛荜荞荟荠荡荣荤荥荦荧荨荩荪荫荬荭荮药莅莜莱莲莳莴莶获莸莹莺莼萚萝萤营萦萧萨葱蒇蒉蒋蒌蓝蓟蓠蓣蓥蓦蔷蔹蔺蔼蕲蕴薮藁藓虏虑虚虫虬虮虽虾虿蚀蚁蚂蚕蚝蚬蛊蛎蛏蛮蛰蛱蛲蛳蛴蜕蜗蜡蝇蝈蝉蝎蝼蝾螀螨蟏衅衔补衬衮袄袅袆袜袭袯装裆裈裢裣裤裥褛褴襁襕见观觃规觅视觇览觉觊觋觌觍觎觏觐觑觞触觯詟誉誊讠计订讣认讥讦讧讨让讪讫训议讯记讱讲讳讴讵讶讷许讹论讻讼讽设访诀证诂诃评诅识诇诈诉诊诋诌词诎诏诐译诒诓诔试诖诗诘诙诚诛诜话诞诟诠诡询诣诤该详诧诨诩诪诫诬语诮误诰诱诲诳说诵诶请诸诹诺读诼诽课诿谀谁谂调谄谅谆谇谈谊谋谌谍谎谏谐谑谒谓谔谕谖谗谘谙谚谛谜谝谞谟谠谡谢谣谤谥谦谧谨谩谪谫谬谭谮谯谰谱谲谳谴谵谶谷豮贝贞负贠贡财责贤败账货质贩贪贫贬购贮贯贰贱贲贳贴贵贶贷贸费贺贻贼贽贾贿赀赁赂赃资赅赆赇赈赉赊赋赌赍赎赏赐赑赒赓赔赕赖赗赘赙赚赛赜赝赞赟赠赡赢赣赪赵赶趋趱趸跃跄跖跞践跶跷跸跹跻踊踌踪踬踯蹑蹒蹰蹿躏躜躯车轧轨轩轪轫转轭轮软轰轱轲轳轴轵轶轷轸轹轺轻轼载轾轿辀辁辂较辄辅辆辇辈辉辊辋辌辍辎辏辐辑辒输辔辕辖辗辘辙辚辞辩辫边辽达迁过迈运还这进远违连迟迩迳迹适选逊递逦逻遗遥邓邝邬邮邹邺邻郁郄郏郐郑郓郦郧郸酝酦酱酽酾酿释里鉅鉴銮錾钆钇针钉钊钋钌钍钎钏钐钑钒钓钔钕钖钗钘钙钚钛钝钞钟钠钡钢钣钤钥钦钧钨钩钪钫钬钭钮钯钰钱钲钳钴钵钶钷钸钹钺钻钼钽钾钿铀铁铂铃铄铅铆铈铉铊铋铍铎铏铐铑铒铕铗铘铙铚铛铜铝铞铟铠铡铢铣铤铥铦铧铨铪铫铬铭铮铯铰铱铲铳铴铵银铷铸铹铺铻铼铽链铿销锁锂锃锄锅锆锇锈锉锊锋锌锍锎锏锐锑锒锓锔锕锖锗错锚锜锞锟锠锡锢锣锤锥锦锨锩锫锬锭键锯锰锱锲锳锴锵锶锷锸锹锺锻锼锽锾锿镀镁镂镃镆镇镈镉镊镌镍镎镏镐镑镒镕镖镗镙镚镛镜镝镞镟镠镡镢镣镤镥镦镧镨镩镪镫镬镭镮镯镰镱镲镳镴镶长门闩闪闫闬闭问闯闰闱闲闳间闵闶闷闸闹闺闻闼闽闾闿阀阁阂阃阄阅阆阇阈阉阊阋阌阍阎阏阐阑阒阓阔阕阖阗阘阙阚阛队阳阴阵阶际陆陇陈陉陕陧陨险随隐隶隽难雏雠雳雾霁霉霭靓静靥鞑鞒鞯鞴韦韧韨韩韪韫韬韵页顶顷顸项顺须顼顽顾顿颀颁颂颃预颅领颇颈颉颊颋颌颍颎颏颐频颒颓颔颕颖颗题颙颚颛颜额颞颟颠颡颢颣颤颥颦颧风飏飐飑飒飓飔飕飖飗飘飙飚飞飨餍饤饥饦饧饨饩饪饫饬饭饮饯饰饱饲饳饴饵饶饷饸饹饺饻饼饽饾饿馀馁馂馃馄馅馆馇馈馉馊馋馌馍馎馏馐馑馒馓馔馕马驭驮驯驰驱驲驳驴驵驶驷驸驹驺驻驼驽驾驿骀骁骂骃骄骅骆骇骈骉骊骋验骍骎骏骐骑骒骓骔骕骖骗骘骙骚骛骜骝骞骟骠骡骢骣骤骥骦骧髅髋髌鬓魇魉鱼鱽鱾鱿鲀鲁鲂鲄鲅鲆鲇鲈鲉鲊鲋鲌鲍鲎鲏鲐鲑鲒鲓鲔鲕鲖鲗鲘鲙鲚鲛鲜鲝鲞鲟鲠鲡鲢鲣鲤鲥鲦鲧鲨鲩鲪鲫鲬鲭鲮鲯鲰鲱鲲鲳鲴鲵鲶鲷鲸鲹鲺鲻鲼鲽鲾鲿鳀鳁鳂鳃鳄鳅鳆鳇鳈鳉鳊鳋鳌鳍鳎鳏鳐鳑鳒鳓鳔鳕鳖鳗鳘鳙鳛鳜鳝鳞鳟鳠鳡鳢鳣鸟鸠鸡鸢鸣鸤鸥鸦鸧鸨鸩鸪鸫鸬鸭鸮鸯鸰鸱鸲鸳鸴鸵鸶鸷鸸鸹鸺鸻鸼鸽鸾鸿鹀鹁鹂鹃鹄鹅鹆鹇鹈鹉鹊鹋鹌鹍鹎鹏鹐鹑鹒鹓鹔鹕鹖鹗鹘鹚鹛鹜鹝鹞鹟鹠鹡鹢鹣鹤鹥鹦鹧鹨鹩鹪鹫鹬鹭鹯鹰鹱鹲鹳鹴鹾麦麸黄黉黡黩黪黾鼋鼌鼍鼗鼹齄齐齑齿龀龁龂龃龄龅龆龇龈龉龊龋龌龙龚龛龟志制咨只里系范松没尝尝闹面准钟别闲干尽脏拼" 8 | public static func simplify(_ ch: String) -> String { 9 | return String(ch.map { c in 10 | if let i = big5.index(of: c) { 11 | return gb[i] 12 | } else { 13 | return c 14 | } 15 | }) 16 | } 17 | public static func traditionalize(_ ch: String) -> String { 18 | return String(ch.map { c in 19 | if let i = gb.index(of: c) { 20 | return big5[i] 21 | } else { 22 | return c 23 | } 24 | }) 25 | } 26 | } 27 | 28 | public extension String { 29 | public var big5: String { 30 | return GBig.traditionalize(self) 31 | } 32 | public var gb: String { 33 | return GBig.simplify(self) 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /dailyVerse/Functions/MyFunctions 2.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MyFunctions.swift 3 | // dailyVerse 4 | // 5 | // Created by 庫倪 on 2018/1/13. 6 | // Copyright © 2018年 庫倪. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Alamofire 11 | 12 | enum api { 13 | static func request( 14 | URL: String, 15 | Parameters: Parameters?, 16 | success: @escaping (_ dataRes: Any) -> (), 17 | failure: @escaping (_ dataRes: Any) -> () 18 | ) { 19 | Alamofire.request( 20 | URL, 21 | parameters: Parameters 22 | ) 23 | .responseJSON { response in 24 | switch response.result { 25 | case .success(let value): 26 | success(value) 27 | case .failure(let error): 28 | failure(error) 29 | } 30 | } 31 | } 32 | } 33 | 34 | 35 | -------------------------------------------------------------------------------- /dailyVerse/Functions/MyFunctions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MyFunctions.swift 3 | // dailyVerse 4 | // 5 | // Created by 庫倪 on 2018/1/13. 6 | // Copyright © 2018年 庫倪. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Alamofire 11 | 12 | enum api { 13 | static func request( 14 | URL: String, 15 | Parameters: Parameters?, 16 | success: @escaping (_ dataRes: Any) -> (), 17 | failure: @escaping (_ dataRes: Any) -> () 18 | ) { 19 | 20 | let headers = [ 21 | "Content-Type" : "application/json; charset=utf-8" 22 | ] 23 | 24 | Alamofire.request( 25 | URL, 26 | parameters: Parameters, 27 | headers: headers 28 | ) 29 | .responseJSON { response in 30 | switch response.result { 31 | case .success(let value): 32 | success(value) 33 | case .failure(let error): 34 | sendMessage(title: URL, text: error.localizedDescription) 35 | print(URL) 36 | print(error) 37 | failure(error) 38 | } 39 | } 40 | 41 | } 42 | } 43 | 44 | func sendMessage(title: String, text: String, type: String = "ERROR") { 45 | // 發送錯誤信息到開發者 46 | 47 | let urlParams = [ 48 | "text":"[dailyVerse App]\n\r- \(type) \n\r- \(title) \n\r- \(text)" 49 | ] 50 | Alamofire.request("https://tgbot.lbyczf.com/sendMessage/9qvmshonjxf5csk5", method: .get, parameters: urlParams) 51 | } 52 | 53 | func getCurrentLanguage() -> String { 54 | let preferredLang = Bundle.main.preferredLocalizations.first! as NSString 55 | print("OS Language: \(preferredLang)") 56 | 57 | switch String(describing: preferredLang) { 58 | case "en-US", "en-CN": 59 | return "en"//英文 60 | case "zh-Hans-US", "zh-Hans-CN", "zh-Hans": 61 | return "sc"//中文 62 | case "zh-TW", "zh-HK", "zh-Hant", "zh-Hant-CN": 63 | return "tc"//中文 64 | default: 65 | return "en" 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /dailyVerse/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleDisplayName 8 | Daily Verse 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | $(MARKETING_VERSION) 21 | CFBundleVersion 22 | 64 23 | ITSAppUsesNonExemptEncryption 24 | 25 | LSRequiresIPhoneOS 26 | 27 | NSAppTransportSecurity 28 | 29 | NSAllowsArbitraryLoads 30 | 31 | 32 | UIBackgroundModes 33 | 34 | audio 35 | 36 | UILaunchStoryboardName 37 | LaunchScreen 38 | UIMainStoryboardFile 39 | Main 40 | UIRequiredDeviceCapabilities 41 | 42 | armv7 43 | 44 | UISupportedInterfaceOrientations 45 | 46 | UIInterfaceOrientationPortrait 47 | UIInterfaceOrientationLandscapeLeft 48 | UIInterfaceOrientationLandscapeRight 49 | 50 | UISupportedInterfaceOrientations~ipad 51 | 52 | UIInterfaceOrientationPortrait 53 | UIInterfaceOrientationPortraitUpsideDown 54 | UIInterfaceOrientationLandscapeLeft 55 | UIInterfaceOrientationLandscapeRight 56 | 57 | mtj_appkey 58 | 0786aae6a5 59 | mtj_deubglog 60 | 0 61 | 62 | 63 | -------------------------------------------------------------------------------- /dailyVerse/SectionCell.swift: -------------------------------------------------------------------------------- 1 | //dailyVerse 2 | // 3 | //Copyright (c) 2017 Qoli Wong - https://github.com/qoli/dailyVerse 4 | // 5 | //Permission is hereby granted, free of charge, to any person obtaining a copy 6 | //of this software and associated documentation files (the "Software"), to deal 7 | //in the Software without restriction, including without limitation the rights 8 | //to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | //copies of the Software, and to permit persons to whom the Software is 10 | //furnished to do so, subject to the following conditions: 11 | // 12 | //The above copyright notice and this permission notice shall be included in all 13 | //copies or substantial portions of the Software. 14 | // 15 | //THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | //IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | //FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | //AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | //LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | //OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | //SOFTWARE. 22 | 23 | import UIKit 24 | 25 | class SectionCell: UITableViewCell { 26 | 27 | @IBOutlet weak var sectionLabel: UILabel! 28 | @IBOutlet weak var SectionNumberLabel: UILabel! 29 | 30 | override func awakeFromNib() { 31 | super.awakeFromNib() 32 | // Initialization code 33 | } 34 | 35 | override func setSelected(_ selected: Bool, animated: Bool) { 36 | super.setSelected(selected, animated: animated) 37 | 38 | // Configure the view for the selected state 39 | } 40 | 41 | } 42 | -------------------------------------------------------------------------------- /dailyVerse/SectionText.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /dailyVerse/TableViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TableViewController.swift 3 | // dailyVerse 4 | // 5 | // Created by 庫倪 on 2017/11/12. 6 | // Copyright © 2017年 庫倪. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class TableViewController: UIViewController { 12 | 13 | override func viewDidLoad() { 14 | super.viewDidLoad() 15 | 16 | // Do any additional setup after loading the view. 17 | } 18 | 19 | override func didReceiveMemoryWarning() { 20 | super.didReceiveMemoryWarning() 21 | // Dispose of any resources that can be recreated. 22 | } 23 | 24 | 25 | /* 26 | // MARK: - Navigation 27 | 28 | // In a storyboard-based application, you will often want to do a little preparation before navigation 29 | override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 30 | // Get the new view controller using segue.destinationViewController. 31 | // Pass the selected object to the new view controller. 32 | } 33 | */ 34 | 35 | } 36 | -------------------------------------------------------------------------------- /dailyVerse/ViewController.swift: -------------------------------------------------------------------------------- 1 | //dailyVerse 2 | // 3 | //Copyright (c) 2017 Qoli Wong - https://github.com/qoli/dailyVerse 4 | // 5 | //Permission is hereby granted, free of charge, to any person obtaining a copy 6 | //of this software and associated documentation files (the "Software"), to deal 7 | //in the Software without restriction, including without limitation the rights 8 | //to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | //copies of the Software, and to permit persons to whom the Software is 10 | //furnished to do so, subject to the following conditions: 11 | // 12 | //The above copyright notice and this permission notice shall be included in all 13 | //copies or substantial portions of the Software. 14 | // 15 | //THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | //IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | //FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | //AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | //LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | //OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | //SOFTWARE. 22 | 23 | import UIKit 24 | import AVFoundation 25 | 26 | import Alamofire 27 | import Spring 28 | import SwiftDate 29 | import SwiftyJSON 30 | import DynamicBlurView 31 | import NotificationBannerSwift 32 | import MMMaterialDesignSpinner 33 | 34 | 35 | 36 | // 狀態欄通知的背景顏色 37 | class CustomBannerColors: BannerColorsProtocol { 38 | func color(for style: BannerStyle) -> UIColor { 39 | return UIColor.dlyCoralPink 40 | } 41 | } 42 | 43 | // Main View 44 | class ViewController: UIViewController, UITableViewDataSource, UITabBarDelegate { 45 | 46 | @IBOutlet weak var dateText: UILabel! 47 | @IBOutlet weak var dayText: UILabel! 48 | @IBOutlet weak var mainText: UILabel! 49 | @IBOutlet weak var overlayerView: UIView! 50 | @IBOutlet weak var mainView: UIView! 51 | 52 | @IBOutlet weak var AboutUIView: UIView! 53 | @IBOutlet weak var aboutMainTextView: SpringView! 54 | @IBOutlet weak var aboutVersion: UILabel! 55 | @IBOutlet weak var aboutImage: SpringImageView! 56 | 57 | @IBOutlet weak var chapterView: UIView! 58 | @IBOutlet weak var chapterUITableView: UITableView! 59 | 60 | 61 | var spinnerView: MMMaterialDesignSpinner! 62 | var blurView: DynamicBlurView! 63 | 64 | var updateDataBool: Bool = false 65 | var updateTableBool: Bool = false 66 | 67 | var dailyVerse: String = "" 68 | var textChapterTitle: String = "" 69 | var textChapterNumber: Int = 0 70 | var verseArray = Dictionary() 71 | 72 | var traditionalChinese: Bool = true 73 | 74 | var longPressNumber: Int = 0 75 | 76 | override func viewDidLoad() { 77 | super.viewDidLoad() 78 | 79 | print("> viewDidLoad") 80 | print("") 81 | 82 | UI_Before() 83 | init_spinner() 84 | init_today() 85 | init_verse() 86 | UI_After() 87 | 88 | } 89 | 90 | @IBAction func longPressTouch(_ sender: UILongPressGestureRecognizer) { 91 | 92 | } 93 | 94 | // 一些元件的預先設定 95 | func UI_Before() { 96 | self.overlayerView.backgroundColor = UIColor(named: "white0") 97 | AboutUIView.backgroundColor = UIColor(named: "white0") 98 | AboutUIView.isHidden = true 99 | 100 | chapterUITableView.separatorColor = UIColor.clear 101 | chapterUITableView.backgroundColor = UIColor(named: "backgroudColor") 102 | 103 | chapterView.isHidden = true 104 | 105 | // 刷新版本號 106 | // Get the app's main bundle 107 | let mainBundle = Bundle.main 108 | 109 | let appVersion = mainBundle.infoDictionary!["CFBundleShortVersionString"] as? String 110 | let build = mainBundle.infoDictionary!["CFBundleVersion"] as? String 111 | // print(appVersion) 112 | 113 | aboutVersion.text = "version \(appVersion ?? "0") (Build \(build ?? "0"))" 114 | 115 | if getCurrentLanguage() == "sc" { 116 | traditionalChinese = false 117 | } 118 | 119 | } 120 | 121 | // 一些數據載入好后的調整 122 | func UI_After() { 123 | dateText.typesetting(lineSpacing: 1, lineHeightMultiple: 1, characterSpacing: 1.5) 124 | 125 | chapterUITableView.estimatedRowHeight = 120 126 | chapterUITableView.rowHeight = UITableView.automaticDimension 127 | } 128 | 129 | // MARK: 重新處理全局變量 130 | func UI_updateData() { 131 | print("> UI_updateData()") 132 | 133 | let matched = self.matches(for: "\\S*", in: dailyVerse.replacingOccurrences(of: ":", with: " ")) 134 | var r = matched 135 | r = r.filter { $0 != "" } 136 | print(r) 137 | 138 | textChapterTitle = String(r[0]) //重新賦值章節標題 139 | textChapterNumber = Int(r[1]) ?? 99 //重新賦值第 N 章節 140 | 141 | if textChapterNumber == 99 { 142 | self.UIStatusMessage(Message: "尋找章節失敗") 143 | textChapterNumber = 1 144 | } 145 | 146 | self.updateDataBool = true 147 | self.chapterUITableView.reloadData() 148 | 149 | } 150 | 151 | // didReceiveMemoryWarning 152 | override func didReceiveMemoryWarning() { 153 | super.didReceiveMemoryWarning() 154 | print("didReceiveMemoryWarning") 155 | } 156 | 157 | // Try Button 158 | @IBAction func tryButton(_ sender: UIButton) { 159 | 160 | } 161 | 162 | // 打開﹣關於界面 163 | @IBAction func openAbout(_ sender: UIButton) { 164 | 165 | self.AboutUIView.alpha = 1 166 | aboutMainTextView.animation = "slideUp" 167 | aboutMainTextView.animate() 168 | aboutImage.animation = "fadeIn" 169 | aboutImage.animate() 170 | 171 | 172 | blurView = DynamicBlurView(frame: view.bounds) 173 | self.overlayerView.backgroundColor = UIColor(named: "white0") 174 | 175 | UIView.animate(withDuration: 0.5) { 176 | self.blurView.blurRadius = 15 177 | self.overlayerView.backgroundColor = UIColor(named: "white50") 178 | } 179 | 180 | blurView.tag = 101 181 | self.overlayerView.isHidden = false 182 | self.mainView.addSubview(self.blurView) 183 | } 184 | 185 | // 關閉﹣關於界面 186 | @IBAction func closeAbout(_ sender: UIButton) { 187 | UIView.animate(withDuration: 0.6) { 188 | self.blurView.blurRadius = 0 189 | self.AboutUIView.alpha = 0 190 | } 191 | 192 | self.aboutMainTextView.animation = "fall" 193 | self.aboutMainTextView.animate() 194 | aboutImage.animation = "fadeOut" 195 | aboutImage.animate() 196 | 197 | let _ = setTimeout(0.6) { 198 | self.overlayerView.isHidden = true 199 | if let viewWithTag = self.view.viewWithTag(101) { 200 | viewWithTag.removeFromSuperview() 201 | } 202 | } 203 | 204 | } 205 | @IBOutlet var AudioButton: UIButton! 206 | 207 | var player: AVPlayer? 208 | var isPlaying: Bool = false 209 | var isReadlyPlay: Bool = false 210 | var apiDataAudio: JSON = [] 211 | 212 | var isPlayerError: Bool = false 213 | 214 | func playAudio() { 215 | if isPlaying { 216 | player?.pause() 217 | } else { 218 | player?.play() 219 | } 220 | } 221 | 222 | func getAudioURL() { 223 | 224 | let sortName = self.traditionalChinese(longName: textChapterTitle) 225 | let parameters: Parameters = [ 226 | "link": "https://bible.fhl.net/new/read.php", 227 | "chap": textChapterNumber, 228 | "chineses": sortName 229 | ] 230 | 231 | api.request( 232 | URL: "https://bible.5mlstudio.com/voice.php", 233 | Parameters: parameters, 234 | success: { value in 235 | let json = JSON(value) 236 | self.readlyForPlay(url: json["url"].string ?? "") 237 | self.apiDataAudio = json 238 | }, 239 | failure: { error in 240 | self.AudioButton.setTitle("朗讀錯誤", for: .normal) 241 | } 242 | ) 243 | } 244 | 245 | 246 | override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey: Any]?, context: UnsafeMutableRawPointer?) { 247 | 248 | if keyPath == "rate" { 249 | if player?.rate == 1 { 250 | print("Playing") 251 | isPlaying = true 252 | AudioButton.setTitle("播放中", for: .normal) 253 | } else { 254 | print("Stop") 255 | isPlaying = false 256 | AudioButton.setTitle("朗讀", for: .normal) 257 | } 258 | } 259 | 260 | if keyPath == #keyPath(AVPlayer.currentItem.status) { 261 | let newStatus: AVPlayerItem.Status 262 | if let newStatusAsNumber = change?[NSKeyValueChangeKey.newKey] as? NSNumber { 263 | newStatus = AVPlayerItem.Status(rawValue: newStatusAsNumber.intValue)! 264 | } else { 265 | newStatus = .unknown 266 | } 267 | if newStatus == .failed { 268 | NSLog("Error: \(String(describing: self.player?.currentItem?.error?.localizedDescription)), error: \(String(describing: self.player?.currentItem?.error))") 269 | print("failed") 270 | } 271 | } 272 | } 273 | 274 | // Getting error from Notification payload 275 | func newErrorLogEntry(_ notification: Notification) { 276 | guard let object = notification.object, let playerItem = object as? AVPlayerItem else { 277 | return 278 | } 279 | guard let errorLog: AVPlayerItemErrorLog = playerItem.errorLog() else { 280 | return 281 | } 282 | NSLog("Error: \(errorLog)") 283 | } 284 | 285 | func failedToPlayToEndTime(_ notification: Notification) { 286 | print("failedToPlayToEndTime") 287 | } 288 | 289 | func readlyForPlay(url: String) { 290 | print("readlyForPlay: \(url)") 291 | self.isReadlyPlay = true 292 | 293 | guard let url = URL(string: url) else { 294 | print("Invalid URL") 295 | self.UIStatusMessage(Message: "Invalid URL") 296 | return 297 | } 298 | 299 | do { 300 | try AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category(rawValue: convertFromAVAudioSessionCategory(AVAudioSession.Category.playback))) 301 | let asset = AVURLAsset(url: url) 302 | let item = AVPlayerItem(asset: asset) 303 | self.player = AVPlayer(playerItem: item) 304 | self.player?.addObserver(self, forKeyPath: "rate", options: NSKeyValueObservingOptions(rawValue: NSKeyValueObservingOptions.new.rawValue | NSKeyValueObservingOptions.old.rawValue), context: nil) 305 | self.player?.addObserver(self, forKeyPath: #keyPath(AVPlayer.status), options: [.new, .initial], context: nil) 306 | // Watch notifications 307 | let center = NotificationCenter.default 308 | center.addObserver(self, selector: Selector(("newErrorLogEntry:")), name: .AVPlayerItemNewErrorLogEntry, object: player?.currentItem) 309 | center.addObserver(self, selector: Selector(("failedToPlayToEndTime:")), name: .AVPlayerItemFailedToPlayToEndTime, object: player?.currentItem) 310 | 311 | // play 312 | self.player?.pause() 313 | } catch { 314 | sendMessage(title: "\(url)", text: error.localizedDescription) 315 | self.UIStatusMessage(Message: (error as AnyObject).localizedDescription) 316 | } 317 | } 318 | 319 | func switchAudio() { 320 | if !isReadlyPlay { 321 | self.getAudioURL() 322 | } else { 323 | self.playAudio() 324 | } 325 | } 326 | 327 | @IBAction func audioTap(_ sender: Any) { 328 | print("> audioTap()") 329 | 330 | if let text = AudioButton.titleLabel?.text { 331 | if text == "朗讀錯誤" { 332 | self.getAudioURL() 333 | } else { 334 | self.switchAudio() 335 | } 336 | } 337 | } 338 | 339 | @IBAction func audioLongPress(_ sender: Any) { 340 | 341 | if longPressNumber == 0 { 342 | print("> audioLongPress()") 343 | 344 | // 1 345 | let optionMenu = UIAlertController(title: nil, message: "選擇版本", preferredStyle: .actionSheet) 346 | 347 | for (index, subJson): (String, JSON) in apiDataAudio["versionName"] { 348 | optionMenu.addAction(UIAlertAction(title: subJson.stringValue, style: .default, handler: { action in 349 | let arr: Array = self.apiDataAudio["audioURL"].arrayValue 350 | self.readlyForPlay(url: arr[Int(index)!].stringValue) 351 | 352 | let _ = self.setTimeout(0.8) { 353 | self.switchAudio() 354 | } 355 | })) 356 | 357 | } 358 | 359 | // 4 360 | optionMenu.addAction(UIAlertAction(title: "關閉", style: .cancel)) 361 | 362 | // 5 363 | self.present(optionMenu, animated: true, completion: nil) 364 | 365 | let _ = setTimeout(4.0) { 366 | self.longPressNumber = 0 367 | } 368 | } 369 | 370 | longPressNumber = longPressNumber + 1 371 | } 372 | 373 | // MARK: 關閉 詳細章節界面 374 | @IBAction func closeChapterView(_ sender: UIButton) { 375 | 376 | self.chapterTextLabel.text = "" 377 | chapterView.alpha = 1 378 | UIView.animate(withDuration: 0.3) { 379 | self.chapterView.alpha = 0 380 | } 381 | let _ = setTimeout(0.3) { 382 | self.chapterView.isHidden = true 383 | self.spinnerView.stopAnimating() 384 | } 385 | } 386 | 387 | // MARK: 打開 詳細章節界面 388 | 389 | @IBOutlet weak var chapterTextLabel: UILabel! 390 | 391 | @IBAction func tapPress(_ sender: UITapGestureRecognizer) { 392 | print("> tapPress()") 393 | 394 | if !updateTableBool { 395 | spinnerView.startAnimating() 396 | self.tableData() 397 | } 398 | 399 | chapterView.isHidden = false 400 | chapterView.alpha = 0.0 401 | chapterView.backgroundColor = UIColor(named: "backgroudColor") 402 | UIView.animate(withDuration: 0.16) { 403 | self.chapterView.alpha = 1 404 | } 405 | 406 | 407 | 408 | } 409 | 410 | // MARK: 載入詳細章節 411 | 412 | func tableData() { 413 | 414 | let sortName = self.traditionalChinese(longName: textChapterTitle) 415 | 416 | print("中文縮寫:\(sortName),traditionalChinese 繁體中文模式(Bool):\(traditionalChinese)") 417 | 418 | var gb: String = "0" 419 | 420 | if traditionalChinese { 421 | gb = "0" 422 | } else { 423 | gb = "1" 424 | } 425 | 426 | let parameters: Parameters = [ 427 | "link": "https://bible.fhl.net/json/qb.php", 428 | "gb": gb, 429 | "chap": textChapterNumber, 430 | "chineses": sortName 431 | ] 432 | 433 | // 重置播放狀態 434 | self.isReadlyPlay = false 435 | self.AudioButton.setTitle("...", for: .normal) 436 | self.getAudioURL() 437 | 438 | api.request( 439 | URL: "https://bible.fhl.net/json/qb.php", 440 | Parameters: parameters, 441 | success: { value in 442 | // Table Data 443 | let json = JSON(value) 444 | for (_, subJson): (String, JSON) in json["record"] { 445 | let k: Int = subJson["sec"].intValue 446 | let b: String = subJson["bible_text"].string! 447 | self.verseArray[k] = b 448 | } 449 | self.chapterUITableView.reloadData() 450 | self.spinnerView.stopAnimating() 451 | self.updateTableBool = true 452 | }, 453 | failure: { error in 454 | print(error) 455 | self.chapterTextLabel.text = (error as AnyObject).localizedDescription 456 | self.UIStatusMessage(Message: "Error and Automated Report.") 457 | self.spinnerView.stopAnimating() 458 | } 459 | ) 460 | 461 | } 462 | 463 | // 運算表格數量 464 | func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 465 | print("> Table View...") 466 | 467 | if self.updateDataBool { 468 | print("VerseArray count: \(self.verseArray.count)") 469 | return self.verseArray.count + 2 470 | } else { 471 | return 2 472 | } 473 | 474 | 475 | } 476 | 477 | // 填充表格內容 478 | func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 479 | 480 | if indexPath.row == 0 { 481 | 482 | let ChapterTableCell = tableView.dequeueReusableCell(withIdentifier: "chapterCell") as! ChapterCell 483 | 484 | if !self.updateDataBool { 485 | ChapterTableCell.ChapterLaberTitle.text = "Loading..." 486 | } else { 487 | ChapterTableCell.ChapterLaberTitle.text = "\(textChapterTitle) · \(intIntoString(number: textChapterNumber))章" 488 | } 489 | 490 | ChapterTableCell.ChapterLaberTitle.typesetting(lineSpacing: 1, lineHeightMultiple: 1, characterSpacing: 2) 491 | ChapterTableCell.backgroundColor = UIColor(named: "backgroudColor") 492 | return ChapterTableCell 493 | 494 | } else if indexPath.row == self.verseArray.count + 1 { 495 | 496 | let BlankTableCell = tableView.dequeueReusableCell(withIdentifier: "chapterCell") as! ChapterCell 497 | BlankTableCell.ChapterLaberTitle.text = "" 498 | BlankTableCell.backgroundColor = UIColor(named: "backgroudColor") 499 | return BlankTableCell 500 | 501 | } else { 502 | 503 | if self.updateDataBool { 504 | 505 | let SectionTableCell = tableView.dequeueReusableCell(withIdentifier: "SectionLabelCell") as! SectionCell 506 | SectionTableCell.sectionLabel.text = self.verseArray[indexPath.row] 507 | 508 | if (self.verseArray[indexPath.row] != "") { 509 | SectionTableCell.SectionNumberLabel.text = String(indexPath.row) 510 | SectionTableCell.backgroundColor = UIColor(named: "backgroudColor") 511 | SectionTableCell.sectionLabel.typesetting(lineSpacing: 1.5, lineHeightMultiple: 2, characterSpacing: 2) 512 | } 513 | return SectionTableCell 514 | 515 | } else { 516 | 517 | let SectionTableCell = tableView.dequeueReusableCell(withIdentifier: "SectionLabelCell") as! SectionCell 518 | SectionTableCell.sectionLabel.text = "..." 519 | SectionTableCell.SectionNumberLabel.text = String(0) 520 | SectionTableCell.backgroundColor = UIColor(named: "backgroudColor") 521 | SectionTableCell.sectionLabel.typesetting(lineSpacing: 1.5, lineHeightMultiple: 2, characterSpacing: 2) 522 | return SectionTableCell 523 | } 524 | 525 | 526 | } 527 | 528 | } 529 | 530 | // MARK: 主界面 屏幕中央 531 | @IBAction func longPress(_ sender: UILongPressGestureRecognizer) { 532 | 533 | if longPressNumber == 0 { 534 | init_verse() 535 | updateTableBool = false 536 | updateDataBool = false 537 | self.UIStatusMessage(Message: "重新載入數據") 538 | 539 | let _ = setTimeout(4.0) { 540 | self.longPressNumber = 0 541 | } 542 | } 543 | 544 | longPressNumber = longPressNumber + 1 545 | 546 | } 547 | 548 | 549 | // MARK: 主界面 分享按鈕 550 | @IBAction func shareAction(_ sender: UIButton) { 551 | 552 | self.UIStatusMessage(Message: "正在開啟分享...") 553 | 554 | let shareText: String = dailyVerse 555 | let vc = UIActivityViewController(activityItems: [shareText], applicationActivities: []) 556 | present(vc, animated: true) 557 | 558 | } 559 | 560 | // 初始化日期信息 561 | func init_today() { 562 | let date = DateInRegion() 563 | 564 | print(date) 565 | 566 | dayText.text = String(date.day) 567 | dateText.text = String("\(date.toFormat("dd MMM yyyy")) · \(date.weekdayName(.default))") 568 | dateText.textAlignment = .right 569 | } 570 | 571 | // MARK: - 初始化金句 572 | func init_verse() { 573 | let t: UILabel! = self.mainText 574 | t.text = "" 575 | 576 | spinnerView.startAnimating() 577 | 578 | let _ = setTimeout(0.6) { 579 | Alamofire.request("https://bible.5mlstudio.com") 580 | .responseString { response in 581 | if response.result.isSuccess { 582 | var s: String! = response.result.value ?? "" 583 | 584 | if (response.result.value != "") { 585 | s = s.replacingOccurrences(of: "\r", with: "") 586 | s = s.replacingOccurrences(of: "\n", with: "") 587 | s = s.trimmingCharacters(in: .whitespacesAndNewlines) 588 | 589 | if !self.traditionalChinese { 590 | // 簡體中文模式 591 | print("簡體中文模式") 592 | s = s.gb 593 | } 594 | 595 | self.dailyVerse = s 596 | t.text = s 597 | t.typesetting(lineSpacing: 1.5, lineHeightMultiple: 2, characterSpacing: 2) 598 | t.textAlignment = .center 599 | self.spinnerView.stopAnimating() 600 | self.UI_updateData() 601 | } else { 602 | self.spinnerView.stopAnimating() 603 | Alamofire.request("https://tgbot.lbyczf.com/sendMessage/9qvmshonjxf5csk5?text=api_error", method: .get) 604 | t.text = "API Error" 605 | } 606 | 607 | } else { 608 | Alamofire.request("https://tgbot.lbyczf.com/sendMessage/9qvmshonjxf5csk5?text=Network problem", method: .get) 609 | self.UIStatusMessage(Message: "Network problem") 610 | } 611 | } 612 | } 613 | } 614 | 615 | // 初始化 spinner view 616 | func init_spinner() { 617 | spinnerView = MMMaterialDesignSpinner.init(frame: CGRect(x: 0, y: 0, width: 24, height: 24)) 618 | spinnerView.center = CGPoint(x: self.view.frame.size.width / 2, y: self.view.frame.size.height / 2) 619 | spinnerView.lineWidth = 3 620 | spinnerView.tintColor = UIColor.dlyDark 621 | 622 | self.view .addSubview(spinnerView) 623 | } 624 | 625 | // 顯示狀態欄的通知 626 | func UIStatusMessage(Message: String = "Message") { 627 | let banner = StatusBarNotificationBanner(title: Message, colors: CustomBannerColors()) 628 | banner.show() 629 | } 630 | 631 | /** 632 | setTimeout() 633 | 634 | Shorthand method for create a delayed block to be execute on started Thread. 635 | 636 | This method returns ``Timer`` instance, so that user may execute the block 637 | within immediately or keep the reference for further cancelation by calling 638 | ``Timer.invalidate()`` 639 | 640 | Example: 641 | let timer = setTimeout(0.3) { 642 | // do something 643 | } 644 | timer.invalidate() // cancel it. 645 | */ 646 | func setTimeout(_ delay: TimeInterval, block: @escaping () -> Void) -> Timer { 647 | return Timer.scheduledTimer(timeInterval: delay, target: BlockOperation(block: block), selector: #selector(Operation.main), userInfo: nil, repeats: false) 648 | } 649 | 650 | 651 | // 正則 652 | func matches(for regex: String, in text: String) -> [String] { 653 | 654 | do { 655 | let regex = try NSRegularExpression(pattern: regex) 656 | let results = regex.matches(in: text, range: NSRange(text.startIndex..., in: text)) 657 | return results.map { 658 | String(text[Range($0.range, in: text)!]) 659 | } 660 | } catch let error { 661 | print("invalid regex: \(error.localizedDescription)") 662 | return [] 663 | } 664 | } 665 | 666 | // 數字轉中文 667 | // (載入詳細章節用) 668 | func intIntoString(number: Int) -> String { 669 | let formatter = NumberFormatter() 670 | formatter.numberStyle = NumberFormatter.Style(rawValue: UInt(CFNumberFormatterRoundingMode.roundHalfDown.rawValue))! 671 | let string: String = formatter.string(from: NSNumber(value: number))! 672 | return string 673 | } 674 | 675 | // 聖經詳細名字轉中文縮寫 676 | // (載入詳細章節用) 677 | func traditionalChinese(longName: String) -> String { 678 | 679 | let traditional: [String: String] = [ 680 | "創世記": "創", 681 | "出埃及記": "出", 682 | "利未記": "利", 683 | "民數記": "民", 684 | "申命記": "申", 685 | "約書亞記": "書", 686 | "士師記": "士", 687 | "路得記": "得", 688 | "撒母耳記上": "撒上", 689 | "撒母耳記下": "撒下", 690 | "列王紀上": "王上", 691 | "列王紀下": "王下", 692 | "歷代志上": "代上", 693 | "歷代志下": "代下", 694 | "以斯拉記": "拉", 695 | "尼希米記": "尼", 696 | "以斯帖記": "斯", 697 | "約伯記": "伯", 698 | "詩篇": "詩", 699 | "箴言": "箴", 700 | "傳道書": "傳", 701 | "雅歌": "歌", 702 | "以賽亞書": "賽", 703 | "耶利米書": "耶", 704 | "耶利米哀歌": "哀", 705 | "以西結書": "結", 706 | "但以理書": "但", 707 | "何西阿書": "何", 708 | "約珥書": "珥", 709 | "阿摩司書": "摩", 710 | "俄巴底亞書": "俄", 711 | "約拿書": "拿", 712 | "彌迦書": "彌", 713 | "那鴻書": "鴻", 714 | "哈巴谷書": "哈", 715 | "西番雅書": "番", 716 | "哈該書": "該", 717 | "撒迦利亞書": "亞", 718 | "瑪拉基書": "瑪", 719 | "馬太福音": "太", 720 | "馬可福音": "可", 721 | "路加福音": "路", 722 | "約翰福音": "約", 723 | "使徒行傳": "徒", 724 | "羅馬書": "羅", 725 | "哥林多前書": "林前", 726 | "哥林多後書": "林後", 727 | "加拉太書": "加", 728 | "以弗所書": "弗", 729 | "腓立比書": "腓", 730 | "歌羅西書": "西", 731 | "帖撒羅尼迦前書": "帖前", 732 | "帖撒羅尼迦後書": "帖後", 733 | "提摩太前書": "提前", 734 | "提摩太後書": "提後", 735 | "提多書": "多", 736 | "腓利門書": "門", 737 | "希伯來書": "來", 738 | "雅各書": "雅", 739 | "彼得前書": "彼前", 740 | "彼得後書": "彼後", 741 | "約翰壹書": "約一", 742 | "約翰貳書": "約二", 743 | "約翰參書": "約三", 744 | "猶大書": "猶", 745 | "啟示錄": "啟", 746 | "哥前": "林前", 747 | "哥後": "林後", 748 | "歌前": "林前", 749 | "歌後": "林後", 750 | "希": "來", 751 | "約翰一書": "約一", 752 | "約翰二書": "約二", 753 | "約翰三書": "約三", 754 | "約壹": "約一", 755 | "約貳": "約二", 756 | "約參": "約三", 757 | "啓示錄": "啟", 758 | "啓": "啟", 759 | "创": "創", 760 | "书": "書", 761 | "诗": "詩", 762 | "传": "傳", 763 | "赛": "賽", 764 | "结": "結", 765 | "弥": "彌", 766 | "鸿": "鴻", 767 | "该": "該", 768 | "亚": "亞", 769 | "玛": "瑪", 770 | "约": "約", 771 | "罗": "羅", 772 | "林后": "林後", 773 | "帖后": "帖後", 774 | "提后": "提後", 775 | "门": "門", 776 | "来": "來", 777 | "彼后": "彼後", 778 | "约一": "約一", 779 | "约二": "約二", 780 | "约三": "約三", 781 | "犹": "猶", 782 | "启": "啟", 783 | "哥后": "林後", 784 | "歌后": "林後", 785 | "约翰一书": "約一", 786 | "约翰二书": "約二", 787 | "约翰三书": "約三", 788 | "约壹": "約一", 789 | "约贰": "約二", 790 | "约参": "約三" 791 | ]; 792 | 793 | return (traditional[longName.big5] ?? "") 794 | } 795 | } 796 | 797 | /* 798 | IB 追加陰影\圓角等樣式 799 | */ 800 | @IBDesignable 801 | class DesignableView: UIView { 802 | } 803 | 804 | @IBDesignable 805 | class DesignableButton: UIButton { 806 | } 807 | 808 | @IBDesignable 809 | class DesignableLabel: UILabel { 810 | } 811 | 812 | 813 | 814 | // Helper function inserted by Swift 4.2 migrator. 815 | fileprivate func convertFromAVAudioSessionCategory(_ input: AVAudioSession.Category) -> String { 816 | return input.rawValue 817 | } 818 | 819 | -------------------------------------------------------------------------------- /dailyVerse/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* 2 | InfoPlist.strings 3 | dailyVerse 4 | 5 | Created by 庫倪 on 2017/11/14. 6 | Copyright © 2017年 庫倪. All rights reserved. 7 | */ 8 | 9 | "CFBundleDisplayName" = "Daily Verse"; 10 | -------------------------------------------------------------------------------- /dailyVerse/zh-Hans.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* 2 | InfoPlist.strings 3 | dailyVerse 4 | 5 | Created by 庫倪 on 2017/11/14. 6 | Copyright © 2017年 庫倪. All rights reserved. 7 | */ 8 | 9 | "CFBundleDisplayName" = "每日圣经"; 10 | -------------------------------------------------------------------------------- /dailyVerse/zh-Hans.lproj/LaunchScreen.strings: -------------------------------------------------------------------------------- 1 | 2 | /* Class = "UILabel"; text = "今日聖經金句"; ObjectID = "VtG-Fn-HGD"; */ 3 | "VtG-Fn-HGD.text" = "每日圣经金句"; 4 | -------------------------------------------------------------------------------- /dailyVerse/zh-Hans.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | 2 | /* Class = "UILabel"; text = "Version 1.0"; ObjectID = "35p-o0-os6"; */ 3 | "35p-o0-os6.text" = "版本 1.0"; 4 | 5 | /* Class = "UILabel"; text = "About - Daily Verse"; ObjectID = "41H-A4-Mp0"; */ 6 | "41H-A4-Mp0.text" = "关于 - 每日圣经金句"; 7 | 8 | /* Class = "UILabel"; text = "UI Designer"; ObjectID = "9Lh-Lp-kJr"; */ 9 | "9Lh-Lp-kJr.text" = "界面设计师"; 10 | 11 | 12 | /* Class = "UILabel"; text = "Work Studio"; ObjectID = "PFB-y8-hGL"; */ 13 | "PFB-y8-hGL.text" = "工作室"; 14 | 15 | /* Class = "UILabel"; text = "Today"; ObjectID = "Xhi-6V-KTR"; */ 16 | "Xhi-6V-KTR.text" = "今日"; 17 | 18 | /* Class = "UILabel"; text = "API Supply"; ObjectID = "Xtv-oG-Tx4"; */ 19 | "Xtv-oG-Tx4.text" = "API 提供"; 20 | 21 | /* Class = "UILabel"; text = "Program developer"; ObjectID = "cuB-h6-5KN"; */ 22 | "cuB-h6-5KN.text" = "程序开发人员"; 23 | 24 | /* Class = "UILabel"; text = "Github Project"; ObjectID = "esh-v5-fFy"; */ 25 | "esh-v5-fFy.text" = "Github 项目"; 26 | 27 | "jPh-uh-47i.text" = "感谢"; 28 | "Cne-c1-nda.text" = "分享" 29 | -------------------------------------------------------------------------------- /dailyVerse/zh-Hant.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* 2 | InfoPlist.strings 3 | dailyVerse 4 | 5 | Created by 庫倪 on 2017/11/14. 6 | Copyright © 2017年 庫倪. All rights reserved. 7 | */ 8 | 9 | "CFBundleDisplayName" = "每日聖經"; 10 | -------------------------------------------------------------------------------- /dailyVerse/zh-Hant.lproj/LaunchScreen.strings: -------------------------------------------------------------------------------- 1 | 2 | /* Class = "UILabel"; text = "今日聖經金句"; ObjectID = "VtG-Fn-HGD"; */ 3 | "VtG-Fn-HGD.text" = "每日聖經金句"; 4 | -------------------------------------------------------------------------------- /dailyVerse/zh-Hant.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | 2 | /* Class = "UILabel"; text = "Version 1.0"; ObjectID = "35p-o0-os6"; */ 3 | "35p-o0-os6.text" = "版本 1.0"; 4 | 5 | /* Class = "UILabel"; text = "About - Daily Verse"; ObjectID = "41H-A4-Mp0"; */ 6 | "41H-A4-Mp0.text" = "關於 - 每日聖經金句"; 7 | 8 | /* Class = "UILabel"; text = "UI Designer"; ObjectID = "9Lh-Lp-kJr"; */ 9 | "9Lh-Lp-kJr.text" = "用戶界面設計"; 10 | 11 | /* Class = "UILabel"; text = "Work Studio"; ObjectID = "PFB-y8-hGL"; */ 12 | "PFB-y8-hGL.text" = "工作室網站"; 13 | 14 | /* Class = "UILabel"; text = "Today"; ObjectID = "Xhi-6V-KTR"; */ 15 | "Xhi-6V-KTR.text" = "今日"; 16 | 17 | /* Class = "UILabel"; text = "API Supply"; ObjectID = "Xtv-oG-Tx4"; */ 18 | "Xtv-oG-Tx4.text" = "API 提供"; 19 | 20 | /* Class = "UILabel"; text = "Program developer"; ObjectID = "cuB-h6-5KN"; */ 21 | "cuB-h6-5KN.text" = "程式開發"; 22 | 23 | /* Class = "UILabel"; text = "Github Project"; ObjectID = "esh-v5-fFy"; */ 24 | "esh-v5-fFy.text" = "Github 項目"; 25 | 26 | "jPh-uh-47i.text" = "感謝"; 27 | 28 | "Cne-c1-nda.text" = "分享" 29 | -------------------------------------------------------------------------------- /genstrings.swift: -------------------------------------------------------------------------------- 1 | #!/usr/bin/swift 2 | 3 | import Foundation 4 | 5 | class GenStrings { 6 | 7 | var str = "Hello, playground" 8 | let fileManager = FileManager.default 9 | let acceptedFileExtensions = ["swift"] 10 | let excludedFolderNames = ["Carthage"] 11 | let excludedFileNames = ["genstrings.swift"] 12 | var regularExpresions = [String:NSRegularExpression]() 13 | 14 | let localizedRegex = "(?<=\")([^\"]*)(?=\".(localized|localizedFormat))|(?<=(Localized|NSLocalizedString)\\(\")([^\"]*?)(?=\")" 15 | 16 | enum GenstringsError: Error { 17 | case Error 18 | } 19 | 20 | // Performs the genstrings functionality 21 | func perform(path: String? = nil) { 22 | let directoryPath = path ?? fileManager.currentDirectoryPath 23 | let rootPath = URL(fileURLWithPath:directoryPath) 24 | let allFiles = fetchFilesInFolder(rootPath: rootPath) 25 | // We use a set to avoid duplicates 26 | var localizableStrings = Set() 27 | for filePath in allFiles { 28 | let stringsInFile = localizableStringsInFile(filePath: filePath) 29 | localizableStrings = localizableStrings.union(stringsInFile) 30 | } 31 | // We sort the strings 32 | let sortedStrings = localizableStrings.sorted(by: { $0 < $1 }) 33 | var processedStrings = String() 34 | for string in sortedStrings { 35 | processedStrings.append("\"\(string)\" = \"\(string)\"; \n") 36 | } 37 | print(processedStrings) 38 | } 39 | 40 | // Applies regex to a file at filePath. 41 | func localizableStringsInFile(filePath: URL) -> Set { 42 | do { 43 | let fileContentsData = try Data(contentsOf: filePath) 44 | guard let fileContentsString = NSString(data: fileContentsData, encoding: String.Encoding.utf8.rawValue) else { 45 | return Set() 46 | } 47 | let localizedStringsArray = try regexMatches(pattern: localizedRegex, string: fileContentsString as String).map({fileContentsString.substring(with: $0.range)}) 48 | return Set(localizedStringsArray) 49 | } catch {} 50 | return Set() 51 | } 52 | 53 | //MARK: Regex 54 | 55 | func regexWithPattern(pattern: String) throws -> NSRegularExpression { 56 | var safeRegex = regularExpresions 57 | if let regex = safeRegex[pattern] { 58 | return regex 59 | } 60 | else { 61 | do { 62 | let currentPattern: NSRegularExpression 63 | currentPattern = try NSRegularExpression(pattern: pattern, options:NSRegularExpression.Options.caseInsensitive) 64 | safeRegex.updateValue(currentPattern, forKey: pattern) 65 | regularExpresions = safeRegex 66 | return currentPattern 67 | } 68 | catch { 69 | throw GenstringsError.Error 70 | } 71 | } 72 | } 73 | 74 | func regexMatches(pattern: String, string: String) throws -> [NSTextCheckingResult] { 75 | do { 76 | let internalString = string 77 | let currentPattern = try regexWithPattern(pattern: pattern) 78 | // NSRegularExpression accepts Swift strings but works with NSString under the hood. Safer to bridge to NSString for taking range. 79 | let nsString = internalString as NSString 80 | let stringRange = NSMakeRange(0, nsString.length) 81 | let matches = currentPattern.matches(in: internalString, options: [], range: stringRange) 82 | return matches 83 | } 84 | catch { 85 | throw GenstringsError.Error 86 | } 87 | } 88 | 89 | //MARK: File manager 90 | 91 | func fetchFilesInFolder(rootPath: URL) -> [URL] { 92 | var files = [URL]() 93 | do { 94 | let directoryContents = try fileManager.contentsOfDirectory(at: rootPath as URL, includingPropertiesForKeys: [], options: .skipsHiddenFiles) 95 | for urlPath in directoryContents { 96 | let stringPath = urlPath.path 97 | let lastPathComponent = urlPath.lastPathComponent 98 | let pathExtension = urlPath.pathExtension 99 | var isDir : ObjCBool = false 100 | if fileManager.fileExists(atPath: stringPath, isDirectory:&isDir) { 101 | if isDir.boolValue { 102 | if !excludedFolderNames.contains(lastPathComponent) { 103 | let dirFiles = fetchFilesInFolder(rootPath: urlPath) 104 | files.append(contentsOf: dirFiles) 105 | } 106 | } else { 107 | if acceptedFileExtensions.contains(pathExtension) && !excludedFileNames.contains(lastPathComponent) { 108 | files.append(urlPath) 109 | } 110 | } 111 | } 112 | } 113 | } catch {} 114 | return files 115 | } 116 | 117 | } 118 | 119 | let genStrings = GenStrings() 120 | if CommandLine.arguments.count > 1 { 121 | let path = CommandLine.arguments[1] 122 | genStrings.perform(path: path) 123 | } else { 124 | genStrings.perform() 125 | } 126 | --------------------------------------------------------------------------------