Repository: wenghengcong/Coderpursue
Branch: master
Commit: f4693d0ca8d6
Files: 1889
Total size: 43.3 MB
Directory structure:
gitextract_4gg4ea93/
├── .gitignore
├── BeeFun/
│ ├── .swiftlint.yml
│ ├── BeeFun/
│ │ ├── AppDelegate.swift
│ │ ├── Assets.xcassets/
│ │ │ ├── AppIcon.appiconset/
│ │ │ │ └── Contents.json
│ │ │ ├── Contents.json
│ │ │ ├── Github/
│ │ │ │ ├── Contents.json
│ │ │ │ ├── git_fork.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── git_star.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ └── git_starred.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── Logo/
│ │ │ │ ├── Contents.json
│ │ │ │ ├── app_logo_90.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── github_signin_logo.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ └── login_tip.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── Octicon_15/
│ │ │ │ ├── Contents.json
│ │ │ │ ├── octicon_comment_15.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── octicon_fork_15.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── octicon_person_15.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── octicon_repo_15.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── octicon_star_15.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── octicon_state_15.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── octicon_time_15.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ └── octicons_code_15.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── Octicon_20/
│ │ │ │ ├── Contents.json
│ │ │ │ ├── octicon_filesize_20.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── octicon_fork_20.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── octicon_issue_20.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── octicon_language_20.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── octicon_private_20.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── octicon_star_20.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── octicon_watch_20.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ └── octicons_code_20.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── Octicon_25/
│ │ │ │ ├── Contents.json
│ │ │ │ ├── coticon_branch_25.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── coticon_home_25.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── coticon_repository_25.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── coticon_tag_25.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── octicon_commit_25.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── octicon_issue_25.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── octicon_loc_25.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── octicon_org_25.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── octicon_person_25.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── octicon_pull_request_25.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── octicon_push_25.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── octicon_time_25.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ └── octicons_code_25.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── Octicon_35/
│ │ │ │ ├── Contents.json
│ │ │ │ └── octicon_star_35.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── Octicon_Red/
│ │ │ │ ├── Contents.json
│ │ │ │ ├── octicon_fork_red_20.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── octicon_fork_red_25.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── octicon_star_red_20.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── octicon_watch_red_20.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ └── octicon_watch_red_25.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── ReposDetail/
│ │ │ │ ├── Contents.json
│ │ │ │ ├── repos_file.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── repos_fork.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── repos_homepage.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── repos_issue.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── repos_lan.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── repos_lock.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── repos_me.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── repos_star.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── repos_unlock.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ └── repos_watch.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── Tag/
│ │ │ │ ├── Contents.json
│ │ │ │ ├── set_tag_black.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── tag_pop.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ └── tags_add.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── UserDetail/
│ │ │ │ ├── Contents.json
│ │ │ │ ├── user_home.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── user_loc.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── user_org.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ └── user_time.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── arrow/
│ │ │ │ ├── Contents.json
│ │ │ │ ├── arrow_down.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── arrow_down_gray.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── arrow_left.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── arrow_left_gray.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── arrow_right.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── arrow_right_gray.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── arrow_up.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ └── arrow_up_gray.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── bar_icon/
│ │ │ │ ├── Contents.json
│ │ │ │ ├── nav_cancel.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── nav_funnel.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── nav_funnel_sel.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── nav_seg_nor.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── nav_seg_sel.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ └── nav_share.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── network/
│ │ │ │ ├── Contents.json
│ │ │ │ ├── empty_data.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── network_error_1.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ └── network_error_2.imageset/
│ │ │ │ └── Contents.json
│ │ │ └── octocat/
│ │ │ ├── Contents.json
│ │ │ └── benevocats.imageset/
│ │ │ └── Contents.json
│ │ ├── Base.lproj/
│ │ │ └── LaunchScreen.storyboard
│ │ ├── BeeFun-Bridging-Header.h
│ │ ├── BeeFun.entitlements
│ │ ├── Info.plist
│ │ ├── Model/
│ │ │ ├── BeeFunModel/
│ │ │ │ ├── BeeFunResponseModel.swift
│ │ │ │ ├── BeeFunTrendingResponseModel.swift
│ │ │ │ ├── GetAllTagResponse.swift
│ │ │ │ ├── GetReposResponse.swift
│ │ │ │ └── ObjTag.swift
│ │ │ ├── DataModel.swift
│ │ │ ├── Event/
│ │ │ │ ├── ObjAsset.swift
│ │ │ │ ├── ObjBranch.swift
│ │ │ │ ├── ObjComment.swift
│ │ │ │ ├── ObjCommit.swift
│ │ │ │ ├── ObjDeployment.swift
│ │ │ │ ├── ObjDeploymentPayload.swift
│ │ │ │ ├── ObjEvent.swift
│ │ │ │ ├── ObjEventPayload.swift
│ │ │ │ ├── ObjHref.swift
│ │ │ │ ├── ObjLinks.swift
│ │ │ │ ├── ObjMember.swift
│ │ │ │ ├── ObjNotification.swift
│ │ │ │ ├── ObjPage.swift
│ │ │ │ ├── ObjPullRequest.swift
│ │ │ │ ├── ObjRelease.swift
│ │ │ │ ├── ObjSearchCode.swift
│ │ │ │ └── ObjSubject.swift
│ │ │ ├── Issue/
│ │ │ │ ├── ObjIssue.swift
│ │ │ │ ├── ObjLabel.swift
│ │ │ │ └── ObjMilestone.swift
│ │ │ ├── Network/
│ │ │ │ ├── AppToken.swift
│ │ │ │ ├── NetFilter.swift
│ │ │ │ ├── ObjErropReponse.swift
│ │ │ │ ├── ObjError.swift
│ │ │ │ ├── ObjResponseHeader.swift
│ │ │ │ └── ObjResponser.swift
│ │ │ ├── ObjBase.swift
│ │ │ ├── Other/
│ │ │ │ └── ObjSettings.swift
│ │ │ ├── Repos/
│ │ │ │ ├── ObjGithubStarRepos.swift
│ │ │ │ ├── ObjRepos.swift
│ │ │ │ └── ObjReposSum.swift
│ │ │ ├── Trending/
│ │ │ │ └── ObjShowcase.swift
│ │ │ └── User/
│ │ │ ├── ObjEmail.swift
│ │ │ ├── ObjPermissions.swift
│ │ │ ├── ObjPlan.swift
│ │ │ ├── ObjUser.swift
│ │ │ └── ObjUserSum.swift
│ │ ├── Resources/
│ │ │ ├── Localizable/
│ │ │ │ ├── en.lproj/
│ │ │ │ │ └── Localizable.strings
│ │ │ │ └── zh-Hans.lproj/
│ │ │ │ └── Localizable.strings
│ │ │ ├── cert/
│ │ │ │ └── beefuntop.p12
│ │ │ └── plist/
│ │ │ ├── en.lproj/
│ │ │ │ ├── BFLanguage.plist
│ │ │ │ ├── BFPopularLanguage.plist
│ │ │ │ ├── BFSetting.plist
│ │ │ │ ├── CPCity.plist
│ │ │ │ ├── CPCountry.plist
│ │ │ │ └── CPFilterLanguage.plist
│ │ │ └── zh-Hans.lproj/
│ │ │ ├── BFLanguage.plist
│ │ │ ├── BFPopularLanguage.plist
│ │ │ ├── BFSetting.plist
│ │ │ ├── CPCity.plist
│ │ │ ├── CPCountry.plist
│ │ │ └── CPFilterLanguage.plist
│ │ ├── SystemManager/
│ │ │ ├── Manager/
│ │ │ │ ├── Oauth/
│ │ │ │ │ ├── OAuthGithubWebController.swift
│ │ │ │ │ └── OAuthManager.swift
│ │ │ │ ├── Push/
│ │ │ │ │ ├── BFMessageManager.swift
│ │ │ │ │ └── JPushManager.swift
│ │ │ │ ├── ThirdParty/
│ │ │ │ │ ├── AnswerManager.swift
│ │ │ │ │ ├── KPIManager.swift
│ │ │ │ │ ├── PayManager.swift
│ │ │ │ │ ├── PurchaseManager.swift
│ │ │ │ │ └── ShareManager.swift
│ │ │ │ ├── Utils/
│ │ │ │ │ ├── BFFeedbackManager.swift
│ │ │ │ │ ├── BFGlobalHelper.swift
│ │ │ │ │ ├── BFLanunchManager.swift
│ │ │ │ │ ├── BFMonitor+Handle.swift
│ │ │ │ │ ├── BFMonitor.swift
│ │ │ │ │ ├── BFTabbarManager.swift
│ │ │ │ │ ├── BFTimeHelper.swift
│ │ │ │ │ ├── JumpManager.swift
│ │ │ │ │ ├── PlistHelper.swift
│ │ │ │ │ └── UserManager.swift
│ │ │ │ ├── View/
│ │ │ │ │ ├── MJRefreshManager.swift
│ │ │ │ │ └── YYTextManager.swift
│ │ │ │ └── iCloud/
│ │ │ │ ├── BFPathManager.swift
│ │ │ │ └── BFZipManager.swift
│ │ │ ├── Network/
│ │ │ │ ├── BFNetworkManager.swift
│ │ │ │ ├── BFStatusCode.swift
│ │ │ │ ├── BeeFunAPI.swift
│ │ │ │ ├── BeeFunDBManager.swift
│ │ │ │ ├── EventAPI.swift
│ │ │ │ ├── GitHubAPI.swift
│ │ │ │ ├── IdentityAndTrust.swift
│ │ │ │ ├── IssueAPI.swift
│ │ │ │ ├── LanguageManager.swift
│ │ │ │ ├── Response+ObjectMapper.swift
│ │ │ │ ├── SVGProcessor.swift
│ │ │ │ ├── SearchAPI.swift
│ │ │ │ └── TrendingManager.swift
│ │ │ ├── ProConfig/
│ │ │ │ ├── BFCommonString.swift
│ │ │ │ ├── BFNotificationName.swift
│ │ │ │ ├── BFPlistResourcesKey.swift
│ │ │ │ ├── BFStyleGuide.swift
│ │ │ │ ├── BFThirdLibKey.swift
│ │ │ │ ├── BFUserDefaultManager.swift
│ │ │ │ ├── UIColor+Project.swift
│ │ │ │ └── UIFont+Project.swift
│ │ │ └── Storage/
│ │ │ ├── BFDocument.swift
│ │ │ ├── Manager/
│ │ │ │ ├── SQLConnection.swift
│ │ │ │ ├── SQLHelper.swift
│ │ │ │ ├── SQLLists.swift
│ │ │ │ ├── SQLManager.swift
│ │ │ │ ├── SQLStar+Delete.swift
│ │ │ │ ├── SQLStar+Update.swift
│ │ │ │ ├── SQLStars+Base.swift
│ │ │ │ ├── SQLStars+Find.swift
│ │ │ │ ├── SQLStars.swift
│ │ │ │ └── SQLTags.swift
│ │ │ └── Model/
│ │ │ └── ObjList.swift
│ │ ├── ThirdParty/
│ │ │ ├── MobSDK/
│ │ │ │ ├── Required/
│ │ │ │ │ └── MOBFoundation.framework/
│ │ │ │ │ ├── Headers/
│ │ │ │ │ │ ├── IMOBBaseUser.h
│ │ │ │ │ │ ├── IMOBFDataModel.h
│ │ │ │ │ │ ├── IMOBFPlugin.h
│ │ │ │ │ │ ├── MOBFApplication.h
│ │ │ │ │ │ ├── MOBFColor.h
│ │ │ │ │ │ ├── MOBFData.h
│ │ │ │ │ │ ├── MOBFDataModel.h
│ │ │ │ │ │ ├── MOBFDataService.h
│ │ │ │ │ │ ├── MOBFDate.h
│ │ │ │ │ │ ├── MOBFDebug.h
│ │ │ │ │ │ ├── MOBFDevice.h
│ │ │ │ │ │ ├── MOBFHttpPostedFile.h
│ │ │ │ │ │ ├── MOBFHttpService.h
│ │ │ │ │ │ ├── MOBFImage.h
│ │ │ │ │ │ ├── MOBFImageCachePolicy.h
│ │ │ │ │ │ ├── MOBFImageGetter.h
│ │ │ │ │ │ ├── MOBFImageObserver.h
│ │ │ │ │ │ ├── MOBFImageServiceTypeDef.h
│ │ │ │ │ │ ├── MOBFJSContext.h
│ │ │ │ │ │ ├── MOBFJSMethod.h
│ │ │ │ │ │ ├── MOBFJSTypeDefine.h
│ │ │ │ │ │ ├── MOBFJson.h
│ │ │ │ │ │ ├── MOBFLogService.h
│ │ │ │ │ │ ├── MOBFNotificationCenter.h
│ │ │ │ │ │ ├── MOBFNumber.h
│ │ │ │ │ │ ├── MOBFOAuthService.h
│ │ │ │ │ │ ├── MOBFPluginManager.h
│ │ │ │ │ │ ├── MOBFRSAHelper.h
│ │ │ │ │ │ ├── MOBFRSAKey.h
│ │ │ │ │ │ ├── MOBFRegex.h
│ │ │ │ │ │ ├── MOBFString.h
│ │ │ │ │ │ ├── MOBFUser.h
│ │ │ │ │ │ ├── MOBFViewController.h
│ │ │ │ │ │ ├── MOBFXml.h
│ │ │ │ │ │ ├── MOBFXmlNode.h
│ │ │ │ │ │ ├── MOBFoundation.h
│ │ │ │ │ │ └── MobSDK.h
│ │ │ │ │ ├── Info.plist
│ │ │ │ │ ├── MOBFoundation
│ │ │ │ │ ├── en.lproj/
│ │ │ │ │ │ └── InfoPlist.strings
│ │ │ │ │ └── readme
│ │ │ │ └── ShareSDK/
│ │ │ │ ├── ShareSDK.framework/
│ │ │ │ │ ├── Headers/
│ │ │ │ │ │ ├── IMOBFContentEntity.h
│ │ │ │ │ │ ├── IMOBFShareComponent.h
│ │ │ │ │ │ ├── IMOBFSocialUser.h
│ │ │ │ │ │ ├── ISSDKAuthView.h
│ │ │ │ │ │ ├── NSMutableDictionary+SSDKInit.h
│ │ │ │ │ │ ├── NSMutableDictionary+SSDKShare.h
│ │ │ │ │ │ ├── SSDKAuthViewStyle.h
│ │ │ │ │ │ ├── SSDKContentEntity.h
│ │ │ │ │ │ ├── SSDKCredential.h
│ │ │ │ │ │ ├── SSDKData.h
│ │ │ │ │ │ ├── SSDKHttpServiceModel.h
│ │ │ │ │ │ ├── SSDKImage.h
│ │ │ │ │ │ ├── SSDKPlatform.h
│ │ │ │ │ │ ├── SSDKTypeDefine.h
│ │ │ │ │ │ ├── SSDKUser.h
│ │ │ │ │ │ ├── SSDKUserQueryConditional.h
│ │ │ │ │ │ ├── SSDKVideoUploadCenter.h
│ │ │ │ │ │ ├── ShareSDK+Base.h
│ │ │ │ │ │ └── ShareSDK.h
│ │ │ │ │ ├── Info.plist
│ │ │ │ │ └── ShareSDK
│ │ │ │ └── Support/
│ │ │ │ ├── Optional/
│ │ │ │ │ ├── ShareSDKConfigFile.bundle/
│ │ │ │ │ │ ├── Map.plist
│ │ │ │ │ │ ├── ShareContent.xml
│ │ │ │ │ │ └── ShareSDK.xml
│ │ │ │ │ ├── ShareSDKConfigFile.framework/
│ │ │ │ │ │ ├── Headers/
│ │ │ │ │ │ │ └── ShareSDK+XML.h
│ │ │ │ │ │ ├── Info.plist
│ │ │ │ │ │ └── ShareSDKConfigFile
│ │ │ │ │ ├── ShareSDKExtension.framework/
│ │ │ │ │ │ ├── Headers/
│ │ │ │ │ │ │ ├── SSDKFriendsPaging.h
│ │ │ │ │ │ │ ├── SSEBaseUser.h
│ │ │ │ │ │ │ ├── SSEShareHelper.h
│ │ │ │ │ │ │ ├── SSEThirdPartyLoginHelper.h
│ │ │ │ │ │ │ ├── SSETypeDefine.h
│ │ │ │ │ │ │ └── ShareSDK+Extension.h
│ │ │ │ │ │ ├── Info.plist
│ │ │ │ │ │ └── ShareSDKExtension
│ │ │ │ │ ├── ShareSDKUI.bundle/
│ │ │ │ │ │ ├── Base.lproj/
│ │ │ │ │ │ │ └── ShareSDKUI_Localizable.strings
│ │ │ │ │ │ ├── en.lproj/
│ │ │ │ │ │ │ └── ShareSDKUI_Localizable.strings
│ │ │ │ │ │ └── zh-Hans.lproj/
│ │ │ │ │ │ └── ShareSDKUI_Localizable.strings
│ │ │ │ │ └── ShareSDKUI.framework/
│ │ │ │ │ ├── Headers/
│ │ │ │ │ │ ├── SSUIEditorViewStyle.h
│ │ │ │ │ │ ├── SSUIShareActionSheetController.h
│ │ │ │ │ │ ├── SSUIShareActionSheetCustomItem.h
│ │ │ │ │ │ ├── SSUIShareActionSheetItem.h
│ │ │ │ │ │ ├── SSUIShareActionSheetStyle.h
│ │ │ │ │ │ ├── SSUIShareContentEditorViewController.h
│ │ │ │ │ │ ├── SSUITypeDef.h
│ │ │ │ │ │ ├── ShareSDK+SSUI.h
│ │ │ │ │ │ └── ShareSDKUI.h
│ │ │ │ │ ├── Info.plist
│ │ │ │ │ └── ShareSDKUI
│ │ │ │ ├── PlatformConnector/
│ │ │ │ │ ├── FacebookConnector.framework/
│ │ │ │ │ │ ├── FacebookConnector
│ │ │ │ │ │ ├── Headers/
│ │ │ │ │ │ │ └── FacebookConnector.h
│ │ │ │ │ │ └── Info.plist
│ │ │ │ │ ├── MailConnector.framework/
│ │ │ │ │ │ ├── Headers/
│ │ │ │ │ │ │ └── SSDKMailViewControllerStyle.h
│ │ │ │ │ │ ├── Info.plist
│ │ │ │ │ │ └── MailConnector
│ │ │ │ │ ├── QQConnector.framework/
│ │ │ │ │ │ ├── Headers/
│ │ │ │ │ │ │ └── QQConnector.h
│ │ │ │ │ │ ├── Info.plist
│ │ │ │ │ │ └── QQConnector
│ │ │ │ │ ├── SinaWeiboConnector.framework/
│ │ │ │ │ │ ├── Headers/
│ │ │ │ │ │ │ └── SinaWeiboConnector.h
│ │ │ │ │ │ ├── Info.plist
│ │ │ │ │ │ └── SinaWeiboConnector
│ │ │ │ │ ├── TwitterConnector.framework/
│ │ │ │ │ │ ├── Info.plist
│ │ │ │ │ │ └── TwitterConnector
│ │ │ │ │ └── WechatConnector.framework/
│ │ │ │ │ ├── Headers/
│ │ │ │ │ │ └── WeChatConnector.h
│ │ │ │ │ ├── Info.plist
│ │ │ │ │ └── WechatConnector
│ │ │ │ ├── PlatformSDK/
│ │ │ │ │ ├── QQSDK/
│ │ │ │ │ │ ├── TencentOpenAPI.framework/
│ │ │ │ │ │ │ ├── Headers/
│ │ │ │ │ │ │ │ ├── QQApiInterface.h
│ │ │ │ │ │ │ │ ├── QQApiInterfaceObject.h
│ │ │ │ │ │ │ │ ├── TencentApiInterface.h
│ │ │ │ │ │ │ │ ├── TencentMessageObject.h
│ │ │ │ │ │ │ │ ├── TencentOAuth.h
│ │ │ │ │ │ │ │ ├── TencentOAuthObject.h
│ │ │ │ │ │ │ │ └── sdkdef.h
│ │ │ │ │ │ │ ├── Resources/
│ │ │ │ │ │ │ │ ├── ios_open_sdk_3.1.0.3_iphone
│ │ │ │ │ │ │ │ ├── ios_open_sdk_3.1.3.1_iphone
│ │ │ │ │ │ │ │ └── ios_open_sdk_3.2.1.473_iphone_release
│ │ │ │ │ │ │ └── TencentOpenAPI
│ │ │ │ │ │ └── TencentOpenApi_IOS_Bundle.bundle/
│ │ │ │ │ │ ├── Info.plist
│ │ │ │ │ │ └── local.html
│ │ │ │ │ ├── SinaWeiboSDK/
│ │ │ │ │ │ ├── WBHttpRequest+WeiboToken.h
│ │ │ │ │ │ ├── WBHttpRequest.h
│ │ │ │ │ │ ├── WeiboSDK+Statistics.h
│ │ │ │ │ │ ├── WeiboSDK.bundle/
│ │ │ │ │ │ │ └── others/
│ │ │ │ │ │ │ └── mfp.cer
│ │ │ │ │ │ ├── WeiboSDK.h
│ │ │ │ │ │ └── libWeiboSDK.a
│ │ │ │ │ └── WeChatSDK/
│ │ │ │ │ ├── README.txt
│ │ │ │ │ ├── WXApi.h
│ │ │ │ │ ├── WXApiObject.h
│ │ │ │ │ ├── WechatAuthSDK.h
│ │ │ │ │ └── libWeChatSDK.a
│ │ │ │ └── Required/
│ │ │ │ ├── ShareSDK.bundle/
│ │ │ │ │ ├── Base.lproj/
│ │ │ │ │ │ ├── ShareSDK.strings
│ │ │ │ │ │ └── country.plist
│ │ │ │ │ ├── ScriptCore/
│ │ │ │ │ │ ├── NativeExt.js
│ │ │ │ │ │ ├── ShareSDK.js
│ │ │ │ │ │ └── platforms/
│ │ │ │ │ │ ├── Facebook.js
│ │ │ │ │ │ ├── Mail.js
│ │ │ │ │ │ ├── QQ.js
│ │ │ │ │ │ ├── SinaWeibo.js
│ │ │ │ │ │ ├── Twitter.js
│ │ │ │ │ │ └── WeChat.js
│ │ │ │ │ ├── en.lproj/
│ │ │ │ │ │ ├── ShareSDK.strings
│ │ │ │ │ │ └── country.plist
│ │ │ │ │ └── zh-Hans.lproj/
│ │ │ │ │ ├── ShareSDK.strings
│ │ │ │ │ └── country.plist
│ │ │ │ └── ShareSDKConnector.framework/
│ │ │ │ ├── Headers/
│ │ │ │ │ └── ShareSDKConnector.h
│ │ │ │ ├── Info.plist
│ │ │ │ └── ShareSDKConnector
│ │ │ └── UMMobClick.framework/
│ │ │ └── Versions/
│ │ │ └── A/
│ │ │ ├── Headers/
│ │ │ │ ├── MobClick.h
│ │ │ │ ├── MobClickGameAnalytics.h
│ │ │ │ └── MobClickSocialAnalytics.h
│ │ │ └── UMMobClick
│ │ ├── ToolKit/
│ │ │ └── JSToolKit/
│ │ │ ├── JSBridge/
│ │ │ │ ├── JSHMSegmentedBridge.swift
│ │ │ │ ├── JSMBHUDBridge.swift
│ │ │ │ ├── JSMBProgressHud.xcassets/
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ ├── jsmb_error.imageset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── jsmb_info.imageset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ └── jsmb_success.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── JSSQLiteSwiftBridge.swift
│ │ │ │ ├── JSSVPHUDBridge.swift
│ │ │ │ └── JSSwiftyBeaver.swift
│ │ │ ├── JSFoundation/
│ │ │ │ ├── Array+Extension.swift
│ │ │ │ ├── Bundle+Extension.swift
│ │ │ │ ├── Character+Extension.swift
│ │ │ │ ├── Data+Extension.swift
│ │ │ │ ├── Dictionary+Extension.swift
│ │ │ │ ├── DispatchQueue+Extension.swift
│ │ │ │ ├── JSApp.swift
│ │ │ │ ├── JSAssociatedObject.swift
│ │ │ │ ├── JSClass.swift
│ │ │ │ ├── JSDebug.swift
│ │ │ │ ├── JSFoundation.swift
│ │ │ │ ├── JSFoundationGlobal.swift
│ │ │ │ ├── JSGCD.swift
│ │ │ │ ├── JSLanguage.swift
│ │ │ │ ├── JSObject.swift
│ │ │ │ ├── JSUtilis.swift
│ │ │ │ ├── NSAttributedString+Size.swift
│ │ │ │ ├── NSObject+Extension.swift
│ │ │ │ ├── NSString+Size.swift
│ │ │ │ ├── README.md
│ │ │ │ └── String+Extension.swift
│ │ │ ├── JSModel/
│ │ │ │ └── README.md
│ │ │ ├── JSStyleGuide/
│ │ │ │ ├── JSCommentStyleGudie.swift
│ │ │ │ └── README.md
│ │ │ ├── JSUI/
│ │ │ │ ├── JSSearchBar.swift
│ │ │ │ └── TableViewCell/
│ │ │ │ ├── JSBaseCell.swift
│ │ │ │ ├── JSCellDefine.swift
│ │ │ │ ├── JSCellFactory.swift
│ │ │ │ ├── JSCellModel+Init.swift
│ │ │ │ ├── JSCellModel.swift
│ │ │ │ ├── JSCellModelFactory.swift
│ │ │ │ ├── JSCellProtocol.swift
│ │ │ │ ├── JSCellUtils.swift
│ │ │ │ ├── JSEditCell.swift
│ │ │ │ ├── JSEditCell.xib
│ │ │ │ ├── JSImageCell.swift
│ │ │ │ ├── JSImageCell.xib
│ │ │ │ ├── JSLabelCell.swift
│ │ │ │ ├── JSLabelCell.xib
│ │ │ │ ├── JSSelectedCell.swift
│ │ │ │ ├── JSSelectedCell.xib
│ │ │ │ ├── JSSubLabelCell.swift
│ │ │ │ ├── JSSubLabelCell.xib
│ │ │ │ ├── JSSwitchCell.swift
│ │ │ │ ├── JSSwitchCell.xib
│ │ │ │ ├── README.md
│ │ │ │ └── TableViewCell.xcassets/
│ │ │ │ ├── Contents.json
│ │ │ │ └── arrow_set_right.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── JSUIKit/
│ │ │ │ ├── CGRect+Extension.swift
│ │ │ │ ├── JSApperence.swift
│ │ │ │ ├── JSApplication.swift
│ │ │ │ ├── JSCollectionViewCell.swift
│ │ │ │ ├── JSDevice.swift
│ │ │ │ ├── JSFileManager.swift
│ │ │ │ ├── JSNavigationController.swift
│ │ │ │ ├── JSTabBarController.swift
│ │ │ │ ├── JSUIGlobal.swift
│ │ │ │ ├── JSUIKit.swift
│ │ │ │ ├── JSViewController.swift
│ │ │ │ ├── NSMutableAttributedString.swift
│ │ │ │ ├── README.md
│ │ │ │ ├── UIAlertController+Extension.swift
│ │ │ │ ├── UIColor+Extension.swift
│ │ │ │ ├── UIDevice+Device.swift
│ │ │ │ ├── UIImage+Extension.swift
│ │ │ │ ├── UILabel+Extension.swift
│ │ │ │ ├── UILabel+Size.swift
│ │ │ │ ├── UINavigationController+Pop.swift
│ │ │ │ ├── UIScreen+Size.swift
│ │ │ │ ├── UIStoryboard+Extension.swift
│ │ │ │ ├── UITextField+Extension.swift
│ │ │ │ ├── UIView+Draw.swift
│ │ │ │ └── UIView+Nib.swift
│ │ │ └── README.md
│ │ ├── View/
│ │ │ ├── Base/
│ │ │ │ ├── Controller/
│ │ │ │ │ ├── BFBaseTabBarController.swift
│ │ │ │ │ └── BFWebViewController.swift
│ │ │ │ └── ViewCell/
│ │ │ │ ├── BFBaseCell.swift
│ │ │ │ └── BFSwipeCell.swift
│ │ │ ├── BaseViewController/
│ │ │ │ ├── BFBaseViewController+Answer.swift
│ │ │ │ ├── BFBaseViewController+Empty.swift
│ │ │ │ ├── BFBaseViewController+Login.swift
│ │ │ │ ├── BFBaseViewController+Nav.swift
│ │ │ │ ├── BFBaseViewController+Noti.swift
│ │ │ │ ├── BFBaseViewController+Refresh.swift
│ │ │ │ ├── BFBaseViewController+Reload.swift
│ │ │ │ ├── BFBaseViewController+TableView.swift
│ │ │ │ └── BFBaseViewController.swift
│ │ │ ├── Common/
│ │ │ │ ├── BFEmptyDataCell.swift
│ │ │ │ └── BFPlaceHolderView.swift
│ │ │ ├── Event/
│ │ │ │ ├── Event.xcassets/
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ ├── event_CommitCommentEvent.imageset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── event_CreateEvent.imageset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── event_DeleteEvent.imageset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── event_ForkEvent.imageset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── event_GollumEvent.imageset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── event_IssueCommentEvent.imageset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── event_IssuesEvent_closed.imageset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── event_IssuesEvent_opened.imageset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── event_MemberEvent.imageset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── event_PullRequestEvent.imageset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── event_PullRequestReviewCommentEvent.imageset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── event_PushEvent.imageset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── event_ReleaseEvent.imageset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── event_WatchEvent.imageset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── event_commit_icon.imageset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ └── git-pull-request_256.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── EventCell/
│ │ │ │ │ ├── BFEventBaseCell.swift
│ │ │ │ │ ├── BFEventCell.swift
│ │ │ │ │ ├── BFEventConstants.swift
│ │ │ │ │ ├── BFEventLayout.swift
│ │ │ │ │ └── BFEventParase.swift
│ │ │ │ └── NotUse/
│ │ │ │ ├── BFEventCommitView.swift
│ │ │ │ ├── BFEventPRDetailView.swift
│ │ │ │ ├── BFEventTextView.swift
│ │ │ │ ├── BFEventTimeView.swift
│ │ │ │ ├── BFEventTitleView.swift
│ │ │ │ ├── BFEventView.swift
│ │ │ │ └── BFImageViewAttachment.swift
│ │ │ ├── Gist/
│ │ │ │ └── BFGistViewController.swift
│ │ │ ├── Issue/
│ │ │ │ └── ViewCell/
│ │ │ │ ├── CPMesIssueCell.swift
│ │ │ │ └── CPMesIssueCell.xib
│ │ │ ├── Message/
│ │ │ │ ├── BFMessageConentView.swift
│ │ │ │ ├── BFMessageController.swift
│ │ │ │ └── InsetNavigationBar.swift
│ │ │ ├── NewTrending/
│ │ │ │ └── BFNewTrendingController.swift
│ │ │ ├── Notification/
│ │ │ │ └── ViewCell/
│ │ │ │ ├── CPMesNotificationCell.swift
│ │ │ │ └── CPMesNotificationCell.xib
│ │ │ ├── Profile/
│ │ │ │ ├── BFProfileController+Data.swift
│ │ │ │ ├── BFProfileController.swift
│ │ │ │ ├── Feedback/
│ │ │ │ │ ├── BFFeedbackController.swift
│ │ │ │ │ └── BFFeedbackIssueController.swift
│ │ │ │ ├── Funny/
│ │ │ │ │ ├── BFFunnyLabViewController.swift
│ │ │ │ │ └── CPFunnyAwardViewController.swift
│ │ │ │ ├── ProfileModule.xcassets/
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ └── Profile/
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ ├── default.imageset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── edit_profile.imageset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── lab_award_50.imageset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── profile_bg.imageset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ └── settingsicon/
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ ├── set_about.imageset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── set_feedback.imageset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── set_list.imageset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── set_money.imageset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── set_rate.imageset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── set_settings.imageset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── set_settings_white.imageset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── set_share.imageset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── set_sync.imageset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── set_tag.imageset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ └── set_watched.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Setting/
│ │ │ │ │ ├── BFAboutViewController.swift
│ │ │ │ │ ├── BFSettingsViewController.swift
│ │ │ │ │ ├── en.lproj/
│ │ │ │ │ │ └── BFAbout.plist
│ │ │ │ │ └── zh-Hans.lproj/
│ │ │ │ │ └── BFAbout.plist
│ │ │ │ ├── StarTag/
│ │ │ │ │ ├── BFAddNewTagsController.swift
│ │ │ │ │ ├── BFListsManageController.swift
│ │ │ │ │ ├── BFReposSyncController.swift
│ │ │ │ │ ├── BFTagsManageController.swift
│ │ │ │ │ ├── en.lproj/
│ │ │ │ │ │ └── BFRepoSync.plist
│ │ │ │ │ └── zh-Hans.lproj/
│ │ │ │ │ └── BFRepoSync.plist
│ │ │ │ ├── User/
│ │ │ │ │ └── BFEditUserController.swift
│ │ │ │ ├── ViewCell/
│ │ │ │ │ └── CPPersonCardView.swift
│ │ │ │ ├── en.lproj/
│ │ │ │ │ └── BFProfile.plist
│ │ │ │ └── zh-Hans.lproj/
│ │ │ │ └── BFProfile.plist
│ │ │ ├── Repository/
│ │ │ │ ├── BFRepoDetailController+Data.swift
│ │ │ │ ├── BFRepoDetailController.swift
│ │ │ │ ├── BFRepoListController.swift
│ │ │ │ ├── RepositoryCell/
│ │ │ │ │ ├── BFRepositoryTypeFourCell.swift
│ │ │ │ │ ├── BFRepositoryTypeFourCell.xib
│ │ │ │ │ ├── BFRepositoryTypeOneCell.swift
│ │ │ │ │ ├── BFRepositoryTypeOneCell.xib
│ │ │ │ │ ├── BFRepositoryTypeSecCell.swift
│ │ │ │ │ ├── BFRepositoryTypeSecCell.xib
│ │ │ │ │ ├── BFRepositoryTypeThirdCell.swift
│ │ │ │ │ └── BFRepositoryTypeThirdCell.xib
│ │ │ │ └── View/
│ │ │ │ ├── CPReposInfoView.swift
│ │ │ │ └── CPReposPosterView.swift
│ │ │ ├── Search/
│ │ │ │ ├── ResultResponse/
│ │ │ │ │ ├── SEResponseCode.swift
│ │ │ │ │ ├── SEResponseCommits.swift
│ │ │ │ │ ├── SEResponseIssues.swift
│ │ │ │ │ ├── SEResponseRepos.swift
│ │ │ │ │ ├── SEResponseUsers.swift
│ │ │ │ │ └── SEResponseWikis.swift
│ │ │ │ ├── SESearchResultContentView.swift
│ │ │ │ ├── SESearchResultController+Action.swift
│ │ │ │ ├── SESearchResultController+View.swift
│ │ │ │ ├── SESearchResultController.swift
│ │ │ │ ├── SESearchViewController+View.swift
│ │ │ │ ├── SESearchViewController.swift
│ │ │ │ ├── SearchModel/
│ │ │ │ │ ├── SESearchBaseModel.swift
│ │ │ │ │ ├── SESearchCodeModel.swift
│ │ │ │ │ ├── SESearchCommitModel.swift
│ │ │ │ │ ├── SESearchIssueModel.swift
│ │ │ │ │ ├── SESearchRepoModel.swift
│ │ │ │ │ ├── SESearchUserModel.swift
│ │ │ │ │ └── SESearchWikiModel.swift
│ │ │ │ ├── SearchModule.xcassets/
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ ├── se_down_triangle.imageset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── se_down_triangle_sel.imageset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── se_lang_switch.imageset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── se_up_triangle.imageset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ └── se_up_triangle_sel.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ └── ViewCell/
│ │ │ │ ├── SESearchCodeCell.swift
│ │ │ │ └── SESearchOrderButton.swift
│ │ │ ├── Stars/
│ │ │ │ ├── BFStarContentView.swift
│ │ │ │ ├── BFStarController+Data.swift
│ │ │ │ ├── BFStarController+Noti.swift
│ │ │ │ ├── BFStarController+View.swift
│ │ │ │ ├── BFStarController.swift
│ │ │ │ └── ViewCell/
│ │ │ │ ├── BFStarViewModel.swift
│ │ │ │ └── JSSegmentControl.swift
│ │ │ ├── Tag/
│ │ │ │ ├── BFUpdateTagsController.swift
│ │ │ │ ├── ListView/
│ │ │ │ │ └── ListScrollView.swift
│ │ │ │ └── TagView/
│ │ │ │ ├── AddTagsCell.swift
│ │ │ │ ├── AddTagsCell.xib
│ │ │ │ ├── JSScrollContentView.swift
│ │ │ │ ├── JSTagBar.swift
│ │ │ │ ├── JSTagItem.swift
│ │ │ │ └── ShowTagsCell.swift
│ │ │ ├── Trending/
│ │ │ │ ├── BFShowcaseDetailController.swift
│ │ │ │ ├── BFTrendingController+Data.swift
│ │ │ │ ├── BFTrendingController+View.swift
│ │ │ │ ├── BFTrendingController.swift
│ │ │ │ ├── Model/
│ │ │ │ │ ├── BFExploreNavigationModel.swift
│ │ │ │ │ ├── BFGihubTrendingTimeEnum.swift
│ │ │ │ │ ├── BFGithubTrendingRequsetModel.swift
│ │ │ │ │ ├── BFGithubTrendingUserModel.swift
│ │ │ │ │ └── BFGithubTrengingModel.swift
│ │ │ │ └── ViewCell/
│ │ │ │ ├── BFShowcaseHeaderView.swift
│ │ │ │ ├── BFShowcaseHeaderView.xib
│ │ │ │ ├── BFTrendingSearchBar.swift
│ │ │ │ ├── BFTrendingShowcaseCell.swift
│ │ │ │ ├── BFTrendingShowcaseCell.xib
│ │ │ │ ├── CPFilterTableView.swift
│ │ │ │ └── InfoButton.swift
│ │ │ └── User/
│ │ │ ├── BFUserDetailController.swift
│ │ │ ├── BFUserListController.swift
│ │ │ ├── UserCell/
│ │ │ │ ├── BFUserTypeOneCell.swift
│ │ │ │ ├── BFUserTypeOneCell.xib
│ │ │ │ ├── BFUserTypeSecCell.swift
│ │ │ │ ├── BFUserTypeSecCell.xib
│ │ │ │ ├── BFUserTypeThirdCell.swift
│ │ │ │ └── BFUserTypeThirdCell.xib
│ │ │ └── View/
│ │ │ └── CPDeveloperInfoView.swift
│ │ ├── en.lproj/
│ │ │ └── Main.storyboard
│ │ └── zh-Hans.lproj/
│ │ └── LaunchScreen.strings
│ ├── BeeFun.xcodeproj/
│ │ ├── project.pbxproj
│ │ └── project.xcworkspace/
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata/
│ │ └── IDEWorkspaceChecks.plist
│ ├── BeeFun.xcworkspace/
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata/
│ │ └── IDEWorkspaceChecks.plist
│ ├── Podfile
│ ├── XcodeConfig/
│ │ ├── Adhoc.xcconfig
│ │ ├── Common.xcconfig
│ │ ├── Debug.xcconfig
│ │ └── Release.xcconfig
│ ├── fastlane/
│ │ ├── Appfile
│ │ ├── Deliverfile
│ │ ├── Fastfile
│ │ ├── Gymfile
│ │ ├── Matchfile
│ │ ├── README.md
│ │ ├── metadata/
│ │ │ ├── copyright.txt
│ │ │ ├── en-US/
│ │ │ │ ├── description.txt
│ │ │ │ ├── keywords.txt
│ │ │ │ ├── marketing_url.txt
│ │ │ │ ├── name.txt
│ │ │ │ ├── privacy_url.txt
│ │ │ │ ├── release_notes.txt
│ │ │ │ └── support_url.txt
│ │ │ ├── primary_category.txt
│ │ │ ├── primary_first_sub_category.txt
│ │ │ ├── primary_second_sub_category.txt
│ │ │ ├── review_information/
│ │ │ │ ├── demo_password.txt
│ │ │ │ ├── demo_user.txt
│ │ │ │ ├── email_address.txt
│ │ │ │ ├── first_name.txt
│ │ │ │ ├── last_name.txt
│ │ │ │ ├── notes.txt
│ │ │ │ └── phone_number.txt
│ │ │ ├── secondary_category.txt
│ │ │ ├── secondary_first_sub_category.txt
│ │ │ ├── secondary_second_sub_category.txt
│ │ │ └── zh-Hans/
│ │ │ ├── description.txt
│ │ │ ├── keywords.txt
│ │ │ ├── marketing_url.txt
│ │ │ ├── name.txt
│ │ │ ├── privacy_url.txt
│ │ │ ├── release_notes.txt
│ │ │ └── support_url.txt
│ │ ├── report.xml
│ │ └── screenshots/
│ │ └── README.txt
│ └── infer-out/
│ ├── attributes/
│ │ ├── CALayer_addSublayer:{instance}.48a93d8cb92e1bcef68cee21e613cf95.attr
│ │ ├── CALayer_bounds{instance}.05a14cdc597280814edca2dc485a0fee.attr
│ │ ├── CALayer_init{instance}.00dc135da186f2a34f3805a805a35a91.attr
│ │ ├── CALayer_insertSublayer:atIndex:{instance}.d6358edc3f8395b7e0c7b0a036eb8be6.attr
│ │ ├── CALayer_layer{class}.e985d540f7ae90b6ac7db0f6e58a6e1c.attr
│ │ ├── CALayer_removeFromSuperlayer{instance}.89c0bbb57ec5874e41c61589026c3064.attr
│ │ ├── CALayer_setActions:{instance}.d9f27685491cc59c13fb6a9dcb636009.attr
│ │ ├── CALayer_setBackgroundColor:{instance}.d6ac9338643452b51ac7443f3f1e033c.attr
│ │ ├── CALayer_setBorderColor:{instance}.69ba515004abcd632bce6892427cdfd7.attr
│ │ ├── CALayer_setBorderWidth:{instance}.f3d42ffd8eacc287f4d7188094aa842c.attr
│ │ ├── CALayer_setContents:{instance}.1656da7412d61474a43157b587ebacc2.attr
│ │ ├── CALayer_setContentsScale:{instance}.403e7c4eeebcee89536f58a4663472e8.attr
│ │ ├── CALayer_setFrame:{instance}.3b9c927a1c2d285dcedd624d4fb04423.attr
│ │ ├── CALayer_setMask:{instance}.82d6656c31e620e2a467bf15478f2dd2.attr
│ │ ├── CALayer_setOpacity:{instance}.55609ad7528b3c373bb2afdd25d5cdf9.attr
│ │ ├── CALayer_setSublayers:{instance}.df75a759e0805a82418e67dd6a512c8a.attr
│ │ ├── CALayer_superlayer{instance}.c6293744268bcadda0487f1157270c19.attr
│ │ ├── CAMediaTimingFunction_functionWithName:{class}.19cd6945dc10c4f6edcd922534788f9c.attr
│ │ ├── CAShapeLayer_setPath:{instance}.dbb3dfb480244dfb244f7a1e15979262.attr
│ │ ├── CATextLayer_setAlignmentMode:{instance}.4f6de10f0f042a4e044697b905bb1304.attr
│ │ ├── CATextLayer_setString:{instance}.0d04c35a3e3fc33a500758196865dcdf.attr
│ │ ├── CATextLayer_setTruncationMode:{instance}.82a2c9c1fef34ee2347ef1c4761bfea5.attr
│ │ ├── CATransaction_begin{class}.851bef7307bff524fb4433a42fcd320c.attr
│ │ ├── CATransaction_commit{class}.3f84648cb6b0d16dc28e5966585af788.attr
│ │ ├── CATransaction_setAnimationDuration:{class}.588d842f04f47f548d4a966b27d20e38.attr
│ │ ├── CATransaction_setAnimationTimingFunction:{class}.c82194a8439cb4700a25c3fc64b7902c.attr
│ │ ├── CGAffineTransformConcat.d53f1c202a769649157225dddcd1cb5a.attr
│ │ ├── CGAffineTransformMakeRotation.70cd7ef546e468e69b2b3a7c79275bdc.attr
│ │ ├── CGAffineTransformMakeScale.e2f2530e20d5f4373f362ee125809230.attr
│ │ ├── CGColorSpaceCreateDeviceRGB.ba66fb2e5605d2fdcbdd9025d50994c2.attr
│ │ ├── CGColorSpaceRelease.61e1e802e46513e43dc69aff2da5563a.attr
│ │ ├── CGContextAddArc.a7d2d85ff6e956e49280efc29de5d08c.attr
│ │ ├── CGContextAddArcToPoint.6bda987971d6a10a79ed0aed6eb8b99b.attr
│ │ ├── CGContextAddLineToPoint.59ce028dc7b71069fefe4775ed34c29e.attr
│ │ ├── CGContextBeginPath.1ce5efef25c98326e0ba94fc71df34e3.attr
│ │ ├── CGContextClosePath.e4dcf76d0a3fa61121ff82263cc49506.attr
│ │ ├── CGContextDrawRadialGradient.99a292382c140552bf18582d0baf5179.attr
│ │ ├── CGContextFillEllipseInRect.746ad1e29412b80fd7f21c9b5dfd9e77.attr
│ │ ├── CGContextFillPath.0d9b19fcd1e8e8530ab71cdca0659f4a.attr
│ │ ├── CGContextMoveToPoint.2ff5372957b6ca7702c780e625380337.attr
│ │ ├── CGContextSetFillColorWithColor.da9ad2c3ac7ccdfcb573c41f5967697e.attr
│ │ ├── CGContextSetGrayFillColor.4a3ee89ac153cfa556a498868b493d76.attr
│ │ ├── CGContextSetLineWidth.3eca87eabe1da299b1bc637a2e2c2026.attr
│ │ ├── CGContextSetStrokeColorWithColor.8f70fdeb1b1a1ed7c867dc2c17567857.attr
│ │ ├── CGContextStrokeEllipseInRect.10a47082c627075971b9d65a1c59a8e4.attr
│ │ ├── CGContextStrokePath.e1984260c9d3b0b034e494e5c561e083.attr
│ │ ├── CGGradientCreateWithColorComponents.c1bcf541a0344cf83ab5462b64cf9024.attr
│ │ ├── CGGradientRelease.c8ab0f658a03819c756f07a0faff31e9.attr
│ │ ├── CGPointMake{8f2d787b659f0921d68828fa902f5c6a}.c5b59586ef71f48b3ed72eabbbadc941.attr
│ │ ├── CGRectContainsPoint.30e26dc287538e23f5b1a2980699fd57.attr
│ │ ├── CGRectGetHeight.039c89ff492d7b5a8810e1ad5ca220ae.attr
│ │ ├── CGRectGetMaxX.306dddb5878e5321e59ad7fae597a77f.attr
│ │ ├── CGRectGetMaxY.9abd48b2ea1b32f0d74429e5d009f1b7.attr
│ │ ├── CGRectGetMinX.bfa5b203fe4ad6ff11d4a2c42f3653fe.attr
│ │ ├── CGRectGetMinY.1c2eb0c667170abbdbd24fedce4da231.attr
│ │ ├── CGRectGetWidth.2f54703e3e65c9723f5209221514f786.attr
│ │ ├── CGRectInset.5a782c449e341b994a93839b8993ac8e.attr
│ │ ├── CGRectIntegral.a7454be352381d42006cea0a2d62f233.attr
│ │ ├── CGRectMake{8f2d787b659f0921d68828fa902f5c6a}.fb4e5eb9586b49fd86b6da3c00924ba8.attr
│ │ ├── CGSizeMake{8f2d787b659f0921d68828fa902f5c6a}.e9776dac6163629af80900da9060da71.attr
│ │ ├── HMScrollView_touchesBegan:withEvent:{instance}.d59f2b4a0fda4ec48b036513c8dd8cc9.attr
│ │ ├── HMScrollView_touchesEnded:withEvent:{instance}.8f3c38acc9d5dc615c13261818676983.attr
│ │ ├── HMScrollView_touchesMoved:withEvent:{instance}.c1670bac25a0a202b52dda692c907230.attr
│ │ ├── HMSegmentedControl_addBackgroundAndBorderLayerWithRect:{instance}.7dd0377b1da0e5b410137e62fdec2030.attr
│ │ ├── HMSegmentedControl_attributedTitleAtIndex:{instance}.a5b762b44c0d812624d2256563840cc5.attr
│ │ ├── HMSegmentedControl_awakeFromNib{instance}.f3fa814debe72a72b9e0eb7ccf2e15a5.attr
│ │ ├── HMSegmentedControl_backgroundColor{instance}.6c0d975be62ba854f7bab2eb41bd65df.attr
│ │ ├── HMSegmentedControl_borderColor{instance}.c974aed1ac3888a88a88edca77f3c4c4.attr
│ │ ├── HMSegmentedControl_borderType{instance}.7bdcff07d24df6f0c700bf184c07c007.attr
│ │ ├── HMSegmentedControl_borderWidth{instance}.56af3b362891b90f3116f2baa5fa35d8.attr
│ │ ├── HMSegmentedControl_commonInit{instance}.38533cdade2a6665dabfbf9b34dfee27.attr
│ │ ├── HMSegmentedControl_drawRect:{instance}.0f8cfeaafe528d71c9e70549d32ab6c8.attr
│ │ ├── HMSegmentedControl_frameForFillerSelectionIndicator{instance}.ee003ec468962badb351fdc66dbf4daf.attr
│ │ ├── HMSegmentedControl_frameForSelectionIndicator{instance}.fab573ad9ae86c7cadaf030789e843c9.attr
│ │ ├── HMSegmentedControl_indexChangeBlock{instance}.b158b19f6cc684f30219f4d8828755ff.attr
│ │ ├── HMSegmentedControl_initWithCoder:{instance}.a09c14109303b8ad5c335eb9da3d110b.attr
│ │ ├── HMSegmentedControl_initWithFrame:{instance}.a49a182bda2ad6bcf70effd8929a23fc.attr
│ │ ├── HMSegmentedControl_initWithSectionImages:sectionSelectedImages:titlesForSections:{instance}.b753ee5d390184caf95711bd19d683b5.attr
│ │ ├── HMSegmentedControl_initWithSectionImages:sectionSelectedImages:{instance}.e9b578c4330b480104536188b8a8c976.attr
│ │ ├── HMSegmentedControl_initWithSectionTitles:{instance}.437880827dc06daf2642eb51cedee689.attr
│ │ ├── HMSegmentedControl_isTouchEnabled{instance}.b6d3723e21062d88a646a99466f45bbb.attr
│ │ ├── HMSegmentedControl_isUserDraggable{instance}.53bf5d04f2560750c8db0013c5c7e713.attr
│ │ ├── HMSegmentedControl_isVerticalDividerEnabled{instance}.b09fc4da7cc72200f09e858a18f0a5c3.attr
│ │ ├── HMSegmentedControl_layoutSubviews{instance}.68711c72c0e4854dcc75ef707417c22e.attr
│ │ ├── HMSegmentedControl_measureTitleAtIndex:{instance}.b9e49ac420b85b440d716583a1199bd7.attr
│ │ ├── HMSegmentedControl_notifyForSegmentChangeToIndex:{instance}.9961984e3a59a06f9dce68085bd94b07.attr
│ │ ├── HMSegmentedControl_resultingSelectedTitleTextAttributes{instance}.cc39ce9e58be4ecf606a42f75b7a1e18.attr
│ │ ├── HMSegmentedControl_resultingTitleTextAttributes{instance}.c6edf072205c8920b9c3804bcb465668.attr
│ │ ├── HMSegmentedControl_scrollToSelectedSegmentIndex:{instance}.3b10d351a059eceb4ce7dcc296c10e6b.attr
│ │ ├── HMSegmentedControl_scrollView{instance}.984a4cd4e0dfd407e8b2debe9112308f.attr
│ │ ├── HMSegmentedControl_sectionCount{instance}.8f2d3f243fe8914f47b850886fe77ce5.attr
│ │ ├── HMSegmentedControl_sectionImages{instance}.2c89149c36883d5f50273d129dec6929.attr
│ │ ├── HMSegmentedControl_sectionSelectedImages{instance}.62be27fd0fa44ff0550190f5a86af929.attr
│ │ ├── HMSegmentedControl_sectionTitles{instance}.fe4a558b033f4b6549cb1d3435ca8234.attr
│ │ ├── HMSegmentedControl_segmentEdgeInset{instance}.e0705631980423e348b31e19c90a75b3.attr
│ │ ├── HMSegmentedControl_segmentWidthStyle{instance}.12cd0162148658cf774f62bc5b3e8097.attr
│ │ ├── HMSegmentedControl_segmentWidthsArray{instance}.d95c7a7f5402c830e91e1085601b4cbc.attr
│ │ ├── HMSegmentedControl_segmentWidth{instance}.a5361ec3cba8ff2f3a20d186aa1022ad.attr
│ │ ├── HMSegmentedControl_selectedSegmentIndex{instance}.3863c2728a2b24b92ba408d6142e4d0d.attr
│ │ ├── HMSegmentedControl_selectedTitleTextAttributes{instance}.fa671cbd20cdcb95c0cf3a94dbd92914.attr
│ │ ├── HMSegmentedControl_selectionIndicatorArrowLayer{instance}.60a49ba9ad9d06b6055d839226b15da3.attr
│ │ ├── HMSegmentedControl_selectionIndicatorBoxLayer{instance}.eef7d0a9587700f4acf53912b3f28982.attr
│ │ ├── HMSegmentedControl_selectionIndicatorBoxOpacity{instance}.2bec172ee87e87586fbd7788de1e6e1b.attr
│ │ ├── HMSegmentedControl_selectionIndicatorColor{instance}.f9cffb745cc69caa672cf9d3f8e0a8bd.attr
│ │ ├── HMSegmentedControl_selectionIndicatorEdgeInsets{instance}.ba400682bc26b3cf3ba183e96dc2c33a.attr
│ │ ├── HMSegmentedControl_selectionIndicatorHeight{instance}.2944d21c028e844d04f9bbeefc36e9e8.attr
│ │ ├── HMSegmentedControl_selectionIndicatorLocation{instance}.a8b2f1bda54916a7eeeafe590d695021.attr
│ │ ├── HMSegmentedControl_selectionIndicatorStripLayer{instance}.f63177354a353fc6cdeecb71a5cf2080.attr
│ │ ├── HMSegmentedControl_selectionStyle{instance}.b1fc3e4fba245c89c4ff7a815f84c362.attr
│ │ ├── HMSegmentedControl_setArrowFrame{instance}.5826476954afd05d70ceb71ec673b941.attr
│ │ ├── HMSegmentedControl_setBorderColor:{instance}.a7cf3e92ecb3272d9c6d4e0b7ad2458d.attr
│ │ ├── HMSegmentedControl_setBorderType:{instance}.913cdb23a533132e5838aec6b4e59339.attr
│ │ ├── HMSegmentedControl_setBorderWidth:{instance}.4cb88623f795907950d15373b8278a8a.attr
│ │ ├── HMSegmentedControl_setFrame:{instance}.1c7263eacfefb1784864fef2d128686f.attr
│ │ ├── HMSegmentedControl_setScrollView:{instance}.e95cf1c7b8bd26a3765fe4245f5c5a7a.attr
│ │ ├── HMSegmentedControl_setSectionImages:{instance}.dd1712712826815f898cd900d8051af2.attr
│ │ ├── HMSegmentedControl_setSectionSelectedImages:{instance}.46d9ea6d3851678a0e210a2f91876f28.attr
│ │ ├── HMSegmentedControl_setSectionTitles:{instance}.659c7c1b9fb7032b7e893febe52349bc.attr
│ │ ├── HMSegmentedControl_setSegmentEdgeInset:{instance}.a5400ed9831e9d14bfe8f49ab3aec4eb.attr
│ │ ├── HMSegmentedControl_setSegmentWidth:{instance}.f9020ca34ccdfb8f3fae1fdab00eb581.attr
│ │ ├── HMSegmentedControl_setSegmentWidthStyle:{instance}.0e2d4c1c6e034b4ded13d0bda80fc966.attr
│ │ ├── HMSegmentedControl_setSegmentWidthsArray:{instance}.f19fa5029d441b0f0c65cacae4a5ddd0.attr
│ │ ├── HMSegmentedControl_setSelectedSegmentIndex:animated:notify:{instance}.e28550bafd2dd200d908ec93bf0f5f6f.attr
│ │ ├── HMSegmentedControl_setSelectedSegmentIndex:animated:{instance}.2d10a374506ae4092dce3c89aa0d3ed2.attr
│ │ ├── HMSegmentedControl_setSelectedSegmentIndex:{instance}.7c671210f6f2a504f070e13fa74c6c0f.attr
│ │ ├── HMSegmentedControl_setSelectionIndicatorArrowLayer:{instance}.e91cba373a89945a6566f1e41d15cd40.attr
│ │ ├── HMSegmentedControl_setSelectionIndicatorBoxLayer:{instance}.54fd874b9d7c488d6cb40c9e007a4303.attr
│ │ ├── HMSegmentedControl_setSelectionIndicatorBoxOpacity:{instance}.45b69f43098a4683dfc106f58afed905.attr
│ │ ├── HMSegmentedControl_setSelectionIndicatorEdgeInsets:{instance}.2c6d7402b479f3a13e2af00c660fe2bc.attr
│ │ ├── HMSegmentedControl_setSelectionIndicatorHeight:{instance}.bbbd0c2cbae92d35f3ecf1c745380fa4.attr
│ │ ├── HMSegmentedControl_setSelectionIndicatorLocation:{instance}.a53daba01d6a3f4bf906c7cecf124d14.attr
│ │ ├── HMSegmentedControl_setSelectionIndicatorStripLayer:{instance}.445c4639123dbf524d6b075052ef6129.attr
│ │ ├── HMSegmentedControl_setSelectionStyle:{instance}.db234355255ede1270daa164a4d9da4c.attr
│ │ ├── HMSegmentedControl_setShouldAnimateUserSelection:{instance}.1d4757295d44983747a4234f6eeaf607.attr
│ │ ├── HMSegmentedControl_setTouchEnabled:{instance}.c79ba177add22f1672903cf5dd0f97f0.attr
│ │ ├── HMSegmentedControl_setType:{instance}.4632bffa99b29a9b631888269edbd957.attr
│ │ ├── HMSegmentedControl_setUserDraggable:{instance}.a94d539fa41650dc0e32142bb6b7064f.attr
│ │ ├── HMSegmentedControl_setVerticalDividerEnabled:{instance}.8c74a8159fb14bbc2e9dc12ef36e8564.attr
│ │ ├── HMSegmentedControl_setVerticalDividerWidth:{instance}.4dfb08e915f4ce87cd4008c7e06130ef.attr
│ │ ├── HMSegmentedControl_shouldAnimateUserSelection{instance}.b91bf96db0958ea8866d1d89531db03f.attr
│ │ ├── HMSegmentedControl_titleFormatter{instance}.164ceaaacc6ba02b8c16e5eb8030c4bf.attr
│ │ ├── HMSegmentedControl_titleTextAttributes{instance}.18091c08590b90b9883d798769be6f76.attr
│ │ ├── HMSegmentedControl_totalSegmentedControlWidth{instance}.0d2a745a35745340bb11b6dca1981618.attr
│ │ ├── HMSegmentedControl_touchesEnded:withEvent:{instance}.4e627b0727b096ec8303653816d71374.attr
│ │ ├── HMSegmentedControl_type{instance}.977b3eb3d4522b4a872303ef2272c048.attr
│ │ ├── HMSegmentedControl_updateSegmentsRects{instance}.84ec9da3b15ae6609959e7b9d4e514d6.attr
│ │ ├── HMSegmentedControl_verticalDividerColor{instance}.35d31e2c8524c3431cf3efdb0458c253.attr
│ │ ├── HMSegmentedControl_verticalDividerWidth{instance}.670b4aba0a822417c77bef3aff1caeab.attr
│ │ ├── HMSegmentedControl_willMoveToSuperview:{instance}.664e57902a9674b629014432c158bbe2.attr
│ │ ├── MBBarProgressView_dealloc{instance}.adf1ad15c84766ba9dcf79183c69c3d4.attr
│ │ ├── MBBarProgressView_drawRect:{instance}.320d681186c8fba8f6b277de3f5578a2.attr
│ │ ├── MBBarProgressView_initWithFrame:{instance}.ed6320a3deccb73365df0525f4c1b164.attr
│ │ ├── MBBarProgressView_init{instance}.d718a21a2e82160043ea8993b48ff857.attr
│ │ ├── MBBarProgressView_observableKeypaths{instance}.39b90d036d77a64fc5e4fecf6065c87c.attr
│ │ ├── MBBarProgressView_observeValueForKeyPath:ofObject:change:context:{instance}.7954f9a6af46f9f68c1a1f6b5a2ccdd2.attr
│ │ ├── MBBarProgressView_progress{instance}.560fdc46cd8df96a995256bbc4cff61e.attr
│ │ ├── MBBarProgressView_registerForKVO{instance}.071c8b1636d94f57ae8971bc36daf118.attr
│ │ ├── MBBarProgressView_unregisterFromKVO{instance}.b5a5120611688f493d5727fdfa6d5960.attr
│ │ ├── MBProgressHUD_HUDForView:{class}.a2951ab8562d7ef65f3c11867a36db30.attr
│ │ ├── MBProgressHUD_activityIndicatorColor{instance}.2d61416f4d99fbfea16e34f1761a4a42.attr
│ │ ├── MBProgressHUD_allHUDsForView:{class}.c62400802f12bd5a57844c12fcb0585f.attr
│ │ ├── MBProgressHUD_animationFinished:finished:context:{instance}.9c5e683b9e4ea724431986aec092468a.attr
│ │ ├── MBProgressHUD_cleanUp{instance}.f88f2551df8f2874a1f623e3c7d179a3.attr
│ │ ├── MBProgressHUD_color{instance}.7b97e272716405b208ddb9874ba77e20.attr
│ │ ├── MBProgressHUD_completionBlock{instance}.1ad46d55ec211f7a949fe770b4dc71b5.attr
│ │ ├── MBProgressHUD_cornerRadius{instance}.7ca50c7c725e4c51425bfb2bae6b3274.attr
│ │ ├── MBProgressHUD_dealloc{instance}.734bfbc384d83cb0e26dba7831bb5b5a.attr
│ │ ├── MBProgressHUD_detailsLabelColor{instance}.d810728d8d2cf38296782ee23d415dae.attr
│ │ ├── MBProgressHUD_detailsLabelFont{instance}.3a177fd27f802c9ea8c5f1d0cdff42cc.attr
│ │ ├── MBProgressHUD_detailsLabelText{instance}.0574adaba50347f8e1aa3e9a425906f7.attr
│ │ ├── MBProgressHUD_didMoveToSuperview{instance}.bdd65a2c02acb5f730c9ffafb0a5d09e.attr
│ │ ├── MBProgressHUD_dimBackground{instance}.6b895a8d19f40262d2e45cd4088cdff8.attr
│ │ ├── MBProgressHUD_done{instance}.72390a40ef044120f3206ce23838c81a.attr
│ │ ├── MBProgressHUD_drawRect:{instance}.d021496ab2c89b5e6977af3d98e6a604.attr
│ │ ├── MBProgressHUD_graceTime{instance}.8fd19d236ee22e1fa2d15aeea932664a.attr
│ │ ├── MBProgressHUD_handleGraceTimer:{instance}.1b8680a1326602baf44976543198fed9.attr
│ │ ├── MBProgressHUD_handleMinShowTimer:{instance}.7aafa41664c3ff7af3a291cab98261c3.attr
│ │ ├── MBProgressHUD_hide:afterDelay:{instance}.c859a390b6e21c3da53cc55db145fc51.attr
│ │ ├── MBProgressHUD_hide:{instance}.9f087e822370af64645764e8180cf507.attr
│ │ ├── MBProgressHUD_hideAllHUDsForView:animated:{class}.0c50aff8a43d35a50e24dbcc63a30a32.attr
│ │ ├── MBProgressHUD_hideDelayed:{instance}.c1ee27a326a7aff4bb96a0c3c0081baf.attr
│ │ ├── MBProgressHUD_hideHUDForView:animated:{class}.6464d2a2482f9e32e72a33627277d762.attr
│ │ ├── MBProgressHUD_hideUsingAnimation:{instance}.7d9068a738fef2e9a6e234f592d77b03.attr
│ │ ├── MBProgressHUD_initWithFrame:{instance}.46a9a5ebd85df85c40e4ca277186520f.attr
│ │ ├── MBProgressHUD_initWithView:{instance}.56c371965dcee9d54c2d7a562e2ae498.attr
│ │ ├── MBProgressHUD_initWithWindow:{instance}.d9abb98f4c74d9d83026534b730b52d2.attr
│ │ ├── MBProgressHUD_labelColor{instance}.9d7464c5bbb5afbeb216081e82817b7a.attr
│ │ ├── MBProgressHUD_labelFont{instance}.70faec2749c5ee8f67aa368639130a9a.attr
│ │ ├── MBProgressHUD_labelText{instance}.357a40814f1c8fb1a46c510697a15719.attr
│ │ ├── MBProgressHUD_launchExecution{instance}.65b7de815299c22603cdc0a12874e621.attr
│ │ ├── MBProgressHUD_layoutSubviews{instance}.b1b30a767241a72169fad46125b80ce0.attr
│ │ ├── MBProgressHUD_minShowTime{instance}.dd94b4eb4d38971c76f088bd6b4e5f95.attr
│ │ ├── MBProgressHUD_observableKeypaths{instance}.1d43b626b757e9a1ab7fb2a4953c8d2d.attr
│ │ ├── MBProgressHUD_observeValueForKeyPath:ofObject:change:context:{instance}.6f2717bd4c58c58b1cd5304e7bfb403b.attr
│ │ ├── MBProgressHUD_opacity{instance}.579a958bf7f4e1d992df9f634e28bbac.attr
│ │ ├── MBProgressHUD_registerForKVO{instance}.74d4196c6bc96800ebeadb3eade5e76a.attr
│ │ ├── MBProgressHUD_registerForNotifications{instance}.c083e50aaf59e994cdd425e4c9cf446b.attr
│ │ ├── MBProgressHUD_setActivityIndicatorColor:{instance}.f24d774d97c34f1c2c8c1ae0bf2c1273.attr
│ │ ├── MBProgressHUD_setAnimationType:{instance}.b5811b9f743fc37317bcdc2001b385ec.attr
│ │ ├── MBProgressHUD_setColor:{instance}.87a22a9c5fb03c6a289155584ae01252.attr
│ │ ├── MBProgressHUD_setCompletionBlock:{instance}.9958faa8671959243d097f15bf7cd735.attr
│ │ ├── MBProgressHUD_setCornerRadius:{instance}.5e4384b83b4c8a1047f09cedb24fbc1b.attr
│ │ ├── MBProgressHUD_setDetailsLabelColor:{instance}.4758e16052b436d294d43b2458e2344f.attr
│ │ ├── MBProgressHUD_setDetailsLabelFont:{instance}.2ba74226e9a47ebe3ee377eee7aeda77.attr
│ │ ├── MBProgressHUD_setDetailsLabelText:{instance}.5afc06844e84eff171f543be0a1e3284.attr
│ │ ├── MBProgressHUD_setDimBackground:{instance}.df31cc40ed53290d7a62a4bd9c29b6eb.attr
│ │ ├── MBProgressHUD_setGraceTime:{instance}.90a68b65efaaf31e5c6fb64b16e4841c.attr
│ │ ├── MBProgressHUD_setGraceTimer:{instance}.a11af2368eb0f75014da9ce40b64e334.attr
│ │ ├── MBProgressHUD_setIndicator:{instance}.1493dede8b97b7b574fd526b59f8fcf6.attr
│ │ ├── MBProgressHUD_setLabelColor:{instance}.56abb3a6d08248e4bf1c0564b9e6ad18.attr
│ │ ├── MBProgressHUD_setLabelFont:{instance}.d491e14520fe29a85cde554d6c36bc5b.attr
│ │ ├── MBProgressHUD_setLabelText:{instance}.eb03c91339c840d0b4beeb9760edc92b.attr
│ │ ├── MBProgressHUD_setMargin:{instance}.cfc61775083906307fab4dba43765fe3.attr
│ │ ├── MBProgressHUD_setMinShowTime:{instance}.b813895045aba4190b1dff8f5d44c66a.attr
│ │ ├── MBProgressHUD_setMinShowTimer:{instance}.a9259d37b4fb2f215b28ecb3f9e32dcb.attr
│ │ ├── MBProgressHUD_setMinSize:{instance}.6b3359b7f53a425979976499c1fe8518.attr
│ │ ├── MBProgressHUD_setMode:{instance}.b6d8e4bba9d63bd9c8c932b49b53eb57.attr
│ │ ├── MBProgressHUD_setOpacity:{instance}.0d9de659152193a146548de0151ced1f.attr
│ │ ├── MBProgressHUD_setRemoveFromSuperViewOnHide:{instance}.bc2e0b23f41236455917c9218b5849e3.attr
│ │ ├── MBProgressHUD_setShowStarted:{instance}.5aa5a1f820d62938e64411e5761dcc53.attr
│ │ ├── MBProgressHUD_setSquare:{instance}.7cf5d25512eaffea5eec5389f527a2b1.attr
│ │ ├── MBProgressHUD_setTaskInProgress:{instance}.41e42d6e6bfdc7e9717af48e96f34cfd.attr
│ │ ├── MBProgressHUD_setXOffset:{instance}.b3a146d98d73770b5e2be2b9511ba6d8.attr
│ │ ├── MBProgressHUD_setYOffset:{instance}.ea9213ea1fd72c15e521b8926b7a9658.attr
│ │ ├── MBProgressHUD_setupLabels{instance}.ea2ff0fb299d03874b01a906a7e5f181.attr
│ │ ├── MBProgressHUD_show:{instance}.ac44c85674baa495a162f44dec2bca1f.attr
│ │ ├── MBProgressHUD_showAnimated:whileExecutingBlock:completionBlock:{instance}.cc35373f5b0ef6d67ba0a2cd43d0a077.attr
│ │ ├── MBProgressHUD_showAnimated:whileExecutingBlock:onQueue:completionBlock:{instance}.5f282b5baff14a6b325db22e8dc79cb5.attr
│ │ ├── MBProgressHUD_showAnimated:whileExecutingBlock:onQueue:{instance}.939c8bef4c804dcce1a8f8504d065463.attr
│ │ ├── MBProgressHUD_showAnimated:whileExecutingBlock:{instance}.31adcee70bd29a2315f5a590715c3deb.attr
│ │ ├── MBProgressHUD_showHUDAddedTo:animated:{class}.a5ee486a46c5d3c99b9e068e9ea4baad.attr
│ │ ├── MBProgressHUD_showUsingAnimation:{instance}.9401eaed7b787b815229a4f8ec3357be.attr
│ │ ├── MBProgressHUD_showWhileExecuting:onTarget:withObject:animated:{instance}.0961e1f2841c54f70f3dc0b695dfc84d.attr
│ │ ├── MBProgressHUD_statusBarOrientationDidChange:{instance}.872a47e680449f7f49e472ccf7e9d082.attr
│ │ ├── MBProgressHUD_unregisterFromKVO{instance}.bbf3aaf60e868fa0fb966ae29a1af573.attr
│ │ ├── MBProgressHUD_unregisterFromNotifications{instance}.de0d4125b86d3858fd69944f1d235402.attr
│ │ ├── MBProgressHUD_updateForCurrentOrientationAnimated:{instance}.6fe6a2b1a661f1f307de4fb6a68bd0fb.attr
│ │ ├── MBProgressHUD_updateIndicators{instance}.a3986e584873e64cd5fec235462f12b3.attr
│ │ ├── MBProgressHUD_updateUIForKeypath:{instance}.7f3963efa7a8ac2719bfd99007bd6b6e.attr
│ │ ├── MBProgressHUD_xOffset{instance}.f620c9bf5104d6e75b4f55cf64474cf8.attr
│ │ ├── MBProgressHUD_yOffset{instance}.28e4ee28175cb299c29ea4e4a947fe19.attr
│ │ ├── MBRoundProgressView_dealloc{instance}.f76e97c78e356529b6d3487d19b1a412.attr
│ │ ├── MBRoundProgressView_drawRect:{instance}.5dded631db9e81761adbc52c74e3a158.attr
│ │ ├── MBRoundProgressView_initWithFrame:{instance}.202df68ce7c2e37e1d8f93454b69c4d1.attr
│ │ ├── MBRoundProgressView_init{instance}.d5141eb9f853d4fabd440a664b453b2f.attr
│ │ ├── MBRoundProgressView_observableKeypaths{instance}.88a67d54a2d7175b9b7f5a626393a834.attr
│ │ ├── MBRoundProgressView_observeValueForKeyPath:ofObject:change:context:{instance}.3562ed8d8fbf2b3acfad83fc0f3fcfd0.attr
│ │ ├── MBRoundProgressView_progress{instance}.28f5c55b1a3c9926848ed155ecc0b30c.attr
│ │ ├── MBRoundProgressView_registerForKVO{instance}.56e6d0e76d20137d6b5a2056d5683113.attr
│ │ ├── MBRoundProgressView_setAnnular:{instance}.75a288f0dab258c289396d3bba5ad41f.attr
│ │ ├── MBRoundProgressView_setBackgroundTintColor:{instance}.6d3bdc8da5b9cccf361b2fa1341bf906.attr
│ │ ├── MBRoundProgressView_setProgressTintColor:{instance}.293e9db9f20e0abe810b75c662e07c81.attr
│ │ ├── MBRoundProgressView_unregisterFromKVO{instance}.97841886debac0d49b46482098a4e1d7.attr
│ │ ├── MJRefreshAutoFooter_appearencePercentTriggerAutoRefresh{instance}.931b825764944eff97f78ef4c2c44ebd.attr
│ │ ├── MJRefreshAutoFooter_isAutomaticallyRefresh{instance}.8faea093d1477159a7d91389f9b8f181.attr
│ │ ├── MJRefreshAutoFooter_prepare{instance}.81fdaf533264e53838439b6af78408c2.attr
│ │ ├── MJRefreshAutoFooter_scrollViewContentOffsetDidChange:{instance}.bcfcda2745da14825e78d76c540e5ff0.attr
│ │ ├── MJRefreshAutoFooter_scrollViewContentSizeDidChange:{instance}.c95f98648e58af09c6bb5f9a39329ee1.attr
│ │ ├── MJRefreshAutoFooter_scrollViewPanStateDidChange:{instance}.40aa0d75b89f5a74cf08c78c183d6a19.attr
│ │ ├── MJRefreshAutoFooter_setAppearencePercentTriggerAutoRefresh:{instance}.6d7e658eb08c918e2665dda4d02bbe0e.attr
│ │ ├── MJRefreshAutoFooter_setAutomaticallyRefresh:{instance}.4fbd2a9064091da8a6df342126079d38.attr
│ │ ├── MJRefreshAutoFooter_setHidden:{instance}.8187ea74fc5a524dc007acb5243e7926.attr
│ │ ├── MJRefreshAutoFooter_setState:{instance}.bdb3fcb8173fa59cb33dd391730a20c2.attr
│ │ ├── MJRefreshAutoFooter_setTriggerAutomaticallyRefreshPercent:{instance}.47b1c6d3dd834c962ca0def11f63773f.attr
│ │ ├── MJRefreshAutoFooter_triggerAutomaticallyRefreshPercent{instance}.8e9b83eae28f0dc74a633963546a48c1.attr
│ │ ├── MJRefreshAutoFooter_willMoveToSuperview:{instance}.31c9e7668989c017342140f0185c2188.attr
│ │ ├── MJRefreshAutoGifFooter_gifView{instance}.4ff145d45d6f0d9ac6a9b37155d3cc66.attr
│ │ ├── MJRefreshAutoGifFooter_placeSubviews{instance}.792cabf0aff680ead0baef015354b3be.attr
│ │ ├── MJRefreshAutoGifFooter_setImages:duration:forState:{instance}.c46aa256d08ae2ac7749b27d92bed622.attr
│ │ ├── MJRefreshAutoGifFooter_setImages:forState:{instance}.bc030fd7ddd4c611d524187d37ba0372.attr
│ │ ├── MJRefreshAutoGifFooter_setState:{instance}.ef45940c1ae3cbc92c2bc041ff067afa.attr
│ │ ├── MJRefreshAutoGifFooter_setStateDurations:{instance}.8dd71ca577ac65188093d2b9b15487c9.attr
│ │ ├── MJRefreshAutoGifFooter_setStateImages:{instance}.7ed1529d6d2d5e64353eef546bc54830.attr
│ │ ├── MJRefreshAutoGifFooter_stateDurations{instance}.719f9f19198062078a8a0d9ea201ca6b.attr
│ │ ├── MJRefreshAutoGifFooter_stateImages{instance}.ab92380ab4ded17b30f8a08f961ee684.attr
│ │ ├── MJRefreshAutoNormalFooter_activityIndicatorViewStyle{instance}.ceb4ca03c0e884815e4fa1da22003b56.attr
│ │ ├── MJRefreshAutoNormalFooter_loadingView{instance}.b926a86efa7bdd6b0a6a98c1e90540a4.attr
│ │ ├── MJRefreshAutoNormalFooter_placeSubviews{instance}.0f8d74171158ff20387271e6a94777f4.attr
│ │ ├── MJRefreshAutoNormalFooter_prepare{instance}.62a05293c68d988c434dbcd79ef0ad7b.attr
│ │ ├── MJRefreshAutoNormalFooter_setActivityIndicatorViewStyle:{instance}.1740284edf4289989ed9655458e6e541.attr
│ │ ├── MJRefreshAutoNormalFooter_setLoadingView:{instance}.fe92ca8e7a1b6d7cce8e8120840765ec.attr
│ │ ├── MJRefreshAutoNormalFooter_setState:{instance}.92eb8a4693eb9e978510f5f8e8d079b6.attr
│ │ ├── MJRefreshAutoStateFooter_isRefreshingTitleHidden{instance}.07088d8a06b1bab37884b71f7a787511.attr
│ │ ├── MJRefreshAutoStateFooter_placeSubviews{instance}.e05bd88dad611fa3f5641cc10cf22caf.attr
│ │ ├── MJRefreshAutoStateFooter_prepare{instance}.39111306cd810d7e8289797116b20acc.attr
│ │ ├── MJRefreshAutoStateFooter_setState:{instance}.41f13d685c1d0107cac76f5e6cdc6f22.attr
│ │ ├── MJRefreshAutoStateFooter_setStateTitles:{instance}.ca2fdfc2466d5604e5ba943c77517474.attr
│ │ ├── MJRefreshAutoStateFooter_setTitle:forState:{instance}.a6f426bbeb7cb198331cbcece4cf4ec0.attr
│ │ ├── MJRefreshAutoStateFooter_stateLabelClick{instance}.8d69ce4f9c38bcef0e235e719a0ddbdf.attr
│ │ ├── MJRefreshAutoStateFooter_stateLabel{instance}.0d1656cd91316c5fef17b9f5de691d6b.attr
│ │ ├── MJRefreshAutoStateFooter_stateTitles{instance}.45df57b523fb4f840f1c9d536a35d61c.attr
│ │ ├── MJRefreshBackFooter_endRefreshing{instance}.958680d523a94ab59c1c9601c2541ab2.attr
│ │ ├── MJRefreshBackFooter_happenOffsetY{instance}.0dae9169061683402ab2798299f74adc.attr
│ │ ├── MJRefreshBackFooter_heightForContentBreakView{instance}.6c28d740d05c68bd5806d8010e497a29.attr
│ │ ├── MJRefreshBackFooter_lastBottomDelta{instance}.c496b2fb23a0b6abb0536952369a6067.attr
│ │ ├── MJRefreshBackFooter_lastRefreshCount{instance}.d98b9dfc2f5608eb90069f4a99ccb939.attr
│ │ ├── MJRefreshBackFooter_noticeNoMoreData{instance}.83d8a6971a587c2fe5193c2bc7f4b031.attr
│ │ ├── MJRefreshBackFooter_scrollViewContentOffsetDidChange:{instance}.f883c7a60628c818fb9a69ebcf62f187.attr
│ │ ├── MJRefreshBackFooter_scrollViewContentSizeDidChange:{instance}.665d5ffac44fdda6b0cfcaf9f76338c2.attr
│ │ ├── MJRefreshBackFooter_setLastBottomDelta:{instance}.d7f17dc59f26de4e40fdddac33e09d55.attr
│ │ ├── MJRefreshBackFooter_setLastRefreshCount:{instance}.6ba2ed2e1c21a669ddd4b81d419bf540.attr
│ │ ├── MJRefreshBackFooter_setState:{instance}.2a84f32e6c9d600cfa0c5f9c490fa00b.attr
│ │ ├── MJRefreshBackFooter_willMoveToSuperview:{instance}.5dcec01faa2292110b1de8e64a12c539.attr
│ │ ├── MJRefreshBackGifFooter_gifView{instance}.7c4a05bcc8f049050cffa895709f2611.attr
│ │ ├── MJRefreshBackGifFooter_placeSubviews{instance}.1cf5a34d6185752d129aad4c43b0cf42.attr
│ │ ├── MJRefreshBackGifFooter_setImages:duration:forState:{instance}.bd185713fbda471cfa0b26d0475db1d6.attr
│ │ ├── MJRefreshBackGifFooter_setImages:forState:{instance}.f959fd72b4774da01ea194a4b34ee359.attr
│ │ ├── MJRefreshBackGifFooter_setPullingPercent:{instance}.157a977e4c33fa60e38cb624a19f24de.attr
│ │ ├── MJRefreshBackGifFooter_setState:{instance}.fa1a5e8a04db08dde17ff7de59c16477.attr
│ │ ├── MJRefreshBackGifFooter_setStateDurations:{instance}.a81609e641136283d141a5292c789277.attr
│ │ ├── MJRefreshBackGifFooter_setStateImages:{instance}.0f098236eda9a4915e3507a899e4a6b4.attr
│ │ ├── MJRefreshBackGifFooter_stateDurations{instance}.ecff20c8de39266ddc0f975a0f4306e2.attr
│ │ ├── MJRefreshBackGifFooter_stateImages{instance}.724b5260dc41e21938f90f2360672187.attr
│ │ ├── MJRefreshBackNormalFooter_activityIndicatorViewStyle{instance}.960a7ee908a4fd7a48491e0e03139820.attr
│ │ ├── MJRefreshBackNormalFooter_arrowView{instance}.4311ef7cafa4a9ee91bbac226b717da9.attr
│ │ ├── MJRefreshBackNormalFooter_loadingView{instance}.d862d1537eaf4f13b3ea928a9d7e6bb2.attr
│ │ ├── MJRefreshBackNormalFooter_placeSubviews{instance}.14a691c735954cea598f1c42945a8ade.attr
│ │ ├── MJRefreshBackNormalFooter_prepare{instance}.d348875f78d00052355c482b471988da.attr
│ │ ├── MJRefreshBackNormalFooter_setActivityIndicatorViewStyle:{instance}.c11249674bf6ed2701a1780e8cf790ae.attr
│ │ ├── MJRefreshBackNormalFooter_setLoadingView:{instance}.a44b93d20344678374d94ba20c30fb29.attr
│ │ ├── MJRefreshBackNormalFooter_setState:{instance}.bfb37954287cc1242b9371c8e0c2c53d.attr
│ │ ├── MJRefreshBackStateFooter_placeSubviews{instance}.07dd32534b9ae4810921764ceac1540a.attr
│ │ ├── MJRefreshBackStateFooter_prepare{instance}.e12b6d29ae7cc426b54f69331c789d15.attr
│ │ ├── MJRefreshBackStateFooter_setState:{instance}.0ffb3dd66c48270735110933d1f2f0d7.attr
│ │ ├── MJRefreshBackStateFooter_setStateTitles:{instance}.2cbd1f0a4076406931cad7c161e143f3.attr
│ │ ├── MJRefreshBackStateFooter_setTitle:forState:{instance}.e6265b339a82b1b962fd6b7d372b38b4.attr
│ │ ├── MJRefreshBackStateFooter_stateLabel{instance}.671bdcb3c3052ca29a0160eca1c6b6bd.attr
│ │ ├── MJRefreshBackStateFooter_stateTitles{instance}.8c8d015f558a5b782cef16fa2a872de2.attr
│ │ ├── MJRefreshBackStateFooter_titleForState:{instance}.6644d0fcdc32801821696c2a4d6f0aa8.attr
│ │ ├── MJRefreshComponent_addObservers{instance}.48ac3cc9007a3c8cbb6a15277c7db9ea.attr
│ │ ├── MJRefreshComponent_beginRefreshing{instance}.37e3b4491c03ca5070562df652ae4a3f.attr
│ │ ├── MJRefreshComponent_drawRect:{instance}.5c9569babdce7fbc05fdb15778362755.attr
│ │ ├── MJRefreshComponent_endRefreshing{instance}.2720081dcaca1ee01ca4ba03255da838.attr
│ │ ├── MJRefreshComponent_executeRefreshingCallback{instance}.4f282c4379c6e540d10c12e54d80e390.attr
│ │ ├── MJRefreshComponent_initWithFrame:{instance}.dcc5043bc9d4cc86799bf33ff4f78bb3.attr
│ │ ├── MJRefreshComponent_isAutoChangeAlpha{instance}.d2580facd9584f5d1823586225276c0c.attr
│ │ ├── MJRefreshComponent_isAutomaticallyChangeAlpha{instance}.2a8e6128dc3b7f4056d44eb6a85dcbc0.attr
│ │ ├── MJRefreshComponent_isRefreshing{instance}.a3d1e918912f39baa99b419848f9d33b.attr
│ │ ├── MJRefreshComponent_layoutSubviews{instance}.8098590c7287f2a2c27bd59d78a0452b.attr
│ │ ├── MJRefreshComponent_observeValueForKeyPath:ofObject:change:context:{instance}.5c79a9157e694b8877729d29e6accd4f.attr
│ │ ├── MJRefreshComponent_pan{instance}.b4b8604d2765baa120b9f835149bfa11.attr
│ │ ├── MJRefreshComponent_placeSubviews{instance}.73d06208ee35f85eb9d849aecd472416.attr
│ │ ├── MJRefreshComponent_prepare{instance}.38440e789285bd7781f72155c89e3f5a.attr
│ │ ├── MJRefreshComponent_pullingPercent{instance}.bf3ec592754e2b06a9c418a8a42e64d1.attr
│ │ ├── MJRefreshComponent_refreshingAction{instance}.c143d0e5740c72c171ef233926e1a636.attr
│ │ ├── MJRefreshComponent_refreshingBlock{instance}.69fd8a712aee96a73b3b1907bd80645a.attr
│ │ ├── MJRefreshComponent_refreshingTarget{instance}.3ad49532b05a7ff9e99f62f13f0120a0.attr
│ │ ├── MJRefreshComponent_removeObservers{instance}.c9d911e52f725b43fc7b34f4a07b3923.attr
│ │ ├── MJRefreshComponent_scrollViewContentOffsetDidChange:{instance}.617caa7f28422a6417560a602082f5b8.attr
│ │ ├── MJRefreshComponent_scrollViewContentSizeDidChange:{instance}.e16f83d0096447be3224827fc19b9549.attr
│ │ ├── MJRefreshComponent_scrollViewOriginalInset{instance}.d960bf16dffbba6c5ce59ac62c5b4fb4.attr
│ │ ├── MJRefreshComponent_scrollViewPanStateDidChange:{instance}.d34301c5662a55086b39dd2ec566b5ad.attr
│ │ ├── MJRefreshComponent_scrollView{instance}.b68a4e9c5b6d215896d41cfbac4d856c.attr
│ │ ├── MJRefreshComponent_setAutoChangeAlpha:{instance}.a04c05493fc5ecf43d98b9924f8bc78c.attr
│ │ ├── MJRefreshComponent_setAutomaticallyChangeAlpha:{instance}.4591244e561c565e45c21b89ff9610d4.attr
│ │ ├── MJRefreshComponent_setPan:{instance}.8c82f9c37018718627c17f27fd904e9a.attr
│ │ ├── MJRefreshComponent_setPullingPercent:{instance}.5755356ca5ccb563f50c75bba6db1e9d.attr
│ │ ├── MJRefreshComponent_setRefreshingAction:{instance}.bad58c3b51021489ca89cb2811c78f1d.attr
│ │ ├── MJRefreshComponent_setRefreshingBlock:{instance}.90e035f5c7d64addfbae505ffc8b7a66.attr
│ │ ├── MJRefreshComponent_setRefreshingTarget:refreshingAction:{instance}.d064af6f306c53b4158833f0f020408a.attr
│ │ ├── MJRefreshComponent_setRefreshingTarget:{instance}.afb8262211db09c8108307aa294d217f.attr
│ │ ├── MJRefreshComponent_setState:{instance}.f0480dd1ccaad27d029386c5ed7a1483.attr
│ │ ├── MJRefreshComponent_state{instance}.3e10ee4b41ed83680cb31b6bea5d1de9.attr
│ │ ├── MJRefreshComponent_willMoveToSuperview:{instance}.7f13a46585df11309a3efe2ded73b3e8.attr
│ │ ├── MJRefreshFooter_endRefreshingWithNoMoreData{instance}.7cebeaf3e25d576c2293600605c1d5dd.attr
│ │ ├── MJRefreshFooter_footerWithRefreshingBlock:{class}.7b0806c0686d1afa44b5fed238c938ea.attr
│ │ ├── MJRefreshFooter_footerWithRefreshingTarget:refreshingAction:{class}.1e0bbbdfa84d1cb2fec223b55831736b.attr
│ │ ├── MJRefreshFooter_ignoredScrollViewContentInsetBottom{instance}.bd00196e69f4c011b59698fe4d2a578d.attr
│ │ ├── MJRefreshFooter_isAutomaticallyHidden{instance}.539b1a347be7479872b339b540520f84.attr
│ │ ├── MJRefreshFooter_noticeNoMoreData{instance}.494f0af619d71dbb29db8dfc8f282251.attr
│ │ ├── MJRefreshFooter_prepare{instance}.ddd00b0bdc007d8acb701df2df7655ca.attr
│ │ ├── MJRefreshFooter_resetNoMoreData{instance}.b274245415c7498741c88078022d456f.attr
│ │ ├── MJRefreshFooter_setAutomaticallyHidden:{instance}.7f162ef8d8c58276b815aef7bde84b8d.attr
│ │ ├── MJRefreshFooter_willMoveToSuperview:{instance}.3e71353e4d67175789d2dd970e67fd37.attr
│ │ ├── MJRefreshGifHeader_gifView{instance}.f27c0323d39ba73d7475591753b0d820.attr
│ │ ├── MJRefreshGifHeader_placeSubviews{instance}.3b12f3d808f6e873748f71aeeae3b0eb.attr
│ │ ├── MJRefreshGifHeader_setImages:duration:forState:{instance}.c9ff89babbdd988caa30a42380238d0f.attr
│ │ ├── MJRefreshGifHeader_setImages:forState:{instance}.eedc47d9f24c22cecd1d33d19b2da587.attr
│ │ ├── MJRefreshGifHeader_setPullingPercent:{instance}.09714a93b584cd6ad3c07c560b76c445.attr
│ │ ├── MJRefreshGifHeader_setState:{instance}.81dabe1e4914cef626e0420acceaa1fa.attr
│ │ ├── MJRefreshGifHeader_setStateDurations:{instance}.cb90550e9c001b7d22445dff685c9b49.attr
│ │ ├── MJRefreshGifHeader_setStateImages:{instance}.217cdc2960d0cb5cfa9a2e4ae4d09020.attr
│ │ ├── MJRefreshGifHeader_stateDurations{instance}.ee55fb0d6525e622971f502c74682d20.attr
│ │ ├── MJRefreshGifHeader_stateImages{instance}.c45aa4d25429518b434a1b8d924d07b3.attr
│ │ ├── MJRefreshHeader_drawRect:{instance}.c3e57b4a302b533c30bf09ca94992915.attr
│ │ ├── MJRefreshHeader_endRefreshing{instance}.fb3fecfe4e2f8b20f48a86c39ec8d2c8.attr
│ │ ├── MJRefreshHeader_headerWithRefreshingBlock:{class}.86bd7d9042726fde59582daf33cccd26.attr
│ │ ├── MJRefreshHeader_headerWithRefreshingTarget:refreshingAction:{class}.38704964b164af751351ca0df311361c.attr
│ │ ├── MJRefreshHeader_ignoredScrollViewContentInsetTop{instance}.99e38b0442fb57279fcf578ee0856f11.attr
│ │ ├── MJRefreshHeader_insetTDelta{instance}.f1d969234e8c5d3b96269951bbbaa1ed.attr
│ │ ├── MJRefreshHeader_lastUpdatedTimeKey{instance}.736b450172ca1b7659d372d44199258c.attr
│ │ ├── MJRefreshHeader_lastUpdatedTime{instance}.2a89276f34032f5c83485ead73d73c79.attr
│ │ ├── MJRefreshHeader_placeSubviews{instance}.1feae4d44bd11e658f4aca7d5d6cc6cb.attr
│ │ ├── MJRefreshHeader_prepare{instance}.f8820581ac423aeb157abb616851572d.attr
│ │ ├── MJRefreshHeader_scrollViewContentOffsetDidChange:{instance}.052321827b6bd024a37e6ccf4c6f5eaa.attr
│ │ ├── MJRefreshHeader_setInsetTDelta:{instance}.5d742f6f339f68a1f87cf30bc1161584.attr
│ │ ├── MJRefreshHeader_setLastUpdatedTimeKey:{instance}.cf5e73d71d6aa690207f374bade9c3be.attr
│ │ ├── MJRefreshHeader_setState:{instance}.613dbd07b62ad0844ea350e1c213bfec.attr
│ │ ├── MJRefreshNormalHeader_activityIndicatorViewStyle{instance}.5c09ef3cfb75bbb7a06ebd6bfd64b069.attr
│ │ ├── MJRefreshNormalHeader_arrowView{instance}.3c9cde775fac361e9e6fbd5ed8ee6d86.attr
│ │ ├── MJRefreshNormalHeader_loadingView{instance}.bac4283eefad58aa66ec42809991591a.attr
│ │ ├── MJRefreshNormalHeader_placeSubviews{instance}.1637f8c1509d5ff960a7ee2b01a93543.attr
│ │ ├── MJRefreshNormalHeader_prepare{instance}.c5161195985077e841f425b250b31545.attr
│ │ ├── MJRefreshNormalHeader_setActivityIndicatorViewStyle:{instance}.f54ee85457d5aef8dcad8becafed4dbe.attr
│ │ ├── MJRefreshNormalHeader_setLoadingView:{instance}.008c3e796908f69ecfe7554e5d5d05bf.attr
│ │ ├── MJRefreshNormalHeader_setState:{instance}.cf4cc9b8ba9cb613d7b7656d100e6a5c.attr
│ │ ├── MJRefreshStateHeader_currentCalendar{instance}.8a5d265e54d2287dcf9ab73daf03a0db.attr
│ │ ├── MJRefreshStateHeader_lastUpdatedTimeLabel{instance}.39c3adf46f0e72fe1ca7bdb144690d58.attr
│ │ ├── MJRefreshStateHeader_lastUpdatedTimeText{instance}.fea5b80b2c312ffc0724847799055792.attr
│ │ ├── MJRefreshStateHeader_placeSubviews{instance}.3551b50672d8958430e0714f4a86608a.attr
│ │ ├── MJRefreshStateHeader_prepare{instance}.f22a66a2819564c00d25b26a8008dc49.attr
│ │ ├── MJRefreshStateHeader_setLastUpdatedTimeKey:{instance}.49b3e932b043bc723eadea72e523c08a.attr
│ │ ├── MJRefreshStateHeader_setState:{instance}.9e5202b000baef8593570a086f6041cc.attr
│ │ ├── MJRefreshStateHeader_setStateTitles:{instance}.4b4f630c8af3e6c520900e530b6c9ae3.attr
│ │ ├── MJRefreshStateHeader_setTitle:forState:{instance}.7245f932111276c34a890fcd85654763.attr
│ │ ├── MJRefreshStateHeader_stateLabel{instance}.0d68c4cd4f8dbfeb7f2359f4d961670f.attr
│ │ ├── MJRefreshStateHeader_stateTitles{instance}.38ba9a44aa4289fe8e20bd9863f71a73.attr
│ │ ├── NSArray_arrayWithArray:{class}.73f5cb7c9141d67fe274805a736dc06e.attr
│ │ ├── NSArray_arrayWithObjects:{class}.46b7a97f9f82af16db819040ffbc6603.attr
│ │ ├── NSArray_array{class}.5a4c6dc6cba477ecd82af04178b5f4a0.attr
│ │ ├── NSArray_count{instance}.0f9e592ac8b06ac1a4812f56dc101f92.attr
│ │ ├── NSArray_firstObject{instance}.0dac2e2203b47615244e42ddad98a5f3.attr
│ │ ├── NSArray_lastObject{instance}.4e2e110e52d16989fb6cb503ef918b3c.attr
│ │ ├── NSArray_nextObject{instance}.905860e33a13a5c1c2b249d0d5af276f.attr
│ │ ├── NSArray_objectAtIndex:{instance}.c3cbf46405a13796ce7b5e1d8abd77da.attr
│ │ ├── NSArray_objectAtIndexedSubscript:{instance}.6183d087c46b327219d51c99baba2644.attr
│ │ ├── NSArray_reverseObjectEnumerator{instance}.12852ddfee3dc490afb9c870b6d9170a.attr
│ │ ├── NSAssertionHandler_currentHandler{class}.d6e3a736ec59e36423f239e0912fca50.attr
│ │ ├── NSAttributedString_initWithString:attributes:{instance}.b2a1c2be8262fb402ba1226f32dccbfa.attr
│ │ ├── NSAttributedString_size{instance}.4c91b9dd838acfca4e9d11510dbc48f9.attr
│ │ ├── NSCalendar_calendarWithIdentifier:{class}.56be867910b3643d840f3d908fc520dd.attr
│ │ ├── NSCalendar_components:fromDate:{instance}.878c2f8f9773a68b1749285e5f8e3c57.attr
│ │ ├── NSCalendar_currentCalendar{class}.2feb2436d3331c83e256a47a9598da37.attr
│ │ ├── NSDateComponents_day{instance}.0cc152f755ea10345c10d6ab173818f7.attr
│ │ ├── NSDateComponents_year{instance}.135dd79c9a528bb28e42248f13b509cc.attr
│ │ ├── NSDateFormatter_setDateFormat:{instance}.a70dbd598b901160fb88ec02d8f41a4c.attr
│ │ ├── NSDateFormatter_stringFromDate:{instance}.7c386ab69e42be73312e58a382628e26.attr
│ │ ├── NSDate_date{class}.3d31718970bc6b1329ef1b1edcc8276d.attr
│ │ ├── NSDate_timeIntervalSinceDate:{instance}.3f0066dd0493c4cc0866d3d7d57c29cb.attr
│ │ ├── NSDictionary___objc_dictionary_literal:{class}.2cc6bfd9e03a972257568194f9e67021.attr
│ │ ├── NSDictionary_dictionaryWithDictionary:{class}.cd7e53733b5fda00c29543190f2dab25.attr
│ │ ├── NSDictionary_dictionary{class}.e338f0f034113194542b33e53b663edf.attr
│ │ ├── NSDictionary_initWithObjectsAndKeys:{instance}.bfa3685ce08fed831cbb944ba40821d0.attr
│ │ ├── NSDictionary_objectForKeyedSubscript:{instance}.9dedd7e44ab6ec6a9718a528470b227d.attr
│ │ ├── NSEnumerator_nextObject{instance}.0322b08da1588005f42f65c59a81703b.attr
│ │ ├── NSException_raise:format:{class}.c218a1c123623778144013ca4b657f12.attr
│ │ ├── NSMutableArray_addObject:{instance}.5da7801d846b260275d13172e4fd833f.attr
│ │ ├── NSMutableDictionary_addEntriesFromDictionary:{instance}.14013431c33fe375a8455569b3466326.attr
│ │ ├── NSMutableDictionary_setObject:forKeyedSubscript:{instance}.88e167e2bb625b70bc6f6c0a42668a23.attr
│ │ ├── NSNotificationCenter_addObserver:selector:name:object:{instance}.d8590a494e2626ba1d737df9df98e4db.attr
│ │ ├── NSNotificationCenter_defaultCenter{class}.4f7c3cb78df6c66860599cda99ac8b8e.attr
│ │ ├── NSNotificationCenter_removeObserver:name:object:{instance}.76a492e0632b48f2ba9ac28c0affcc30.attr
│ │ ├── NSNull_null{class}.4cdc12943af510da40c0a0c27e47e0f0.attr
│ │ ├── NSNumber_boolValue{instance}.e4893df39cae4a256f2380575788be54.attr
│ │ ├── NSNumber_floatValue{instance}.84fcbed74c16528537b3ea5efc31b740.attr
│ │ ├── NSNumber_numberWithBool:{class}.f2deb31f15437b8867202d7ed0d8f349.attr
│ │ ├── NSNumber_numberWithDouble:{class}.2f131d3300739acd32e1b7a585149f88.attr
│ │ ├── NSNumber_numberWithFloat:{class}.94fb77dd79b333aaed1a5f016be662d9.attr
│ │ ├── NSNumber_numberWithInteger:{class}.3038ee3633f763bed71abfbfdc809f6e.attr
│ │ ├── NSObject_addObserver:forKeyPath:options:context:{instance}.128bb4105c9090708dbbbab2f2ca6b2a.attr
│ │ ├── NSObject_awakeFromNib{instance}.7f4a69fcaef89cd61de6a10cbca6763d.attr
│ │ ├── NSObject_cancelPreviousPerformRequestsWithTarget:{class}.8f9c67f6629bf621b978bc97bffcad31.attr
│ │ ├── NSObject_copy{instance}.580600ed244fca5c057f9989b248eca2.attr
│ │ ├── NSObject_didChangeValueForKey:{instance}.8adfe9d247985ab2cfb5ff06b13dff1a.attr
│ │ ├── NSObject_exchangeClassMethod1:method2:{class}.71d689a434ca09b8cb8f74bbec7f4eb5.attr
│ │ ├── NSObject_exchangeInstanceMethod1:method2:{class}.96dfacd3a3ff34cf35523d85905b2d24.attr
│ │ ├── NSObject_init{instance}.a9cbb5363d8c7a60d726fbff19001bf9.attr
│ │ ├── NSObject_isKindOfClass:{instance}.757d2e3904bfd44b044e734bfc4139a5.attr
│ │ ├── NSObject_performSelector:withObject:afterDelay:{instance}.be441d6c4c6bbe45bc39bb0a6f13a3e4.attr
│ │ ├── NSObject_performSelectorOnMainThread:withObject:waitUntilDone:{instance}.c04af645454fffffe2b35e80847de072.attr
│ │ ├── NSObject_removeObserver:forKeyPath:{instance}.d01714f3860a2ea0b2b5d61be80c45d1.attr
│ │ ├── NSObject_respondsToSelector:{instance}.1f130cc6d2f85e175c04db8e1caf0088.attr
│ │ ├── NSObject_valueForKeyPath:{instance}.121d4741c9cda1c7173b9bdc4a4163e6.attr
│ │ ├── NSObject_willChangeValueForKey:{instance}.e5bccbb6868b934c9411a6308d4ab574.attr
│ │ ├── NSRunLoop_addTimer:forMode:{instance}.1bcdd94e70af8c43e1d4402566833994.attr
│ │ ├── NSRunLoop_currentRunLoop{class}.065a7a5dbd7cef74f9536194dcb90aef.attr
│ │ ├── NSSet_anyObject{instance}.af7cec527f1fd27dcf9e0471109fd643.attr
│ │ ├── NSString_boundingRectWithSize:options:attributes:context:{instance}.2df85a2d3dc840f02c1e25e051b0c64d.attr
│ │ ├── NSString_isEqualToString:{instance}.dec2551d2b640c984af1dcbb0bbc09bf.attr
│ │ ├── NSString_length{instance}.a8a4fc57e4b1be8ff5e74267bacb5a39.attr
│ │ ├── NSString_sizeWithAttributes:{instance}.bb0ef614f8af1bf78f0643f823f7f825.attr
│ │ ├── NSString_stringByAppendingPathComponent:{instance}.0d669413fdefb3ee003b28c2e8c98c97.attr
│ │ ├── NSString_stringWithFormat:{class}.0c23bd53945e16ff03395a53fad2c613.attr
│ │ ├── NSString_stringWithUTF8String:{class}.a244cdea666ec44c14a50b4e35422a5a.attr
│ │ ├── NSThread_detachNewThreadSelector:toTarget:withObject:{class}.ea7c7a072ac4ebb1739d38149cd67ce3.attr
│ │ ├── NSThread_isMainThread{class}.8a097307ec61e16f1d9aca8957b34c27.attr
│ │ ├── NSTimer_scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:{class}.7e0dd39eae48ecdcf7e5a4dfd8c1a8ab.attr
│ │ ├── NSTimer_timerWithTimeInterval:target:selector:userInfo:repeats:{class}.ba6152c08738512cf1d8d3ed23f91a5f.attr
│ │ ├── NSUserDefaults_objectForKey:{instance}.6a736c858820440b9fb7e7bb989e29ca.attr
│ │ ├── NSUserDefaults_setObject:forKey:{instance}.5e04418fd217107d46c5ee4a927e2950.attr
│ │ ├── NSUserDefaults_standardUserDefaults{class}.8586e9dd0243e961e456b72f0e385088.attr
│ │ ├── NSUserDefaults_synchronize{instance}.566cee594928cff507a4b361d331eb65.attr
│ │ ├── UIActivityIndicatorView_initWithActivityIndicatorStyle:{instance}.686b39dbd6130831f4f596a496925229.attr
│ │ ├── UIActivityIndicatorView_setColor:{instance}.631d527193bd37f518c551d94f783091.attr
│ │ ├── UIActivityIndicatorView_setHidesWhenStopped:{instance}.5a63bb51473681194292c1f220b1e850.attr
│ │ ├── UIActivityIndicatorView_startAnimating{instance}.726b2a8146ee530895e73bd14a9ca02e.attr
│ │ ├── UIActivityIndicatorView_stopAnimating{instance}.762f63490221703422041e428618707d.attr
│ │ ├── UIBezierPath_CGPath{instance}.a445b02f43b2a23c22ee800024b5cbab.attr
│ │ ├── UIBezierPath_addArcWithCenter:radius:startAngle:endAngle:clockwise:{instance}.e3553dfdf35173592b926fdb144cd888.attr
│ │ ├── UIBezierPath_addLineToPoint:{instance}.3517513044772845e4d9e6445f8867d9.attr
│ │ ├── UIBezierPath_bezierPath{class}.7f9ae66976a90eaf739696c997fe9fc9.attr
│ │ ├── UIBezierPath_closePath{instance}.be9df4ae3c60793ff53f707c8224c555.attr
│ │ ├── UIBezierPath_moveToPoint:{instance}.c79bfbd33abb9a5389cc40da6796073d.attr
│ │ ├── UIBezierPath_setLineCapStyle:{instance}.9e889c2a613ffd858e579dbf69bc1324.attr
│ │ ├── UIBezierPath_setLineWidth:{instance}.88b9a75ad8d9dfcd01048acb45b97d12.attr
│ │ ├── UIBezierPath_stroke{instance}.29a9f86895dc451dacc08f9383ceb210.attr
│ │ ├── UICollectionView_exchangeInstanceMethod1:method2:{class}.8f3805d0d4c7e406484eb6c46768b9e9.attr
│ │ ├── UICollectionView_load{class}.d1e03b913041c5304ea6e6aaae62516c.attr
│ │ ├── UICollectionView_mj_reloadData{instance}.9bef8e95c2259d92fdae989582bb1f01.attr
│ │ ├── UICollectionView_numberOfItemsInSection:{instance}.2205eeefdaf761dd5195364e3bdbee69.attr
│ │ ├── UICollectionView_numberOfSections{instance}.fc89bcbc428c0e925c8e719b344b5ca9.attr
│ │ ├── UIColor_CGColor{instance}.f5ecbc4894a012cb3b4a04efa282c7b7.attr
│ │ ├── UIColor_blackColor{class}.46ede24821f1f2d54f006111646d26fa.attr
│ │ ├── UIColor_clearColor{class}.25d7256e95f6af4d2c0861039007243f.attr
│ │ ├── UIColor_colorWithAlphaComponent:{instance}.dd512154e7f94f56b56e00b6e2d443b6.attr
│ │ ├── UIColor_colorWithRed:green:blue:alpha:{class}.64a6f7ddc1864ad6e93df9a14cd41d82.attr
│ │ ├── UIColor_initWithWhite:alpha:{instance}.ea873fd63315c61c4099c75a94879989.attr
│ │ ├── UIColor_setFill{instance}.5fa3c963e716d90c8a63be7ffeea2c2f.attr
│ │ ├── UIColor_setStroke{instance}.1e8c957c23295bc168bee3e09efe3d17.attr
│ │ ├── UIColor_set{instance}.d7a24e329074be7deaa76154b826ed83.attr
│ │ ├── UIColor_whiteColor{class}.9b53921418410c49c69a221d4b6e51cd.attr
│ │ ├── UIControl_sendActionsForControlEvents:{instance}.7ab324ce1f2330b7bf5f623fd4ade166.attr
│ │ ├── UIEdgeInsetsMake{705028a55d4fee0bbc295b270638c368}.f40f0a913c04ca8641baa16af33549b2.attr
│ │ ├── UIFont_boldSystemFontOfSize:{class}.6108f1febb9408b875a34c06ed122b7a.attr
│ │ ├── UIFont_systemFontOfSize:{class}.9b318e42bf117f3a5a0bfaa19275a53d.attr
│ │ ├── UIGestureRecognizer_initWithTarget:action:{instance}.d20213482c0d76613243d4599a25e3b0.attr
│ │ ├── UIGestureRecognizer_state{instance}.72d3b4528beba9fed05f1ae9f3a094ea.attr
│ │ ├── UIGraphicsGetCurrentContext.009d5161ebfaed78bdca47d702bc6418.attr
│ │ ├── UIGraphicsPopContext.0928809562c91cf79a57a329e7e9a4ad.attr
│ │ ├── UIGraphicsPushContext.e73809d88e498128f47750f2c68fb132.attr
│ │ ├── UIImageView_image{instance}.e6b6b82ede62a75b05f9e95e34ad1d7a.attr
│ │ ├── UIImageView_initWithImage:{instance}.018262108f526bf12f9ade60d5fbe567.attr
│ │ ├── UIImageView_setAnimationDuration:{instance}.a74491675b3119c5d2de2242230e0df2.attr
│ │ ├── UIImageView_setAnimationImages:{instance}.61e950b1fd0d052dc20a5e3e9ef151a0.attr
│ │ ├── UIImageView_setImage:{instance}.c627e5b9b438d458859cf58d0a2e81f8.attr
│ │ ├── UIImageView_startAnimating{instance}.c464c413b7b3333652b8115b1afdacb8.attr
│ │ ├── UIImageView_stopAnimating{instance}.e5b07b7994b0cc7ed263f16c3c656d50.attr
│ │ ├── UIImage_CGImage{instance}.a9dc7f3473cf1a1d874d869a22c88c49.attr
│ │ ├── UIImage_imageNamed:{class}.e8c6d5f00a6eeef0fa342fd5065b6979.attr
│ │ ├── UIImage_size{instance}.278a524c30a719737b5502caa26a9cab.attr
│ │ ├── UILabel_font{instance}.65291af887b5b39270095e2fc5445e28.attr
│ │ ├── UILabel_label{class}.afa07640ba686955a2a7362d25bc45b7.attr
│ │ ├── UILabel_setAdjustsFontSizeToFitWidth:{instance}.98c95f6466e382b4da1bac6936f2def2.attr
│ │ ├── UILabel_setFont:{instance}.605d4c00f146c7ba4aabc2fee3e4367f.attr
│ │ ├── UILabel_setNumberOfLines:{instance}.92a9c34957d9852ce38bf7dbf0b20922.attr
│ │ ├── UILabel_setText:{instance}.abe14bc97d99fda5d472956538c9383a.attr
│ │ ├── UILabel_setTextAlignment:{instance}.4908bb9cf71a2c7c85bd19545b76c727.attr
│ │ ├── UILabel_setTextColor:{instance}.caae9447da5a175b8206e83c00953f82.attr
│ │ ├── UILabel_setUserInteractionEnabled:{instance}.c2d339af2fc5dd453d8cd9de654707be.attr
│ │ ├── UILabel_text{instance}.35fc1826e3b0ff188d9eee1358b317d1.attr
│ │ ├── UIRectFill.3d2c0ca4b41800cd9c278779a94d31eb.attr
│ │ ├── UIResponder_nextResponder{instance}.cd790ed750397388a1867a17022e0b1d.attr
│ │ ├── UIResponder_touchesBegan:withEvent:{instance}.cb347b9b9b9cddc7da875ff9a9beb3e2.attr
│ │ ├── UIResponder_touchesEnded:withEvent:{instance}.597eb0f7e280ba0732deb6f9c273c728.attr
│ │ ├── UIResponder_touchesMoved:withEvent:{instance}.b8debe8a7558c7089892858ca8322ad0.attr
│ │ ├── UIScreen_mainScreen{class}.934832fad1215042efad457357d981e7.attr
│ │ ├── UIScreen_scale{instance}.37770ea77184b324005e335c80f21931.attr
│ │ ├── UIScrollView_contentInset{instance}.809545d6ddbddcfa01bc8d96bf05ce5c.attr
│ │ ├── UIScrollView_contentOffset{instance}.03a66915b30c9c364c50eba29a2c5ba9.attr
│ │ ├── UIScrollView_contentSize{instance}.7c944fb1ab90ddc3b94bb328d9e64ab7.attr
│ │ ├── UIScrollView_executeReloadDataBlock{instance}.2ca85f7effafbea15ae2c2975b285598.attr
│ │ ├── UIScrollView_footer{instance}.8fce697ac57901aefeb1dacc2f5a47fb.attr
│ │ ├── UIScrollView_header{instance}.e36f42d4e2603c64553db7a0edc46a00.attr
│ │ ├── UIScrollView_isDragging{instance}.7133375b2bcf4d6809489e19e834beff.attr
│ │ ├── UIScrollView_mj_contentH{instance}.24036d4daf4502909755d50e306cf8aa.attr
│ │ ├── UIScrollView_mj_contentW{instance}.b233414ab82901bfa5e9c481f02eed57.attr
│ │ ├── UIScrollView_mj_footer{instance}.ba19ff126339a1f9cc565424123dd04a.attr
│ │ ├── UIScrollView_mj_header{instance}.de4dca3362b06a6fcebf0d4f8ea6605d.attr
│ │ ├── UIScrollView_mj_insetB{instance}.027c674f176050465f25d28555c82310.attr
│ │ ├── UIScrollView_mj_insetL{instance}.69019a4b689dc5e9480034298613a0c4.attr
│ │ ├── UIScrollView_mj_insetR{instance}.8115b31217137fcbfb89f6bc0a2b4fbb.attr
│ │ ├── UIScrollView_mj_insetT{instance}.dac71a98dc5d026ebd267231dbdea13e.attr
│ │ ├── UIScrollView_mj_offsetX{instance}.add36016215f1fb4cf2e3cdb7c52da44.attr
│ │ ├── UIScrollView_mj_offsetY{instance}.d3262116c9f7c7ee5e0b4e48645e0584.attr
│ │ ├── UIScrollView_mj_reloadDataBlock{instance}.768a89e8546301059a84c1fcc484d254.attr
│ │ ├── UIScrollView_mj_totalDataCount{instance}.6c960100dbafbe2ab276237e1d1d821d.attr
│ │ ├── UIScrollView_panGestureRecognizer{instance}.1de5fbb878e0815eb4316f32991830bd.attr
│ │ ├── UIScrollView_scrollRectToVisible:animated:{instance}.b010a37e6e0d5f49efb0134761bf7f90.attr
│ │ ├── UIScrollView_setAlwaysBounceVertical:{instance}.ad65d80697dd4c7d83b60ccc779f1492.attr
│ │ ├── UIScrollView_setContentInset:{instance}.f5f5bf643ed22f851f9a5c1d69b643bf.attr
│ │ ├── UIScrollView_setContentOffset:{instance}.c7c935e6eefcb263db577dcf6fe585d7.attr
│ │ ├── UIScrollView_setContentSize:{instance}.9e194cc3b6f4c11cc984e7b204b1fe32.attr
│ │ ├── UIScrollView_setFooter:{instance}.228b084c44c3768d2822fc3e5ea603c3.attr
│ │ ├── UIScrollView_setHeader:{instance}.0e813252b26bad8d7194457a9c6ba149.attr
│ │ ├── UIScrollView_setMj_contentH:{instance}.834d14f06ceb43250beab703d0ccfc0a.attr
│ │ ├── UIScrollView_setMj_contentW:{instance}.e5a6e3a2cd405961dfb5c0d27d352b8d.attr
│ │ ├── UIScrollView_setMj_footer:{instance}.2cd77804053e8f9f52d938b68b3a588d.attr
│ │ ├── UIScrollView_setMj_header:{instance}.bd1cfdba85638094043a7255cd38d0ea.attr
│ │ ├── UIScrollView_setMj_insetB:{instance}.5a71cb186a3ec20d90f8bd47b9dac47d.attr
│ │ ├── UIScrollView_setMj_insetL:{instance}.e64529e7d174d17a7bec9ddea732217e.attr
│ │ ├── UIScrollView_setMj_insetR:{instance}.12aee9fa466171ca35f2b72511ac6b2c.attr
│ │ ├── UIScrollView_setMj_insetT:{instance}.48d5cd4609dcdd5cff9a9c427036d431.attr
│ │ ├── UIScrollView_setMj_offsetX:{instance}.e4bac092fb29b1d9c57a97f035e115ee.attr
│ │ ├── UIScrollView_setMj_offsetY:{instance}.b20c4dbf093bd5a03175f1fa88401744.attr
│ │ ├── UIScrollView_setMj_reloadDataBlock:{instance}.76ba198ea223a97ea4f70bb1841542da.attr
│ │ ├── UIScrollView_setScrollEnabled:{instance}.45832e63699ae4c09e268546c06b603c.attr
│ │ ├── UIScrollView_setScrollsToTop:{instance}.1781c1c7913dbf277b060b2ad000f7d1.attr
│ │ ├── UIScrollView_setShowsHorizontalScrollIndicator:{instance}.4d9fa3a033af752cfc9b2957780a9a18.attr
│ │ ├── UIScrollView_setShowsVerticalScrollIndicator:{instance}.4cf4244522f213cf763e4da1b739c164.attr
│ │ ├── UITableView_exchangeInstanceMethod1:method2:{class}.6c90bca382792c410ed205c1df305598.attr
│ │ ├── UITableView_load{class}.84c274c5438215fdde4219bec1285f66.attr
│ │ ├── UITableView_mj_reloadData{instance}.8779ce6889d187a3a60ecee233b45a4d.attr
│ │ ├── UITableView_numberOfRowsInSection:{instance}.97c4ed6b84f71b6f8639bfe7e36b45dd.attr
│ │ ├── UITableView_numberOfSections{instance}.d3b6f58354cc85621d3844e12b016ff7.attr
│ │ ├── UITouch_locationInView:{instance}.6a054f5819a4dc8bfe1a464ab790d241.attr
│ │ ├── UIView_addGestureRecognizer:{instance}.5d657f4e80ce5c4fd6a6d26e7b07abbc.attr
│ │ ├── UIView_addSubview:{instance}.c934a3bd40a524ae869862a432f5e368.attr
│ │ ├── UIView_animateWithDuration:animations:completion:{class}.2fbae83d2d4b3075330b6acd0123fbf8.attr
│ │ ├── UIView_animateWithDuration:animations:{class}.f3ad807f22a7e5fef7f44ca9221e0e54.attr
│ │ ├── UIView_beginAnimations:context:{class}.13586b086f490c5804a3dd8a161b01eb.attr
│ │ ├── UIView_bounds{instance}.dfdcdac9b90b82d6d190dbcd41287c8c.attr
│ │ ├── UIView_commitAnimations{class}.a170df192a6bc57c8a780671db28cb97.attr
│ │ ├── UIView_constraints{instance}.b352270b6842071fcf82725e671f866e.attr
│ │ ├── UIView_drawRect:{instance}.220292325593a2ab2703e71165083697.attr
│ │ ├── UIView_frame{instance}.e774555e447e80fc64977496e0756bf6.attr
│ │ ├── UIView_initWithCoder:{instance}.1f4ad3ff1b1143efe631e41eec3f5f69.attr
│ │ ├── UIView_initWithFrame:{instance}.999cfd7adff53531c19a1800d4b26074.attr
│ │ ├── UIView_insertSubview:atIndex:{instance}.eeda326685d1a257553b02a0fad012d1.attr
│ │ ├── UIView_isHidden{instance}.2f69e83805c7bd9ee39652f78fe8ec50.attr
│ │ ├── UIView_isUserInteractionEnabled{instance}.8e4a5c03a7a25defaaf97fd11479aa6d.attr
│ │ ├── UIView_layer{instance}.718eacf24871543710ae657b71dd6bd7.attr
│ │ ├── UIView_layoutSubviews{instance}.eea9f1b8f1b5a78329564f6b6acc13b4.attr
│ │ ├── UIView_mj_h{instance}.ee1ab511f6d44208e5e19010a90366d1.attr
│ │ ├── UIView_mj_origin{instance}.2920f5c507be706665b2cd16dee7bd48.attr
│ │ ├── UIView_mj_size{instance}.1a606f4737e097976c18bab3c2937c8a.attr
│ │ ├── UIView_mj_w{instance}.40d5044cb68b9af45a11d48702981b38.attr
│ │ ├── UIView_mj_x{instance}.68420f3d9cbd6af5459acfe1f5ff8969.attr
│ │ ├── UIView_mj_y{instance}.5ee543392493c0ac7824532a483f2ecb.attr
│ │ ├── UIView_removeFromSuperview{instance}.ffbbc6f0cb8ecaa369141c8b7f532f5d.attr
│ │ ├── UIView_setAlpha:{instance}.37c5d037012d55dd3560f77cc1fa7a6f.attr
│ │ ├── UIView_setAnimationDelegate:{class}.50bc488c433dafa113af1fe4ea2d5611.attr
│ │ ├── UIView_setAnimationDidStopSelector:{class}.6a7928deb7b9b1b3dc2603d6784c9b4d.attr
│ │ ├── UIView_setAnimationDuration:{class}.965cf2440653ae52eecea15019ba704f.attr
│ │ ├── UIView_setAutoresizingMask:{instance}.a5cdfea613aa444e8dc67662733c0332.attr
│ │ ├── UIView_setBackgroundColor:{instance}.451fb747cf7fc6379f90628489956b27.attr
│ │ ├── UIView_setBounds:{instance}.0aff0d58436c27abfee4c4849f09e33e.attr
│ │ ├── UIView_setCenter:{instance}.9f0bbd04d0b4ce5e2e2c991d737e2289.attr
│ │ ├── UIView_setContentMode:{instance}.fa1cca3e860c2ed84d8700492042c119.attr
│ │ ├── UIView_setFrame:{instance}.e1f4e66623b3536d72fe2f949afeb9ea.attr
│ │ ├── UIView_setHidden:{instance}.eb45b6df3bae1f0ccaffc74c6b88668a.attr
│ │ ├── UIView_setMj_h:{instance}.e3c6b5717320a086e65063710338abec.attr
│ │ ├── UIView_setMj_origin:{instance}.172127b30d28a15fd36a401db0f22d36.attr
│ │ ├── UIView_setMj_size:{instance}.489fcf45b45f241ec7b42263ac5af8d5.attr
│ │ ├── UIView_setMj_w:{instance}.f49ebde9182999565f9e96ae7c6f508c.attr
│ │ ├── UIView_setMj_x:{instance}.055a79745f644de01d6f4b9ebac4198d.attr
│ │ ├── UIView_setMj_y:{instance}.48f4dc71b9e738f0a240f9bf0482deb2.attr
│ │ ├── UIView_setNeedsDisplay{instance}.8e6b550f944d6019a6ed88f57214706f.attr
│ │ ├── UIView_setNeedsLayout{instance}.b8c290f62d91388862b1652f0a26d702.attr
│ │ ├── UIView_setOpaque:{instance}.f9eb73db4abc14bc58e9a4403fda266c.attr
│ │ ├── UIView_setTransform:{instance}.92302a29ddb7c4e064002ae5b0da286b.attr
│ │ ├── UIView_subviews{instance}.b8fef094369377a86291add963fee252.attr
│ │ ├── UIView_superview{instance}.b54fb789be2c477c4f47f51e13f9a9de.attr
│ │ ├── UIView_willMoveToSuperview:{instance}.83e241c7ea1cdc09f9c8fb6e0d35e505.attr
│ │ ├── UIView_window{instance}.a9414123fc356526946920d8cd289dfc.attr
│ │ ├── __infer_assume.763fa5689f30d86011d25fe6db5d82b0.attr
│ │ ├── __inline_isnand.9daa6d15806960182ff01bb9776dc168.attr
│ │ ├── __inline_isnanf.d7f7e2f6701f527453d27757c1cd0bb7.attr
│ │ ├── __inline_isnanl.0e383e1e13fc7d27d7793ad3d239ef63.attr
│ │ ├── __objc_anonymous_block_HMSegmentedControl_drawRect:______1.ac00e0b31d310500f8d60cbc5fe837d4.attr
│ │ ├── __objc_anonymous_block_HMSegmentedControl_drawRect:______2.7bdf1a5d4cc5e5ba3c504eddfeac85db.attr
│ │ ├── __objc_anonymous_block_HMSegmentedControl_drawRect:______3.471cb3b49d3a9cab6761cbe3ec1d252c.attr
│ │ ├── __objc_anonymous_block_HMSegmentedControl_updateSegmentsRects______4.429f1ffb7ec31f9a9c435111bc406f9c.attr
│ │ ├── __objc_anonymous_block_HMSegmentedControl_updateSegmentsRects______5.a41e476bf4b88c8e9f84999dce16c732.attr
│ │ ├── __objc_anonymous_block_HMSegmentedControl_updateSegmentsRects______6.dee26246d5e256df34bdf8b19b84cde7.attr
│ │ ├── __objc_anonymous_block_HMSegmentedControl_updateSegmentsRects______7.269aa7e8b4620722a518c763475e9f4f.attr
│ │ ├── __objc_anonymous_block_MBProgressHUD_showAnimated:whileExecutingBlock:onQueue:completionBlock:______.409368d69a6b2c45cfe2d573b5fa37c4.attr
│ │ ├── __objc_anonymous_block_MJRefreshAutoFooter_setState:______1.aedcdd766515748b002173dc90ceff19.attr
│ │ ├── __objc_anonymous_block_MJRefreshBackFooter_endRefreshing______5.f746c28cdd1c3f742fca6eecb5947b8b.attr
│ │ ├── __objc_anonymous_block_MJRefreshBackFooter_noticeNoMoreData______6.76d263dba46eb0370ed7480e9cb3b56f.attr
│ │ ├── __objc_anonymous_block_MJRefreshBackFooter_setState:______1.cfa28ad1b71153eff2ab2df148a9350c.attr
│ │ ├── __objc_anonymous_block_MJRefreshBackFooter_setState:______2.8de7ef77687044e540ac043423b63632.attr
│ │ ├── __objc_anonymous_block_MJRefreshBackFooter_setState:______3.b2c868550af9354ff62f3e4fc3848162.attr
│ │ ├── __objc_anonymous_block_MJRefreshBackFooter_setState:______4.ab8afe779bff8ed6270e2d15f642c4fe.attr
│ │ ├── __objc_anonymous_block_MJRefreshBackNormalFooter_setState:______1.7522c36b71d1ab187151be463eff1098.attr
│ │ ├── __objc_anonymous_block_MJRefreshBackNormalFooter_setState:______2.c0b565ccdc6399fe31cea3f918a63d77.attr
│ │ ├── __objc_anonymous_block_MJRefreshBackNormalFooter_setState:______3.96e6d447a9ecb2dbbf0a435a452011fe.attr
│ │ ├── __objc_anonymous_block_MJRefreshBackNormalFooter_setState:______4.fc556a200c10aeee80632a7de7f14568.attr
│ │ ├── __objc_anonymous_block_MJRefreshComponent_beginRefreshing______1.21a03cc40ef29fea9c999c520e574567.attr
│ │ ├── __objc_anonymous_block_MJRefreshComponent_executeRefreshingCallback______2.ac25df20ab117714920dc4367d5da310.attr
│ │ ├── __objc_anonymous_block_MJRefreshFooter_willMoveToSuperview:______1.06e600200d9f03e2ae58f19c069e87ed.attr
│ │ ├── __objc_anonymous_block_MJRefreshHeader_endRefreshing______5.bf7c3d564e1f67dffe3fb8f441a17a01.attr
│ │ ├── __objc_anonymous_block_MJRefreshHeader_setState:______1.d3a54c1db631c871b31b389567116d06.attr
│ │ ├── __objc_anonymous_block_MJRefreshHeader_setState:______2.76071b0d0f5e67c93ff3d61cf3a3789e.attr
│ │ ├── __objc_anonymous_block_MJRefreshHeader_setState:______3.8532e74d34f685982ae68b06d10fd8df.attr
│ │ ├── __objc_anonymous_block_MJRefreshHeader_setState:______4.7d0f7a7a3eb581c034485e549b090838.attr
│ │ ├── __objc_anonymous_block_MJRefreshNormalHeader_setState:______1.13050930c71724b7417ba383bb55c321.attr
│ │ ├── __objc_anonymous_block_MJRefreshNormalHeader_setState:______2.1b4d0233230d9fceaa325a329806fc0d.attr
│ │ ├── __objc_anonymous_block_MJRefreshNormalHeader_setState:______3.696a392bca56dbc6cc8c2c8a2eb661b9.attr
│ │ ├── __objc_anonymous_block_MJRefreshNormalHeader_setState:______4.2249f9bd76235aa33803cf6005991b20.attr
│ │ ├── __objc_anonymous_block___objc_anonymous_block_MBProgressHUD_showAnimated:whileExecutingBlock:onQueue.c2d18021879fb88e6826d66a2b095c56.attr
│ │ ├── __tg_acos{840691106643d0420542f4b9eb7071d7}.43d6bffb10b8d18622ded581519a817e.attr
│ │ ├── __tg_round{840691106643d0420542f4b9eb7071d7}.b167308f29775a1872c814cfef430a12.attr
│ │ ├── ceilf.c35ffbe720ff6f15515cddd67ec17360.attr
│ │ ├── class_getClassMethod.b61336e980ae12ec9fd181d56184244e.attr
│ │ ├── class_getInstanceMethod.476ebc3b586481c6c4f86d1000ced2ba.attr
│ │ ├── dispatch_get_global_queue.37c0928a2fd099b4674969aa504a47d4.attr
│ │ ├── free.aa2d6e4f578eb0cfaba23beef76c2194.attr
│ │ ├── malloc.224eda3dc1d26b208edcc3a08d3175f2.attr
│ │ ├── method_exchangeImplementations.004d39e0a6392a3e41564f956dd33e53.attr
│ │ ├── objc_getAssociatedObject.c8d44d4e93a9a269c0b5fa0d184c87c0.attr
│ │ ├── objc_msgSend.080a5d880a7fe2378f966440a8b14758.attr
│ │ ├── objc_object_CGPointValue{instance}.113afdb97cec07996c74499ac383bd26.attr
│ │ ├── objc_object_doubleValue{instance}.6e0a5de0fae3d3a57031b3f9963bf917.attr
│ │ ├── objc_object_floatValue{instance}.eaa8a7f0730176efb26b974c69e0db91.attr
│ │ ├── objc_object_initWithView:{instance}.bbf54c8b0d0b9a0461af1a8bd2599bc5.attr
│ │ ├── objc_object_init{instance}.4ea9869683b94e8d1953de2594f2272b.attr
│ │ ├── objc_object_isKindOfClass:{instance}.065002119ae85d6e5b8a1f63a85b4e25.attr
│ │ ├── objc_object_performSelector:withObject:{instance}.09bb66ed9fd8f528870acab4e906b23a.attr
│ │ ├── objc_object_respondsToSelector:{instance}.b81867383c76614f5cc7161e622bf997.attr
│ │ ├── objc_object_setValue:forKey:{instance}.3ac002600c5853b5aa7637064daf5e1d.attr
│ │ ├── objc_setAssociatedObject.7ea322e13ef2b48c11f38662c94e0875.attr
│ │ ├── roundf.bd19547b602dd13481be74c905a74397.attr
│ │ └── sel_getName.cf2cb9a34374385686a41d267cf0b39f.attr
│ ├── bugs.txt
│ ├── captured/
│ │ ├── Alamofire-dummy.m.6d09ccfa28152a26014c27759907e588/
│ │ │ ├── Alamofire-dummy.m.3cf25aeb2bad93f01908ce84bfe55bc6.cfg
│ │ │ ├── Alamofire-dummy.m.3cf25aeb2bad93f01908ce84bfe55bc6.cg
│ │ │ └── Alamofire-dummy.m.3cf25aeb2bad93f01908ce84bfe55bc6.tenv
│ │ ├── Alamofire_vers.c.8254cedb6fb41479278cde7811b8d08f/
│ │ │ ├── Alamofire_vers.c.e7652d1cffef37678648eadf480ced31.cfg
│ │ │ ├── Alamofire_vers.c.e7652d1cffef37678648eadf480ced31.cg
│ │ │ └── Alamofire_vers.c.e7652d1cffef37678648eadf480ced31.tenv
│ │ ├── HMSegmentedControl.m.3ada2ea9130f9a3bb1eba0413ee61fd2/
│ │ │ ├── HMSegmentedControl.m.f55267153a5a085e7033d6ace6f57f0b.cfg
│ │ │ ├── HMSegmentedControl.m.f55267153a5a085e7033d6ace6f57f0b.cg
│ │ │ └── HMSegmentedControl.m.f55267153a5a085e7033d6ace6f57f0b.tenv
│ │ ├── IQKeyboardManagerSwift-dummy.m.7b6e737acd46f056f78947ffd5d24033/
│ │ │ ├── IQKeyboardManagerSwift-dummy.m.93b3a5567a32c2632e99aec38b481d2f.cfg
│ │ │ ├── IQKeyboardManagerSwift-dummy.m.93b3a5567a32c2632e99aec38b481d2f.cg
│ │ │ └── IQKeyboardManagerSwift-dummy.m.93b3a5567a32c2632e99aec38b481d2f.tenv
│ │ ├── IQKeyboardManagerSwift_vers.c.f21e5b0f68d1cf813cae480426968773/
│ │ │ ├── IQKeyboardManagerSwift_vers.c.864f5644b19f877e616f223029ac114c.cfg
│ │ │ ├── IQKeyboardManagerSwift_vers.c.864f5644b19f877e616f223029ac114c.cg
│ │ │ └── IQKeyboardManagerSwift_vers.c.864f5644b19f877e616f223029ac114c.tenv
│ │ ├── Kingfisher-dummy.m.8a951ae840d733902b687e9445028f55/
│ │ │ ├── Kingfisher-dummy.m.3301c2c6c20c895cd5b2f17680031084.cfg
│ │ │ ├── Kingfisher-dummy.m.3301c2c6c20c895cd5b2f17680031084.cg
│ │ │ └── Kingfisher-dummy.m.3301c2c6c20c895cd5b2f17680031084.tenv
│ │ ├── Kingfisher_vers.c.00419a18a8a213a3e0b6ae9fa5cec143/
│ │ │ ├── Kingfisher_vers.c.ab85ca49f5236b33b689b3d2f7b30832.cfg
│ │ │ ├── Kingfisher_vers.c.ab85ca49f5236b33b689b3d2f7b30832.cg
│ │ │ └── Kingfisher_vers.c.ab85ca49f5236b33b689b3d2f7b30832.tenv
│ │ ├── MBProgressHUD-dummy.m.2cbcc6b03a541520b945b322f2af3999/
│ │ │ ├── MBProgressHUD-dummy.m.94ed195adb8e987a55cd7f536b8d4391.cfg
│ │ │ ├── MBProgressHUD-dummy.m.94ed195adb8e987a55cd7f536b8d4391.cg
│ │ │ └── MBProgressHUD-dummy.m.94ed195adb8e987a55cd7f536b8d4391.tenv
│ │ ├── MBProgressHUD.m.045dbb041f57e2890a8587701e40a10f/
│ │ │ ├── MBProgressHUD.m.77bb4d01f867ea1f44d816a66131d999.cfg
│ │ │ ├── MBProgressHUD.m.77bb4d01f867ea1f44d816a66131d999.cg
│ │ │ └── MBProgressHUD.m.77bb4d01f867ea1f44d816a66131d999.tenv
│ │ ├── MBProgressHUD.m.2d788876e46e11285e0fd8ab23884da0/
│ │ │ ├── MBProgressHUD.m.77bb4d01f867ea1f44d816a66131d999.cfg
│ │ │ ├── MBProgressHUD.m.77bb4d01f867ea1f44d816a66131d999.cg
│ │ │ └── MBProgressHUD.m.77bb4d01f867ea1f44d816a66131d999.tenv
│ │ ├── MBProgressHUD_vers.c.55e8963b1036818ef14b9ff87abb4381/
│ │ │ ├── MBProgressHUD_vers.c.43d99a7de32a8f2d06e98107c04bbc41.cfg
│ │ │ ├── MBProgressHUD_vers.c.43d99a7de32a8f2d06e98107c04bbc41.cg
│ │ │ └── MBProgressHUD_vers.c.43d99a7de32a8f2d06e98107c04bbc41.tenv
│ │ ├── MJRefresh-dummy.m.89641addd9b18d30b1f3ccfcacc1da14/
│ │ │ ├── MJRefresh-dummy.m.c19c9ff64c412d5b31de15ca7f9de397.cfg
│ │ │ ├── MJRefresh-dummy.m.c19c9ff64c412d5b31de15ca7f9de397.cg
│ │ │ └── MJRefresh-dummy.m.c19c9ff64c412d5b31de15ca7f9de397.tenv
│ │ ├── MJRefreshAutoFooter.m.ccfbabb8dfc249bd8a1556531300613e/
│ │ │ ├── MJRefreshAutoFooter.m.8f3b996ff08a9d1d3cf51a7fb9683d0c.cfg
│ │ │ ├── MJRefreshAutoFooter.m.8f3b996ff08a9d1d3cf51a7fb9683d0c.cg
│ │ │ └── MJRefreshAutoFooter.m.8f3b996ff08a9d1d3cf51a7fb9683d0c.tenv
│ │ ├── MJRefreshAutoGifFooter.m.a31382caf4ac8759682b9a5a16a0c221/
│ │ │ ├── MJRefreshAutoGifFooter.m.fbc180b477df91631f1ae1b711b7ad38.cfg
│ │ │ ├── MJRefreshAutoGifFooter.m.fbc180b477df91631f1ae1b711b7ad38.cg
│ │ │ └── MJRefreshAutoGifFooter.m.fbc180b477df91631f1ae1b711b7ad38.tenv
│ │ ├── MJRefreshAutoNormalFooter.m.160698844e47dc16f7937652bf531356/
│ │ │ ├── MJRefreshAutoNormalFooter.m.acc5592aea13c97fed9d64632207e380.cfg
│ │ │ ├── MJRefreshAutoNormalFooter.m.acc5592aea13c97fed9d64632207e380.cg
│ │ │ └── MJRefreshAutoNormalFooter.m.acc5592aea13c97fed9d64632207e380.tenv
│ │ ├── MJRefreshAutoStateFooter.m.4b8722870b787ea3822663dce7a9a42b/
│ │ │ ├── MJRefreshAutoStateFooter.m.f3a5395ab3dd93065f871317cb869958.cfg
│ │ │ ├── MJRefreshAutoStateFooter.m.f3a5395ab3dd93065f871317cb869958.cg
│ │ │ └── MJRefreshAutoStateFooter.m.f3a5395ab3dd93065f871317cb869958.tenv
│ │ ├── MJRefreshBackFooter.m.c7c9312f3c1f73ce64abb9b05afc0c3e/
│ │ │ ├── MJRefreshBackFooter.m.8b835d53e85b841b7fef8c7e24d53354.cfg
│ │ │ ├── MJRefreshBackFooter.m.8b835d53e85b841b7fef8c7e24d53354.cg
│ │ │ └── MJRefreshBackFooter.m.8b835d53e85b841b7fef8c7e24d53354.tenv
│ │ ├── MJRefreshBackGifFooter.m.9fbdeffb50ad5cddb2eb31f449cef553/
│ │ │ ├── MJRefreshBackGifFooter.m.19435fcb848b09c997ccea089b1f6910.cfg
│ │ │ ├── MJRefreshBackGifFooter.m.19435fcb848b09c997ccea089b1f6910.cg
│ │ │ └── MJRefreshBackGifFooter.m.19435fcb848b09c997ccea089b1f6910.tenv
│ │ ├── MJRefreshBackNormalFooter.m.9fee50dbf43908ec8fb61f6997bcab26/
│ │ │ ├── MJRefreshBackNormalFooter.m.17e99acb215a92c052caf7cd719aced9.cfg
│ │ │ ├── MJRefreshBackNormalFooter.m.17e99acb215a92c052caf7cd719aced9.cg
│ │ │ └── MJRefreshBackNormalFooter.m.17e99acb215a92c052caf7cd719aced9.tenv
│ │ ├── MJRefreshBackStateFooter.m.d38f2bdb12763b5fdd12e2cbeee1c695/
│ │ │ ├── MJRefreshBackStateFooter.m.7da68a0a0457fb07095b594d1e4fd09a.cfg
│ │ │ ├── MJRefreshBackStateFooter.m.7da68a0a0457fb07095b594d1e4fd09a.cg
│ │ │ └── MJRefreshBackStateFooter.m.7da68a0a0457fb07095b594d1e4fd09a.tenv
│ │ ├── MJRefreshComponent.m.34ccc65193a850aa6cacb1e560d2e18f/
│ │ │ ├── MJRefreshComponent.m.f8bc97a2b665f7b6757c4a2e86309d9b.cfg
│ │ │ ├── MJRefreshComponent.m.f8bc97a2b665f7b6757c4a2e86309d9b.cg
│ │ │ └── MJRefreshComponent.m.f8bc97a2b665f7b6757c4a2e86309d9b.tenv
│ │ ├── MJRefreshConst.m.10ebaf8e0e1dbc8c756595f4b7e51b53/
│ │ │ ├── MJRefreshConst.m.1e4d22c0d8057d612f3542d3d0d3ab42.cfg
│ │ │ ├── MJRefreshConst.m.1e4d22c0d8057d612f3542d3d0d3ab42.cg
│ │ │ └── MJRefreshConst.m.1e4d22c0d8057d612f3542d3d0d3ab42.tenv
│ │ ├── MJRefreshFooter.m.1171c762a89233728365cd4c56dc3f42/
│ │ │ ├── MJRefreshFooter.m.f53adcd8ea99e29c1c6c2bcb8fde7942.cfg
│ │ │ ├── MJRefreshFooter.m.f53adcd8ea99e29c1c6c2bcb8fde7942.cg
│ │ │ └── MJRefreshFooter.m.f53adcd8ea99e29c1c6c2bcb8fde7942.tenv
│ │ ├── MJRefreshGifHeader.m.ec82e1fce0432afaace206d5863c0918/
│ │ │ ├── MJRefreshGifHeader.m.9a5df955b11480208e981ea8431ab83e.cfg
│ │ │ ├── MJRefreshGifHeader.m.9a5df955b11480208e981ea8431ab83e.cg
│ │ │ └── MJRefreshGifHeader.m.9a5df955b11480208e981ea8431ab83e.tenv
│ │ ├── MJRefreshHeader.m.23f6ad1fa93bce55e58df454e3c81f28/
│ │ │ ├── MJRefreshHeader.m.ea1b118a2b84a94f3793a325ee537804.cfg
│ │ │ ├── MJRefreshHeader.m.ea1b118a2b84a94f3793a325ee537804.cg
│ │ │ └── MJRefreshHeader.m.ea1b118a2b84a94f3793a325ee537804.tenv
│ │ ├── MJRefreshNormalHeader.m.1bda2488e255708da2996916537e8619/
│ │ │ ├── MJRefreshNormalHeader.m.8cf124baec1eb944fc9dcacb6e7493ce.cfg
│ │ │ ├── MJRefreshNormalHeader.m.8cf124baec1eb944fc9dcacb6e7493ce.cg
│ │ │ └── MJRefreshNormalHeader.m.8cf124baec1eb944fc9dcacb6e7493ce.tenv
│ │ ├── MJRefreshStateHeader.m.a270adbea6697f5f08d5a7c099a20e77/
│ │ │ ├── MJRefreshStateHeader.m.08d505ba1d0a2929d6fd49b279cc42c7.cfg
│ │ │ ├── MJRefreshStateHeader.m.08d505ba1d0a2929d6fd49b279cc42c7.cg
│ │ │ └── MJRefreshStateHeader.m.08d505ba1d0a2929d6fd49b279cc42c7.tenv
│ │ ├── MJRefresh_vers.c.fdbf3bfbf5344618726d9bdc20a96ac8/
│ │ │ ├── MJRefresh_vers.c.2897d6619eefb8ad938595d78e314c4a.cfg
│ │ │ ├── MJRefresh_vers.c.2897d6619eefb8ad938595d78e314c4a.cg
│ │ │ └── MJRefresh_vers.c.2897d6619eefb8ad938595d78e314c4a.tenv
│ │ ├── Moya-dummy.m.7ca1843127a0c59014b13cb46b4be5c5/
│ │ │ ├── Moya-dummy.m.b89accf00db26359b04edc10060f3c51.cfg
│ │ │ ├── Moya-dummy.m.b89accf00db26359b04edc10060f3c51.cg
│ │ │ └── Moya-dummy.m.b89accf00db26359b04edc10060f3c51.tenv
│ │ ├── Moya_vers.c.ccdf2bc7f3b870bcbaf3fb8b74e5c3b1/
│ │ │ ├── Moya_vers.c.3451270a87ddaa93d39cc40065bd4b26.cfg
│ │ │ ├── Moya_vers.c.3451270a87ddaa93d39cc40065bd4b26.cg
│ │ │ └── Moya_vers.c.3451270a87ddaa93d39cc40065bd4b26.tenv
│ │ ├── ObjectMapper-dummy.m.9e3146cd2b23217c763a2d504a75457e/
│ │ │ ├── ObjectMapper-dummy.m.81b9209ff09e85154578c8f219710667.cfg
│ │ │ ├── ObjectMapper-dummy.m.81b9209ff09e85154578c8f219710667.cg
│ │ │ └── ObjectMapper-dummy.m.81b9209ff09e85154578c8f219710667.tenv
│ │ ├── ObjectMapper_vers.c.2c870b1208e8a54bd7f7a7bd1a592dc5/
│ │ │ ├── ObjectMapper_vers.c.6832f0fc769368c246c0b5140c3441b3.cfg
│ │ │ ├── ObjectMapper_vers.c.6832f0fc769368c246c0b5140c3441b3.cg
│ │ │ └── ObjectMapper_vers.c.6832f0fc769368c246c0b5140c3441b3.tenv
│ │ ├── Pods-dummy.m.78ce02d1bec8d9a8cdf8e193eac92c0c/
│ │ │ ├── Pods-dummy.m.41f6871746d6ec21d524e86fc88427b4.cfg
│ │ │ ├── Pods-dummy.m.41f6871746d6ec21d524e86fc88427b4.cg
│ │ │ └── Pods-dummy.m.41f6871746d6ec21d524e86fc88427b4.tenv
│ │ ├── Pods_vers.c.e34b81a174547bf13f9c59c29a71f79d/
│ │ │ ├── Pods_vers.c.2eae1ecd33129543bf1a7a99486f0c5c.cfg
│ │ │ ├── Pods_vers.c.2eae1ecd33129543bf1a7a99486f0c5c.cg
│ │ │ └── Pods_vers.c.2eae1ecd33129543bf1a7a99486f0c5c.tenv
│ │ ├── ReachabilitySwift-dummy.m.81bcb52c99c18a6d774b3dd976fb0214/
│ │ │ ├── ReachabilitySwift-dummy.m.687de7e7d6e63ce3b7f7c114e5a7aabc.cfg
│ │ │ ├── ReachabilitySwift-dummy.m.687de7e7d6e63ce3b7f7c114e5a7aabc.cg
│ │ │ └── ReachabilitySwift-dummy.m.687de7e7d6e63ce3b7f7c114e5a7aabc.tenv
│ │ ├── ReachabilitySwift_vers.c.106744f7723126899873b7d2d4e22295/
│ │ │ ├── ReachabilitySwift_vers.c.90417ce64ef95d4d1d26d128c4f4ddca.cfg
│ │ │ ├── ReachabilitySwift_vers.c.90417ce64ef95d4d1d26d128c4f4ddca.cg
│ │ │ └── ReachabilitySwift_vers.c.90417ce64ef95d4d1d26d128c4f4ddca.tenv
│ │ ├── Result-dummy.m.487d4a46f6fc74236bcbc3ae7d7c27ab/
│ │ │ ├── Result-dummy.m.1f7435f84f78465b941740a6605f13ab.cfg
│ │ │ ├── Result-dummy.m.1f7435f84f78465b941740a6605f13ab.cg
│ │ │ └── Result-dummy.m.1f7435f84f78465b941740a6605f13ab.tenv
│ │ ├── Result_vers.c.ef95a536428b9b58e98412eb536774b5/
│ │ │ ├── Result_vers.c.1c335bbba3c619b5e45eb0333c7e5414.cfg
│ │ │ ├── Result_vers.c.1c335bbba3c619b5e45eb0333c7e5414.cg
│ │ │ └── Result_vers.c.1c335bbba3c619b5e45eb0333c7e5414.tenv
│ │ ├── SnapKit-dummy.m.552f2542a60bc7af3ec07236cbb386be/
│ │ │ ├── SnapKit-dummy.m.7acfcb3843b5b230a9e6984ffa5e0226.cfg
│ │ │ ├── SnapKit-dummy.m.7acfcb3843b5b230a9e6984ffa5e0226.cg
│ │ │ └── SnapKit-dummy.m.7acfcb3843b5b230a9e6984ffa5e0226.tenv
│ │ ├── SnapKit_vers.c.7f12e521ccb5413d5db82f8ce23e056f/
│ │ │ ├── SnapKit_vers.c.3a6b330540276a447a3fe15b5fced76a.cfg
│ │ │ ├── SnapKit_vers.c.3a6b330540276a447a3fe15b5fced76a.cg
│ │ │ └── SnapKit_vers.c.3a6b330540276a447a3fe15b5fced76a.tenv
│ │ ├── SwiftDate-dummy.m.b9c681999e8e59b4dd482bdf37fe6f24/
│ │ │ ├── SwiftDate-dummy.m.feb025c96307bcbfc89c3f778e1b6b1e.cfg
│ │ │ ├── SwiftDate-dummy.m.feb025c96307bcbfc89c3f778e1b6b1e.cg
│ │ │ └── SwiftDate-dummy.m.feb025c96307bcbfc89c3f778e1b6b1e.tenv
│ │ ├── SwiftDate_vers.c.4326ee98dee4b56883987638959c8def/
│ │ │ ├── SwiftDate_vers.c.a4734f8c7b0bc0f3b8e66ccf1d4c8f5e.cfg
│ │ │ ├── SwiftDate_vers.c.a4734f8c7b0bc0f3b8e66ccf1d4c8f5e.cg
│ │ │ └── SwiftDate_vers.c.a4734f8c7b0bc0f3b8e66ccf1d4c8f5e.tenv
│ │ ├── SwiftyJSON-dummy.m.07fe6c3e47a33789842e405038d2424a/
│ │ │ ├── SwiftyJSON-dummy.m.8407b3791bf30dfa3d3cb3473fb1bdec.cfg
│ │ │ ├── SwiftyJSON-dummy.m.8407b3791bf30dfa3d3cb3473fb1bdec.cg
│ │ │ └── SwiftyJSON-dummy.m.8407b3791bf30dfa3d3cb3473fb1bdec.tenv
│ │ ├── SwiftyJSON_vers.c.de83cfb439c8f4f5f1edfe8aabce609d/
│ │ │ ├── SwiftyJSON_vers.c.ac7dc6e04065e841a9af2170dd865fc5.cfg
│ │ │ ├── SwiftyJSON_vers.c.ac7dc6e04065e841a9af2170dd865fc5.cg
│ │ │ └── SwiftyJSON_vers.c.ac7dc6e04065e841a9af2170dd865fc5.tenv
│ │ ├── UIScrollView+MJExtension.m.e58616bc3e3601567328a68aaf6990a3/
│ │ │ ├── UIScrollView+MJExtension.m.bb0212caffedd1154fda05f2aa1eaf27.cfg
│ │ │ ├── UIScrollView+MJExtension.m.bb0212caffedd1154fda05f2aa1eaf27.cg
│ │ │ └── UIScrollView+MJExtension.m.bb0212caffedd1154fda05f2aa1eaf27.tenv
│ │ ├── UIScrollView+MJRefresh.m.c656b88045d9e660612378e050df8caa/
│ │ │ ├── UIScrollView+MJRefresh.m.cbf22b46b8e8d7ce0c053bbd404b9977.cfg
│ │ │ ├── UIScrollView+MJRefresh.m.cbf22b46b8e8d7ce0c053bbd404b9977.cg
│ │ │ └── UIScrollView+MJRefresh.m.cbf22b46b8e8d7ce0c053bbd404b9977.tenv
│ │ └── UIView+MJExtension.m.fcc8a28eead7a716734205472672c935/
│ │ ├── UIView+MJExtension.m.e6dfb20a0cf28329d729d37c7d270c2c.cfg
│ │ ├── UIView+MJExtension.m.e6dfb20a0cf28329d729d37c7d270c2c.cg
│ │ └── UIView+MJExtension.m.e6dfb20a0cf28329d729d37c7d270c2c.tenv
│ ├── multicore/
│ │ ├── Makefile
│ │ ├── cl1
│ │ ├── cl10
│ │ ├── cl11
│ │ ├── cl12
│ │ ├── cl13
│ │ ├── cl14
│ │ ├── cl15
│ │ ├── cl16
│ │ ├── cl17
│ │ ├── cl18
│ │ ├── cl19
│ │ ├── cl2
│ │ ├── cl3
│ │ ├── cl4
│ │ ├── cl5
│ │ ├── cl6
│ │ ├── cl7
│ │ ├── cl8
│ │ ├── cl9
│ │ ├── xcl1.cluster
│ │ ├── xcl10.cluster
│ │ ├── xcl11.cluster
│ │ ├── xcl12.cluster
│ │ ├── xcl13.cluster
│ │ ├── xcl14.cluster
│ │ ├── xcl15.cluster
│ │ ├── xcl16.cluster
│ │ ├── xcl17.cluster
│ │ ├── xcl18.cluster
│ │ ├── xcl19.cluster
│ │ ├── xcl2.cluster
│ │ ├── xcl3.cluster
│ │ ├── xcl4.cluster
│ │ ├── xcl5.cluster
│ │ ├── xcl6.cluster
│ │ ├── xcl7.cluster
│ │ ├── xcl8.cluster
│ │ └── xcl9.cluster
│ ├── proc_stats.json
│ ├── procs.csv
│ ├── report.csv
│ ├── report.json
│ ├── sources/
│ │ ├── HMSegmentedControl.m.3ada2ea9130f9a3bb1eba0413ee61fd2
│ │ ├── MBProgressHUD.m.045dbb041f57e2890a8587701e40a10f
│ │ ├── MBProgressHUD.m.2d788876e46e11285e0fd8ab23884da0
│ │ ├── MJRefreshAutoFooter.m.ccfbabb8dfc249bd8a1556531300613e
│ │ ├── MJRefreshAutoGifFooter.m.a31382caf4ac8759682b9a5a16a0c221
│ │ ├── MJRefreshAutoNormalFooter.m.160698844e47dc16f7937652bf531356
│ │ ├── MJRefreshAutoStateFooter.m.4b8722870b787ea3822663dce7a9a42b
│ │ ├── MJRefreshBackFooter.m.c7c9312f3c1f73ce64abb9b05afc0c3e
│ │ ├── MJRefreshBackGifFooter.m.9fbdeffb50ad5cddb2eb31f449cef553
│ │ ├── MJRefreshBackNormalFooter.m.9fee50dbf43908ec8fb61f6997bcab26
│ │ ├── MJRefreshBackStateFooter.m.d38f2bdb12763b5fdd12e2cbeee1c695
│ │ ├── MJRefreshComponent.m.34ccc65193a850aa6cacb1e560d2e18f
│ │ ├── MJRefreshFooter.m.1171c762a89233728365cd4c56dc3f42
│ │ ├── MJRefreshGifHeader.m.ec82e1fce0432afaace206d5863c0918
│ │ ├── MJRefreshHeader.m.23f6ad1fa93bce55e58df454e3c81f28
│ │ ├── MJRefreshNormalHeader.m.1bda2488e255708da2996916537e8619
│ │ ├── MJRefreshStateHeader.m.a270adbea6697f5f08d5a7c099a20e77
│ │ ├── UIScrollView+MJExtension.m.e58616bc3e3601567328a68aaf6990a3
│ │ ├── UIScrollView+MJRefresh.m.c656b88045d9e660612378e050df8caa
│ │ └── UIView+MJExtension.m.fcc8a28eead7a716734205472672c935
│ ├── specs/
│ │ ├── HMScrollView_touchesBegan:withEvent:{instance}.d59f2b4a0fda4ec48b036513c8dd8cc9.specs
│ │ ├── HMScrollView_touchesEnded:withEvent:{instance}.8f3c38acc9d5dc615c13261818676983.specs
│ │ ├── HMScrollView_touchesMoved:withEvent:{instance}.c1670bac25a0a202b52dda692c907230.specs
│ │ ├── HMSegmentedControl_addBackgroundAndBorderLayerWithRect:{instance}.7dd0377b1da0e5b410137e62fdec2030.specs
│ │ ├── HMSegmentedControl_attributedTitleAtIndex:{instance}.a5b762b44c0d812624d2256563840cc5.specs
│ │ ├── HMSegmentedControl_awakeFromNib{instance}.f3fa814debe72a72b9e0eb7ccf2e15a5.specs
│ │ ├── HMSegmentedControl_commonInit{instance}.38533cdade2a6665dabfbf9b34dfee27.specs
│ │ ├── HMSegmentedControl_drawRect:{instance}.0f8cfeaafe528d71c9e70549d32ab6c8.specs
│ │ ├── HMSegmentedControl_frameForFillerSelectionIndicator{instance}.ee003ec468962badb351fdc66dbf4daf.specs
│ │ ├── HMSegmentedControl_frameForSelectionIndicator{instance}.fab573ad9ae86c7cadaf030789e843c9.specs
│ │ ├── HMSegmentedControl_initWithCoder:{instance}.a09c14109303b8ad5c335eb9da3d110b.specs
│ │ ├── HMSegmentedControl_initWithFrame:{instance}.a49a182bda2ad6bcf70effd8929a23fc.specs
│ │ ├── HMSegmentedControl_initWithSectionImages:sectionSelectedImages:titlesForSections:{instance}.b753ee5d390184caf95711bd19d683b5.specs
│ │ ├── HMSegmentedControl_initWithSectionImages:sectionSelectedImages:{instance}.e9b578c4330b480104536188b8a8c976.specs
│ │ ├── HMSegmentedControl_initWithSectionTitles:{instance}.437880827dc06daf2642eb51cedee689.specs
│ │ ├── HMSegmentedControl_layoutSubviews{instance}.68711c72c0e4854dcc75ef707417c22e.specs
│ │ ├── HMSegmentedControl_measureTitleAtIndex:{instance}.b9e49ac420b85b440d716583a1199bd7.specs
│ │ ├── HMSegmentedControl_notifyForSegmentChangeToIndex:{instance}.9961984e3a59a06f9dce68085bd94b07.specs
│ │ ├── HMSegmentedControl_resultingSelectedTitleTextAttributes{instance}.cc39ce9e58be4ecf606a42f75b7a1e18.specs
│ │ ├── HMSegmentedControl_resultingTitleTextAttributes{instance}.c6edf072205c8920b9c3804bcb465668.specs
│ │ ├── HMSegmentedControl_scrollToSelectedSegmentIndex:{instance}.3b10d351a059eceb4ce7dcc296c10e6b.specs
│ │ ├── HMSegmentedControl_sectionCount{instance}.8f2d3f243fe8914f47b850886fe77ce5.specs
│ │ ├── HMSegmentedControl_setArrowFrame{instance}.5826476954afd05d70ceb71ec673b941.specs
│ │ ├── HMSegmentedControl_setBorderType:{instance}.913cdb23a533132e5838aec6b4e59339.specs
│ │ ├── HMSegmentedControl_setFrame:{instance}.1c7263eacfefb1784864fef2d128686f.specs
│ │ ├── HMSegmentedControl_setSectionImages:{instance}.dd1712712826815f898cd900d8051af2.specs
│ │ ├── HMSegmentedControl_setSectionTitles:{instance}.659c7c1b9fb7032b7e893febe52349bc.specs
│ │ ├── HMSegmentedControl_setSegmentWidthStyle:{instance}.0e2d4c1c6e034b4ded13d0bda80fc966.specs
│ │ ├── HMSegmentedControl_setSelectedSegmentIndex:animated:notify:{instance}.e28550bafd2dd200d908ec93bf0f5f6f.specs
│ │ ├── HMSegmentedControl_setSelectedSegmentIndex:animated:{instance}.2d10a374506ae4092dce3c89aa0d3ed2.specs
│ │ ├── HMSegmentedControl_setSelectedSegmentIndex:{instance}.7c671210f6f2a504f070e13fa74c6c0f.specs
│ │ ├── HMSegmentedControl_setSelectionIndicatorBoxOpacity:{instance}.45b69f43098a4683dfc106f58afed905.specs
│ │ ├── HMSegmentedControl_setSelectionIndicatorLocation:{instance}.a53daba01d6a3f4bf906c7cecf124d14.specs
│ │ ├── HMSegmentedControl_totalSegmentedControlWidth{instance}.0d2a745a35745340bb11b6dca1981618.specs
│ │ ├── HMSegmentedControl_touchesEnded:withEvent:{instance}.4e627b0727b096ec8303653816d71374.specs
│ │ ├── HMSegmentedControl_updateSegmentsRects{instance}.84ec9da3b15ae6609959e7b9d4e514d6.specs
│ │ ├── HMSegmentedControl_willMoveToSuperview:{instance}.664e57902a9674b629014432c158bbe2.specs
│ │ ├── MBBarProgressView_dealloc{instance}.adf1ad15c84766ba9dcf79183c69c3d4.specs
│ │ ├── MBBarProgressView_drawRect:{instance}.320d681186c8fba8f6b277de3f5578a2.specs
│ │ ├── MBBarProgressView_initWithFrame:{instance}.ed6320a3deccb73365df0525f4c1b164.specs
│ │ ├── MBBarProgressView_init{instance}.d718a21a2e82160043ea8993b48ff857.specs
│ │ ├── MBBarProgressView_observableKeypaths{instance}.39b90d036d77a64fc5e4fecf6065c87c.specs
│ │ ├── MBBarProgressView_observeValueForKeyPath:ofObject:change:context:{instance}.7954f9a6af46f9f68c1a1f6b5a2ccdd2.specs
│ │ ├── MBBarProgressView_registerForKVO{instance}.071c8b1636d94f57ae8971bc36daf118.specs
│ │ ├── MBBarProgressView_unregisterFromKVO{instance}.b5a5120611688f493d5727fdfa6d5960.specs
│ │ ├── MBProgressHUD_HUDForView:{class}.a2951ab8562d7ef65f3c11867a36db30.specs
│ │ ├── MBProgressHUD_allHUDsForView:{class}.c62400802f12bd5a57844c12fcb0585f.specs
│ │ ├── MBProgressHUD_animationFinished:finished:context:{instance}.9c5e683b9e4ea724431986aec092468a.specs
│ │ ├── MBProgressHUD_cleanUp{instance}.f88f2551df8f2874a1f623e3c7d179a3.specs
│ │ ├── MBProgressHUD_dealloc{instance}.734bfbc384d83cb0e26dba7831bb5b5a.specs
│ │ ├── MBProgressHUD_didMoveToSuperview{instance}.bdd65a2c02acb5f730c9ffafb0a5d09e.specs
│ │ ├── MBProgressHUD_done{instance}.72390a40ef044120f3206ce23838c81a.specs
│ │ ├── MBProgressHUD_drawRect:{instance}.d021496ab2c89b5e6977af3d98e6a604.specs
│ │ ├── MBProgressHUD_handleGraceTimer:{instance}.1b8680a1326602baf44976543198fed9.specs
│ │ ├── MBProgressHUD_handleMinShowTimer:{instance}.7aafa41664c3ff7af3a291cab98261c3.specs
│ │ ├── MBProgressHUD_hide:afterDelay:{instance}.c859a390b6e21c3da53cc55db145fc51.specs
│ │ ├── MBProgressHUD_hide:{instance}.9f087e822370af64645764e8180cf507.specs
│ │ ├── MBProgressHUD_hideAllHUDsForView:animated:{class}.0c50aff8a43d35a50e24dbcc63a30a32.specs
│ │ ├── MBProgressHUD_hideDelayed:{instance}.c1ee27a326a7aff4bb96a0c3c0081baf.specs
│ │ ├── MBProgressHUD_hideHUDForView:animated:{class}.6464d2a2482f9e32e72a33627277d762.specs
│ │ ├── MBProgressHUD_hideUsingAnimation:{instance}.7d9068a738fef2e9a6e234f592d77b03.specs
│ │ ├── MBProgressHUD_initWithFrame:{instance}.46a9a5ebd85df85c40e4ca277186520f.specs
│ │ ├── MBProgressHUD_initWithView:{instance}.56c371965dcee9d54c2d7a562e2ae498.specs
│ │ ├── MBProgressHUD_initWithWindow:{instance}.d9abb98f4c74d9d83026534b730b52d2.specs
│ │ ├── MBProgressHUD_launchExecution{instance}.65b7de815299c22603cdc0a12874e621.specs
│ │ ├── MBProgressHUD_layoutSubviews{instance}.b1b30a767241a72169fad46125b80ce0.specs
│ │ ├── MBProgressHUD_observableKeypaths{instance}.1d43b626b757e9a1ab7fb2a4953c8d2d.specs
│ │ ├── MBProgressHUD_observeValueForKeyPath:ofObject:change:context:{instance}.6f2717bd4c58c58b1cd5304e7bfb403b.specs
│ │ ├── MBProgressHUD_registerForKVO{instance}.74d4196c6bc96800ebeadb3eade5e76a.specs
│ │ ├── MBProgressHUD_registerForNotifications{instance}.c083e50aaf59e994cdd425e4c9cf446b.specs
│ │ ├── MBProgressHUD_setupLabels{instance}.ea2ff0fb299d03874b01a906a7e5f181.specs
│ │ ├── MBProgressHUD_show:{instance}.ac44c85674baa495a162f44dec2bca1f.specs
│ │ ├── MBProgressHUD_showAnimated:whileExecutingBlock:completionBlock:{instance}.cc35373f5b0ef6d67ba0a2cd43d0a077.specs
│ │ ├── MBProgressHUD_showAnimated:whileExecutingBlock:onQueue:completionBlock:{instance}.5f282b5baff14a6b325db22e8dc79cb5.specs
│ │ ├── MBProgressHUD_showAnimated:whileExecutingBlock:onQueue:{instance}.939c8bef4c804dcce1a8f8504d065463.specs
│ │ ├── MBProgressHUD_showAnimated:whileExecutingBlock:{instance}.31adcee70bd29a2315f5a590715c3deb.specs
│ │ ├── MBProgressHUD_showHUDAddedTo:animated:{class}.a5ee486a46c5d3c99b9e068e9ea4baad.specs
│ │ ├── MBProgressHUD_showUsingAnimation:{instance}.9401eaed7b787b815229a4f8ec3357be.specs
│ │ ├── MBProgressHUD_showWhileExecuting:onTarget:withObject:animated:{instance}.0961e1f2841c54f70f3dc0b695dfc84d.specs
│ │ ├── MBProgressHUD_statusBarOrientationDidChange:{instance}.872a47e680449f7f49e472ccf7e9d082.specs
│ │ ├── MBProgressHUD_unregisterFromKVO{instance}.bbf3aaf60e868fa0fb966ae29a1af573.specs
│ │ ├── MBProgressHUD_unregisterFromNotifications{instance}.de0d4125b86d3858fd69944f1d235402.specs
│ │ ├── MBProgressHUD_updateForCurrentOrientationAnimated:{instance}.6fe6a2b1a661f1f307de4fb6a68bd0fb.specs
│ │ ├── MBProgressHUD_updateIndicators{instance}.a3986e584873e64cd5fec235462f12b3.specs
│ │ ├── MBProgressHUD_updateUIForKeypath:{instance}.7f3963efa7a8ac2719bfd99007bd6b6e.specs
│ │ ├── MBRoundProgressView_dealloc{instance}.f76e97c78e356529b6d3487d19b1a412.specs
│ │ ├── MBRoundProgressView_drawRect:{instance}.5dded631db9e81761adbc52c74e3a158.specs
│ │ ├── MBRoundProgressView_initWithFrame:{instance}.202df68ce7c2e37e1d8f93454b69c4d1.specs
│ │ ├── MBRoundProgressView_init{instance}.d5141eb9f853d4fabd440a664b453b2f.specs
│ │ ├── MBRoundProgressView_observableKeypaths{instance}.88a67d54a2d7175b9b7f5a626393a834.specs
│ │ ├── MBRoundProgressView_observeValueForKeyPath:ofObject:change:context:{instance}.3562ed8d8fbf2b3acfad83fc0f3fcfd0.specs
│ │ ├── MBRoundProgressView_registerForKVO{instance}.56e6d0e76d20137d6b5a2056d5683113.specs
│ │ ├── MBRoundProgressView_unregisterFromKVO{instance}.97841886debac0d49b46482098a4e1d7.specs
│ │ ├── MJRefreshAutoFooter_appearencePercentTriggerAutoRefresh{instance}.931b825764944eff97f78ef4c2c44ebd.specs
│ │ ├── MJRefreshAutoFooter_prepare{instance}.81fdaf533264e53838439b6af78408c2.specs
│ │ ├── MJRefreshAutoFooter_scrollViewContentOffsetDidChange:{instance}.bcfcda2745da14825e78d76c540e5ff0.specs
│ │ ├── MJRefreshAutoFooter_scrollViewContentSizeDidChange:{instance}.c95f98648e58af09c6bb5f9a39329ee1.specs
│ │ ├── MJRefreshAutoFooter_scrollViewPanStateDidChange:{instance}.40aa0d75b89f5a74cf08c78c183d6a19.specs
│ │ ├── MJRefreshAutoFooter_setAppearencePercentTriggerAutoRefresh:{instance}.6d7e658eb08c918e2665dda4d02bbe0e.specs
│ │ ├── MJRefreshAutoFooter_setHidden:{instance}.8187ea74fc5a524dc007acb5243e7926.specs
│ │ ├── MJRefreshAutoFooter_setState:{instance}.bdb3fcb8173fa59cb33dd391730a20c2.specs
│ │ ├── MJRefreshAutoFooter_willMoveToSuperview:{instance}.31c9e7668989c017342140f0185c2188.specs
│ │ ├── MJRefreshAutoGifFooter_gifView{instance}.4ff145d45d6f0d9ac6a9b37155d3cc66.specs
│ │ ├── MJRefreshAutoGifFooter_placeSubviews{instance}.792cabf0aff680ead0baef015354b3be.specs
│ │ ├── MJRefreshAutoGifFooter_setImages:duration:forState:{instance}.c46aa256d08ae2ac7749b27d92bed622.specs
│ │ ├── MJRefreshAutoGifFooter_setImages:forState:{instance}.bc030fd7ddd4c611d524187d37ba0372.specs
│ │ ├── MJRefreshAutoGifFooter_setState:{instance}.ef45940c1ae3cbc92c2bc041ff067afa.specs
│ │ ├── MJRefreshAutoGifFooter_stateDurations{instance}.719f9f19198062078a8a0d9ea201ca6b.specs
│ │ ├── MJRefreshAutoGifFooter_stateImages{instance}.ab92380ab4ded17b30f8a08f961ee684.specs
│ │ ├── MJRefreshAutoNormalFooter_loadingView{instance}.b926a86efa7bdd6b0a6a98c1e90540a4.specs
│ │ ├── MJRefreshAutoNormalFooter_placeSubviews{instance}.0f8d74171158ff20387271e6a94777f4.specs
│ │ ├── MJRefreshAutoNormalFooter_prepare{instance}.62a05293c68d988c434dbcd79ef0ad7b.specs
│ │ ├── MJRefreshAutoNormalFooter_setActivityIndicatorViewStyle:{instance}.1740284edf4289989ed9655458e6e541.specs
│ │ ├── MJRefreshAutoNormalFooter_setState:{instance}.92eb8a4693eb9e978510f5f8e8d079b6.specs
│ │ ├── MJRefreshAutoStateFooter_placeSubviews{instance}.e05bd88dad611fa3f5641cc10cf22caf.specs
│ │ ├── MJRefreshAutoStateFooter_prepare{instance}.39111306cd810d7e8289797116b20acc.specs
│ │ ├── MJRefreshAutoStateFooter_setState:{instance}.41f13d685c1d0107cac76f5e6cdc6f22.specs
│ │ ├── MJRefreshAutoStateFooter_setTitle:forState:{instance}.a6f426bbeb7cb198331cbcece4cf4ec0.specs
│ │ ├── MJRefreshAutoStateFooter_stateLabelClick{instance}.8d69ce4f9c38bcef0e235e719a0ddbdf.specs
│ │ ├── MJRefreshAutoStateFooter_stateLabel{instance}.0d1656cd91316c5fef17b9f5de691d6b.specs
│ │ ├── MJRefreshAutoStateFooter_stateTitles{instance}.45df57b523fb4f840f1c9d536a35d61c.specs
│ │ ├── MJRefreshBackFooter_endRefreshing{instance}.958680d523a94ab59c1c9601c2541ab2.specs
│ │ ├── MJRefreshBackFooter_happenOffsetY{instance}.0dae9169061683402ab2798299f74adc.specs
│ │ ├── MJRefreshBackFooter_heightForContentBreakView{instance}.6c28d740d05c68bd5806d8010e497a29.specs
│ │ ├── MJRefreshBackFooter_noticeNoMoreData{instance}.83d8a6971a587c2fe5193c2bc7f4b031.specs
│ │ ├── MJRefreshBackFooter_scrollViewContentOffsetDidChange:{instance}.f883c7a60628c818fb9a69ebcf62f187.specs
│ │ ├── MJRefreshBackFooter_scrollViewContentSizeDidChange:{instance}.665d5ffac44fdda6b0cfcaf9f76338c2.specs
│ │ ├── MJRefreshBackFooter_setState:{instance}.2a84f32e6c9d600cfa0c5f9c490fa00b.specs
│ │ ├── MJRefreshBackFooter_willMoveToSuperview:{instance}.5dcec01faa2292110b1de8e64a12c539.specs
│ │ ├── MJRefreshBackGifFooter_gifView{instance}.7c4a05bcc8f049050cffa895709f2611.specs
│ │ ├── MJRefreshBackGifFooter_placeSubviews{instance}.1cf5a34d6185752d129aad4c43b0cf42.specs
│ │ ├── MJRefreshBackGifFooter_setImages:duration:forState:{instance}.bd185713fbda471cfa0b26d0475db1d6.specs
│ │ ├── MJRefreshBackGifFooter_setImages:forState:{instance}.f959fd72b4774da01ea194a4b34ee359.specs
│ │ ├── MJRefreshBackGifFooter_setPullingPercent:{instance}.157a977e4c33fa60e38cb624a19f24de.specs
│ │ ├── MJRefreshBackGifFooter_setState:{instance}.fa1a5e8a04db08dde17ff7de59c16477.specs
│ │ ├── MJRefreshBackGifFooter_stateDurations{instance}.ecff20c8de39266ddc0f975a0f4306e2.specs
│ │ ├── MJRefreshBackGifFooter_stateImages{instance}.724b5260dc41e21938f90f2360672187.specs
│ │ ├── MJRefreshBackNormalFooter_arrowView{instance}.4311ef7cafa4a9ee91bbac226b717da9.specs
│ │ ├── MJRefreshBackNormalFooter_loadingView{instance}.d862d1537eaf4f13b3ea928a9d7e6bb2.specs
│ │ ├── MJRefreshBackNormalFooter_placeSubviews{instance}.14a691c735954cea598f1c42945a8ade.specs
│ │ ├── MJRefreshBackNormalFooter_prepare{instance}.d348875f78d00052355c482b471988da.specs
│ │ ├── MJRefreshBackNormalFooter_setActivityIndicatorViewStyle:{instance}.c11249674bf6ed2701a1780e8cf790ae.specs
│ │ ├── MJRefreshBackNormalFooter_setState:{instance}.bfb37954287cc1242b9371c8e0c2c53d.specs
│ │ ├── MJRefreshBackStateFooter_placeSubviews{instance}.07dd32534b9ae4810921764ceac1540a.specs
│ │ ├── MJRefreshBackStateFooter_prepare{instance}.e12b6d29ae7cc426b54f69331c789d15.specs
│ │ ├── MJRefreshBackStateFooter_setState:{instance}.0ffb3dd66c48270735110933d1f2f0d7.specs
│ │ ├── MJRefreshBackStateFooter_setTitle:forState:{instance}.e6265b339a82b1b962fd6b7d372b38b4.specs
│ │ ├── MJRefreshBackStateFooter_stateLabel{instance}.671bdcb3c3052ca29a0160eca1c6b6bd.specs
│ │ ├── MJRefreshBackStateFooter_stateTitles{instance}.8c8d015f558a5b782cef16fa2a872de2.specs
│ │ ├── MJRefreshBackStateFooter_titleForState:{instance}.6644d0fcdc32801821696c2a4d6f0aa8.specs
│ │ ├── MJRefreshComponent_addObservers{instance}.48ac3cc9007a3c8cbb6a15277c7db9ea.specs
│ │ ├── MJRefreshComponent_beginRefreshing{instance}.37e3b4491c03ca5070562df652ae4a3f.specs
│ │ ├── MJRefreshComponent_drawRect:{instance}.5c9569babdce7fbc05fdb15778362755.specs
│ │ ├── MJRefreshComponent_endRefreshing{instance}.2720081dcaca1ee01ca4ba03255da838.specs
│ │ ├── MJRefreshComponent_executeRefreshingCallback{instance}.4f282c4379c6e540d10c12e54d80e390.specs
│ │ ├── MJRefreshComponent_initWithFrame:{instance}.dcc5043bc9d4cc86799bf33ff4f78bb3.specs
│ │ ├── MJRefreshComponent_isAutoChangeAlpha{instance}.d2580facd9584f5d1823586225276c0c.specs
│ │ ├── MJRefreshComponent_isRefreshing{instance}.a3d1e918912f39baa99b419848f9d33b.specs
│ │ ├── MJRefreshComponent_layoutSubviews{instance}.8098590c7287f2a2c27bd59d78a0452b.specs
│ │ ├── MJRefreshComponent_observeValueForKeyPath:ofObject:change:context:{instance}.5c79a9157e694b8877729d29e6accd4f.specs
│ │ ├── MJRefreshComponent_placeSubviews{instance}.73d06208ee35f85eb9d849aecd472416.specs
│ │ ├── MJRefreshComponent_prepare{instance}.38440e789285bd7781f72155c89e3f5a.specs
│ │ ├── MJRefreshComponent_removeObservers{instance}.c9d911e52f725b43fc7b34f4a07b3923.specs
│ │ ├── MJRefreshComponent_scrollViewContentOffsetDidChange:{instance}.617caa7f28422a6417560a602082f5b8.specs
│ │ ├── MJRefreshComponent_scrollViewContentSizeDidChange:{instance}.e16f83d0096447be3224827fc19b9549.specs
│ │ ├── MJRefreshComponent_scrollViewPanStateDidChange:{instance}.d34301c5662a55086b39dd2ec566b5ad.specs
│ │ ├── MJRefreshComponent_setAutoChangeAlpha:{instance}.a04c05493fc5ecf43d98b9924f8bc78c.specs
│ │ ├── MJRefreshComponent_setAutomaticallyChangeAlpha:{instance}.4591244e561c565e45c21b89ff9610d4.specs
│ │ ├── MJRefreshComponent_setPullingPercent:{instance}.5755356ca5ccb563f50c75bba6db1e9d.specs
│ │ ├── MJRefreshComponent_setRefreshingTarget:refreshingAction:{instance}.d064af6f306c53b4158833f0f020408a.specs
│ │ ├── MJRefreshComponent_willMoveToSuperview:{instance}.7f13a46585df11309a3efe2ded73b3e8.specs
│ │ ├── MJRefreshFooter_endRefreshingWithNoMoreData{instance}.7cebeaf3e25d576c2293600605c1d5dd.specs
│ │ ├── MJRefreshFooter_footerWithRefreshingBlock:{class}.7b0806c0686d1afa44b5fed238c938ea.specs
│ │ ├── MJRefreshFooter_footerWithRefreshingTarget:refreshingAction:{class}.1e0bbbdfa84d1cb2fec223b55831736b.specs
│ │ ├── MJRefreshFooter_noticeNoMoreData{instance}.494f0af619d71dbb29db8dfc8f282251.specs
│ │ ├── MJRefreshFooter_prepare{instance}.ddd00b0bdc007d8acb701df2df7655ca.specs
│ │ ├── MJRefreshFooter_resetNoMoreData{instance}.b274245415c7498741c88078022d456f.specs
│ │ ├── MJRefreshFooter_willMoveToSuperview:{instance}.3e71353e4d67175789d2dd970e67fd37.specs
│ │ ├── MJRefreshGifHeader_gifView{instance}.f27c0323d39ba73d7475591753b0d820.specs
│ │ ├── MJRefreshGifHeader_placeSubviews{instance}.3b12f3d808f6e873748f71aeeae3b0eb.specs
│ │ ├── MJRefreshGifHeader_setImages:duration:forState:{instance}.c9ff89babbdd988caa30a42380238d0f.specs
│ │ ├── MJRefreshGifHeader_setImages:forState:{instance}.eedc47d9f24c22cecd1d33d19b2da587.specs
│ │ ├── MJRefreshGifHeader_setPullingPercent:{instance}.09714a93b584cd6ad3c07c560b76c445.specs
│ │ ├── MJRefreshGifHeader_setState:{instance}.81dabe1e4914cef626e0420acceaa1fa.specs
│ │ ├── MJRefreshGifHeader_stateDurations{instance}.ee55fb0d6525e622971f502c74682d20.specs
│ │ ├── MJRefreshGifHeader_stateImages{instance}.c45aa4d25429518b434a1b8d924d07b3.specs
│ │ ├── MJRefreshHeader_drawRect:{instance}.c3e57b4a302b533c30bf09ca94992915.specs
│ │ ├── MJRefreshHeader_endRefreshing{instance}.fb3fecfe4e2f8b20f48a86c39ec8d2c8.specs
│ │ ├── MJRefreshHeader_headerWithRefreshingBlock:{class}.86bd7d9042726fde59582daf33cccd26.specs
│ │ ├── MJRefreshHeader_headerWithRefreshingTarget:refreshingAction:{class}.38704964b164af751351ca0df311361c.specs
│ │ ├── MJRefreshHeader_lastUpdatedTime{instance}.2a89276f34032f5c83485ead73d73c79.specs
│ │ ├── MJRefreshHeader_placeSubviews{instance}.1feae4d44bd11e658f4aca7d5d6cc6cb.specs
│ │ ├── MJRefreshHeader_prepare{instance}.f8820581ac423aeb157abb616851572d.specs
│ │ ├── MJRefreshHeader_scrollViewContentOffsetDidChange:{instance}.052321827b6bd024a37e6ccf4c6f5eaa.specs
│ │ ├── MJRefreshHeader_setState:{instance}.613dbd07b62ad0844ea350e1c213bfec.specs
│ │ ├── MJRefreshNormalHeader_arrowView{instance}.3c9cde775fac361e9e6fbd5ed8ee6d86.specs
│ │ ├── MJRefreshNormalHeader_loadingView{instance}.bac4283eefad58aa66ec42809991591a.specs
│ │ ├── MJRefreshNormalHeader_placeSubviews{instance}.1637f8c1509d5ff960a7ee2b01a93543.specs
│ │ ├── MJRefreshNormalHeader_prepare{instance}.c5161195985077e841f425b250b31545.specs
│ │ ├── MJRefreshNormalHeader_setActivityIndicatorViewStyle:{instance}.f54ee85457d5aef8dcad8becafed4dbe.specs
│ │ ├── MJRefreshNormalHeader_setState:{instance}.cf4cc9b8ba9cb613d7b7656d100e6a5c.specs
│ │ ├── MJRefreshStateHeader_currentCalendar{instance}.8a5d265e54d2287dcf9ab73daf03a0db.specs
│ │ ├── MJRefreshStateHeader_lastUpdatedTimeLabel{instance}.39c3adf46f0e72fe1ca7bdb144690d58.specs
│ │ ├── MJRefreshStateHeader_placeSubviews{instance}.3551b50672d8958430e0714f4a86608a.specs
│ │ ├── MJRefreshStateHeader_prepare{instance}.f22a66a2819564c00d25b26a8008dc49.specs
│ │ ├── MJRefreshStateHeader_setLastUpdatedTimeKey:{instance}.49b3e932b043bc723eadea72e523c08a.specs
│ │ ├── MJRefreshStateHeader_setState:{instance}.9e5202b000baef8593570a086f6041cc.specs
│ │ ├── MJRefreshStateHeader_setTitle:forState:{instance}.7245f932111276c34a890fcd85654763.specs
│ │ ├── MJRefreshStateHeader_stateLabel{instance}.0d68c4cd4f8dbfeb7f2359f4d961670f.specs
│ │ ├── MJRefreshStateHeader_stateTitles{instance}.38ba9a44aa4289fe8e20bd9863f71a73.specs
│ │ ├── NSObject_exchangeClassMethod1:method2:{class}.71d689a434ca09b8cb8f74bbec7f4eb5.specs
│ │ ├── NSObject_exchangeInstanceMethod1:method2:{class}.96dfacd3a3ff34cf35523d85905b2d24.specs
│ │ ├── UICollectionView_load{class}.d1e03b913041c5304ea6e6aaae62516c.specs
│ │ ├── UICollectionView_mj_reloadData{instance}.9bef8e95c2259d92fdae989582bb1f01.specs
│ │ ├── UILabel_label{class}.afa07640ba686955a2a7362d25bc45b7.specs
│ │ ├── UIScrollView_executeReloadDataBlock{instance}.2ca85f7effafbea15ae2c2975b285598.specs
│ │ ├── UIScrollView_footer{instance}.8fce697ac57901aefeb1dacc2f5a47fb.specs
│ │ ├── UIScrollView_header{instance}.e36f42d4e2603c64553db7a0edc46a00.specs
│ │ ├── UIScrollView_mj_contentH{instance}.24036d4daf4502909755d50e306cf8aa.specs
│ │ ├── UIScrollView_mj_contentW{instance}.b233414ab82901bfa5e9c481f02eed57.specs
│ │ ├── UIScrollView_mj_footer{instance}.ba19ff126339a1f9cc565424123dd04a.specs
│ │ ├── UIScrollView_mj_header{instance}.de4dca3362b06a6fcebf0d4f8ea6605d.specs
│ │ ├── UIScrollView_mj_insetB{instance}.027c674f176050465f25d28555c82310.specs
│ │ ├── UIScrollView_mj_insetL{instance}.69019a4b689dc5e9480034298613a0c4.specs
│ │ ├── UIScrollView_mj_insetR{instance}.8115b31217137fcbfb89f6bc0a2b4fbb.specs
│ │ ├── UIScrollView_mj_insetT{instance}.dac71a98dc5d026ebd267231dbdea13e.specs
│ │ ├── UIScrollView_mj_offsetX{instance}.add36016215f1fb4cf2e3cdb7c52da44.specs
│ │ ├── UIScrollView_mj_offsetY{instance}.d3262116c9f7c7ee5e0b4e48645e0584.specs
│ │ ├── UIScrollView_mj_reloadDataBlock{instance}.768a89e8546301059a84c1fcc484d254.specs
│ │ ├── UIScrollView_mj_totalDataCount{instance}.6c960100dbafbe2ab276237e1d1d821d.specs
│ │ ├── UIScrollView_setFooter:{instance}.228b084c44c3768d2822fc3e5ea603c3.specs
│ │ ├── UIScrollView_setHeader:{instance}.0e813252b26bad8d7194457a9c6ba149.specs
│ │ ├── UIScrollView_setMj_contentH:{instance}.834d14f06ceb43250beab703d0ccfc0a.specs
│ │ ├── UIScrollView_setMj_contentW:{instance}.e5a6e3a2cd405961dfb5c0d27d352b8d.specs
│ │ ├── UIScrollView_setMj_footer:{instance}.2cd77804053e8f9f52d938b68b3a588d.specs
│ │ ├── UIScrollView_setMj_header:{instance}.bd1cfdba85638094043a7255cd38d0ea.specs
│ │ ├── UIScrollView_setMj_insetB:{instance}.5a71cb186a3ec20d90f8bd47b9dac47d.specs
│ │ ├── UIScrollView_setMj_insetL:{instance}.e64529e7d174d17a7bec9ddea732217e.specs
│ │ ├── UIScrollView_setMj_insetR:{instance}.12aee9fa466171ca35f2b72511ac6b2c.specs
│ │ ├── UIScrollView_setMj_insetT:{instance}.48d5cd4609dcdd5cff9a9c427036d431.specs
│ │ ├── UIScrollView_setMj_offsetX:{instance}.e4bac092fb29b1d9c57a97f035e115ee.specs
│ │ ├── UIScrollView_setMj_offsetY:{instance}.b20c4dbf093bd5a03175f1fa88401744.specs
│ │ ├── UIScrollView_setMj_reloadDataBlock:{instance}.76ba198ea223a97ea4f70bb1841542da.specs
│ │ ├── UITableView_load{class}.84c274c5438215fdde4219bec1285f66.specs
│ │ ├── UITableView_mj_reloadData{instance}.8779ce6889d187a3a60ecee233b45a4d.specs
│ │ ├── UIView_mj_h{instance}.ee1ab511f6d44208e5e19010a90366d1.specs
│ │ ├── UIView_mj_origin{instance}.2920f5c507be706665b2cd16dee7bd48.specs
│ │ ├── UIView_mj_size{instance}.1a606f4737e097976c18bab3c2937c8a.specs
│ │ ├── UIView_mj_w{instance}.40d5044cb68b9af45a11d48702981b38.specs
│ │ ├── UIView_mj_x{instance}.68420f3d9cbd6af5459acfe1f5ff8969.specs
│ │ ├── UIView_mj_y{instance}.5ee543392493c0ac7824532a483f2ecb.specs
│ │ ├── UIView_setMj_h:{instance}.e3c6b5717320a086e65063710338abec.specs
│ │ ├── UIView_setMj_origin:{instance}.172127b30d28a15fd36a401db0f22d36.specs
│ │ ├── UIView_setMj_size:{instance}.489fcf45b45f241ec7b42263ac5af8d5.specs
│ │ ├── UIView_setMj_w:{instance}.f49ebde9182999565f9e96ae7c6f508c.specs
│ │ ├── UIView_setMj_x:{instance}.055a79745f644de01d6f4b9ebac4198d.specs
│ │ ├── UIView_setMj_y:{instance}.48f4dc71b9e738f0a240f9bf0482deb2.specs
│ │ ├── __objc_anonymous_block_HMSegmentedControl_drawRect:______1.ac00e0b31d310500f8d60cbc5fe837d4.specs
│ │ ├── __objc_anonymous_block_HMSegmentedControl_drawRect:______2.7bdf1a5d4cc5e5ba3c504eddfeac85db.specs
│ │ ├── __objc_anonymous_block_HMSegmentedControl_drawRect:______3.471cb3b49d3a9cab6761cbe3ec1d252c.specs
│ │ ├── __objc_anonymous_block_HMSegmentedControl_updateSegmentsRects______4.429f1ffb7ec31f9a9c435111bc406f9c.specs
│ │ ├── __objc_anonymous_block_HMSegmentedControl_updateSegmentsRects______5.a41e476bf4b88c8e9f84999dce16c732.specs
│ │ ├── __objc_anonymous_block_HMSegmentedControl_updateSegmentsRects______6.dee26246d5e256df34bdf8b19b84cde7.specs
│ │ ├── __objc_anonymous_block_HMSegmentedControl_updateSegmentsRects______7.269aa7e8b4620722a518c763475e9f4f.specs
│ │ ├── __objc_anonymous_block_MBProgressHUD_showAnimated:whileExecutingBlock:onQueue:completionBlock:______.409368d69a6b2c45cfe2d573b5fa37c4.specs
│ │ ├── __objc_anonymous_block_MJRefreshAutoFooter_setState:______1.aedcdd766515748b002173dc90ceff19.specs
│ │ ├── __objc_anonymous_block_MJRefreshBackFooter_setState:______1.cfa28ad1b71153eff2ab2df148a9350c.specs
│ │ ├── __objc_anonymous_block_MJRefreshBackFooter_setState:______2.8de7ef77687044e540ac043423b63632.specs
│ │ ├── __objc_anonymous_block_MJRefreshBackFooter_setState:______3.b2c868550af9354ff62f3e4fc3848162.specs
│ │ ├── __objc_anonymous_block_MJRefreshBackFooter_setState:______4.ab8afe779bff8ed6270e2d15f642c4fe.specs
│ │ ├── __objc_anonymous_block_MJRefreshBackNormalFooter_setState:______1.7522c36b71d1ab187151be463eff1098.specs
│ │ ├── __objc_anonymous_block_MJRefreshBackNormalFooter_setState:______2.c0b565ccdc6399fe31cea3f918a63d77.specs
│ │ ├── __objc_anonymous_block_MJRefreshBackNormalFooter_setState:______3.96e6d447a9ecb2dbbf0a435a452011fe.specs
│ │ ├── __objc_anonymous_block_MJRefreshBackNormalFooter_setState:______4.fc556a200c10aeee80632a7de7f14568.specs
│ │ ├── __objc_anonymous_block_MJRefreshComponent_beginRefreshing______1.21a03cc40ef29fea9c999c520e574567.specs
│ │ ├── __objc_anonymous_block_MJRefreshComponent_executeRefreshingCallback______2.ac25df20ab117714920dc4367d5da310.specs
│ │ ├── __objc_anonymous_block_MJRefreshFooter_willMoveToSuperview:______1.06e600200d9f03e2ae58f19c069e87ed.specs
│ │ ├── __objc_anonymous_block_MJRefreshHeader_setState:______1.d3a54c1db631c871b31b389567116d06.specs
│ │ ├── __objc_anonymous_block_MJRefreshHeader_setState:______2.76071b0d0f5e67c93ff3d61cf3a3789e.specs
│ │ ├── __objc_anonymous_block_MJRefreshHeader_setState:______3.8532e74d34f685982ae68b06d10fd8df.specs
│ │ ├── __objc_anonymous_block_MJRefreshHeader_setState:______4.7d0f7a7a3eb581c034485e549b090838.specs
│ │ ├── __objc_anonymous_block_MJRefreshNormalHeader_setState:______1.13050930c71724b7417ba383bb55c321.specs
│ │ ├── __objc_anonymous_block_MJRefreshNormalHeader_setState:______2.1b4d0233230d9fceaa325a329806fc0d.specs
│ │ ├── __objc_anonymous_block_MJRefreshNormalHeader_setState:______3.696a392bca56dbc6cc8c2c8a2eb661b9.specs
│ │ ├── __objc_anonymous_block_MJRefreshNormalHeader_setState:______4.2249f9bd76235aa33803cf6005991b20.specs
│ │ └── __objc_anonymous_block___objc_anonymous_block_MBProgressHUD_showAnimated:whileExecutingBlock:onQueue.c2d18021879fb88e6826d66a2b095c56.specs
│ ├── stats.json
│ └── toplevel.log
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── SECURITY.md
├── docs/
│ ├── README.md
│ ├── architecture/
│ │ └── REPO_STRUCTURE.md
│ └── legacy/
│ ├── bugs.md
│ ├── opensource.md
│ ├── other.md
│ ├── reference.md
│ └── suggestion.md
├── logo/
│ └── version1.0/
│ ├── BeeFun.sketch
│ ├── bee.icns
│ └── bee.iconsproj
└── screenshot/
└── version1.0/
└── orginal/
└── desing/
└── screenshot.sketch
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
# Xcode
#
build/
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
xcuserdata
*.xccheckout
*.moved-aside
DerivedData
*.hmap
*.ipa
*.xcuserstate
# CocoaPods
#
# We recommend against adding the Pods directory to your .gitignore. However
# you should judge for yourself, the pros and cons are mentioned at:
# http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control
#
BeeFun/Pods/
# Carthage
#
# Add this line if you want to avoid checking in source code from Carthage dependencies.
# Carthage/Checkouts
Carthage/Build
================================================
FILE: BeeFun/.swiftlint.yml
================================================
disabled_rules: # 执行时排除掉的规则
- line_length
- identifier_name
- trailing_whitespace
- empty_count
- function_body_length
opt_in_rules: # 一些规则仅仅是可选的
- missing_docs
# 可以通过执行如下指令来查找所有可用的规则:
# swiftlint rules
included: # 执行 linting 时包含的路径。如果出现这个 `--path` 会被忽略。
excluded: # 执行 linting 时忽略的路径。 优先级比 `included` 更高。
- Carthage
- Pods
# 可配置的规则可以通过这个配置文件来自定义
# 二进制规则可以设置他们的严格程度
force_cast: warning # 隐式
force_try:
severity: warning # 显式
# 同时有警告和错误等级的规则,可以只设置它的警告等级
# 隐式
line_length: 110
# 可以通过一个数组同时进行隐式设置
type_body_length:
- 300 # warning
- 1000 # error
# 或者也可以同时进行显式设置
file_length:
warning: 2000
error: 4000
# 命名规则可以设置最小长度和最大程度的警告/错误
# 此外它们也可以设置排除在外的名字
type_name:
min_length: 4 # 只是警告
max_length: # 警告和错误
warning: 40
error: 50
excluded: # 排除某个名字
- iPhone
- iOS
- iPad
- iOSVersion
cyclomatic_complexity: 50
================================================
FILE: BeeFun/BeeFun/AppDelegate.swift
================================================
//
// AppDelegate.swift
// BeeFun
//
// Created by wenghengcong on 15/12/22.
// Copyright © 2015年 JungleSong. All rights reserved.
//
import UIKit
import UserNotifications
//import SwiftyStoreKit
import OAuthSwift
import Alamofire
#if DEBUG
//import GDPerformanceView_Swift
#endif
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate {
var window: UIWindow?
var tabBarController: BFBaseTabBarController?
class var sharedInstance: AppDelegate {
return UIApplication.shared.delegate as! AppDelegate
}
func application(_ application: UIApplication,
didFinishLaunchingWithOptions
launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
BFLanunchManager.shared.application(application, didFinishLaunchingWithOptions: launchOptions)
window = UIWindow(frame: UIScreen.main.bounds)
window?.backgroundColor = UIColor.white
window?.makeKeyAndVisible()
tabBarController = BFBaseTabBarController()
window?.rootViewController = tabBarController
//User Notification
if #available(iOS 10.0, *) {
UNUserNotificationCenter.current().delegate = self
} else {
// Fallback on earlier versions
}
return true
}
// MARK: - Device token
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
let deviceTokenString = deviceToken.reduce("", {$0 + String(format: "%02X", $1)})
print("device token \(deviceTokenString)")
JPUSHService.registerDeviceToken(deviceToken)
}
func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
print("did fail to register for remote notifications with error: \(error)")
}
// MARK: - iOS 10 以下
// MARK: Action Notification
/**
* Called when your app has been activated by the user selecting an action from a remote notification.
* 8.0 above
* 当操作交互式通知时,进入这里
*/
func application(_ application: UIApplication, handleActionWithIdentifier identifier: String?, forRemoteNotification userInfo: [AnyHashable: Any], completionHandler: @escaping () -> Void) {
completionHandler()
}
/**
* Called when your app has been activated by the user selecting an action from a remote notification.
* 9.0 above
*/
func application(_ application: UIApplication, handleActionWithIdentifier identifier: String?, forRemoteNotification userInfo: [AnyHashable: Any], withResponseInfo responseInfo: [AnyHashable : Any], completionHandler: @escaping () -> Void) {
completionHandler()
}
/**
* Called when your app has been activated by the user selecting an action from a local notification.
* 8.0 above
*/
func application(_ application: UIApplication, handleActionWithIdentifier identifier: String?, for notification: UILocalNotification, completionHandler: @escaping () -> Void) {
completionHandler()
}
/**
* Called when your app has been activated by the user selecting an action from a local notification.
* 9.0 above
*/
func application(_ application: UIApplication, handleActionWithIdentifier identifier: String?, for notification: UILocalNotification, withResponseInfo responseInfo: [AnyHashable: Any], completionHandler: @escaping () -> Void) {
completionHandler()
}
// MARK: Local Notification
/**
* iOS 10之前,在前台,收到本地通知,会进入这里
* iOS 10之前,在后台,点击本地通知,会进入这里
* 假如未设置UNUserNotificationCenter代理,iOS 10收到本地通知也会进入这里。
*/
func application(_ application: UIApplication, didReceive notification: UILocalNotification) {
BFMessageManager.receiveLocalNotificaion(notification: notification)
}
/**
* iOS 10之前,若未实现该代理application didReceiveRemoteNotification: fetchCompletionHandler:
不管在前台还是在后台,收到远程通知(包括静默通知)会进入didReceiveRemoteNotification代理方法;
* 假如实现了,收到远程通知(包括静默通知)就会进入application didReceiveRemoteNotification: fetchCompletionHandler:方法
* 假如未设置UNUserNotificationCenter代理,iOS 10收到远程通知也会进入这里。
*/
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any]) {
BFMessageManager.receiveRemoteNotification(userInfo: userInfo)
}
/*! This delegate method offers an opportunity for applications with the "remote-notification" background mode to fetch appropriate new data in response to an incoming remote notification. You should call the fetchCompletionHandler as soon as you're finished performing that operation, so the system can accurately estimate its power and data cost.
This method will be invoked even if the application was launched or resumed because of the remote notification. The respective delegate methods will be invoked first. Note that this behavior is in contrast to application:didReceiveRemoteNotification:, which is not called in those cases, and which will not be invoked if this method is implemented. !*/
/**
* iOS 10之前,不管在前台还是在后台,收到远程通知会进入此处;
* iOS 10之前,若未实现该代理,不管在前台还是在后台,收到远程通知会进入didReceiveRemoteNotification代理方法;
* iOS 10之前,静默通知,会进入到这里;
* iOS 10之后,在前台,静默通知,也会进入到这里
如果为设置代理,再调用- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler。
否则,不会调用上面方法;
* iOS 10之后,在后台,收到静默推送,也会进到这里。
*/
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
}
// MARK: - iOS 10 UNUserNotificationCenterDelegate
/**
* 在用户与你通知的通知进行交互时被调用,包括用户通过通知打开了你的应用,或者点击或者触发了某个action
* 后台收到远程通知,点击进入
* 后台收到本地通知,点击进入
*/
@available(iOS 10.0, *)
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
print(response)
BFMessageManager.receiveResponse(response: response)
completionHandler()
}
/**
* 在前台如何处理,通过completionHandler指定。如果不想显示某个通知,可以直接用空 options 调用 completionHandler:
// completionHandler(0)
* 前台收到远程通知,进入这里
* 前台收到本地通知,进入这里
* 前台收到带有其他字段alert/sound/badge的静默通知,进入这里
* 后台收到静默通知不会调用该方法
*/
@available(iOS 10.0, *)
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification,
withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
print(notification)
BFMessageManager.receiveNotification(notification: notification)
// 需要执行这个方法,选择是否提醒用户,有Badge、Sound、Alert三种类型可以设置
let option = ( UNNotificationPresentationOptions.badge.rawValue|UNNotificationPresentationOptions.alert.rawValue|UNNotificationPresentationOptions.sound.rawValue )
completionHandler(UNNotificationPresentationOptions(rawValue: option))
}
// MARK: - App Life cycle
func applicationWillResignActive(_ application: UIApplication) {
// 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.
// Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
}
func applicationDidEnterBackground(_ application: UIApplication) {
// 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.
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
}
func applicationWillEnterForeground(_ application: UIApplication) {
// Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
}
func applicationDidBecomeActive(_ application: UIApplication) {
// 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.
BFLanunchManager.shared.applicationDidBecomeActive(application)
}
func applicationWillTerminate(_ application: UIApplication) {
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}
// MARK: - Open URL
func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
//return UMSocialSnsService.handleOpen(url, wxApiDelegate: nil)
applicationHandle(url: url)
return true
}
func application(_ application: UIApplication, handleOpen url: URL) -> Bool {
//return UMSocialSnsService.handleOpen(url)
return true
}
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
applicationHandle(url: url)
return true
}
func applicationHandle(url: URL) {
if url.host == AppOfficeShortSite {
OAuthSwift.handle(url: url)
} else {
// Google provider is the only one wuth your.bundle.id url schema.
OAuthSwift.handle(url: url)
}
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/AppIcon.appiconset/Contents.json
================================================
{
"images" : [
{
"size" : "20x20",
"idiom" : "iphone",
"filename" : "bee-20x20@2x-1.png",
"scale" : "2x"
},
{
"size" : "20x20",
"idiom" : "iphone",
"filename" : "bee-20x20@3x.png",
"scale" : "3x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "bee-Small@2x-1.png",
"scale" : "2x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "bee-Small@3x-1.png",
"scale" : "3x"
},
{
"size" : "40x40",
"idiom" : "iphone",
"filename" : "bee-Small-40@2x.png",
"scale" : "2x"
},
{
"size" : "40x40",
"idiom" : "iphone",
"filename" : "bee-Small-40@3x.png",
"scale" : "3x"
},
{
"size" : "60x60",
"idiom" : "iphone",
"filename" : "bee-60@2x.png",
"scale" : "2x"
},
{
"size" : "60x60",
"idiom" : "iphone",
"filename" : "bee-60@3x.png",
"scale" : "3x"
},
{
"size" : "20x20",
"idiom" : "ipad",
"filename" : "bee-20x20.png",
"scale" : "1x"
},
{
"size" : "20x20",
"idiom" : "ipad",
"filename" : "bee-20x20@2x.png",
"scale" : "2x"
},
{
"size" : "29x29",
"idiom" : "ipad",
"filename" : "bee-Small.png",
"scale" : "1x"
},
{
"size" : "29x29",
"idiom" : "ipad",
"filename" : "bee-Small@2x-2.png",
"scale" : "2x"
},
{
"size" : "40x40",
"idiom" : "ipad",
"filename" : "bee-Small-40.png",
"scale" : "1x"
},
{
"size" : "40x40",
"idiom" : "ipad",
"filename" : "bee-HomeScreen-38-Long-Look.png",
"scale" : "2x"
},
{
"size" : "76x76",
"idiom" : "ipad",
"filename" : "bee-76.png",
"scale" : "1x"
},
{
"size" : "76x76",
"idiom" : "ipad",
"filename" : "bee-76@2x.png",
"scale" : "2x"
},
{
"size" : "83.5x83.5",
"idiom" : "ipad",
"filename" : "bee-83.5@2x.png",
"scale" : "2x"
},
{
"size" : "1024x1024",
"idiom" : "ios-marketing",
"filename" : "bee_1024-1.png",
"scale" : "1x"
},
{
"size" : "24x24",
"idiom" : "watch",
"filename" : "bee-38-Notification.png",
"scale" : "2x",
"role" : "notificationCenter",
"subtype" : "38mm"
},
{
"size" : "27.5x27.5",
"idiom" : "watch",
"filename" : "bee-42-Notification.png",
"scale" : "2x",
"role" : "notificationCenter",
"subtype" : "42mm"
},
{
"size" : "29x29",
"idiom" : "watch",
"filename" : "bee-Small@2x.png",
"role" : "companionSettings",
"scale" : "2x"
},
{
"size" : "29x29",
"idiom" : "watch",
"filename" : "bee-Small@3x.png",
"role" : "companionSettings",
"scale" : "3x"
},
{
"size" : "40x40",
"idiom" : "watch",
"filename" : "bee-Small-40@2x-1.png",
"scale" : "2x",
"role" : "appLauncher",
"subtype" : "38mm"
},
{
"size" : "44x44",
"idiom" : "watch",
"scale" : "2x",
"role" : "appLauncher",
"subtype" : "40mm"
},
{
"size" : "50x50",
"idiom" : "watch",
"scale" : "2x",
"role" : "appLauncher",
"subtype" : "44mm"
},
{
"size" : "86x86",
"idiom" : "watch",
"filename" : "bee-38-Short-Look.png",
"scale" : "2x",
"role" : "quickLook",
"subtype" : "38mm"
},
{
"size" : "98x98",
"idiom" : "watch",
"filename" : "bee-42-Short-Look.png",
"scale" : "2x",
"role" : "quickLook",
"subtype" : "42mm"
},
{
"size" : "108x108",
"idiom" : "watch",
"scale" : "2x",
"role" : "quickLook",
"subtype" : "44mm"
},
{
"size" : "1024x1024",
"idiom" : "watch-marketing",
"filename" : "bee_1024.png",
"scale" : "1x"
},
{
"size" : "44x44",
"idiom" : "watch",
"filename" : "bee-42-Long-Look.png",
"scale" : "2x",
"role" : "longLook",
"subtype" : "42mm"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/Contents.json
================================================
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/Github/Contents.json
================================================
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/Github/git_fork.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "git_fork@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/Github/git_star.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "git_star@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/Github/git_starred.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "git_starred@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/Logo/Contents.json
================================================
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/Logo/app_logo_90.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "Artboard.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "Artboard@2x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/Logo/github_signin_logo.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "signin_logo@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/Logo/login_tip.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "login_tip.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_15/Contents.json
================================================
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_15/octicon_comment_15.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "octicon_comment_45@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_15/octicon_fork_15.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "octicon_fork_15@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "octicon_fork_15@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_15/octicon_person_15.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "octicon_person_15@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_15/octicon_repo_15.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "octicons_repo_15@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "octicon_repo_15@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_15/octicon_star_15.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "octicon_star_15@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "octicon_star_15@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_15/octicon_state_15.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "octicon_state_15@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_15/octicon_time_15.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "octicon_time_15@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_15/octicons_code_15.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "octicons_code_15@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "octicons_code_15@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_20/Contents.json
================================================
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_20/octicon_filesize_20.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "octicon_filesize_20@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "octicon_filesize_20@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
},
"properties" : {
"template-rendering-intent" : "original"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_20/octicon_fork_20.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "octicon_fork_20@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "octicon_fork_20@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
},
"properties" : {
"template-rendering-intent" : "original"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_20/octicon_issue_20.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "octicon_issue_20@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "octicon_issue_20@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
},
"properties" : {
"template-rendering-intent" : "original"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_20/octicon_language_20.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "octicon_language_20@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "octicon_language_20@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
},
"properties" : {
"template-rendering-intent" : "original"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_20/octicon_private_20.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "octicon_private_20@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "octicon_private_20@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
},
"properties" : {
"template-rendering-intent" : "original"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_20/octicon_star_20.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "octicon_star_20@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "octicon_star_20@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
},
"properties" : {
"template-rendering-intent" : "original"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_20/octicon_watch_20.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "octicon_watch_20@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "octicon_watch_20@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
},
"properties" : {
"template-rendering-intent" : "original"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_20/octicons_code_20.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "octicons_code_20@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "octicons_code_20@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_25/Contents.json
================================================
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_25/coticon_branch_25.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "coticon_branch_25@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_25/coticon_home_25.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "coticon_home_25@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "coticon_home_25@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_25/coticon_repository_25.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "coticon_repos_25@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_25/coticon_tag_25.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "octicon_tag_25@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "coticon_tag_25@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_25/octicon_commit_25.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "octicon_commit_25@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "octicon_commit_25@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_25/octicon_issue_25.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "octicon_issue@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_25/octicon_loc_25.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "octicon_loc_25@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "octicon_loc_25@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_25/octicon_org_25.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "octicon_org_25@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "octicon_org_25@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_25/octicon_person_25.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "octicon_person_25@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "octicon_person_25@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_25/octicon_pull_request_25.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "octicon_pull_request@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_25/octicon_push_25.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "octicon_push_25@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_25/octicon_time_25.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "octicon_time_25@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "octicon_time_25@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_25/octicons_code_25.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "octicons_code_25@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "octicons_code_25@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_35/Contents.json
================================================
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_35/octicon_star_35.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "octicon_star_35@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_Red/Contents.json
================================================
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_Red/octicon_fork_red_20.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "octicon-repo-forked_40_0_e31100_none.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "octicon-repo-forked_60_0_e31100_none.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
},
"properties" : {
"template-rendering-intent" : "original"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_Red/octicon_fork_red_25.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "octicon_fork_red_25@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "octicon_fork_red_25@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
},
"properties" : {
"template-rendering-intent" : "original"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_Red/octicon_star_red_20.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "octicon-star_40_0_e31100_none.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "octicon-star_60_0_e31100_none.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
},
"properties" : {
"template-rendering-intent" : "original"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_Red/octicon_watch_red_20.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "octicon-eye_40_0_e31100_none.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "octicon-eye_60_0_e31100_none.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
},
"properties" : {
"template-rendering-intent" : "original"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_Red/octicon_watch_red_25.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "octicon_watch_red_25@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "octicon_watch_red_25@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
},
"properties" : {
"template-rendering-intent" : "original"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/ReposDetail/Contents.json
================================================
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/ReposDetail/repos_file.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "repos_file@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/ReposDetail/repos_fork.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "repos_fork@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/ReposDetail/repos_homepage.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "book.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "book-1.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/ReposDetail/repos_issue.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "repos_issue@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/ReposDetail/repos_lan.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "repos_lan@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/ReposDetail/repos_lock.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "repos_lock@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/ReposDetail/repos_me.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "me (1).png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "me.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/ReposDetail/repos_star.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "repos_star@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/ReposDetail/repos_unlock.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "repos_unlock@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/ReposDetail/repos_watch.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "repos_watch@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/Tag/Contents.json
================================================
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/Tag/set_tag_black.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "tag.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "tag (1).png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/Tag/tag_pop.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "chat.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/Tag/tags_add.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "tags_add@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "tags_add@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/UserDetail/Contents.json
================================================
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/UserDetail/user_home.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "user_home@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "home.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/UserDetail/user_loc.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "user_loc@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "position.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/UserDetail/user_org.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "user_org@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "building.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/UserDetail/user_time.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "clock (6).png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "clock (5).png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/arrow/Contents.json
================================================
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/arrow/arrow_down.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "向下箭头.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "向下箭头 (1).png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/arrow/arrow_down_gray.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "向下箭头 (1).png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "向下箭头.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/arrow/arrow_left.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "向左箭头.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "向左箭头 (1).png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/arrow/arrow_left_gray.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "向左箭头 (1).png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "向左箭头.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/arrow/arrow_right.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "向右箭头 (1).png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "向右箭头.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/arrow/arrow_right_gray.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "向右箭头.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "向右箭头 (1).png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/arrow/arrow_up.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "向上箭头 (1).png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "向上箭头.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/arrow/arrow_up_gray.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "向上箭头.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "向上箭头 (1).png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/bar_icon/Contents.json
================================================
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/bar_icon/nav_cancel.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "cancel (1).png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "cancel.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/bar_icon/nav_funnel.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "funnel (1).png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "funnel.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/bar_icon/nav_funnel_sel.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "Filter Filled-60.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/bar_icon/nav_seg_nor.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "Combined Shape@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "Combined Shape@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/bar_icon/nav_seg_sel.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "Group@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "Group@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/bar_icon/nav_share.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "share (3).png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "share (2).png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/network/Contents.json
================================================
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/network/empty_data.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "Group@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "Group@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/network/network_error_1.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "constructocat2@2x.jpg",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "constructocat2@3x.jpg",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/network/network_error_2.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "network_error@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "network_error@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/octocat/Contents.json
================================================
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Assets.xcassets/octocat/benevocats.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "benevocats.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "benevocats3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BeeFun/BeeFun/Base.lproj/LaunchScreen.storyboard
================================================
================================================
FILE: BeeFun/BeeFun/BeeFun-Bridging-Header.h
================================================
//
// Use this file to import your target's public headers that you would like to expose to Swift.
//
//#import
#import
#import
#import
//==========ShareSDK头文件====================
#import
#import
//==========ShareSDKUI头文件,使用ShareSDK提供的UI需要导入=====
#import
#import
//==========以下是各个平台SDK的头文件,根据需要继承的平台添加===
//腾讯开放平台(对应QQ和QQ空间)SDK头文件
#import
#import
#import "WXApi.h"
#import "WeiboSDK.h"
//新浪微博SDK需要在项目Build Settings中的Other Linker Flags添加"-ObjC"
//#import "iCarousel.h"
================================================
FILE: BeeFun/BeeFun/BeeFun.entitlements
================================================
aps-environment
development
================================================
FILE: BeeFun/BeeFun/Info.plist
================================================
CFBundleDevelopmentRegion
en
CFBundleDisplayName
BeeFun
CFBundleExecutable
$(EXECUTABLE_NAME)
CFBundleIdentifier
$(PRODUCT_BUNDLE_IDENTIFIER)
CFBundleInfoDictionaryVersion
6.0
CFBundleName
${PRODUCT_NAME}
CFBundlePackageType
APPL
CFBundleShortVersionString
1.0.6
CFBundleSignature
????
CFBundleURLTypes
CFBundleTypeRole
Editor
CFBundleURLName
facebook
CFBundleURLSchemes
fb789261007875015
CFBundleTypeRole
Editor
CFBundleURLName
weibo
CFBundleURLSchemes
wb1224249220
CFBundleTypeRole
Editor
CFBundleURLName
weixin
CFBundleURLSchemes
wx9231f7e12ddac379
CFBundleTypeRole
Editor
CFBundleURLName
qq
CFBundleURLSchemes
QQ41ED8968
CFBundleTypeRole
Editor
CFBundleURLName
tencent
CFBundleURLSchemes
tencent1105263895
CFBundleTypeRole
Editor
CFBundleURLIconFile
CFBundleURLName
beefunios
CFBundleURLSchemes
beefunios
CFBundleVersion
1153
Fabric
APIKey
e7fc6fe67f5ece8c9c70144eafeb17ac57c79885
Kits
KitInfo
KitName
Answers
KitInfo
KitName
Crashlytics
FacebookAppID
789261007875015
FacebookDisplayName
Coder
LSApplicationQueriesSchemes
alipayauth
alipayqr
alipay
alipayshare
wechat
weixin
sinaweibohd
sinaweibo
sinaweibosso
sinaweibohdsso
weibosdk
weibosdk2.5
mqqapi
mqq
mqqOpensdkSSoLogin
mqqconnect
mqqopensdkdataline
mqqopensdkgrouptribeshare
mqqopensdkfriend
mqqopensdkapi
mqqopensdkapiV2
mqqopensdkapiV3
mqqopensdkapiV4
mqzoneopensdk
wtloginmqq
wtloginmqq2
mqqwpa
mqzone
mqzonev2
mqzoneshare
wtloginqzone
mqzonewx
mqzoneopensdkapiV2
mqzoneopensdkapi19
mqzoneopensdkapi
mqqbrowser
mttbrowser
fbapi
fb-messenger-api
fb-messenger
fbauth
fbauth2
fbshareextension
LSRequiresIPhoneOS
MOBAppSecret
480ba09dc992ae0234a0fef9183ff836
MOBAppkey
11b9cf1d0cec0
NSAppTransportSecurity
NSAllowsArbitraryLoads
NSExceptionDomains
github.com
NSExceptionAllowsInsecureHTTPLoads
NSIncludesSubdomains
jpush.cn
NSExceptionAllowsInsecureHTTPLoads
NSIncludesSubdomains
akamaihd.net
NSExceptionAllowsInsecureHTTPLoads
NSExceptionRequiresForwardSecrecy
NSIncludesSubdomains
facebook.com
NSExceptionAllowsInsecureHTTPLoads
NSExceptionRequiresForwardSecrecy
NSIncludesSubdomains
fbcdn.net
NSExceptionAllowsInsecureHTTPLoads
NSExceptionRequiresForwardSecrecy
NSIncludesSubdomains
qq.com
NSExceptionAllowsInsecureHTTPLoads
NSExceptionRequiresForwardSecrecy
NSIncludesSubdomains
sina.com.cn
NSExceptionAllowsInsecureHTTPLoads
NSExceptionRequiresForwardSecrecy
NSIncludesSubdomains
twitter.com
twitter.com
NSExceptionAllowsInsecureHTTPLoads
NSExceptionRequiresForwardSecrecy
NSIncludesSubdomains
weibo.cn
NSExceptionAllowsInsecureHTTPLoads
NSExceptionRequiresForwardSecrecy
NSIncludesSubdomains
weibo.com
NSExceptionAllowsInsecureHTTPLoads
NSExceptionRequiresForwardSecrecy
NSIncludesSubdomains
NSPhotoLibraryUsageDescription
BeeFun will access your photo library
NSUbiquitousContainers
iCloud.com.luci.beefun.mac
NSUbiquitousContainerIsDocumentScopePublic
NSUbiquitousContainerName
BeeFun
NSUbiquitousContainerSupportedFolderLevels
Any
UIBackgroundModes
remote-notification
UILaunchStoryboardName
LaunchScreen
UIMainStoryboardFile
Main
UIRequiredDeviceCapabilities
armv7
UIRequiresFullScreen
UIStatusBarStyle
UIStatusBarStyleLightContent
UIStatusBarTintParameters
UINavigationBar
Style
UIBarStyleDefault
Translucent
UISupportedInterfaceOrientations
UIInterfaceOrientationPortrait
UIInterfaceOrientationPortraitUpsideDown
UIViewControllerBasedStatusBarAppearance
================================================
FILE: BeeFun/BeeFun/Model/BeeFunModel/BeeFunResponseModel.swift
================================================
//
// BeeFunResponseModel.swift
// BeeFun
//
// Created by WengHengcong on 2018/5/3.
// Copyright © 2018年 JungleSong. All rights reserved.
//
import UIKit
import ObjectMapper
class BeeFunResponseModel: NSObject, Mappable {
var code: Int?
var codeEnum: BFStatusCode?
var msg: String?
required init?(map: Map) {
}
func mapping(map: Map) {
// super.mapping(map)
code <- map["code"]
if code != nil {
codeEnum = BFStatusCode(rawValue: code!)
}
msg <- map["msg"]
}
}
================================================
FILE: BeeFun/BeeFun/Model/BeeFunModel/BeeFunTrendingResponseModel.swift
================================================
//
// BeeFunTrendingResponseModel.swift
// BeeFun
//
// Created by Hunt on 2019/6/25.
// Copyright © 2019 JungleSong. All rights reserved.
//
import UIKit
import ObjectMapper
class BeeFunTrendingResponseModel: NSObject, Mappable {
var code: Int?
var codeEnum: BFStatusCode?
var msg: String?
var data: [BFGithubTrengingModel]?
required init?(map: Map) {
}
func mapping(map: Map) {
// super.mapping(map)
code <- map["code"]
if code != nil {
codeEnum = BFStatusCode(rawValue: code!)
}
msg <- map["msg"]
data <- map["data"]
}
}
================================================
FILE: BeeFun/BeeFun/Model/BeeFunModel/GetAllTagResponse.swift
================================================
//
// GetAllTagResponse.swift
// BeeFun
//
// Created by WengHengcong on 2018/5/3.
// Copyright © 2018年 JungleSong. All rights reserved.
//
import UIKit
import ObjectMapper
class GetAllTagResponse: BeeFunResponseModel {
var data: [ObjTag]?
required init?(map: Map) {
super.init(map: map)
}
override func mapping(map: Map) {
super.mapping(map: map)
data <- map["data"]
}
}
================================================
FILE: BeeFun/BeeFun/Model/BeeFunModel/GetReposResponse.swift
================================================
//
// GetReposResponse.swift
// BeeFun
//
// Created by WengHengcong on 2018/5/12.
// Copyright © 2018年 JungleSong. All rights reserved.
//
import UIKit
import ObjectMapper
class GetReposResponse: BeeFunResponseModel {
var data: [ObjRepos]?
required init?(map: Map) {
super.init(map: map)
}
override func mapping(map: Map) {
super.mapping(map: map)
data <- map["data"]
}
}
================================================
FILE: BeeFun/BeeFun/Model/BeeFunModel/ObjTag.swift
================================================
//
// ObjTagModel.swift
// BeeFun
//
// Created by WengHengcong on 2018/5/3.
// Copyright © 2018年 JungleSong. All rights reserved.
//
import UIKit
import ObjectMapper
public class ObjTag: NSObject, Mappable, NSCopying {
public func copy(with zone: NSZone? = nil) -> Any {
let newCopy = ObjTag()
newCopy.name = name
newCopy.owner = owner
newCopy.count = count
newCopy.sort = sort
newCopy.repos = repos
newCopy.created_at = created_at
newCopy.updated_at = updated_at
return newCopy
}
var name: String?
var owner: String?
var count: Int?
var sort: Int?
var repos: String?
var created_at: Int64?
var updated_at: Int64?
required public init?(map: Map) {
}
override init() {
super.init()
}
public func mapping(map: Map) {
name <- map["name"]
owner <- map["owner"]
count <- map["count"]
sort <- map["sort"]
repos <- map["repos"]
created_at <- map["created_at"]
updated_at <- map["updated_at"]
}
}
================================================
FILE: BeeFun/BeeFun/Model/DataModel.swift
================================================
//
// DataModel.swift
// BeeFun
//
// Created by wenghengcong on 16/1/31.
// Copyright © 2016年 JungleSong. All rights reserved.
//
import UIKit
import Foundation
class DataModel: NSObject {
}
================================================
FILE: BeeFun/BeeFun/Model/Event/ObjAsset.swift
================================================
//
// ObjAsset.swift
// BeeFun
//
// Created by WengHengcong on 26/09/2017.
// Copyright © 2017 JungleSong. All rights reserved.
//
import UIKit
import ObjectMapper
/*
{
"url": "https://api.github.com/repos/octocat/Hello-World/releases/assets/1",
"browser_download_url": "https://github.com/octocat/Hello-World/releases/download/v1.0.0/example.zip",
"id": 1,
"name": "example.zip",
"label": "short description",
"state": "uploaded",
"content_type": "application/zip",
"size": 1024,
"download_count": 42,
"created_at": "2013-02-27T19:35:32Z",
"updated_at": "2013-02-27T19:35:32Z",
"uploader": {
"login": "octocat",
"id": 1,
"avatar_url": "https://github.com/images/error/octocat_happy.gif",
"gravatar_id": "",
"url": "https://api.github.com/users/octocat",
"html_url": "https://github.com/octocat",
"followers_url": "https://api.github.com/users/octocat/followers",
"following_url": "https://api.github.com/users/octocat/following{/other_user}",
"gists_url": "https://api.github.com/users/octocat/gists{/gist_id}",
"starred_url": "https://api.github.com/users/octocat/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/octocat/subscriptions",
"organizations_url": "https://api.github.com/users/octocat/orgs",
"repos_url": "https://api.github.com/users/octocat/repos",
"events_url": "https://api.github.com/users/octocat/events{/privacy}",
"received_events_url": "https://api.github.com/users/octocat/received_events",
"type": "User",
"site_admin": false
}
}
*/
class ObjAsset: Mappable {
var url: String?
var browser_download_url: String?
var id: ObjUser?
var name: String?
var label: String?
var state: Bool?
var content_type: String?
var size: Int?
var download_count: Int?
var created_at: Bool?
var updated_at: String?
var uploader: ObjUser?
required init?(map: Map) {
}
func mapping(map: Map) {
url <- map["url"]
browser_download_url <- map["browser_download_url"]
id <- map["id"]
name <- map["name"]
label <- map["label"]
state <- map["state"]
content_type <- map["content_type"]
size <- map["size"]
download_count <- map["download_count"]
created_at <- map["created_at"]
updated_at <- map["updated_at"]
uploader <- map["uploader"]
}
}
================================================
FILE: BeeFun/BeeFun/Model/Event/ObjBranch.swift
================================================
//
// ObjHead.swift
// BeeFun
//
// Created by WengHengcong on 15/09/2017.
// Copyright © 2017 JungleSong. All rights reserved.
//
import UIKit
import ObjectMapper
/*
{
"label": "new-topic",
"ref": "new-topic",
"sha": "6dcb09b5b57875f334f61aebed695e2e4193db5e",
"user": {
}
"repo": {
}
}
*/
class ObjBranch: NSObject, Mappable {
var label: String?
var ref: String?
var sha: String?
var user: ObjUser?
var repo: ObjRepos?
required init?(map: Map) {
}
func mapping(map: Map) {
label <- map["label"]
ref <- map["ref"]
user <- map["user"]
repo <- map["repo"]
sha <- map["sha"]
}
}
================================================
FILE: BeeFun/BeeFun/Model/Event/ObjComment.swift
================================================
//
// ObjComment.swift
// BeeFun
//
// Created by WengHengcong on 2/23/16.
// Copyright © 2016 JungleSong. All rights reserved.
//
/**
*
{
"html_url": "https://github.com/octocat/Hello-World/commit/6dcb09b5b57875f334f61aebed695e2e4193db5e#commitcomment-1",
"url": "https://api.github.com/repos/octocat/Hello-World/comments/1",
"id": 1,
"body": "Great stuff",
"path": "file1.txt",
"position": 4,
"line": 14,
"commit_id": "6dcb09b5b57875f334f61aebed695e2e4193db5e",
"user": {},
"created_at": "2011-04-14T16:00:49Z",
"updated_at": "2011-04-14T16:00:49Z"
}
*/
import UIKit
import ObjectMapper
class ObjComment: NSObject, Mappable {
var url: String?
var html_url: String?
var issue_url: String?
var id: Int?
var user: ObjUser?
var created_at: String?
var updated_at: String?
var body: String?
var position: Int?
var line: String?
var path: String?
var commit_id: String?
required init?(map: Map) {
}
func mapping(map: Map) {
// super.mapping(map)
url <- map["url"]
html_url <- map["html_url"]
issue_url <- map["issue_url"]
id <- map["id"]
user <- map["user"]
created_at <- map["created_at"]
updated_at <- map["updated_at"]
body <- map["body"]
position <- map["position"]
line <- map["line"]
path <- map["path"]
commit_id <- map["commit_id"]
}
}
================================================
FILE: BeeFun/BeeFun/Model/Event/ObjCommit.swift
================================================
//
// ObjCommit.swift
// BeeFun
//
// Created by WengHengcong on 2/23/16.
// Copyright © 2016 JungleSong. All rights reserved.
//
import UIKit
import ObjectMapper
/*
"sha": "134f57a577b4dc45a29818d11d2484c549a86ac0",
"author":ObjUser,
"message": "starred repos done",
"distinct": true,
"url": "https://api.github.com/repos/wenghengcong/BeeFun/commits/134f57a577b4dc45a29818d11d2484c549a86ac0"
*/
class ObjCommit: NSObject, Mappable {
var sha: String?
var author: ObjUser?
var message: String?
var distinct: Bool?
var url: String?
required init?(map: Map) {
}
func mapping(map: Map) {
// super.mapping(map)
sha <- map["sha"]
author <- map["author"]
message <- map["message"]
distinct <- map["distinct"]
url <- map["url"]
}
}
================================================
FILE: BeeFun/BeeFun/Model/Event/ObjDeployment.swift
================================================
//
// ObjDeployment.swift
// BeeFun
//
// Created by WengHengcong on 26/09/2017.
// Copyright © 2017 JungleSong. All rights reserved.
//
import UIKit
import ObjectMapper
/*
{
"url": "https://api.github.com/repos/baxterthehacker/public-repo/deployments/710692",
"id": 710692,
"sha": "9049f1265b7d61be4a8904a9a27120d2064dab3b",
"ref": "master",
"task": "deploy",
"payload": {
},
"environment": "production",
"description": null,
"creator": {
},
"created_at": "2015-05-05T23:40:38Z",
"updated_at": "2015-05-05T23:40:38Z",
"statuses_url": "https://api.github.com/repos/baxterthehacker/public-repo/deployments/710692/statuses",
"repository_url": "https://api.github.com/repos/baxterthehacker/public-repo"
}
*/
class ObjDeployment: Mappable {
var url: String?
var sha: String?
var id: Int?
var ref: String?
var task: String?
var payload: ObjDeploymentPayload?
var environment: String?
var description: String?
var creator: ObjUser?
var created_at: String?
var updated_at: String?
var statuses_url: String?
var repository_url: String?
required init?(map: Map) {
}
func mapping(map: Map) {
url <- map["url"]
sha <- map["sha"]
id <- map["id"]
ref <- map["ref"]
task <- map["task"]
payload <- map["payload"]
environment <- map["environment"]
description <- map["description"]
creator <- map["creator"]
created_at <- map["created_at"]
updated_at <- map["updated_at"]
statuses_url <- map["statuses_url"]
repository_url <- map["repository_url"]
}
}
================================================
FILE: BeeFun/BeeFun/Model/Event/ObjDeploymentPayload.swift
================================================
//
// ObjDeploymentPayload.swift
// BeeFun
//
// Created by WengHengcong on 26/09/2017.
// Copyright © 2017 JungleSong. All rights reserved.
//
import UIKit
import ObjectMapper
class ObjDeploymentPayload: Mappable {
var task: String?
required init?(map: Map) {
}
func mapping(map: Map) {
task <- map["url"]
}
}
================================================
FILE: BeeFun/BeeFun/Model/Event/ObjEvent.swift
================================================
//
// ObjEvent.swift
// BeeFun
//
// Created by WengHengcong on 2/23/16.
// Copyright © 2016 JungleSong. All rights reserved.
//
/**
{
"id": "3675348721",
"type": "IssueCommentEvent",
"actor":ObjUser,
"repo":ObjRepos,
"payload": ObjEventPayload,
"public": true,
"created_at": "2016-02-22T23:11:00Z"
}
*/
import UIKit
import ObjectMapper
/// Event
///
/// - commitCommentEvent: Triggered when a commit comment is created
/// - createEvent: Represents a created repository, branch, or tag.
/// - deleteEvent: Represents a deleted branch or tag.
/// - deploymentEvent: <#deploymentEvent description#>
/// - deploymentStatusEvent: <#deploymentStatusEvent description#>
/// - downloadEvent: <#downloadEvent description#>
/// - followEvent: <#followEvent description#>
/// - forkEvent: <#forkEvent description#>
/// - forkApplyEvent: <#forkApplyEvent description#>
/// - gistEvent: <#gistEvent description#>
/// - gollumEvent: <#gollumEvent description#>
/// - installationEvent: <#installationEvent description#>
/// - installationRepositoriesEvent: <#installationRepositoriesEvent description#>
/// - issuesEvent: <#issuesEvent description#>
/// - issueCommentEvent: <#issueCommentEvent description#>
/// - labelEvent: <#labelEvent description#>
/// - marketplacePurchaseEvent: <#marketplacePurchaseEvent description#>
/// - memberEvent: <#memberEvent description#>
/// - membershipEvent: <#membershipEvent description#>
/// - milestoneEvent: <#milestoneEvent description#>
/// - organizationEvent: <#organizationEvent description#>
/// - OrgBlockEvent: <#OrgBlockEvent description#>
/// - pageBuildEvent: <#pageBuildEvent description#>
/// - projectCardEvent: <#projectCardEvent description#>
/// - projectColumnEvent: <#projectColumnEvent description#>
/// - projectEvent: <#projectEvent description#>
/// - publicEvent: <#publicEvent description#>
/// - pullRequestEvent: <#pullRequestEvent description#>
/// - pullRequestReviewEvent: <#pullRequestReviewEvent description#>
/// - pullRequestReviewCommentEvent: <#pullRequestReviewCommentEvent description#>
/// - pushEvent: <#pushEvent description#>
/// - releaseEvent: <#releaseEvent description#>
/// - repositoryEvent: <#repositoryEvent description#>
/// - statusEvent: <#statusEvent description#>
/// - teamEvent: <#teamEvent description#>
/// - teamAddEvent: <#teamAddEvent description#>
/// - watchEvent: <#watchEvent description#>
public enum EventType: String {
case commitCommentEvent = "CommitCommentEvent"
case createEvent = "CreateEvent"
case deleteEvent = "DeleteEvent"
case deploymentEvent = "DeploymentEvent"
case deploymentStatusEvent = "DeploymentStatusEvent"
case downloadEvent = "DownloadEvent"
case followEvent = "FollowEvent"
case forkEvent = "ForkEvent"
case forkApplyEvent = "ForkApplyEvent"
case gistEvent = "GistEvent"
case gollumEvent = "GollumEvent"
case installationEvent = "InstallationEvent"
case installationRepositoriesEvent = "InstallationRepositoriesEvent"
case issuesEvent = "IssuesEvent"
case issueCommentEvent = "IssueCommentEvent"
case labelEvent = "LabelEvent"
case marketplacePurchaseEvent = "MarketplacePurchaseEvent"
case memberEvent = "MemberEvent"
case membershipEvent = "MembershipEvent"
case milestoneEvent = "MilestoneEvent"
case organizationEvent = "OrganizationEvent"
case OrgBlockEvent = "OrgBlockEvent"
case pageBuildEvent = "PageBuildEvent"
case projectCardEvent = "ProjectCardEvent"
case projectColumnEvent = "ProjectColumnEvent"
case projectEvent = "ProjectEvent"
case publicEvent = "PublicEvent"
case pullRequestEvent = "PullRequestEvent"
case pullRequestReviewEvent = "PullRequestReviewEvent"
case pullRequestReviewCommentEvent = "PullRequestReviewCommentEvent"
case pushEvent = "PushEvent"
case releaseEvent = "ReleaseEvent"
case repositoryEvent = "RepositoryEvent"
case statusEvent = "StatusEvent"
case teamEvent = "TeamEvent"
case teamAddEvent = "TeamAddEvent"
case watchEvent = "WatchEvent"
}
public enum CreateEventType: String {
case CreateRepositoryEvent = "repository"
case CreateBranchEvent = "branch"
case CreateTagEvent = "tag"
}
class ObjEvent: NSObject, Mappable {
var id: String?
var type: EventType?
var actor: ObjUser?
var repo: ObjRepos?
var payload: ObjEventPayload?
var org: ObjUser?
var cpublic: Bool? //"public" is keyword,so add "c" prefix
var created_at: String?
//TODO: org is organization
//var org:String?
override init() {
super.init()
}
required init?(map: Map) {
}
func mapping(map: Map) {
// super.mapping(map)
id <- map["id"]
type <- map["type"]
actor <- map["actor"]
org <- map["org"]
repo <- map["repo"]
payload <- map["payload"]
cpublic <- map["public"]
created_at <- map["created_at"]
}
}
================================================
FILE: BeeFun/BeeFun/Model/Event/ObjEventPayload.swift
================================================
//
// ObjEventPayload.swift
// BeeFun
//
// Created by WengHengcong on 2/23/16.
// Copyright © 2016 JungleSong. All rights reserved.
//
/**
{
"action": "created",
"issue":ObjIssue,
"comment": ObjComment,
}
*/
import UIKit
import ObjectMapper
enum EventAction: String {
//GistEvent
case create
//GistEvent
case update
//GollumEvent/InstallationEvent/IssueCommentEvent/LabelEvent
//MilestoneEvent/ProjectCardEvent/ProjectColumnEvent
//ProjectEvent/PullRequestReviewCommentEvent
//RepositoryEvent/TeamEvent
case created
//GollumEvent/IssueCommentEvent/IssuesEvent/LabelEvent
//MemberEvent/MilestoneEvent/ProjectCardEvent/ProjectColumnEvent
//ProjectEvent/PullRequestEvent/PullRequestReviewEvent
//PullRequestReviewCommentEvent/TeamEvent
case edited
//InstallationEvent/IssueCommentEvent/LabelEvent
//MemberEvent/MilestoneEvent/ProjectCardEvent/ProjectColumnEvent
//ProjectEvent/PullRequestReviewCommentEvent
//RepositoryEvent/TeamEvent
case deleted
//InstallationRepositoriesEvent/MemberEvent/MembershipEvent
//MembershipEvent
case added
//InstallationRepositoriesEvent
case removed
//IssuesEvent
case milestoned
//IssuesEvent
case demilestoned
//IssuesEvent
case labeled
//IssuesEvent
case unlabeled
//IssuesEvent/PullRequestEvent
case assigned
//IssuesEvent/PullRequestEvent
case unassigned
//IssuesEvent/ProjectEvent/PullRequestEvent
case reopened
//IssuesEvent/MilestoneEvent/PullRequestEvent
case opened
//IssuesEvent/MilestoneEvent/ProjectEvent/PullRequestEvent
case closed
//MarketplacePurchaseEvent
case purchased
//MarketplacePurchaseEvent
case cancelled
//MarketplacePurchaseEvent
case changed
//OrganizationEvent
case member_added
//OrganizationEvent
case member_removed
//OrganizationEvent
case member_invited
//OrgBlockEvent
case blocked
//OrgBlockEvent
case unblocked
//ProjectCardEvent
case converted
//ProjectCardEvent/ProjectColumnEvent
case moved
//PullRequestEvent
case review_requested
//PullRequestEvent
case review_request_removed
//PullRequestReviewEvent
case submitted
//PullRequestReviewEvent
case dismissed
//ReleaseEvent
case published
//RepositoryEvent
case publicized
//RepositoryEvent
case privatized
//TeamEvent
case added_to_repository
//TeamEvent
case removed_from_repository
//WatchEvent
case started
}
class ObjEventPayload: NSObject, Mappable {
var action: EventAction?
var issue: ObjIssue?
var comment: ObjComment?
var ref: String?
var ref_type: String?
var master_branch: String?
var cdescription: String?
var pusher_type: String?
var sender: ObjUser?
var push_id: Int?
var size: Int?
var distinct_size: Int?
var head: String?
var before: String?
var commits: [ObjCommit]?
var member: ObjMember?
var pull_request: ObjPullRequest?
var number: Int?
var cpublic: Bool? //对应public,添加c为前缀
var release: ObjRelease?
var forkee: ObjRepos?
//GollumEvent
var pages: [ObjPage]?
required init?(map: Map) {
}
func mapping(map: Map) {
// super.mapping(map)
action <- map["action"]
issue <- map["issue"]
comment <- map["comment"]
ref <- map["ref"]
ref_type <- map["ref_type"]
master_branch <- map["master_branch"]
cdescription <- map["description"]
pusher_type <- map["pusher_type"]
sender <- map["sender"]
push_id <- map["push_id"]
size <- map["size"]
distinct_size <- map["distinct_size"]
head <- map["head"]
before <- map["before"]
commits <- map["commits"]
number <- map["number"]
cpublic <- map["public"]
pull_request <- map["pull_request"]
release <- map["release"]
member <- map["member"]
forkee <- map["forkee"]
pages <- map["pages"]
}
}
================================================
FILE: BeeFun/BeeFun/Model/Event/ObjHref.swift
================================================
//
// ObjHref.swift
// BeeFun
//
// Created by WengHengcong on 15/09/2017.
// Copyright © 2017 JungleSong. All rights reserved.
//
import UIKit
import ObjectMapper
/*
{
"href": "https://api.github.com/repos/octocat/Hello-World/pulls/1347"
}
*/
class ObjHref: NSObject, Mappable {
var href: String?
required init?(map: Map) {
}
func mapping(map: Map) {
href <- map["href"]
}
}
================================================
FILE: BeeFun/BeeFun/Model/Event/ObjLinks.swift
================================================
//
// ObjLinks.swift
// BeeFun
//
// Created by WengHengcong on 15/09/2017.
// Copyright © 2017 JungleSong. All rights reserved.
//
import UIKit
import ObjectMapper
/*
{
"self": {
"href": "https://api.github.com/repos/octocat/Hello-World/pulls/1347"
},
"html": {
"href": "https://github.com/octocat/Hello-World/pull/1347"
},
"issue": {
"href": "https://api.github.com/repos/octocat/Hello-World/issues/1347"
},
"comments": {
"href": "https://api.github.com/repos/octocat/Hello-World/issues/1347/comments"
},
"review_comments": {
"href": "https://api.github.com/repos/octocat/Hello-World/pulls/1347/comments"
},
"review_comment": {
"href": "https://api.github.com/repos/octocat/Hello-World/pulls/comments{/number}"
},
"commits": {
"href": "https://api.github.com/repos/octocat/Hello-World/pulls/1347/commits"
},
"statuses": {
"href": "https://api.github.com/repos/octocat/Hello-World/statuses/6dcb09b5b57875f334f61aebed695e2e4193db5e"
}
}
*/
class ObjLinks: NSObject, Mappable {
var cself: ObjHref?
var html: ObjHref?
var issue: ObjHref?
var comments: ObjHref?
var review_comments: ObjHref?
var review_comment: ObjHref?
var commits: ObjHref?
var statuses: ObjHref?
required init?(map: Map) {
}
func mapping(map: Map) {
cself <- map["self"]
html <- map["html"]
issue <- map["issue"]
comments <- map["comments"]
review_comments <- map["sha"]
review_comment <- map["sha"]
commits <- map["sha"]
statuses <- map["sha"]
}
}
================================================
FILE: BeeFun/BeeFun/Model/Event/ObjMember.swift
================================================
//
// ObjMember.swift
// BeeFun
//
// Created by WengHengcong on 26/09/2017.
// Copyright © 2017 JungleSong. All rights reserved.
//
import UIKit
import ObjectMapper
/*
{
"avatar_url": "https://avatars1.githubusercontent.com/u/170270?v=4",
"events_url": "https://api.github.com/users/sindresorhus/events{/privacy}",
"followers_url": "https://api.github.com/users/sindresorhus/followers",
"following_url": "https://api.github.com/users/sindresorhus/following{/other_user}",
"gists_url": "https://api.github.com/users/sindresorhus/gists{/gist_id}",
"gravatar_id": "",
"html_url": "https://github.com/sindresorhus",
"id": 170270,
"login": "sindresorhus",
"organizations_url": "https://api.github.com/users/sindresorhus/orgs",
"received_events_url": "https://api.github.com/users/sindresorhus/received_events",
"repos_url": "https://api.github.com/users/sindresorhus/repos",
"site_admin": false,
"starred_url": "https://api.github.com/users/sindresorhus/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/sindresorhus/subscriptions",
"type": "User",
"url": "https://api.github.com/users/sindresorhus"
}
*/
class ObjMember: Mappable {
var avatar_url: String?
var events_url: String?
var followers_url: Int?
var following_url: String?
var gists_url: String?
var gravatar_id: String?
var html_url: String?
var id: Int?
var login: String?
var organizations_url: String?
var received_events_url: String?
var repos_url: String?
var site_admin: Bool?
var starred_url: String?
var subscriptions_url: String?
var type: String?
var url: String?
required init?(map: Map) {
}
func mapping(map: Map) {
avatar_url <- map["avatar_url"]
events_url <- map["events_url"]
followers_url <- map["followers_url"]
following_url <- map["following_url"]
gists_url <- map["gists_url"]
gravatar_id <- map["gravatar_id"]
html_url <- map["html_url"]
id <- map["id"]
organizations_url <- map["organizations_url"]
received_events_url <- map["received_events_url"]
repos_url <- map["repos_url"]
site_admin <- map["site_admin"]
starred_url <- map["starred_url"]
subscriptions_url <- map["subscriptions_url"]
type <- map["type"]
url <- map["url"]
}
}
================================================
FILE: BeeFun/BeeFun/Model/Event/ObjNotification.swift
================================================
//
// ObjNotification.swift
// BeeFun
//
// Created by WengHengcong on 2/23/16.
// Copyright © 2016 JungleSong. All rights reserved.
//
/**
{
"id": "125784581",
"unread": true,
"reason": "subscribed",
"updated_at": "2016-02-22T18:22:41Z",
"last_read_at": null,
"subject":ObjSubject
"repository": ObjRepos,
"url": "https://api.github.com/notifications/threads/125784581",
"subscription_url": "https://api.github.com/notifications/threads/125784581/subscription"
}
*/
import UIKit
import ObjectMapper
public enum NotificationReason: String {
case Subscribed = "subscribed"
case Manual = "manual"
case Author = "author"
case Comment = "comment"
case Mention = "mention"
case TeamMention = "team_mention"
case StateChange = "state_change"
case Assign = "assign"
}
class ObjNotification: NSObject, Mappable {
var id: String?
var unread: Bool?
var reason: String?
var updated_at: String?
var last_read_at: String?
var subject: ObjSubject?
var repository: ObjRepos?
var url: String?
var subscription_url: String?
required init?(map: Map) {
}
func mapping(map: Map) {
// super.mapping(map)
id <- map["id"]
unread <- map["unread"]
reason <- map["reason"]
updated_at <- map["updated_at"]
last_read_at <- map["last_read_at"]
subject <- map["subject"]
repository <- map["repository"]
url <- map["url"]
subscription_url <- map["subscription_url"]
}
}
================================================
FILE: BeeFun/BeeFun/Model/Event/ObjPage.swift
================================================
//
// ObjPage.swift
// BeeFun
//
// Created by WengHengcong on 14/10/2017.
// Copyright © 2017 JungleSong. All rights reserved.
//
import UIKit
import ObjectMapper
/*
{
"action": "edited",
"html_url": "https://github.com/AFNetworking/AFNetworking/wiki/AFNetworking-3.0-Migration-Guide",
"page_name": "AFNetworking-3.0-Migration-Guide",
"sha": "2d4cab76bc2bb73c890ebada2d53b614f0945635",
"summary": null,
"title": "AFNetworking 3.0 Migration Guide"
}
*/
class ObjPage: Mappable {
var action: String?
var html_url: String?
var page_name: String?
var sha: String?
var summary: String?
var title: String?
required init?(map: Map) {
}
func mapping(map: Map) {
action <- map["action"]
html_url <- map["html_url"]
page_name <- map["page_name"]
sha <- map["sha"]
summary <- map["summary"]
title <- map["title"]
}
}
================================================
FILE: BeeFun/BeeFun/Model/Event/ObjPullRequest.swift
================================================
//
// ObjPullRequest.swift
// BeeFun
//
// Created by WengHengcong on 15/09/2017.
// Copyright © 2017 JungleSong. All rights reserved.
//
import UIKit
import ObjectMapper
/*
{
"id": 1,
"url": "https://api.github.com/repos/octocat/Hello-World/pulls/1347",
"html_url": "https://github.com/octocat/Hello-World/pull/1347",
"diff_url": "https://github.com/octocat/Hello-World/pull/1347.diff",
"patch_url": "https://github.com/octocat/Hello-World/pull/1347.patch",
"issue_url": "https://api.github.com/repos/octocat/Hello-World/issues/1347",
"commits_url": "https://api.github.com/repos/octocat/Hello-World/pulls/1347/commits",
"review_comments_url": "https://api.github.com/repos/octocat/Hello-World/pulls/1347/comments",
"review_comment_url": "https://api.github.com/repos/octocat/Hello-World/pulls/comments{/number}",
"comments_url": "https://api.github.com/repos/octocat/Hello-World/issues/1347/comments",
"statuses_url": "https://api.github.com/repos/octocat/Hello-World/statuses/6dcb09b5b57875f334f61aebed695e2e4193db5e",
"number": 1347,
"state": "open",
"title": "new-feature",
"body": "Please pull these awesome changes",
"assignee": {
},
"milestone": {
},
"locked": false,
"created_at": "2011-01-26T19:01:12Z",
"updated_at": "2011-01-26T19:01:12Z",
"closed_at": "2011-01-26T19:01:12Z",
"merged_at": "2011-01-26T19:01:12Z",
"head": {
},
"base": {
},
"_links": {
},
"user": {
}
}
*/
class ObjPullRequest: NSObject, Mappable {
var id: Int?
var _links: ObjLinks?
var url: String?
var html_url: String?
var diff_url: String?
var patch_url: String?
var issue_url: String?
var commits_url: String?
var review_comments_url: String?
var review_comment_url: String?
var comments_url: String?
var statuses_url: String?
var body: String?
var number: Int?
var state: String?
var locked: Int?
var title: String?
var additions: Int?
var milestone: ObjMilestone?
var created_at: String?
var updated_at: String?
var closed_at: String?
var merged_at: String?
var merge_commit_sha: String?
//值可为:OWNER、NONE、 CONTRIBUTOR、COLLABORATOR
var author_association: String?
var assignee: ObjUser?
var assignees: [ObjUser]?
var base: ObjBranch?
var head: ObjBranch?
var changed_files: Int?
var comments: Int?
var commits: Int?
var deletions: Int?
var maintainer_can_modify: Bool?
var mergeable_state: String?
var merged: Bool?
var merged_by: ObjUser?
var rebaseable: Bool?
var review_comments: Int?
var mergeable: Bool?
//不确定以下值类型
var requested_reviewers: [ObjUser]?
required init?(map: Map) {
}
func mapping(map: Map) {
// super.mapping(map)
id <- map["id"]
_links <- map["_links"]
url <- map["url"]
html_url <- map["html_url"]
diff_url <- map["diff_url"]
patch_url <- map["patch_url"]
issue_url <- map["issue_url"]
commits_url <- map["commits_url"]
review_comments_url <- map["review_comments_url"]
review_comment_url <- map["review_comment_url"]
comments_url <- map["comments_url"]
statuses_url <- map["statuses_url"]
body <- map["body"]
number <- map["number"]
state <- map["state"]
locked <- map["locked"]
title <- map["title"]
milestone <- map["milestone"]
additions <- map["additions"]
created_at <- map["created_at"]
updated_at <- map["updated_at"]
closed_at <- map["closed_at"]
merged_at <- map["merged_at"]
merge_commit_sha <- map["merge_commit_sha"]
author_association <- map["author_association"]
assignee <- map["assignee"]
assignees <- map["assignees"]
base <- map["base"]
head <- map["head"]
changed_files <- map["changed_files"]
comments <- map["comments"]
commits <- map["commits"]
deletions <- map["deletions"]
maintainer_can_modify <- map["maintainer_can_modify"]
mergeable_state <- map["mergeable_state"]
merged <- map["merged"]
merged_by <- map["merged_by"]
rebaseable <- map["rebaseable"]
review_comments <- map["review_comments"]
mergeable <- map["mergeable"]
requested_reviewers <- map["requested_reviewers"]
}
}
================================================
FILE: BeeFun/BeeFun/Model/Event/ObjRelease.swift
================================================
//
// ObjRelease.swift
// BeeFun
//
// Created by WengHengcong on 26/09/2017.
// Copyright © 2017 JungleSong. All rights reserved.
//
import UIKit
import ObjectMapper
/*
{
"assets": [],
"assets_url": "https://api.github.com/repos/ckrey/MQTT-Client-Framework/releases/7834095/assets",
"author": {
},
"body": "\r\n [FIX] added connectTo:",
"created_at": "2017-09-21T04:42:48Z",
"draft": false,
"html_url": "https://github.com/ckrey/MQTT-Client-Framework/releases/tag/0.9.9",
"id": 7834095,
"name": "Session Manager and CoreDataPersistence",
"prerelease": false,
"published_at": "2017-09-21T04:44:14Z",
"tag_name": "0.9.9",
"tarball_url": "https://api.github.com/repos/ckrey/MQTT-Client-Framework/tarball/0.9.9",
"target_commitish": "master",
"upload_url": "https://uploads.github.com/repos/ckrey/MQTT-Client-Framework/releases/7834095/assets{?name,label}",
"url": "https://api.github.com/repos/ckrey/MQTT-Client-Framework/releases/7834095",
"zipball_url": "https://api.github.com/repos/ckrey/MQTT-Client-Framework/zipball/0.9.9"
}
*/
class ObjRelease: Mappable {
var assets: [ObjAsset]?
var assets_url: String?
var author: ObjUser?
var body: String?
var created_at: String?
var draft: Bool?
var html_url: String?
var id: Int?
var name: String?
var prerelease: Bool?
var published_at: String?
var tag_name: String?
var tarball_url: String?
var target_commitish: String?
var upload_url: String?
var url: String?
var zipball_url: String?
required init?(map: Map) {
}
func mapping(map: Map) {
assets <- map["assets"]
assets_url <- map["assets_url"]
author <- map["author"]
body <- map["body"]
created_at <- map["created_at"]
draft <- map["draft"]
html_url <- map["html_url"]
id <- map["id"]
name <- map["name"]
prerelease <- map["prerelease"]
published_at <- map["published_at"]
tag_name <- map["tag_name"]
tarball_url <- map["tarball_url"]
target_commitish <- map["target_commitish"]
upload_url <- map["upload_url"]
url <- map["url"]
zipball_url <- map["zipball_url"]
}
}
================================================
FILE: BeeFun/BeeFun/Model/Event/ObjSearchCode.swift
================================================
//
// ObjSearchCode.swift
// BeeFun
//
// Created by WengHengcong on 11/09/2017.
// Copyright © 2017 JungleSong. All rights reserved.
//
import UIKit
import ObjectMapper
/*
{
"git_url": "https://api.github.com/repositories/91869205/git/blobs/ebcf232789ff70f5e78a401cba3646216a1e20c3",
"html_url": "https://github.com/cohena100/Shimi/blob/63aff29a6e822588f3a8cb6f080c8021405dd508/Carthage/Checkouts/SwifterSwift/Tests/SwifterSwiftTests/UIKitExtensionsTests/UISegmentedControlExtensionsTests.swift",
"name": "UISegmentedControlExtensionsTests.swift",
"path": "Carthage/Checkouts/SwifterSwift/Tests/SwifterSwiftTests/UIKitExtensionsTests/UISegmentedControlExtensionsTests.swift",
"repository": {
......,
"owner": {
},
},
"score": 4.027219,
"sha": "ebcf232789ff70f5e78a401cba3646216a1e20c3",
"url": "https://api.github.com/repositories/91869205/contents/Carthage/Checkouts/SwifterSwift/Tests/SwifterSwiftTests/UIKitExtensionsTests/UISegmentedControlExtensionsTests.swift?ref=63aff29a6e822588f3a8cb6f080c8021405dd508"
},
*/
// MARK: - 更为完整的属性
/*
git_url->的结果,其中content是搜索到的代码,base64加密后的显示
{
sha: "ebcf232789ff70f5e78a401cba3646216a1e20c3",
size: 885,
url: "https://api.github.com/repos/cohena100/Shimi/git/blobs/ebcf232789ff70f5e78a401cba3646216a1e20c3",
content: "Ly8KLy8gIFVJU2VnbWVudGVkQ29udHJvbEV4dGVuc2lvbnNUZXN0cy5zd2lm dAovLyAgU3dpZnRlclN3aWZ0Ci8vCi8vICBDcmVhdGVkIGJ5IFN0ZXZlbiBv biAyLzE1LzE3LgovLyAgQ29weXJpZ2h0IMKpIDIwMTcgb21hcmFsYmVpay4g QWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8KCiNpZiBvcyhpT1MpIHx8IG9zKHR2 T1MpCgppbXBvcnQgWENUZXN0CkB0ZXN0YWJsZSBpbXBvcnQgU3dpZnRlclN3 aWZ0CgpjbGFzcyBVSVNlZ21lbnRlZENvbnRyb2xFeHRlbnNpb25zVGVzdHM6 IFhDVGVzdENhc2UgewoKICAgIGZ1bmMgdGVzdFNlZ21lbnRUaXRsZXMoKSB7 CiAgICAgICAgbGV0IHNlZ21lbnRDb250cm9sID0gVUlTZWdtZW50ZWRDb250 cm9sKCkKICAgICAgICBYQ1RBc3NlcnQoc2VnbWVudENvbnRyb2wuc2VnbWVu dFRpdGxlcy5pc0VtcHR5KQogICAgICAgIGxldCB0aXRsZXMgPSBbIlRpdGxl MSIsICJUaXRsZTIiXQogICAgICAgIHNlZ21lbnRDb250cm9sLnNlZ21lbnRU aXRsZXMgPSB0aXRsZXMKICAgICAgICBYQ1RBc3NlcnRFcXVhbChzZWdtZW50 Q29udHJvbC5zZWdtZW50VGl0bGVzLCB0aXRsZXMpCiAgICB9CiAgICAKICAg IGZ1bmMgdGVzdFNlZ21lbnRJbWFnZXMoKSB7CiAgICAgICAgbGV0IHNlZ21l bnRDb250cm9sID0gVUlTZWdtZW50ZWRDb250cm9sKCkKICAgICAgICBYQ1RB c3NlcnQoc2VnbWVudENvbnRyb2wuc2VnbWVudEltYWdlcy5pc0VtcHR5KQog ICAgICAgIGxldCBpbWFnZXMgPSBbVUlJbWFnZSgpLCBVSUltYWdlKCldCiAg ICAgICAgc2VnbWVudENvbnRyb2wuc2VnbWVudEltYWdlcyA9IGltYWdlcwog ICAgICAgIFhDVEFzc2VydEVxdWFsKHNlZ21lbnRDb250cm9sLnNlZ21lbnRJ bWFnZXMsIGltYWdlcykKICAgIH0KfQojZW5kaWYK ",
encoding: "base64"
}
*/
/*
url-> 更为完整的代码片段的属性
name: "UISegmentedControlExtensionsTests.swift",
path: "Carthage/Checkouts/SwifterSwift/Tests/SwifterSwiftTests/UIKitExtensionsTests/UISegmentedControlExtensionsTests.swift",
sha: "ebcf232789ff70f5e78a401cba3646216a1e20c3",
size: 885,
url: "https://api.github.com/repos/cohena100/Shimi/contents/Carthage/Checkouts/SwifterSwift/Tests/SwifterSwiftTests/UIKitExtensionsTests/UISegmentedControlExtensionsTests.swift?ref=63aff29a6e822588f3a8cb6f080c8021405dd508",
html_url: "https://github.com/cohena100/Shimi/blob/63aff29a6e822588f3a8cb6f080c8021405dd508/Carthage/Checkouts/SwifterSwift/Tests/SwifterSwiftTests/UIKitExtensionsTests/UISegmentedControlExtensionsTests.swift",
git_url: "https://api.github.com/repos/cohena100/Shimi/git/blobs/ebcf232789ff70f5e78a401cba3646216a1e20c3",
download_url: "https://raw.githubusercontent.com/cohena100/Shimi/63aff29a6e822588f3a8cb6f080c8021405dd508/Carthage/Checkouts/SwifterSwift/Tests/SwifterSwiftTests/UIKitExtensionsTests/UISegmentedControlExtensionsTests.swift",
type: "file",
content: " ",
encoding: "base64",
_links: {
self: "https://api.github.com/repos/cohena100/Shimi/contents/Carthage/Checkouts/SwifterSwift/Tests/SwifterSwiftTests/UIKitExtensionsTests/UISegmentedControlExtensionsTests.swift?ref=63aff29a6e822588f3a8cb6f080c8021405dd508",
git: "https://api.github.com/repos/cohena100/Shimi/git/blobs/ebcf232789ff70f5e78a401cba3646216a1e20c3",
html: "https://github.com/cohena100/Shimi/blob/63aff29a6e822588f3a8cb6f080c8021405dd508/Carthage/Checkouts/SwifterSwift/Tests/SwifterSwiftTests/UIKitExtensionsTests/UISegmentedControlExtensionsTests.swift"
}
}
*/
class ObjSearchCode: NSObject, Mappable {
/// 获取后得到该代码的部分属性
var git_url: String?
/// 可以显示代码的网址,跳转打开的页面
var html_url: String?
var name: String?
var path: String?
var repository: ObjRepos?
var score: Double?
var sha: String?
/// 获取后得到该代码的全部属性
var url: String?
required init?(map: Map) {
}
func mapping(map: Map) {
git_url <- map["git_url"]
html_url <- map["html_url"]
name <- map["name"]
path <- map["path"]
repository <- map["repository"]
score <- map["score"]
sha <- map["sha"]
url <- map["url"]
}
}
================================================
FILE: BeeFun/BeeFun/Model/Event/ObjSubject.swift
================================================
//
// ObjSubject.swift
// BeeFun
//
// Created by WengHengcong on 2/23/16.
// Copyright © 2016 JungleSong. All rights reserved.
//
/**
"title": "marked designated initializers (issue #1142)",
"url": "https://api.github.com/repos/jessesquires/JSQMessagesViewController/pulls/1460",
"latest_comment_url": "https://api.github.com/repos/jessesquires/JSQMessagesViewController/pulls/1460",
"type": "PullRequest"
*/
import UIKit
import ObjectMapper
public enum SubjectType: String {
case issue = "Issue"
case pullRequest = "PullRequest"
case release = "Release"
case commit = "Commit"
}
class ObjSubject: NSObject, Mappable {
var title: String?
var url: String?
var latest_comment_url: String?
var type: String?
required init?(map: Map) {
}
func mapping(map: Map) {
// super.mapping(map)
title <- map["title"]
url <- map["url"]
latest_comment_url <- map["latest_comment_url"]
type <- map["type"]
}
}
================================================
FILE: BeeFun/BeeFun/Model/Issue/ObjIssue.swift
================================================
//
// ObjIssue.swift
// BeeFun
//
// Created by WengHengcong on 2/23/16.
// Copyright © 2016 JungleSong. All rights reserved.
//
/**
{
"url": "https://api.github.com/repos/wenghengcong/TestForCoder/issues/2",
"repository_url": "https://api.github.com/repos/wenghengcong/TestForCoder",
"labels_url": "https://api.github.com/repos/wenghengcong/TestForCoder/issues/2/labels{/name}",
"comments_url": "https://api.github.com/repos/wenghengcong/TestForCoder/issues/2/comments",
"events_url": "https://api.github.com/repos/wenghengcong/TestForCoder/issues/2/events",
"html_url": "https://github.com/wenghengcong/TestForCoder/issues/2",
"id": 135574763,
"number": 2,
"title": "Issue 2",
"user": ObjUser,
"labels": [],
"state": "open",
"locked": false,
"assignee": null,
"milestone": null,
"comments": 1,
"created_at": "2016-02-22T23:11:00Z",
"updated_at": "2016-02-22T23:11:15Z",
"closed_at": null,
"repository": ObjRepos
"closed_by":ObjUser
"pull_request":ObjPullRequest
"body": "@wenghengcong\r\nnoti user"
}
*/
import UIKit
import ObjectMapper
class ObjIssue: NSObject, Mappable {
var url: String?
var repository_url: String?
var labels_url: String?
var comments_url: String?
var events_url: String?
var html_url: String?
var id: Int?
var number: Int?
var title: String?
var user: ObjUser?
var labels: [ObjLabel]?
var state: String?
var locked: Bool?
var assignee: ObjUser?
var assignees: [ObjUser]?
var milestone: ObjMilestone?
var comments: Int?
var created_at: String?
var updated_at: String?
var closed_at: String?
var repository: ObjRepos?
var closed_by: ObjUser?
var pull_request: ObjPullRequest?
var body: String?
var score: Double?
//值可为:OWNER、NONE、 CONTRIBUTOR、COLLABORATOR
var author_association: String?
required init?(map: Map) {
}
func mapping(map: Map) {
// super.mapping(map)
url <- map["url"]
repository_url <- map["repository_url"]
labels_url <- map["labels_url"]
comments_url <- map["comments_url"]
events_url <- map["events_url"]
html_url <- map["html_url"]
id <- map["id"]
number <- map["number"]
title <- map["title"]
user <- map["user"]
labels <- map["labels"]
state <- map["state"]
locked <- map["locked"]
assignee <- map["assignee"]
assignees <- map["assignees"]
milestone <- map["milestone"]
comments <- map["comments"]
created_at <- map["created_at"]
updated_at <- map["updated_at"]
closed_at <- map["closed_at"]
repository <- map["repository"]
closed_by <- map["closed_by"]
pull_request <- map["pull_request"]
body <- map["body"]
score <- map["score"] //搜索匹配得分
author_association <- map["author_association"]
}
}
================================================
FILE: BeeFun/BeeFun/Model/Issue/ObjLabel.swift
================================================
//
// ObjLabel.swift
// BeeFun
//
// Created by WengHengcong on 2/23/16.
// Copyright © 2016 JungleSong. All rights reserved.
//
/**
*
"url": "https://api.github.com/repos/octocat/Hello-World/labels/bug",
"name": "bug",
"color": "f29513"
*/
import UIKit
import ObjectMapper
class ObjLabel: NSObject, Mappable {
var url: String?
var name: String?
var color: String?
required init?(map: Map) {
}
func mapping(map: Map) {
// super.mapping(map)
url <- map["url"]
name <- map["name"]
color <- map["color"]
}
}
================================================
FILE: BeeFun/BeeFun/Model/Issue/ObjMilestone.swift
================================================
//
// ObjMilestone.swift
// BeeFun
//
// Created by WengHengcong on 2/23/16.
// Copyright © 2016 JungleSong. All rights reserved.
//
/*
{
"url": "https://api.github.com/repos/octocat/Hello-World/milestones/1",
"html_url": "https://github.com/octocat/Hello-World/milestones/v1.0",
"labels_url": "https://api.github.com/repos/octocat/Hello-World/milestones/1/labels",
"id": 1002604,
"number": 1,
"state": "open",
"title": "v1.0",
"description": "Tracking milestone for version 1.0",
"creator": {
"login": "octocat",
"id": 1,
"avatar_url": "https://github.com/images/error/octocat_happy.gif",
"gravatar_id": "",
"url": "https://api.github.com/users/octocat",
"html_url": "https://github.com/octocat",
"followers_url": "https://api.github.com/users/octocat/followers",
"following_url": "https://api.github.com/users/octocat/following{/other_user}",
"gists_url": "https://api.github.com/users/octocat/gists{/gist_id}",
"starred_url": "https://api.github.com/users/octocat/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/octocat/subscriptions",
"organizations_url": "https://api.github.com/users/octocat/orgs",
"repos_url": "https://api.github.com/users/octocat/repos",
"events_url": "https://api.github.com/users/octocat/events{/privacy}",
"received_events_url": "https://api.github.com/users/octocat/received_events",
"type": "User",
"site_admin": false
},
"open_issues": 4,
"closed_issues": 8,
"created_at": "2011-04-10T20:09:31Z",
"updated_at": "2014-03-03T18:58:10Z",
"closed_at": "2013-02-12T13:22:01Z",
"due_on": "2012-10-09T23:39:01Z"
}
*/
import UIKit
import ObjectMapper
class ObjMilestone: NSObject, Mappable {
var url: String?
var html_url: String?
var labels_url: String?
var id: Int?
var number: Int?
var state: String?
var title: String?
var cdescription: String? //与description关键字冲突
var creator: ObjUser?
var open_issues: Int?
var closed_issues: Int?
var created_at: String?
var updated_at: String?
var closed_at: String?
var due_on: String?
required init?(map: Map) {
}
func mapping(map: Map) {
// super.mapping(map)
url <- map["url"]
html_url <- map["html_url"]
labels_url <- map["labels_url"]
id <- map["id"]
number <- map["number"]
state <- map["state"]
title <- map["title"]
cdescription <- map["description"]
creator <- map["creator"]
open_issues <- map["open_issues"]
closed_issues <- map["closed_issues"]
created_at <- map["created_at"]
updated_at <- map["updated_at"]
closed_at <- map["closed_at"]
due_on <- map["due_on"]
}
}
================================================
FILE: BeeFun/BeeFun/Model/Network/AppToken.swift
================================================
//
// ObjUser.swift
// BeeFun
//
// Created by wenghengcong on 16/1/12.
// Copyright © 2016年 JungleSong. All rights reserved.
//
import UIKit
class AppToken: NSObject {
enum DefaultsKeys: String {
case tokenKey = "TokenKey"
case tokenType = "TokenType"
case tokenScope = "TokenScope"
case tokenExpire = "TokenExpiry"
case tokenExpireDate = "tokenExpireDate"
}
let defaults: UserDefaults
static let shared = AppToken()
init(defaults: UserDefaults) {
self.defaults = defaults
}
override init() {
self.defaults = UserDefaults.standard
}
var access_token: String? {
get {
let key = defaults.string(forKey: DefaultsKeys.tokenKey.rawValue)
return key
}
set(newToken) {
defaults.set(newToken, forKey: DefaultsKeys.tokenKey.rawValue)
}
}
var token_type: String? {
get {
let key = defaults.string(forKey: DefaultsKeys.tokenType.rawValue)
return key
}
set(newType) {
defaults.set(newType, forKey: DefaultsKeys.tokenType.rawValue)
}
}
var scope: String? {
get {
let key = defaults.string(forKey: DefaultsKeys.tokenScope.rawValue)
return key
}
set(newScope) {
defaults.set(newScope, forKey: DefaultsKeys.tokenScope.rawValue)
}
}
var isValid: Bool {
if let token = access_token {
return token.isEmpty
}
return false
}
var token_expire_date: Date? {
get {
let date = defaults.object(forKey: DefaultsKeys.tokenExpireDate.rawValue) as? Date
return date
}
set(newDate) {
defaults.set(newDate, forKey: DefaultsKeys.tokenExpireDate.rawValue)
}
}
func clear() {
access_token = nil
token_type = nil
scope = nil
token_expire_date = Date()
}
}
================================================
FILE: BeeFun/BeeFun/Model/Network/NetFilter.swift
================================================
//
// NetFilter.swift
// BeeFun
//
// Created by Hunt on 2019/6/25.
// Copyright © 2019 JungleSong. All rights reserved.
//
import UIKit
class NetFilter: Codable {
/// Filter名称
var name: String?
/// 排序字段
var sidx: String?
/// 升降序,desc/asc
var sord: String?
/// 页码
var page: UInt?
/// 每页大小
var pageSize: UInt?
}
class TagFilter: NetFilter {
var owner: String? = UserManager.shared.login
var tag: String?
enum TagFilterCodingKeys: String, CodingKey {
case owner
case tag
}
required override init() {
super.init()
}
//编码方法
override func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: TagFilterCodingKeys.self)
try container.encode(owner, forKey: TagFilterCodingKeys.owner)
try container.encode(tag, forKey: TagFilterCodingKeys.tag)
try super.encode(to: encoder)
}
//解码方法
required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: TagFilterCodingKeys.self)
self.owner = try container.decode(String.self, forKey: .owner)
self.tag = try container.decode(String.self, forKey: .tag)
try super.init(from: decoder)
}
}
================================================
FILE: BeeFun/BeeFun/Model/Network/ObjErropReponse.swift
================================================
//
// ObjErropReponse.swift
// BeeFun
//
// Created by WengHengcong on 3/8/16.
// Copyright © 2016 JungleSong. All rights reserved.
//
import UIKit
import ObjectMapper
/*
{
"message": "Validation Failed",
"errors": [
{
"resource": "Search",
"field": "q",
"code": "missing"
}
],
"documentation_url": "https://developer.github.com/v3/search"
}
*/
class ObjErropReponse: NSObject, Mappable {
var message: String?
var errors: [ObjError]?
var documentationUrl: String?
required init?(map: Map) {
}
func mapping(map: Map) {
// super.mapping(map)
message <- map["message"]
errors <- map["errors"]
documentationUrl <- map["documentation_url"]
}
}
================================================
FILE: BeeFun/BeeFun/Model/Network/ObjError.swift
================================================
//
// ObjErrorMessage.swift
// BeeFun
//
// Created by WengHengcong on 3/8/16.
// Copyright © 2016 JungleSong. All rights reserved.
//
import UIKit
import ObjectMapper
/*
{
"resource": "Search",
"field": "q",
"code": "missing"
}
*/
class ObjError: NSObject, Mappable {
var resource: String?
var field: String?
var code: String?
required init?(map: Map) {
}
func mapping(map: Map) {
// super.mapping(map)
resource <- map["resource"]
field <- map["field"]
code <- map["code"]
}
}
================================================
FILE: BeeFun/BeeFun/Model/Network/ObjResponseHeader.swift
================================================
//
// ObjResponseHeader.swift
// BeeFun
//
// Created by wenghengcong on 16/1/31.
// Copyright © 2016年 JungleSong. All rights reserved.
//
import UIKit
import ObjectMapper
/*
"Access-Control-Allow-Credentials" = true;
"Access-Control-Allow-Origin" = "*";
"Access-Control-Expose-Headers" = "ETag, Link, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval";
"Cache-Control" = "private, max-age=60, s-maxage=60";
"Content-Encoding" = gzip;
"Content-Security-Policy" = "default-src 'none'";
"Content-Type" = "application/json; charset=utf-8";
Date = "Sun, 31 Jan 2016 09:06:03 GMT";
Etag = "W/\"b2c5f6199e027d93fa523f36a97ad058\"";
Link = "; rel=\"next\", ; rel=\"last\"";
Server = "GitHub.com";
Status = "200 OK";
"Strict-Transport-Security" = "max-age=31536000; includeSubdomains; preload";
"Transfer-Encoding" = Identity;
Vary = "Accept, Authorization, Cookie, X-GitHub-OTP, Accept-Encoding";
"X-Accepted-OAuth-Scopes" = "";
"X-Content-Type-Options" = nosniff;
"X-Frame-Options" = deny;
"X-GitHub-Media-Type" = "github.v3";
"X-GitHub-Request-Id" = "74FBD5F3:1C1EA:104F1885:56ADCE78";
"X-OAuth-Client-Id" = 294e97e63b0e68f456ad;
"X-OAuth-Scopes" = "public_repo, user";
"X-RateLimit-Limit" = 5000;
"X-RateLimit-Remaining" = 4993;
"X-RateLimit-Reset" = 1454234562;
"X-Served-By" = 4c8b2d4732c413f4b9aefe394bd65569;
"X-XSS-Protection" = "1; mode=block";
*/
class ObjResponseHeader: NSObject, Mappable {
var AccessControlAllowCredentials: String?
var AccessControlAllowOrigin: String?
var AccessControlExposeHeaders: String?
var CacheControl: String?
var ContentEncoding: String?
var ContentSecurityPolicy: String?
var ContentType: String?
var Date: String?
var Etag: String?
var Link: String?
var Server: String?
var Status: String?
var StrictTransportSecurity: String?
var TransferEncoding: String?
var Vary: String?
var XAcceptedOAuthScopes: String?
var XContentTypeOptions: String?
var XFrameOptions: String?
var XGitHubMediaType: String?
var XGitHubRequestId: String?
var XOAuthClientId: String?
var XOAuthScopes: String?
var XRateLimitLimit: Int?
var XRateLimitRemaining: Int?
var XRateLimitReset: Int?
var XServedBy: String?
var XXSSProtection: String?
required init?(map: Map) {
}
func mapping(map: Map) {
// super.mapping(map)
AccessControlAllowCredentials <- map["Access-Control-Allow-Credentials"]
AccessControlAllowOrigin <- map["Access-Control-Allow-Origin"]
AccessControlExposeHeaders <- map["Access-Control-Expose-Headers"]
CacheControl <- map["Cache-Control"]
ContentEncoding <- map["Content-Encoding"]
ContentSecurityPolicy <- map["Content-Security-Policy"]
ContentType <- map["Content-Type"]
Date <- map["Date"]
Etag <- map["Etag"]
Link <- map["Link"]
Server <- map["Server"]
Status <- map["Status"]
StrictTransportSecurity <- map["Strict-Transport-Security"]
TransferEncoding <- map["Transfer-Encoding"]
Vary <- map["Vary"]
XAcceptedOAuthScopes <- map["X-Accepted-OAuth-Scopes"]
XContentTypeOptions <- map["X-Content-Type-Options"]
XFrameOptions <- map["X-Frame-Options"]
XGitHubMediaType <- map["X-GitHub-Media-Type"]
XGitHubRequestId <- map["X-GitHub-Request-Id"]
XOAuthClientId <- map["X-OAuth-Client-Id"]
XOAuthScopes <- map["X-OAuth-Scopes"]
XRateLimitLimit <- map["X-RateLimit-Limit"]
XRateLimitRemaining <- map["X-RateLimit-Remaining"]
XRateLimitReset <- map["X-RateLimit-Reset"]
XServedBy <- map["X-Served-By"]
XXSSProtection <- map["X-XSS-Protection"]
}
}
================================================
FILE: BeeFun/BeeFun/Model/Network/ObjResponser.swift
================================================
//
// ObjResponser.swift
// BeeFun
//
// Created by wenghengcong on 16/1/31.
// Copyright © 2016年 JungleSong. All rights reserved.
//
import UIKit
import ObjectMapper
/*
status code: 200,
headers {
}
*/
class ObjResponser: NSObject, Mappable {
var statusCode: Int?
var headers: ObjResponseHeader?
required init?(map: Map) {
}
func mapping(map: Map) {
// super.mapping(map)
statusCode <- map["status code"]
headers <- map["headers"]
}
}
================================================
FILE: BeeFun/BeeFun/Model/ObjBase.swift
================================================
//
// ObjBase.swift
// BeeFun
//
// Created by wenghengcong on 16/1/7.
// Copyright © 2016年 JungleSong. All rights reserved.
//
import UIKit
import ObjectMapper
class ObjBase: Mappable {
// var guid
// var obj_type
// var create_at
// var update_at
//
required init?(map: Map) {
}
func mapping(map: Map) {
}
}
================================================
FILE: BeeFun/BeeFun/Model/Other/ObjSettings.swift
================================================
//
// ObjSettings.swift
// BeeFun
//
// Created by wenghengcong on 16/1/19.
// Copyright © 2016年 JungleSong. All rights reserved.
//
import UIKit
class ObjSettings: NSObject {
var itemKey: String?
var itemName: String?
var itemValue: String?
var itemIcon: String?
var itemDisclosure: Bool?
override func setValue(_ value: Any?, forUndefinedKey key: String) {
return
}
override func setValuesForKeys(_ keyedValues: [String : Any]) {
itemKey = keyedValues["itemKey"] as? String
itemName = keyedValues["itemName"] as? String
itemValue = keyedValues["itemValue"] as? String
itemIcon = keyedValues["itemIcon"] as? String
itemDisclosure = keyedValues["itemDisclosure"] as? Bool
}
}
================================================
FILE: BeeFun/BeeFun/Model/Repos/ObjGithubStarRepos.swift
================================================
//
// ObjStarRepos.swift
// BeeFunMac
//
// Created by WengHengcong on 2017/12/27.
// Copyright © 2017年 LuCi. All rights reserved.
//
import Foundation
import ObjectMapper
/// Star repos可以在请求头添加accept字段,获取到star的时间
/// https://developer.github.com/v3/activity/starring/
class ObjGithubStarRepos: NSObject, Mappable {
var starred_at: String?
var repo: ObjRepos?
required init?(map: Map) {
}
func mapping(map: Map) {
starred_at <- map["starred_at"]
repo <- map["repo"]
repo?.starred_at = starred_at
}
}
================================================
FILE: BeeFun/BeeFun/Model/Repos/ObjRepos.swift
================================================
//
// ObjRepos.swift
// BeeFun
//
// Created by wenghengcong on 16/1/23.
// Copyright © 2016年 JungleSong. All rights reserved.
//
import Foundation
import ObjectMapper
/*
{
"id": 3739481,
"name": "ZXingObjC",
"full_name": "TheLevelUp/ZXingObjC",
"owner": {
"login": "TheLevelUp",
"id": 1521628,
"avatar_url": "https://avatars3.githubusercontent.com/u/1521628?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/TheLevelUp",
"html_url": "https://github.com/TheLevelUp",
"followers_url": "https://api.github.com/users/TheLevelUp/followers",
"following_url": "https://api.github.com/users/TheLevelUp/following{/other_user}",
"gists_url": "https://api.github.com/users/TheLevelUp/gists{/gist_id}",
"starred_url": "https://api.github.com/users/TheLevelUp/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/TheLevelUp/subscriptions",
"organizations_url": "https://api.github.com/users/TheLevelUp/orgs",
"repos_url": "https://api.github.com/users/TheLevelUp/repos",
"events_url": "https://api.github.com/users/TheLevelUp/events{/privacy}",
"received_events_url": "https://api.github.com/users/TheLevelUp/received_events",
"type": "Organization",
"site_admin": false
},
"private": false,
"html_url": "https://github.com/TheLevelUp/ZXingObjC",
"description": "An Objective-C Port of ZXing",
"fork": false,
"url": "https://api.github.com/repos/TheLevelUp/ZXingObjC",
"forks_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/forks",
"keys_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/keys{/key_id}",
"collaborators_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/collaborators{/collaborator}",
"teams_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/teams",
"hooks_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/hooks",
"issue_events_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/issues/events{/number}",
"events_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/events",
"assignees_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/assignees{/user}",
"branches_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/branches{/branch}",
"tags_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/tags",
"blobs_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/git/blobs{/sha}",
"git_tags_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/git/tags{/sha}",
"git_refs_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/git/refs{/sha}",
"trees_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/git/trees{/sha}",
"statuses_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/statuses/{sha}",
"languages_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/languages",
"stargazers_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/stargazers",
"contributors_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/contributors",
"subscribers_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/subscribers",
"subscription_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/subscription",
"commits_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/commits{/sha}",
"git_commits_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/git/commits{/sha}",
"comments_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/comments{/number}",
"issue_comment_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/issues/comments{/number}",
"contents_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/contents/{+path}",
"compare_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/compare/{base}...{head}",
"merges_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/merges",
"archive_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/{archive_format}{/ref}",
"downloads_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/downloads",
"issues_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/issues{/number}",
"pulls_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/pulls{/number}",
"milestones_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/milestones{/number}",
"notifications_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/notifications{?since,all,participating}",
"labels_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/labels{/name}",
"releases_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/releases{/id}",
"deployments_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/deployments",
"created_at": "2012-03-16T14:09:18Z",
"updated_at": "2018-05-02T02:14:07Z",
"pushed_at": "2018-04-18T07:42:30Z",
"git_url": "git://github.com/TheLevelUp/ZXingObjC.git",
"ssh_url": "git@github.com:TheLevelUp/ZXingObjC.git",
"clone_url": "https://github.com/TheLevelUp/ZXingObjC.git",
"svn_url": "https://github.com/TheLevelUp/ZXingObjC",
"homepage": "",
"size": 187508,
"stargazers_count": 2644,
"watchers_count": 2644,
"language": "Objective-C",
"has_issues": true,
"has_projects": false,
"has_downloads": true,
"has_wiki": true,
"has_pages": false,
"forks_count": 666,
"mirror_url": null,
"archived": false,
"open_issues_count": 21,
"license": {
"key": "apache-2.0",
"name": "Apache License 2.0",
"spdx_id": "Apache-2.0",
"url": "https://api.github.com/licenses/apache-2.0"
},
"forks": 666,
"open_issues": 21,
"watchers": 2644,
"default_branch": "master",
"permissions": {
"admin": false,
"push": false,
"pull": true
}
}
*/
public class ObjRepos: NSObject, Mappable {
//1
var archive_url: String?
var assignees_url: String?
var blobs_url: String?
var branches_url: String?
var clone_url: String?
var collaborators_url: String?
var comments_url: String?
var commits_url: String?
var compare_url: String?
var contents_url: String?
//11
var contributors_url: String?
var created_at: String?
var default_branch: String?
var deployments_url: String?
var cdescription: String? //description同关键字冲突,加c前缀
var downloads_url: String?
var events_url: String?
var fork: Bool?
var forks: Int?
var forks_count: Int?
//21
var forks_url: String?
var full_name: String?
var git_commits_url: String?
var git_refs_url: String?
var git_tags_url: String?
var git_url: String?
var has_downloads: Bool?
var has_projects: Bool?
var has_issues: Bool?
var has_pages: Bool?
var has_wiki: Bool?
//31
var homepage: String?
var hooks_url: String?
var html_url: String?
var id: Int?
var issue_comment_url: String?
var issue_events_url: String?
var issues_url: String?
var keys_url: String?
var labels_url: String?
var language: String?
//41
var languages_url: String?
var merges_url: String?
var milestones_url: String?
var mirror_url: String?
var name: String?
var notifications_url: String?
var open_issues: Int?
var open_issues_count: Int?
var owner: ObjUser?
var star_owner: String?
var permissions: ObjPermissions?
//51
var cprivate: Bool? //private同关键字冲突,加c前缀
var pulls_url: String?
var pushed_at: String?
var releases_url: String?
var size: Int?
var ssh_url: String?
var stargazers_count: Int?
var stargazers_url: String?
var statuses_url: String?
var subscribers_url: String?
//61
var subscription_url: String?
var svn_url: String?
var tags_url: String?
var teams_url: String?
var trees_url: String?
var updated_at: String?
var url: String?
var watchers: Int?
var watchers_count: Int?
var subscribers_count: Int?
//以下字段为单独增加
var star_tags: [String]?
var star_lists: [String]?
/// 是否订阅该项目
var watched: Bool? = false
/// 是否关注该项目
var starred: Bool? = false
/// 关注该repo的时间,从网络请求中截取
var starred_at: String?
/// Trending中
var trending_star_text: String? /// star
var trending_fork_text: String? /// star
var trending_star_interval_text: String? /// 200 stars this week
var trending_showcase_update_text: String? ///Updated Jul 5, 2017
var score: Double? //搜索得分
struct ReposKey {
static let archiveUrlKey = "archive_url"
static let assigneesUrlKey = "assignees_url"
static let blobsUrlKey = "blobs_url"
static let branchesUrlKey = "branches_url"
static let cloneUrlKey = "clone_url"
static let collaboratorsUrlKey = "collaborators_url"
static let commentsUrlKey = "comments_url"
static let commitsUrlKey = "commits_url"
static let compareUrlKey = "compare_url"
static let contentsUrlKey = "contents_url"
static let contributorsUrlKey = "contributors_url"
static let createdAtKey = "created_at"
static let defaultBranchKey = "default_branch"
static let deploymentsUrlKey = "deployments_url"
static let descriptionKey = "description"
static let downloadsUrlKey = "downloads_url"
static let eventsUrlKey = "events_url"
static let forkKey = "fork"
static let forksKey = "forks"
static let forksCountKey = "forks_count"
static let forksUrlKey = "forks_url"
static let fullNameKey = "full_name"
static let gitCommitsUrlKey = "git_commits_url"
static let gitRefsUrlKey = "git_refs_url"
static let gitTagsUrlKey = "git_tags_url"
static let gitUrlKey = "git_url"
static let hasDownloadsKey = "has_downloads"
static let hasProjects = "has_projects"
static let hasIssuesKey = "has_issues"
static let hasPagesKey = "has_pages"
static let hasWikiKey = "has_wiki"
static let homepageKey = "homepage"
static let hooksUrlKey = "hooks_url"
static let htmlUrlKey = "html_url"
static let idKey = "id"
static let issueCommentUrlKey = "issue_comment_url:"
static let issueEventsUrlKey = "issue_events_url"
static let issuesUrlKey = "issues_url"
static let keysUrlKey = "keys_url"
static let labelsUrlKey = "labels_url"
static let languageKey = "language"
static let languagesUrlKey = "languages_url"
static let mergesUrlKey = "merges_url"
static let milestonesUrlKey = "milestones_url"
static let mirrorUrlKey = "mirror_url"
static let nameKey = "name"
static let notificationsUrlKey = "notifications_url"
static let openIssuesKey = "open_issues"
static let openIssuesCountKey = "open_issues_count"
static let ownerKey = "owner"
static let starOwnerKey = "star_owner"
static let permissionsKey = "permissions"
static let privateKey = "private"
static let pullsUrlKey = "pulls_url"
static let pushedAtKey = "pushed_at"
static let releasesUrlKey = "releases_url"
static let sizeKey = "size"
static let sshUrley = "ssh_url"
static let stargazersCountKey = "stargazers_count"
static let stargazersUrlKey = "stargazers_url"
static let statusesUrlKey = "statuses_url"
static let subscribersUrlKey = "subscribers_url"
static let subscriptionUrlKey = "subscription_url"
static let svnUrlKey = "svn_url"
static let tagsUrlKey = "tags_url"
static let teamsUrlKey = "teams_url"
static let treesUrlKey = "trees_url:"
static let updatedAtKey = "updated_at"
static let urlKey = "url"
static let watchersKey = "watchers"
static let watchersCountKey = "watchers_count"
static let subscribersCountKey = "subscribers_count"
static let starTagsKey = "star_tags"
static let starListKey = "star_lists"
static let watchedKey = "watched"
static let scoreKey = "score"
static let starred_atKey = "starred_at"
static let trending_star_textKey = "trending_star_text"
static let trending_fork_textKey = "trending_fork_text"
static let trending_star_interval_textKey = "trending_star_interval_text"
static let trending_showcase_update_textKey = "trending_showcase_update_text"
}
// MARK: init and mapping
required public init?(map: Map) {
}
override init() {
super.init()
}
public func mapping(map: Map) {
// super.mapping(map)
archive_url <- map[ReposKey.archiveUrlKey]
assignees_url <- map[ReposKey.assigneesUrlKey]
blobs_url <- map[ReposKey.blobsUrlKey]
branches_url <- map[ReposKey.branchesUrlKey]
clone_url <- map[ReposKey.cloneUrlKey]
collaborators_url <- map[ReposKey.collaboratorsUrlKey]
comments_url <- map[ReposKey.commentsUrlKey]
commits_url <- map[ReposKey.commitsUrlKey]
compare_url <- map[ReposKey.compareUrlKey]
contents_url <- map[ReposKey.contentsUrlKey]
contributors_url <- map[ReposKey.contributorsUrlKey]
created_at <- map[ReposKey.createdAtKey]
default_branch <- map[ReposKey.defaultBranchKey]
deployments_url <- map[ReposKey.deploymentsUrlKey]
cdescription <- map[ReposKey.descriptionKey]
downloads_url <- map[ReposKey.downloadsUrlKey]
events_url <- map[ReposKey.eventsUrlKey]
fork <- map[ReposKey.forkKey]
forks <- map[ReposKey.forksKey]
forks_count <- map[ReposKey.forksCountKey]
forks_url <- map[ReposKey.forksUrlKey]
full_name <- map[ReposKey.fullNameKey]
git_commits_url <- map[ReposKey.gitCommitsUrlKey]
git_refs_url <- map[ReposKey.gitRefsUrlKey]
git_tags_url <- map[ReposKey.gitTagsUrlKey]
git_url <- map[ReposKey.gitUrlKey]
has_downloads <- map[ReposKey.hasDownloadsKey]
has_projects <- map[ReposKey.hasProjects]
has_issues <- map[ReposKey.hasIssuesKey]
has_pages <- map[ReposKey.hasPagesKey]
has_wiki <- map[ReposKey.hasWikiKey]
homepage <- map[ReposKey.homepageKey]
hooks_url <- map[ReposKey.hooksUrlKey]
html_url <- map[ReposKey.htmlUrlKey]
id <- map[ReposKey.idKey]
issue_comment_url <- map[ReposKey.issueCommentUrlKey]
issue_events_url <- map[ReposKey.issueEventsUrlKey]
issues_url <- map[ReposKey.issuesUrlKey]
keys_url <- map[ReposKey.keysUrlKey]
labels_url <- map[ReposKey.labelsUrlKey]
language <- map[ReposKey.languageKey]
languages_url <- map[ReposKey.languagesUrlKey]
merges_url <- map[ReposKey.mergesUrlKey]
milestones_url <- map[ReposKey.milestonesUrlKey]
mirror_url <- map[ReposKey.mirrorUrlKey]
name <- map[ReposKey.nameKey]
notifications_url <- map[ReposKey.notificationsUrlKey]
open_issues <- map[ReposKey.openIssuesKey]
open_issues_count <- map[ReposKey.openIssuesCountKey]
owner <- map[ReposKey.ownerKey]
star_owner <- map[ReposKey.starOwnerKey]
permissions <- map[ReposKey.permissionsKey]
cprivate <- map[ReposKey.privateKey]
pulls_url <- map[ReposKey.pullsUrlKey]
pushed_at <- map[ReposKey.pushedAtKey]
releases_url <- map[ReposKey.releasesUrlKey]
size <- map[ReposKey.sizeKey]
ssh_url <- map[ReposKey.sshUrley]
stargazers_count <- map[ReposKey.stargazersCountKey]
stargazers_url <- map[ReposKey.stargazersUrlKey]
statuses_url <- map[ReposKey.statusesUrlKey]
subscribers_url <- map[ReposKey.subscribersUrlKey]
subscription_url <- map[ReposKey.subscriptionUrlKey]
svn_url <- map[ReposKey.svnUrlKey]
tags_url <- map[ReposKey.gitTagsUrlKey]
teams_url <- map[ReposKey.teamsUrlKey]
trees_url <- map[ReposKey.treesUrlKey]
updated_at <- map[ReposKey.updatedAtKey]
url <- map[ReposKey.urlKey]
watchers <- map[ReposKey.watchersKey]
watchers_count <- map[ReposKey.watchersCountKey]
subscribers_count <- map[ReposKey.subscribersCountKey]
score <- map[ReposKey.scoreKey]
starred_at <- map[ReposKey.starred_atKey]
star_tags <- map[ReposKey.starTagsKey]
star_lists <- map[ReposKey.starListKey]
trending_fork_text <- map[ReposKey.trending_fork_textKey]
trending_star_text <- map[ReposKey.trending_star_textKey]
trending_star_interval_text <- map[ReposKey.trending_star_interval_textKey]
trending_showcase_update_text <- map[ReposKey.trending_showcase_update_textKey]
}
}
================================================
FILE: BeeFun/BeeFun/Model/Repos/ObjReposSum.swift
================================================
//
// ObjReposSum.swift
// BeeFun
//
// Created by WengHengcong on 16/1/26.
// Copyright © 2016年 JungleSong. All rights reserved.
//
import ObjectMapper
/*
"id": 1296269,
"owner": {
"login": "octocat",
"id": 1,
"avatar_url": "https://github.com/images/error/octocat_happy.gif",
"gravatar_id": "",
"url": "https://api.github.com/users/octocat",
"html_url": "https://github.com/octocat",
"followers_url": "https://api.github.com/users/octocat/followers",
"following_url": "https://api.github.com/users/octocat/following{/other_user}",
"gists_url": "https://api.github.com/users/octocat/gists{/gist_id}",
"starred_url": "https://api.github.com/users/octocat/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/octocat/subscriptions",
"organizations_url": "https://api.github.com/users/octocat/orgs",
"repos_url": "https://api.github.com/users/octocat/repos",
"events_url": "https://api.github.com/users/octocat/events{/privacy}",
"received_events_url": "https://api.github.com/users/octocat/received_events",
"type": "User",
"site_admin": false
},
"name": "Hello-World",
"full_name": "octocat/Hello-World",
"description": "This your first repo!",
"private": false,
"fork": false,
"url": "https://api.github.com/repos/octocat/Hello-World",
"html_url": "https://github.com/octocat/Hello-World"
*/
class ObjReposSum: NSObject {
}
================================================
FILE: BeeFun/BeeFun/Model/Trending/ObjShowcase.swift
================================================
//
// ObjShowcase.swift
// BeeFun
//
// Created by WengHengcong on 3/8/16.
// Copyright © 2016 JungleSong. All rights reserved.
//
import UIKit
import ObjectMapper
/*
"name": "Policies",
"slug": "policies",
"description": "From federal governments to corporations to student clubs, groups of all sizes are using GitHub to share, discuss, and improve laws. Ask...",
"image_url": "http://trending.codehub-app.com/policies.png",
"repositories": [ObjRespo]
*/
class ObjShowcase: NSObject, Mappable {
var name: String?
var slug: String?
var cdescription: String?
var image_url: String?
var repositories: [ObjRepos]?
//自定义字段,从网页解析
/// 项目数目
var trend_repo_text: String?
/// 语言数目
var trend_lan_text: String?
/// 解析后的图片svg数据,base64未解码数据
var svgXml: String?
override init() {
super.init()
}
required init?(map: Map) {
}
func mapping(map: Map) {
// super.mapping(map)
name <- map["name"]
slug <- map["slug"]
cdescription <- map["description"]
image_url <- map["image_url"]
repositories <- map["repositories"]
//自定义字段
//repos_count\launguage_count
}
}
================================================
FILE: BeeFun/BeeFun/Model/User/ObjEmail.swift
================================================
//
// ObjEmail.swift
// BeeFun
//
// Created by WengHengcong on 16/1/25.
// Copyright © 2016年 JungleSong. All rights reserved.
//
import UIKit
import ObjectMapper
class ObjEmail: NSObject, Mappable {
var email: String?
var primary: Bool?
var verified: Bool?
required init?(map: Map) {
}
func mapping(map: Map) {
// super.mapping(map)
email <- map["email"]
primary <- map["primary"]
verified <- map["verified"]
}
}
================================================
FILE: BeeFun/BeeFun/Model/User/ObjPermissions.swift
================================================
//
// ObjPermissions.swift
// BeeFun
//
// Created by wenghengcong on 16/1/23.
// Copyright © 2016年 JungleSong. All rights reserved.
//
import UIKit
import ObjectMapper
class ObjPermissions: NSObject, Mappable {
var admin: Int?
var pull: Int?
var push: Int?
required init?(map: Map) {
}
func mapping(map: Map) {
// super.mapping(map)
admin <- map["admin"]
pull <- map["pull"]
push <- map["push"]
}
}
================================================
FILE: BeeFun/BeeFun/Model/User/ObjPlan.swift
================================================
//
// ObjPlan.swift
// BeeFun
//
// Created by wenghengcong on 16/1/14.
// Copyright © 2016年 JungleSong. All rights reserved.
//
import UIKit
import ObjectMapper
/*
"private_repos" : 0,
"collaborators" : 0,
"space" : 976562499,
"name" : "free"
*/
class ObjPlan: NSObject, NSCoding, Mappable {
var private_repos: Int?
var collaborators: Int?
var space: Int?
var name: String?
struct PlanKey {
static let privateReposKey = "private_repos"
static let collaboratorsKey = "collaborators"
static let spaceKey = "space"
static let nameKey = "name"
}
required init?(map: Map) {
}
func mapping(map: Map) {
// super.mapping(map)
private_repos <- map[PlanKey.privateReposKey]
collaborators <- map[PlanKey.collaboratorsKey]
space <- map[PlanKey.spaceKey]
name <- map[PlanKey.nameKey]
}
func encode(with aCoder: NSCoder) {
aCoder.encode(private_repos, forKey:PlanKey.privateReposKey)
aCoder.encode(collaborators, forKey:PlanKey.collaboratorsKey)
aCoder.encode(space, forKey:PlanKey.spaceKey)
aCoder.encode(name, forKey:PlanKey.nameKey)
}
required init?(coder aDecoder: NSCoder) {
super.init()
private_repos = aDecoder.decodeObject(forKey: PlanKey.privateReposKey) as? Int
collaborators = aDecoder.decodeObject(forKey: PlanKey.collaboratorsKey) as? Int
space = aDecoder.decodeObject(forKey: PlanKey.spaceKey) as? Int
name = aDecoder.decodeObject(forKey: PlanKey.nameKey) as? String
}
}
================================================
FILE: BeeFun/BeeFun/Model/User/ObjUser.swift
================================================
//
// ObjUser.swift
// BeeFun
//
// Created by wenghengcong on 16/1/14.
// Copyright © 2016年 JungleSong. All rights reserved.
//
import UIKit
import ObjectMapper
/*
{
"avatar_url": "https://avatars3.githubusercontent.com/u/3964406?v=4",
"bio": "iOS Developer/App addict",
"blog": "http://www.wenghengcong.com",
"collaborators": 0,
"company": "JD ",
"created_at": "2013-03-25T13:03:12Z",
"disk_usage": 1557766,
"email": "wenghengcong@gmail.com",
"events_url": "https://api.github.com/users/wenghengcong/events{/privacy}",
"followers": 56,
"followers_url": "https://api.github.com/users/wenghengcong/followers",
"following": 38,
"following_url": "https://api.github.com/users/wenghengcong/following{/other_user}",
"gists_url": "https://api.github.com/users/wenghengcong/gists{/gist_id}",
"gravatar_id": "",
"hireable": true,
"html_url": "https://github.com/wenghengcong",
"id": 3964406,
"location": "ShangHai",
"login": "wenghengcong",
"name": "wenghengcong",
"node_id": "MDQ6VXNlcjM5NjQ0MDY=",
"organizations_url": "https://api.github.com/users/wenghengcong/orgs",
"owned_private_repos": 20,
"plan": {
"collaborators": 0,
"name": "developer",
"private_repos": 9999,
"space": 976562499
},
"private_gists": 0,
"public_gists": 2,
"public_repos": 12,
"received_events_url": "https://api.github.com/users/wenghengcong/received_events",
"repos_url": "https://api.github.com/users/wenghengcong/repos",
"site_admin": false,
"starred_url": "https://api.github.com/users/wenghengcong/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/wenghengcong/subscriptions",
"total_private_repos": 20,
"two_factor_authentication": false,
"type": "User",
"updated_at": "2018-06-11T15:32:59Z",
"url": "https://api.github.com/users/wenghengcong"
}
*/
public class ObjUser: NSObject, NSCoding, Mappable {
// MARK: repos
var total_private_repos: Int?
var public_repos: Int?
var owned_private_repos: Int?
var repos_url: String?
// MARK: follower
var followers: Int?
var following: Int?
var following_url: String?
var followers_url: String?
// MARK: user infomation
var name: String?
var bio: String?
var organizations_url: String?
var location: String?
var blog: String?
var avatar_url: String?
var email: String?
var company: String?
var hireable: Bool?
var login: String? //wenghengcong
// MARK: gist
var private_gists: Int?
var public_gists: Int?
var gists_url: String?
// MARK: github information
var type: String?
var starred_url: String?
var id: Int?
var collaborators: Int?
var gravatar_id: String?
var disk_usage: Int?
var url: String?
var updated_at: String?
var created_at: String?
var site_admin: Bool?
var received_events_url: String?
var subscriptions_url: String?
var events_url: String?
var html_url: String?
var plan: ObjPlan?
var node_id: String?
var two_factor_authentication: Bool?
// MARK: 自定义字段
var trend_repo_order: Int? //排序order
var trend_user_name: String? //developer的名称
var trend_repo_name: String? //repo的名称
var trend_repo_desc: String? //repo的描述
var trend_user_follow: String? //关注的文本,Follow/UnFollow
var score: Double? //搜索得分
var display_login: String? //pull request event中actor需要的属性
var token: String?
struct UserKey {
static let totalPrivateReposKey = "total_private_repos"
static let publicReposKey = "public_repos"
static let ownedPrivateReposKey = "owned_private_repos"
static let reposUrlKey = "repos_url"
static let followersKey = "followers"
static let followingKey = "following"
static let followingUrlKey = "following_url"
static let followersUrlKey = "followers_url"
static let nameKey = "name"
static let bioKey = "bio"
static let organizationsUrlKey = "organizations_url"
static let locationKey = "location"
static let blogKey = "blog"
static let avatarUrlKey = "avatar_url"
static let emailKey = "email"
static let companyKey = "company"
static let hireableKey = "hireable"
static let loginKey = "login"
static let privateGistsKey = "private_gists"
static let publicGistsKey = "public_gists"
static let gistsUrlKey = "gists_url"
static let typeKey = "type"
static let starredUrlKey = "starred_url"
static let idKey = "id"
static let collaboratorsKey = "collaborators"
static let gravatarIdKey = "gravatar_id"
static let diskUsageKey = "disk_usage"
static let urlKey = "url"
static let updatedAtKey = "updated_at"
static let createdAtKey = "created_at"
static let siteAdminKey = "site_admin"
static let receivedRventsUrlKey = "received_events_url"
static let subscriptionsUrlKey = "subscriptions_url"
static let eventsUrlKey = "events_url"
static let htmlUrlKey = "html_url"
static let planKey = "plan"
static let trend_repo_order = "trend_repo_order"
static let trend_repo_name = "trend_repo_name"
static let trend_repo_desc = "trend_repo_desc"
static let score = "score"
static let display_login = "display_login"
static let node_id = "node_id"
static let two_factor_authentication = "two_factor_authentication"
static let token = "token"
}
// MARK: init and mapping
required public init?(map: Map) {
}
override init() {
super.init()
}
public func mapping(map: Map) {
// super.mapping(map)
total_private_repos <- map[UserKey.totalPrivateReposKey]
public_repos <- map[UserKey.publicReposKey]
owned_private_repos <- map[UserKey.ownedPrivateReposKey]
repos_url <- map[UserKey.reposUrlKey]
followers <- map[UserKey.followersKey]
following <- map[UserKey.followingKey]
following_url <- map[UserKey.followingUrlKey]
followers_url <- map[UserKey.followersUrlKey]
name <- map[UserKey.nameKey]
bio <- map[UserKey.bioKey]
organizations_url <- map[UserKey.organizationsUrlKey]
location <- map[UserKey.locationKey]
blog <- map[UserKey.blogKey]
avatar_url <- map[UserKey.avatarUrlKey]
email <- map[UserKey.emailKey]
company <- map[UserKey.companyKey]
hireable <- map[UserKey.hireableKey]
login <- map[UserKey.loginKey]
private_gists <- map[UserKey.privateGistsKey]
public_gists <- map[UserKey.publicGistsKey]
gists_url <- map[UserKey.gistsUrlKey]
type <- map[UserKey.typeKey]
starred_url <- map[UserKey.starredUrlKey]
id <- map[UserKey.idKey]
collaborators <- map[UserKey.collaboratorsKey]
gravatar_id <- map[UserKey.gravatarIdKey]
disk_usage <- map[UserKey.diskUsageKey]
url <- map[UserKey.urlKey]
updated_at <- map[UserKey.updatedAtKey]
created_at <- map[UserKey.createdAtKey]
site_admin <- map[UserKey.siteAdminKey]
received_events_url <- map[UserKey.receivedRventsUrlKey]
subscriptions_url <- map[UserKey.subscriptionsUrlKey]
events_url <- map[UserKey.eventsUrlKey]
html_url <- map[UserKey.htmlUrlKey]
plan <- map[UserKey.planKey]
//自定义时,trend相关字段无须存储
//trend_repo_desc
score <- map[UserKey.score]
display_login <- map[UserKey.display_login]
node_id <- map[UserKey.node_id]
two_factor_authentication <- map[UserKey.two_factor_authentication]
token <- map[UserKey.token];
}
public func encode(with aCoder: NSCoder) {
aCoder.encode(total_private_repos, forKey: UserKey.totalPrivateReposKey)
aCoder.encode(public_repos, forKey: UserKey.publicReposKey)
aCoder.encode(owned_private_repos, forKey: UserKey.ownedPrivateReposKey)
aCoder.encode(repos_url, forKey: UserKey.reposUrlKey)
aCoder.encode(followers, forKey: UserKey.followersKey)
aCoder.encode(following, forKey: UserKey.followingKey)
aCoder.encode(following_url, forKey: UserKey.followingUrlKey)
aCoder.encode(followers_url, forKey: UserKey.followersUrlKey)
aCoder.encode(name, forKey: UserKey.nameKey)
aCoder.encode(bio, forKey: UserKey.bioKey)
aCoder.encode(organizations_url, forKey: UserKey.organizationsUrlKey)
aCoder.encode(location, forKey: UserKey.locationKey)
aCoder.encode(blog, forKey: UserKey.blogKey)
aCoder.encode(avatar_url, forKey: UserKey.avatarUrlKey)
aCoder.encode(email, forKey: UserKey.emailKey)
aCoder.encode(company, forKey: UserKey.companyKey)
aCoder.encode(hireable, forKey: UserKey.hireableKey)
aCoder.encode(login, forKey: UserKey.loginKey)
aCoder.encode(private_gists, forKey: UserKey.privateGistsKey)
aCoder.encode(public_gists, forKey: UserKey.publicGistsKey)
aCoder.encode(gists_url, forKey: UserKey.gistsUrlKey)
aCoder.encode(type, forKey: UserKey.typeKey)
aCoder.encode(starred_url, forKey: UserKey.starredUrlKey)
aCoder.encode(id, forKey: UserKey.idKey)
aCoder.encode(collaborators, forKey: UserKey.collaboratorsKey)
aCoder.encode(gravatar_id, forKey: UserKey.gravatarIdKey)
aCoder.encode(disk_usage, forKey: UserKey.diskUsageKey)
aCoder.encode(url, forKey: UserKey.urlKey)
aCoder.encode(updated_at, forKey: UserKey.updatedAtKey)
aCoder.encode(created_at, forKey: UserKey.createdAtKey)
aCoder.encode(site_admin, forKey: UserKey.siteAdminKey)
aCoder.encode(received_events_url, forKey: UserKey.receivedRventsUrlKey)
aCoder.encode(subscriptions_url, forKey: UserKey.subscriptionsUrlKey)
aCoder.encode(events_url, forKey: UserKey.eventsUrlKey)
aCoder.encode(html_url, forKey: UserKey.htmlUrlKey)
aCoder.encode(plan, forKey: UserKey.planKey)
aCoder.encode(score, forKey: UserKey.score)
aCoder.encode(display_login, forKey: UserKey.display_login)
aCoder.encode(node_id, forKey: UserKey.node_id)
aCoder.encode(two_factor_authentication, forKey: UserKey.two_factor_authentication)
aCoder.encode(token, forKey: UserKey.token)
//自定义时,trend相关字段无须存储
}
//The required keyword means this initializer must be implemented on every subclass of the class that defines this initializer.
//The convenience keyword denotes this initializer as a convenience initializer. Convenience initializers are secondary, supporting initializers that need to call one of their class’s designated initializers. Designated initializers are the primary initializers for a class. They fully initialize all properties introduced by that class and call a superclass initializer to continue the initialization process up the superclass chain. Here, you’re declaring this initializer as a convenience initializer because it only applies when there’s saved data to be loaded.
required public init?(coder aDecoder: NSCoder) {
super.init()
total_private_repos = aDecoder.decodeObject(forKey: UserKey.totalPrivateReposKey) as? Int
public_repos = aDecoder.decodeObject(forKey: UserKey.publicReposKey) as? Int
owned_private_repos = aDecoder.decodeObject(forKey: UserKey.ownedPrivateReposKey) as? Int
repos_url = aDecoder.decodeObject(forKey: UserKey.reposUrlKey) as? String
followers = aDecoder.decodeObject(forKey: UserKey.followersKey) as? Int
following = aDecoder.decodeObject(forKey: UserKey.followingKey) as? Int
following_url = aDecoder.decodeObject(forKey: UserKey.followingUrlKey) as? String
followers_url = aDecoder.decodeObject(forKey: UserKey.followersUrlKey) as? String
name = aDecoder.decodeObject(forKey: UserKey.nameKey) as? String
bio = aDecoder.decodeObject(forKey: UserKey.bioKey) as? String
organizations_url = aDecoder.decodeObject(forKey: UserKey.organizationsUrlKey) as? String
location = aDecoder.decodeObject(forKey: UserKey.locationKey) as? String
blog = aDecoder.decodeObject(forKey: UserKey.blogKey) as? String
avatar_url = aDecoder.decodeObject(forKey: UserKey.avatarUrlKey) as? String
email = aDecoder.decodeObject(forKey: UserKey.emailKey) as? String
company = aDecoder.decodeObject(forKey: UserKey.companyKey) as? String
hireable = aDecoder.decodeObject(forKey: UserKey.hireableKey) as? Bool
login = aDecoder.decodeObject(forKey: UserKey.loginKey) as? String
private_gists = aDecoder.decodeObject(forKey: UserKey.privateGistsKey) as? Int
public_gists = aDecoder.decodeObject(forKey: UserKey.publicGistsKey) as? Int
gists_url = aDecoder.decodeObject(forKey: UserKey.gistsUrlKey) as? String
type = aDecoder.decodeObject(forKey: UserKey.typeKey) as? String
starred_url = aDecoder.decodeObject(forKey: UserKey.starredUrlKey) as? String
id = aDecoder.decodeObject(forKey: UserKey.idKey) as? Int
collaborators = aDecoder.decodeObject(forKey: UserKey.collaboratorsKey) as? Int
gravatar_id = aDecoder.decodeObject(forKey: UserKey.gravatarIdKey) as? String
disk_usage = aDecoder.decodeObject(forKey: UserKey.diskUsageKey) as? Int
url = aDecoder.decodeObject(forKey: UserKey.urlKey) as? String
updated_at = aDecoder.decodeObject(forKey: UserKey.updatedAtKey) as? String
created_at = aDecoder.decodeObject(forKey: UserKey.createdAtKey) as? String
site_admin = aDecoder.decodeObject(forKey: UserKey.siteAdminKey) as? Bool
received_events_url = aDecoder.decodeObject(forKey: UserKey.receivedRventsUrlKey) as? String
subscriptions_url = aDecoder.decodeObject(forKey: UserKey.subscriptionsUrlKey) as? String
events_url = aDecoder.decodeObject(forKey: UserKey.eventsUrlKey) as? String
html_url = aDecoder.decodeObject(forKey: UserKey.htmlUrlKey) as? String
plan = aDecoder.decodeObject(forKey: UserKey.planKey) as? ObjPlan
score = aDecoder.decodeObject(forKey: UserKey.score) as? Double
display_login = aDecoder.decodeObject(forKey: UserKey.display_login) as? String
node_id = aDecoder.decodeObject(forKey: UserKey.node_id) as? String
two_factor_authentication = aDecoder.decodeObject(forKey: UserKey.two_factor_authentication) as? Bool
token = aDecoder.decodeObject(forKey: UserKey.token) as? String
//自定义时,trend相关字段无须存储
}
// MARK: Archive path
static let documentDirectory = JSFileManager.documentsUrl
static let archiveURL = documentDirectory.appendingPathComponent("userinfo")
// MARK: save and load user info with disk
class func saveUserInfo(_ user: ObjUser?) {
if user == nil {
print("user is nil...")
} else {
// NSKeyedArchiver.setClassName("ObjUser", for: ObjUser.self)
let isScuessfulSave = NSKeyedArchiver.archiveRootObject(user!, toFile: ObjUser.archiveURL.path)
if !isScuessfulSave {
print("Failed to save user ...")
}
}
}
class func loadUserInfo() -> ObjUser? {
// NSKeyedUnarchiver.setClass(ObjUser.self, forClassName: "ObjUser")
return NSKeyedUnarchiver.unarchiveObject(withFile: ObjUser.archiveURL.path) as? ObjUser
}
class func deleteUserInfo() {
let fileM = FileManager.default
if fileM.fileExists(atPath: archiveURL.path) {
do {
try fileM.removeItem(at: archiveURL)
} catch {
}
}
}
}
================================================
FILE: BeeFun/BeeFun/Model/User/ObjUserSum.swift
================================================
//
// ObjUserSum.swift
// BeeFun
//
// Created by WengHengcong on 16/1/25.
// Copyright © 2016年 JungleSong. All rights reserved.
//
import UIKit
import ObjectMapper
/*
"login": "Mike19800206",
"id": 13727538,
"avatar_url": "https://avatars.githubusercontent.com/u/13727538?v=3",
"gravatar_id": "",
"url": "https://api.github.com/users/Mike19800206",
"html_url": "https://github.com/Mike19800206",
"followers_url": "https://api.github.com/users/Mike19800206/followers",
"following_url": "https://api.github.com/users/Mike19800206/following{/other_user}",
"gists_url": "https://api.github.com/users/Mike19800206/gists{/gist_id}",
"starred_url": "https://api.github.com/users/Mike19800206/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/Mike19800206/subscriptions",
"organizations_url": "https://api.github.com/users/Mike19800206/orgs",
"repos_url": "https://api.github.com/users/Mike19800206/repos",
"events_url": "https://api.github.com/users/Mike19800206/events{/privacy}",
"received_events_url": "https://api.github.com/users/Mike19800206/received_events",
"type": "User",
"site_admin": false
*/
class ObjUserSum: NSObject, Mappable {
var login: String? //wenghengcong
var id: Int?
var avatar_url: String?
var url: String?
var html_url: String?
var following_url: String?
var followers_url: String?
var gists_url: String?
var starred_url: String?
var subscriptions_url: String?
var organizations_url: String?
var repos_url: String?
var events_url: String?
var received_events_url: String?
var type: String?
var site_admin: Bool?
struct UserSumKey {
static let reposUrlKey = "repos_url"
static let followingUrlKey = "following_url"
static let followersUrlKey = "followers_url"
static let organizationsUrlKey = "organizations_url"
static let avatarUrlKey = "avatar_url"
static let emailKey = "email"
static let loginKey = "login"
static let gistsUrlKey = "gists_url"
static let typeKey = "type"
static let starredUrlKey = "starred_url"
static let idKey = "id"
static let urlKey = "url"
static let siteAdminKey = "site_admin"
static let receivedRventsUrlKey = "received_events_url"
static let subscriptionsUrlKey = "subscriptions_url"
static let eventsUrlKey = "events_url"
static let htmlUrlKey = "html_url:"
}
// MARK: init and mapping
required init?(map: Map) {
}
func mapping(map: Map) {
// super.mapping(map)
repos_url <- map[UserSumKey.reposUrlKey]
following_url <- map[UserSumKey.followingUrlKey]
followers_url <- map[UserSumKey.followersUrlKey]
organizations_url <- map[UserSumKey.organizationsUrlKey]
avatar_url <- map[UserSumKey.avatarUrlKey]
login <- map[UserSumKey.loginKey]
gists_url <- map[UserSumKey.gistsUrlKey]
type <- map[UserSumKey.typeKey]
starred_url <- map[UserSumKey.starredUrlKey]
id <- map[UserSumKey.idKey]
url <- map[UserSumKey.urlKey]
site_admin <- map[UserSumKey.siteAdminKey]
received_events_url <- map[UserSumKey.receivedRventsUrlKey]
subscriptions_url <- map[UserSumKey.subscriptionsUrlKey]
events_url <- map[UserSumKey.eventsUrlKey]
html_url <- map[UserSumKey.htmlUrlKey]
}
}
================================================
FILE: BeeFun/BeeFun/Resources/Localizable/en.lproj/Localizable.strings
================================================
/*
Localizable.strings
BeeFun
Created by WengHengcong on 2017/3/13.
Copyright © 2017年 JungleSong. All rights reserved.
*/
/*****英文转中文 Start******/
//explore
"Explore" = "Explore";
"Repositories" = "Repositories";
"Developers" = "Developers";
"Showcases"="Showcases";
//filter
"Since"="Since";
"daily"="daily";
"weekly"="weekly";
"monthly"="monthly";
//search
"All" = "All";
"Language"="Language";
"Country"="Country";
"Sort"="Sort";
"Reset"="Reset";
"Sure"="Sure";
"Best match"="Best match";
"Most stars"="Most stars";
"Fewest stars"="Fewest stars";
"Most forks"="Most forks";
"Fewest forks"="Fewest forks";
"Recently updated"="Recently updated";
"Leaest recently updated"="Leaest recently updated";
"Search repositories"="Search repositories";
"Search users"="Search users";
"Best match"="Best match";
"Most followers"="Most followers";
"Fewest followers"="Fewest followers";
"Most recently joined"="Most recently joined";
"Leaest recently joined"="Fewest recently joined";
"Most repositories"="Most repositories";
"Fewest repositories"="Fewest repositories";
//Message
"Message" = "Message";
"Notifications"="Notifications";
//Stars
"Stars" = "Stars";
"Event"="Event";
//Profile
"Profile" = "Profile";
"Sign in"="Sign in";
"Followers"="Followers";
"Following"="Following";
"Watched"="Watched";
"Feedback"="Feedback";
"Settings"="Settings";
"Share"="Share";
"Rate"="Rate";
"About"="About";
"Edit"="Edit";
//Settings
"Version"="Version";
"Log Out"="Log Out";
//About
"About"="About";
"Me"="Me";
//repo view
"Watch"="Watch";
"Unwatch"="Unwatch";
"Star"="Star";
"Unstar"="Unstar";
"Fork"="Fork";
"Public"="Public";
"Private"="Private";
"catated at"="catated at";
//user view
"Joined on"="Joined on";
"Follow"="Follow";
"Unfollow"="Unfollow";
"Follower"="Follower";
"Repositories"="Repositories";
"Following"="Following";
//长文本
" BeeFun is a client for github.It is written in Swift language. Welcome more suggestions and reports of bugs come from everyone! Thanks." = " BeeFun is a client for github.It is written in Swift language. Welcome more suggestions and reports of bugs come from everyone! Thanks.";
//提醒
"Share Success"="Share Success";
"Share Failure"="Share Failure";
"Share Cancel"="Share Cancel";
"Please login first"="Please login first";
"No Data Found"="No Data Found";
"Release to refresh"="Release to refresh";
"Pull down to refresh"="Pull down to refresh";
"Load"="Load";
"Loading"="Loading";
"More"="More";
"No More data"="😭No More data";
"Network error /(ㄒoㄒ)/~~"="Network error /(ㄒoㄒ)/~~";
"Sign in Now?" = "Sign in Now?";
"access data ask github account"="access data ask github account";
"Watch?"="Watch?";
"Unwatch?"="Unwatch?";
"Unstar?"="Unstar?";
"Star?"="Star?";
"Fork?"="Fork?";
"Watch Success"="Watch Success";
"Unwatch Success"="Unwatch Success";
"Star Success"="Star Success";
"Unstar Success"="Unstar Success";
"Fork Success"="Fork Success";
"Follow Success"="Follow Success";
"UnFollow Success"="UnFollow Success";
"Immediately sync your star repositories from github.com in silence."="Immediately sync your star repositories from github.com in silence.";
"Sync"="Sync";
"Sync start"="Sync start";
"Sync end"="Sync end";
//其他
"Unknown" = "Unknown";
"Success"="Success";
"created at"="created at";
"Homepage"="Homepage";
"Cancel"="Cancel";
"Failure"="Failure";
"Repository"="Repository";
"Tags"="Tags";
"All Tags"="All Tags";
"Save"="Save";
"Save Tags?"="Save Tags?";
"Add new tag"="Add new tag";
"input new tag name"="input new tag name";
"input tag"="input tag";
"Already exists!"="Already exists!";
"No tag to save"="No tag to save";
"Demo" = "Demo";
"Edit"="Edit";
"Trash"="Trash";
"OK"="OK";
"make a change"="make a change";
"Lists"="Lists";
//其他
"Owner"="Owner";
"Join"="Join";
"Location"="Location";
"Company"="Company";
"Name"="Name";
"Email"="Email";
"Blog"="Blog";
"Hireable"="Hireable";
"Bio"="Bio";
"Trash it will remove this tag from star repositories!"="Trash it will remove this tag from star repositories!";
//搜索
"Historical records" = "Historical records";
"Clear All Records" = "Clear All Records";
"Search repositories、users..." = "Search repositories、users...";
"Clear all history records?" = "Clear all history records?";
"Forks" = "Forks";
"Updated" = "Updated";
"Users"="Users";
"Search"="Search";
"Joined"="Joined";
"Comments"="Comments";
"Created"="Created";
"Repo"="Repo";
"Foll"="Foll";
"Comm"="Comm";
"Join"="Join";
"Creat"="Creat";
"Delete"="Delete";
"Submit"="Submit";
"Title can't be empty"="Title can't be empty";
"bug? function?..."="bug? function?...";
//分享
"It's A Wonderful Repository from github! Hurry UP!" = "It's A Wonderful Repository from github! Hurry UP!";
"from BeeFun App"="from BeeFun App";
"Download Here"="Download Here";
"A Talented Developer"="A Talented Developer";
"BeeFun,excellent Github client. Download here: http://t.cn/RinAeZq \n Office website: http://www.beefun.top" = "BeeFun,excellent Github client. Download here: http://t.cn/RinAeZq \n Office website: http://www.beefun.top";
"Update Failure" = "Update Failure";
"'All' is default,change one."="'All' is default,change one.";
"Try Again"="Try Again";
"Wake up your connection!"="Wake up your connection!";
"Empty now"="Empty now";
"Go"="Go";
"Explore more"="Explore more";
"Empty now,star repositories and tag it"="Empty now,star repositories and tag it";
/*****英文转中文 End******/
/*****中文转英文 Start******/
//explore
"发现" = "Explore";
"项目" = "Repositories";
"用户" = "Developers";
"列表"="Showcases";
//filter
"时间"="Since";
"每天"="daily";
"每周"="weekly";
"每月"="monthly";
"全部"="All";
//country
"中国"="China";
"美国"="USA";
"印度"="India";
"日本"="Japan";
"韩国"="Korea";
"巴西"="Brazil";
"德国"="Germany";
"俄罗斯"="Russia";
"英国"="UK";
"法国"="France";
"西班牙"="Spain";
"加拿大"="Canada";
"新加坡"="Singapore";
"荷兰"="Netherlands";
"意大利"="Italy";
"瑞士"="Switzerland";
"澳大利亚"="Australia";
//City
"北京"="Beijing";
"上海"="Shanghai";
"深圳"="Shenzhen";
"杭州"="Hangzhou";
"广州"="Guangzhou";
"成都"="Chengdu";
"南昌"="NanChang";
//search
"语言"="Language";
"国家"="Country";
"排序"="Sort";
"重置"="Reset";
"确认"="Sure";
"最优匹配"="Best match";
"收藏最多"="Most stars";
"收藏最少"="Fewest stars";
"派生最多"="Most forks";
"派生最少"="Fewest forks";
"更新最近"="Recently updated";
"更新最少"="Leaest recently updated";
"搜索项目"="Search repositories";
"搜索用户"="Search Users";
"最优匹配"="Best match";
"粉丝最多"="Most followers";
"粉丝最少"="Fewest followers";
"加入最新"="Most recently joined";
"加入最旧"="Fewest recently joined";
"项目最多"="Most repositories";
"项目最少"="Fewest repositories";
//Message
"消息" = "Message";
"通知"="Notifications";
"讨论"="Issues";
//Stars
"收藏" = "Stars";
"项目"="Repositories";
"事件"="Event";
//Profile
"我" = "Profile";
"登录"="Sign in";
"粉丝"="Followers";
"关注"="Following";
"关注"="Watched";
"反馈"="Feedback";
"设置"="Settings";
"分享"="Share";
"评价"="Rate";
"关于"="About";
//Settings
"版本"="Version";
"退出登录"="Log Out";
//About
"关于"="About";
"我"="Me";
//repo view
"关注"="Watch";
"取消关注"="Unwatch";
"收藏"="Star";
"取消收藏"="Unstar";
"派生"="Fork";
"公开"="Public";
"私有"="Private";
"创建"="catated at";
//user view
"加入于"="Joined on";
"关注"="Follow";
"取消关注"="Unfollow";
/*****中文转英文 End******/
================================================
FILE: BeeFun/BeeFun/Resources/Localizable/zh-Hans.lproj/Localizable.strings
================================================
/*
Localizable.strings
BeeFun
Created by WengHengcong on 2017/3/13.
Copyright © 2017年 JungleSong. All rights reserved.
*/
/*****英文转中文 Start******/
//explore
"Explore" = "发现";
"Repositories" = "项目";
"Developers" = "用户";
"Showcases"="列表";
//filter
"Since"="时间";
"daily"="每天";
"weekly"="每周";
"monthly"="每月";
//search
"All" = "全部";
"Language"="语言";
"Country"="国家";
"Sort"="排序";
"Reset"="重置";
"Sure"="确认";
"Best match"="最优匹配";
"Most stars"="收藏最多";
"Fewest stars"="收藏最少";
"Most forks"="派生最多";
"Fewest forks"="派生最少";
"Recently updated"="更新最近";
"Leaest recently updated"="更新最少";
"Search repositories"="搜索项目";
"Search users"="搜索用户";
"Best match"="最优匹配";
"Most followers"="粉丝最多";
"Fewest followers"="粉丝最少";
"Most recently joined"="加入最新";
"Leaest recently joined"="加入最旧";
"Most repositories"="项目最多";
"Fewest repositories"="项目最少";
//Message
"Message" = "消息";
"Notifications"="通知";
"Issues"="讨论";
//Stars
"Stars" = "收藏";
"Event"="事件";
//Profile
"Profile" = "我";
"Sign in"="登录";
"Followers"="粉丝";
"Following"="关注";
"Watched"="关注";
"Feedback"="反馈";
"Settings"="设置";
"Share"="分享";
"Rate"="评价";
"About"="关于";
"Edit"="编辑";
//Settings
"Version"="版本";
"Log Out"="退出登录";
//About
//"About"="About";
"Me"="我";
//repo view
"Watch"="关注";
"Unwatch"="取消关注";
"Star"="收藏";
"Unstar"="取消收藏";
"Fork"="派生";
"Public"="公开";
"Private"="私有";
"catated at"="创建";
//user view
"Joined on"="加入于";
"Follow"="关注";
"Unfollow"="取消关注";
"Follower"="粉丝";
"Repositories"="项目";
"Following"="关注";
"Submit"="提交";
"Title can't be empty"="标题不能为空";
"bug? function?..."="bug,功能建议....";
//长文本
" BeeFun is a client for github.It is written in Swift language. Welcome more suggestions and reports of bugs come from everyone! Thanks." = " BeeFun ,是使用Swift语言编写的Github客户端。欢迎大家能提出更多的建议和反馈bugs。";
"registers the user to receive notifications on new discussions" = "用户关注后,可以接受新讨论的通知";
"lets users bookmark repositories."="用户可以收藏项目";
"A fork is a copy of a repository."="拷贝项目";
"Suggestions or report bugs"="建议或者提报Bugs";
"Could not send Email"="无法发送邮件";
"Your device could not send e-mail. Please check e-mail configuration and try again."="您的设备无法发送邮件,请检查【设置】中【邮件】设置,然后重试。";
"Immediately sync your star repositories from github.com in silence."="点击‘同步’按钮,将会及时同步您GitHub账户下Star repositories";
"Sync"="同步";
//提醒
"Share Success"="分享成功";
"Share Failure"="分享失败";
"Share Cancel"="取消分享";
"Please login first"="请先登录";
"No Data Found"="没有找到宝藏";
"Release to refresh"="松开刷新";
"Pull down to refresh"="下拉刷新";
"Load"="加载";
"Loading"="加载中";
"More"="更多";
"No More data"="😭没有更多数据啦";
"Network error /(ㄒoㄒ)/~~"="呀,网络正在开小差~";
"Sign in Now?" = "立刻登录?";
"access data ask github account"="访问这些数据,需要登录Github账户";
"Watch?"="是否关注";
"Unwatch?"="是否取消关注?";
"Unstar?"="是否取消收藏?";
"Star?"="是否收藏?";
"Fork?"="是否派生?";
"Watch Success"="关注成功";
"Unwatch Success"="取消关注";
"Star Success"="收藏成功";
"Unstar Success"="取消收藏";
"Fork Success"="派生成功";
"Follow Success"="关注成功";
"UnFollow Success"="取消关注";
//其他
"Unknown" = "未知";
"Success"="成功";
"created at"="创建于";
"Homepage"="主页";
"Cancel"="取消";
"Failure"="失败";
"Repository"="项目";
"Tags"="标签";
"All Tags"="所有标签";
"Save"="保存";
"Save Tags?"="保存本次编辑";
"Add new tag"="新建标签";
"input new tag name"="输入新标签名字";
"input tag"="输入标签";
"Already exists!"="已经存在!";
"No tag to save"="无须保存";
"Demo" = "示例";
"Edit"="编辑";
"Trash"="删除";
"OK"="好的";
"make a change"="换个新名字试试";
"Lists"="列表";
//其他
"Owner"="用户";
"Join"="加入";
"Location"="位置";
"Company"="公司";
"Name"="用户名";
"Email"="邮箱";
"Blog"="博客";
"Hireable"="在职";
"Bio"="简介";
"Trash it will remove this tag from star repositories!"="删除后,将从所有star项目中移除该tag";
"Sync start"="同步开始";
"Sync end"="同步完成";
"Delete"="删除";
//搜索
"Historical records" = "历史记录";
"Clear All Records" = "清除所有记录";
"Search repositories、users..." = "搜索项目、用户...";
"Clear all history records?" = "是否删除所有历史记录?";
"Forks" = "派生";
"Updated" = "更新";
"Users"="用户";
"Search"="搜索";
"Joined"="加入";
"Comments"="评论";
"Created"="创建";
"Repo"="项目";
"Foll"="粉丝";
"Comm"="评论";
"Join"="加入";
"Creat"="创建";
//分享
"It's A Wonderful Repository from github! Hurry UP!" = "这么棒的项目,赶紧来看看!";
"from BeeFun App"="来源BeeFun App";
"Download Here"="点击下载";
"A Talented Developer"="一位天才开发者";
"BeeFun,excellent Github client. Download here: http://t.cn/RinAeZq \n Office website: http://www.beefun.top" = "BeeFun,优秀的Github客户端。 下载: http://t.cn/RinAeZq \n 官网: http://www.beefun.top";
"Update Failure" = "更新失败";
"'All' is default,change one."="'All'是默认tag,换一个吧";
"Try Again"="重新加载";
"Wake up your connection!" = "网络走丢了,快去找回来!";
"Empty now"="暂无数据,去添加吧!";
"Go"="Go";
"Explore more"="探索更多";
"Empty now,star repositories and tag it"="没有数据,去收藏标记项目吧!";
/*****英文转中文 End******/
/*****中文转英文 Start******/
//explore
"发现" = "发现";
"项目" = "项目";
"用户" = "用户";
"列表"="列表";
//filter
"时间"="时间";
"每天"="每天";
"每周"="每周";
"每月"="每月";
"全部"="全部";
//country
"中国"="中国";
"美国"="美国";
"印度"="印度";
"日本"="日本";
"韩国"="韩国";
"巴西"="巴西";
"德国"="德国";
"俄罗斯"="俄罗斯";
"英国"="英国";
"法国"="法国";
"西班牙"="西班牙";
"加拿大"="加拿大";
"新加坡"="新加坡";
"荷兰"="荷兰";
"意大利"="意大利";
"瑞士"="瑞士";
"澳大利亚"="澳大利亚";
//City
"北京"="北京";
"上海"="上海";
"深圳"="深圳";
"杭州"="杭州";
"广州"="广州";
"成都"="成都";
"南昌"="南昌";
//search
"全部"="全部";
"语言"="语言";
"国家"="国家";
"排序"="排序";
"重置"="重置";
"确认"="确认";
"最优匹配"="最优匹配";
"收藏最多"="收藏最多";
"收藏最少"="收藏最少";
"派生最多"="派生最多";
"派生最少"="派生最少";
"更新最近"="更新最近";
"更新最少"="更新最少";
"搜索项目"="搜索项目";
"搜索用户"="搜索用户";
"最优匹配"="最优匹配";
"粉丝最多"="粉丝最多";
"粉丝最少"="粉丝最少";
"加入最新"="加入最新";
"加入最旧"="加入最旧";
"项目最多"="项目最多";
"项目最少"="项目最少";
//Message
"消息" = "消息";
"通知"="通知";
"讨论"="讨论";
//Stars
"收藏" = "收藏";
"项目"="项目";
"事件"="事件";
//Profile
"我" = "我";
"登录"="登录";
"粉丝"="粉丝";
"关注"="关注";
"关注项目"="关注项目";
"反馈"="反馈";
"设置"="设置";
"分享"="分享";
"评价"="评价";
"关于"="关于";
//Settings
"版本"="版本";
"退出登录"="退出登录";
//About
//"About"="About";
"我"="我";
//repo view
"关注"="关注";
"取消关注"="取消关注";
"收藏"="收藏";
"取消收藏"="取消收藏";
"派生"="派生";
"公开"="公开";
"私有"="私有";
"创建"="创建";
//user view
"加入于"="加入于";
"关注"="关注";
"取消关注"="取消关注";
/*****中文转英文 End******/
================================================
FILE: BeeFun/BeeFun/Resources/plist/en.lproj/BFLanguage.plist
================================================
All
1C Enterprise
ABAP
ABNF
ActionScript
Ada
Agda
AGS Script
Alloy
Alpine Abuild
AMPL
Ant Build System
ANTLR
ApacheConf
Apex
API Blueprint
APL
Apollo Guidance Computer
AppleScript
Arc
Arduino
AsciiDoc
ASN.1
ASP
AspectJ
Assembly
ATS
Augeas
AutoHotkey
AutoIt
Awk
Batchfile
Befunge
Bison
BitBake
Blade
BlitzBasic
BlitzMax
Bluespec
Boo
Brainfuck
Brightscript
Bro
C
C#
C++
C-ObjDump
C2hs Haskell
Cap'n Proto
CartoCSS
Ceylon
Chapel
Charity
ChucK
Cirru
Clarion
Clean
Click
CLIPS
Clojure
Closure Templates
CMake
COBOL
CoffeeScript
ColdFusion
ColdFusion CFC
COLLADA
Common Lisp
Component Pascal
Cool
Coq
Cpp-ObjDump
Creole
Crystal
CSON
Csound
Csound Document
Csound Score
CSS
CSV
Gherkin
Cuda
CWeb
Cycript
Cython
D
D-ObjDump
Darcs Patch
Dart
desktop
Diff
DIGITAL Command Language
DM
DNS Zone
Dockerfile
Dogescript
DTrace
Dylan
E
Eagle
EBNF
eC
Ecere Projects
ECL
ECLiPSe
edn
Eiffel
EJS
Elixir
Elm
Emacs Lisp
EmberScript
EQ
Erlang
F#
Factor
Fancy
Fantom
Filebench WML
Filterscript
fish
FLUX
Formatted
Forth
Fortran
FreeMarker
Frege
G-code
Game Maker Language
GAMS
GAP
GCC Machine Description
GDB
GDScript
Genie
Genshi
Gentoo Ebuild
Gentoo Eclass
Gettext Catalog
Gherkin
GLSL
Glyph
GN
Gnuplot
Go
Golo
Gosu
Grace
Gradle
Grammatical Framework
Graph Modeling Language
GraphQL
Graphviz (DOT)
Groovy
Groovy Server Pages
Hack
Haml
Handlebars
Harbour
Haskell
Haxe
HCL
HLSL
HTML
HTML+Django
HTML+ECR
HTML+EEX
HTML+ERB
HTML+PHP
HTTP
Hy
HyPhy
IDL
Idris
IGOR Pro
Inform 7
INI
Inno Setup
Io
Ioke
IRC log
Isabelle
Isabelle ROOT
J
Jasmin
Java
Java Server Pages
JavaScript
JFlex
Jison
Jison Lex
Jolie
JSON
JSON5
JSONiq
JSONLD
JSX
Julia
Jupyter Notebook
KiCad
Kit
Kotlin
KRL
LabVIEW
Lasso
Latte
Lean
Less
Lex
LFE
LilyPond
Limbo
Linker Script
Linux Kernel Module
Liquid
Literate Agda
Literate CoffeeScript
Literate Haskell
LiveScript
LLVM
Logos
Logtalk
LOLCODE
LookML
LoomScript
LSL
Lua
M
M4
M4Sugar
Makefile
Mako
Markdown
Marko
Mask
Mathematica
Matlab
Maven POM
Max
MAXScript
MediaWiki
Mercury
Meson
Metal
MiniD
Mirah
Modelica
Modula-2
Module Management System
Monkey
Moocode
MoonScript
MQL4
MQL5
MTML
MUF
mupad
Myghty
NCL
Nemerle
nesC
NetLinx
NetLinx+ERB
NetLogo
NewLisp
Nginx
Nim
Ninja
Nit
Nix
NL
NSIS
Nu
NumPy
ObjDump
Objective-C
Objective-C++
Objective-J
OCaml
Omgrofl
ooc
Opa
Opal
OpenCL
OpenEdge ABL
OpenRC runscript
OpenSCAD
OpenType Feature File
Org
Ox
Oxygene
Oz
P4
Pan
Papyrus
Parrot
Parrot Assembly
Parrot Internal Representation
Pascal
PAWN
Pep8
Perl
Perl6
PHP
Pic
Pickle
PicoLisp
PigLatin
Pike
PLpgSQL
PLSQL
Pod
PogoScript
Pony
PostScript
POV-Ray SDL
PowerBuilder
PowerShell
Processing
Prolog
Propeller Spin
Protocol Buffer
Public Key
Pug
Puppet
Pure Data
PureBasic
PureScript
Python
Python console
Python traceback
QMake
QML
R
Racket
Ragel
RAML
Rascal
Raw token data
RDoc
REALbasic
Reason
Rebol
Red
Redcode
Regular Expression
Ren'Py
RenderScript
reStructuredText
REXX
RHTML
RMarkdown
RobotFramework
Roff
Rouge
RPM Spec
Ruby
RUNOFF
Rust
Sage
SaltStack
SAS
Sass
Scala
Scaml
Scheme
Scilab
SCSS
Self
ShaderLab
Shell
ShellSession
Shen
Slash
Slim
Smali
Smalltalk
Smarty
SMT
SourcePawn
SPARQL
Spline Font Database
SQF
SQL
SQLPL
Squirrel
SRecode Template
Stan
Standard ML
Stata
STON
Stylus
Sublime Text Config
SubRip Text
SuperCollider
SVG
Swift
SystemVerilog
Tcl
Tcsh
Tea
Terra
TeX
Text
Textile
Thrift
TI Program
TLA
TOML
Turing
Turtle
Twig
TXL
TypeScript
Unified Parallel C
Unity3D Asset
Unix Assembly
Uno
UnrealScript
UrWeb
Vala
VCL
Verilog
VHDL
Vim script
Vim script
Visual Basic
Volt
Vue
Wavefront Material
Wavefront Object
Web Ontology Language
WebIDL
wisp
World of Warcraft Addon Data
X10
xBase
XC
XCompose
XML
Xojo
XPages
XProc
XQuery
XS
XSLT
Xtend
Yacc
YAML
YANG
Zephir
Zimpl
================================================
FILE: BeeFun/BeeFun/Resources/plist/en.lproj/BFPopularLanguage.plist
================================================
ActionScript
C
C#
C++
Clojure
CoffeeScript
CSS
Go
Haskell
HTML
Java
JavaScript
Lua
Matlab
Objective-C
Perl
PHP
Python
R
Ruby
Scala
Shell
Swift
TeX
Vim script
================================================
FILE: BeeFun/BeeFun/Resources/plist/en.lproj/BFSetting.plist
================================================
type
label
id
version
key
Version
value
1.0
disclosure
type
label
id
language
key
Language
value
Change to Chinese
type
label
id
rate
key
Rate
disclosure
type
label
id
about
key
About
disclosure
================================================
FILE: BeeFun/BeeFun/Resources/plist/en.lproj/CPCity.plist
================================================
All
Beijing
Shanghai
Shenzhen
Hangzhou
Guangzhou
Chengdu
NanChang
================================================
FILE: BeeFun/BeeFun/Resources/plist/en.lproj/CPCountry.plist
================================================
All
China
USA
India
Japan
Korea
Brazil
Germany
Russia
UK
France
Spain
Canada
Singapore
Netherlands
Italy
Switzerland
Australia
================================================
FILE: BeeFun/BeeFun/Resources/plist/en.lproj/CPFilterLanguage.plist
================================================
All
Java
C
C++
C#
PHP
Python
Javascript
Swift
Kotlin
Perl
Ruby
Assembly language
Objective-C
Objective-C++
CSS
HTML
R
Go
PLSQL
MATLAB
SQL
SQLPL
Pascal
Assembly
Visual Basic
Rust
D
Bash
ASP
COBOL
ABAP
SAS
Scratch
Dart
Fortran
Lisp
Ada
Lua
Scala
Logo
Prolog
F#
Haskell
Clojure
LabVIEW
CoffeeScript
Hack
Rust
Apex
Scheme
Awk
Erlang
MQL4
Groovy
================================================
FILE: BeeFun/BeeFun/Resources/plist/zh-Hans.lproj/BFLanguage.plist
================================================
All
1C Enterprise
ABAP
ABNF
ActionScript
Ada
Agda
AGS Script
Alloy
Alpine Abuild
AMPL
Ant Build System
ANTLR
ApacheConf
Apex
API Blueprint
APL
Apollo Guidance Computer
AppleScript
Arc
Arduino
AsciiDoc
ASN.1
ASP
AspectJ
Assembly
ATS
Augeas
AutoHotkey
AutoIt
Awk
Batchfile
Befunge
Bison
BitBake
Blade
BlitzBasic
BlitzMax
Bluespec
Boo
Brainfuck
Brightscript
Bro
C
C#
C++
C-ObjDump
C2hs Haskell
Cap'n Proto
CartoCSS
Ceylon
Chapel
Charity
ChucK
Cirru
Clarion
Clean
Click
CLIPS
Clojure
Closure Templates
CMake
COBOL
CoffeeScript
ColdFusion
ColdFusion CFC
COLLADA
Common Lisp
Component Pascal
Cool
Coq
Cpp-ObjDump
Creole
Crystal
CSON
Csound
Csound Document
Csound Score
CSS
CSV
Gherkin
Cuda
CWeb
Cycript
Cython
D
D-ObjDump
Darcs Patch
Dart
desktop
Diff
DIGITAL Command Language
DM
DNS Zone
Dockerfile
Dogescript
DTrace
Dylan
E
Eagle
EBNF
eC
Ecere Projects
ECL
ECLiPSe
edn
Eiffel
EJS
Elixir
Elm
Emacs Lisp
EmberScript
EQ
Erlang
F#
Factor
Fancy
Fantom
Filebench WML
Filterscript
fish
FLUX
Formatted
Forth
Fortran
FreeMarker
Frege
G-code
Game Maker Language
GAMS
GAP
GCC Machine Description
GDB
GDScript
Genie
Genshi
Gentoo Ebuild
Gentoo Eclass
Gettext Catalog
Gherkin
GLSL
Glyph
GN
Gnuplot
Go
Golo
Gosu
Grace
Gradle
Grammatical Framework
Graph Modeling Language
GraphQL
Graphviz (DOT)
Groovy
Groovy Server Pages
Hack
Haml
Handlebars
Harbour
Haskell
Haxe
HCL
HLSL
HTML
HTML+Django
HTML+ECR
HTML+EEX
HTML+ERB
HTML+PHP
HTTP
Hy
HyPhy
IDL
Idris
IGOR Pro
Inform 7
INI
Inno Setup
Io
Ioke
IRC log
Isabelle
Isabelle ROOT
J
Jasmin
Java
Java Server Pages
JavaScript
JFlex
Jison
Jison Lex
Jolie
JSON
JSON5
JSONiq
JSONLD
JSX
Julia
Jupyter Notebook
KiCad
Kit
Kotlin
KRL
LabVIEW
Lasso
Latte
Lean
Less
Lex
LFE
LilyPond
Limbo
Linker Script
Linux Kernel Module
Liquid
Literate Agda
Literate CoffeeScript
Literate Haskell
LiveScript
LLVM
Logos
Logtalk
LOLCODE
LookML
LoomScript
LSL
Lua
M
M4
M4Sugar
Makefile
Mako
Markdown
Marko
Mask
Mathematica
Matlab
Maven POM
Max
MAXScript
MediaWiki
Mercury
Meson
Metal
MiniD
Mirah
Modelica
Modula-2
Module Management System
Monkey
Moocode
MoonScript
MQL4
MQL5
MTML
MUF
mupad
Myghty
NCL
Nemerle
nesC
NetLinx
NetLinx+ERB
NetLogo
NewLisp
Nginx
Nim
Ninja
Nit
Nix
NL
NSIS
Nu
NumPy
ObjDump
Objective-C
Objective-C++
Objective-J
OCaml
Omgrofl
ooc
Opa
Opal
OpenCL
OpenEdge ABL
OpenRC runscript
OpenSCAD
OpenType Feature File
Org
Ox
Oxygene
Oz
P4
Pan
Papyrus
Parrot
Parrot Assembly
Parrot Internal Representation
Pascal
PAWN
Pep8
Perl
Perl6
PHP
Pic
Pickle
PicoLisp
PigLatin
Pike
PLpgSQL
PLSQL
Pod
PogoScript
Pony
PostScript
POV-Ray SDL
PowerBuilder
PowerShell
Processing
Prolog
Propeller Spin
Protocol Buffer
Public Key
Pug
Puppet
Pure Data
PureBasic
PureScript
Python
Python console
Python traceback
QMake
QML
R
Racket
Ragel
RAML
Rascal
Raw token data
RDoc
REALbasic
Reason
Rebol
Red
Redcode
Regular Expression
Ren'Py
RenderScript
reStructuredText
REXX
RHTML
RMarkdown
RobotFramework
Roff
Rouge
RPM Spec
Ruby
RUNOFF
Rust
Sage
SaltStack
SAS
Sass
Scala
Scaml
Scheme
Scilab
SCSS
Self
ShaderLab
Shell
ShellSession
Shen
Slash
Slim
Smali
Smalltalk
Smarty
SMT
SourcePawn
SPARQL
Spline Font Database
SQF
SQL
SQLPL
Squirrel
SRecode Template
Stan
Standard ML
Stata
STON
Stylus
Sublime Text Config
SubRip Text
SuperCollider
SVG
Swift
SystemVerilog
Tcl
Tcsh
Tea
Terra
TeX
Text
Textile
Thrift
TI Program
TLA
TOML
Turing
Turtle
Twig
TXL
TypeScript
Unified Parallel C
Unity3D Asset
Unix Assembly
Uno
UnrealScript
UrWeb
Vala
VCL
Verilog
VHDL
Vim script
Vim script
Visual Basic
Volt
Vue
Wavefront Material
Wavefront Object
Web Ontology Language
WebIDL
wisp
World of Warcraft Addon Data
X10
xBase
XC
XCompose
XML
Xojo
XPages
XProc
XQuery
XS
XSLT
Xtend
Yacc
YAML
YANG
Zephir
Zimpl
================================================
FILE: BeeFun/BeeFun/Resources/plist/zh-Hans.lproj/BFPopularLanguage.plist
================================================
ActionScript
C
C#
C++
Clojure
CoffeeScript
CSS
Go
Haskell
HTML
Java
JavaScript
Lua
Matlab
Objective-C
Perl
PHP
Python
R
Ruby
Scala
Shell
Swift
TeX
Vim script
================================================
FILE: BeeFun/BeeFun/Resources/plist/zh-Hans.lproj/BFSetting.plist
================================================
type
label
id
version
key
版本
value
1.0
disclosure
type
label
id
language
key
语言
value
切换到英语
type
label
id
rate
key
评价
disclosure
type
label
id
about
key
关于
disclosure
================================================
FILE: BeeFun/BeeFun/Resources/plist/zh-Hans.lproj/CPCity.plist
================================================
全部
北京
上海
深圳
杭州
广州
成都
南昌
================================================
FILE: BeeFun/BeeFun/Resources/plist/zh-Hans.lproj/CPCountry.plist
================================================
全部
中国
美国
印度
日本
韩国
巴西
德国
俄罗斯
英国
法国
西班牙
加拿大
新加坡
荷兰
意大利
瑞士
澳大利亚
================================================
FILE: BeeFun/BeeFun/Resources/plist/zh-Hans.lproj/CPFilterLanguage.plist
================================================
All
Java
C
C++
C#
PHP
Python
Javascript
Swift
Kotlin
Perl
Ruby
Assembly language
Objective-C
Objective-C++
CSS
HTML
R
Go
PLSQL
MATLAB
SQL
SQLPL
Pascal
Assembly
Visual Basic
Rust
D
Bash
ASP
COBOL
ABAP
SAS
Scratch
Dart
Fortran
Lisp
Ada
Lua
Scala
Logo
Prolog
F#
Haskell
Clojure
LabVIEW
CoffeeScript
Hack
Rust
Apex
Scheme
Awk
Erlang
MQL4
Groovy
================================================
FILE: BeeFun/BeeFun/SystemManager/Manager/Oauth/OAuthGithubWebController.swift
================================================
//
// OAuthWebViewController.swift
// BeeFun
//
// Created by WengHengcong on 2018/1/24.
// Copyright © 2018年 LuCi. All rights reserved.
//
import OAuthSwift
import WebKit
import MBProgressHUD
typealias WebView = WKWebView
class OAuthGithubWebController: OAuthWebViewController {
var targetURL: URL?
let webView: WebView = WebView()
var progressHud: MBProgressHUD = MBProgressHUD()
override func viewDidLoad() {
super.viewDidLoad()
self.title = "Sign in to GitHub"
configWebView()
configHudView()
}
func configWebView() {
self.webView.frame = UIScreen.main.bounds
self.webView.navigationDelegate = self
self.hidesBottomBarWhenPushed = true
self.view.addSubview(self.webView)
self.webView.addObserver(self, forKeyPath: "estimatedProgress", options: .new, context: nil)
}
func configHudView() {
progressHud = MBProgressHUD.init(view: self.view)
progressHud.mode = .determinate
progressHud.delegate = self
progressHud.removeFromSuperViewOnHide = true
progressHud.label.text = "On the way..."
}
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if (keyPath == "estimatedProgress") {
progressHud.progress = Float(webView.estimatedProgress)
if webView.estimatedProgress >= 0.7 {
let _ : Void = {
hideHud()
}()
}
}
}
override func handle(_ url: URL) {
targetURL = url
super.handle(url)
self.loadAddressURL()
}
func loadAddressURL() {
guard let url = targetURL else {
return
}
let req = URLRequest(url: url)
showHud()
self.webView.load(req)
}
func showHud() {
progressHud.show(animated: true)
self.view.addSubview(progressHud)
}
func hideHud() {
progressHud.hide(animated: true)
}
}
extension OAuthGithubWebController: WKNavigationDelegate {
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
// here we handle internally the callback url and call method that call handleOpenURL (not app scheme used)
if let url = navigationAction.request.url, url.scheme == "beefunios" {
AppDelegate.sharedInstance.applicationHandle(url: url)
decisionHandler(.cancel)
return
}
decisionHandler(.allow)
}
func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
print("\(error)")
self.dismissWebViewController()
// maybe cancel request...
}
}
extension OAuthGithubWebController: MBProgressHUDDelegate {
func hudWasHidden(_ hud: MBProgressHUD) {
progressHud.removeFromSuperview()
}
}
================================================
FILE: BeeFun/BeeFun/SystemManager/Manager/Oauth/OAuthManager.swift
================================================
//
// OAuthManager.swift
// BeeFunMac
//
// Created by WengHengcong on 2018/1/24.
// Copyright © 2018年 LuCi. All rights reserved.
//
import OAuthSwift
import ObjectMapper
import Alamofire
class OAuthManager: NSObject {
static let shared = OAuthManager()
var oauthswift: OAuthSwift?
lazy var internalWebViewController: OAuthGithubWebController = {
let controller = OAuthGithubWebController()
controller.delegate = self
controller.viewDidLoad() // allow WebViewController to use this ViewController as parent to be presented
return controller
}()
// MARK: - Github Oauth and save Token
func beginOauth() {
BFNetworkManager.clearCache()
BFNetworkManager.clearCookies()
//全局通知:将要登录
NotificationCenter.default.post(name: NSNotification.Name.BeeFun.WillLogout, object: nil)
let oauthswift = OAuth2Swift(
consumerKey: GithubAppClientId,
consumerSecret: GithubAppClientSecret,
authorizeUrl: "https://github.com/login/oauth/authorize",
accessTokenUrl: "https://github.com/login/oauth/access_token",
responseType: "code"
)
self.oauthswift = oauthswift
oauthswift.authorizeURLHandler = getURLHandler(external: false)
let state = generateState(withLength: 20)
_ = oauthswift.authorize(withCallbackURL: nil, scope: GithubAppScope, state: state, completionHandler: { ( result ) in
switch result {
case .success(let (credential, _, parameters)):
print(credential.oauthToken)
if credential != nil && parameters != nil && parameters.keys.count > 0 {
NotificationCenter.default.post(name: NSNotification.Name.BeeFun.GetOAuthToken, object: nil)
self.saveOauthToken(credential: credential, parameters: parameters)
}
// Do your request
case .failure(let error):
print(error.localizedDescription)
}
})
}
func getURLHandler(external: Bool) -> OAuthSwiftURLHandlerType {
if external {
return OAuthSwiftOpenURLExternally.sharedInstance
} else {
if internalWebViewController.parent == nil {
BFTabbarManager.shared.jsTopViewController()?.addChild(internalWebViewController)
}
return internalWebViewController
}
}
func saveOauthToken(credential: OAuthSwiftCredential, parameters: [String: Any]) {
let token = AppToken.shared
token.access_token = String(format: "token %@", credential.oauthToken)
if let token_type: String = parameters["token_type"] as? String {
token.token_type = token_type
}
if let token_scope: String = parameters["scope"] as? String {
token.scope = token_scope
}
if let token_expireDate: Date = credential.oauthTokenExpiresAt {
token.token_expire_date = token_expireDate
}
print(credential.oauthToken)
self.getUserinfo(token.access_token!)
}
// MARK: - 获取个人信息
private func getUserinfo(_ token: String) {
self.internalWebViewController.showHud()
let provider = Provider.sharedProvider
provider.request(.myInfo) { (result) -> Void in
switch result {
case let .success(response):
do {
if let gitUser: ObjUser = Mapper().map(JSONObject: try response.mapJSON()) {
ObjUser.saveUserInfo(gitUser)
//全局通知:已经登录
self.internalWebViewController.hideHud()
self.didLogin()
} else {
}
} catch {
}
case .failure:
break
}
}
}
private func didLogin() {
NotificationCenter.default.post(name: NSNotification.Name.BeeFun.DidLogin, object: nil)
NotificationCenter.default.post(name: NSNotification.Name.BeeFun.GetUserInfo, object: nil)
BFTabbarManager.shared.jsTopNavigationViewController()?.popViewController(animated: true)
UserManager.shared.updateUserInfo()
}
}
// MARK: - OAuthWebViewControllerDelegate
extension OAuthManager: OAuthWebViewControllerDelegate {
func oauthWebViewControllerDidPresent() {
}
func oauthWebViewControllerDidDismiss() {
}
func oauthWebViewControllerWillAppear() {
}
func oauthWebViewControllerDidAppear() {
}
func oauthWebViewControllerWillDisappear() {
}
func oauthWebViewControllerDidDisappear() {
// Ensure all listeners are removed if presented web view close
oauthswift?.cancel()
}
}
================================================
FILE: BeeFun/BeeFun/SystemManager/Manager/Push/BFMessageManager.swift
================================================
//
// BFMessageManager.swift
// BeeFun
//
// Created by 翁恒丛 on 2018/6/19.
// Copyright © 2018年 JungleSong. All rights reserved.
//
import UIKit
import UserNotifications
enum PushMessageService: String {
case m
case versionUpgrade
}
class BFMessageManager: NSObject {
static let serviceTypeKey = "serviceType"
static let landpageUrl = "landpageUrl"
// MARK: - iOS 10以下推送处理
/// 处理本地推送
static func receiveLocalNotificaion(notification: UILocalNotification) {
if let userinfo = notification.userInfo {
handleLocalNotification(userInfo: userinfo)
}
}
/// 处理远程推送
static func receiveRemoteNotification(userInfo: [AnyHashable: Any]) {
handleRemoteNotification(userInfo: userInfo)
}
// MARK: - iOS 10推送处理
@available(iOS 10.0, *)
/// 处理远程推送
static func receiveResponse(response: UNNotificationResponse) {
if let userinfo = JPushManager.shared.userinfoWithUNNotification(notification: response),
let trigger = response.notification.request.trigger {
if trigger.isKind(of: UNPushNotificationTrigger.self) {
handleRemoteNotification(userInfo: userinfo)
} else {
handleLocalNotification(userInfo: userinfo)
}
}
}
@available(iOS 10.0, *)
/// 前台处理远程推送
static func receiveNotification(notification: UNNotification) {
if let userinfo = JPushManager.shared.userinfoWithUNNotification(notification: notification),
let trigger = notification.request.trigger {
if trigger.isKind(of: UNPushNotificationTrigger.self) {
appActiveHandleRemoteNotification(userInfo: userinfo)
} else {
appActiveHandleLocalNotification(userInfo: userinfo)
}
}
}
// MARK: - 远程推送
/// 后台处理远程推送
private static func handleRemoteNotification(userInfo: [AnyHashable: Any]) {
JPUSHService.handleRemoteNotification(userInfo)
if UIApplication.shared.applicationState == .inactive {
appInactiveHandleRemoteNotification(userInfo: userInfo)
} else {
appActiveHandleRemoteNotification(userInfo: userInfo)
}
}
/// 后台处理远程推送
private static func appInactiveHandleRemoteNotification(userInfo: [AnyHashable: Any]) {
if let serviceType: String = userInfo[serviceTypeKey] as? String {
let type: PushMessageService = PushMessageService(rawValue: serviceType)!
switch type {
case .m:
if let url = userInfo["landpageUrl"] as? String {
JumpManager.shared.jumpWebView(url: url)
}
default:
break
}
}
}
/// 前台处理远程推送
private static func appActiveHandleRemoteNotification(userInfo: [AnyHashable: Any]) {
}
// MARK: - 本地推送
/// 处理本地推送
private static func handleLocalNotification(userInfo: [AnyHashable: Any]) {
if UIApplication.shared.applicationState == .inactive {
appInactiveHandleLocalNotification(userInfo: userInfo)
} else {
appActiveHandleLocalNotification(userInfo: userInfo)
}
}
/// 后台处理本地推送
private static func appInactiveHandleLocalNotification(userInfo: [AnyHashable: Any]) {
if let serviceType: String = userInfo["serviceType"] as? String {
let type: PushMessageService = PushMessageService(rawValue: serviceType)!
switch type {
case .m:
break
default:
break
}
}
}
/// 前台处理本地推送
private static func appActiveHandleLocalNotification(userInfo: [AnyHashable: Any]) {
}
/// 是否是静默推送
static func isSlientPush(userInfo: [AnyHashable: Any]) -> Bool {
if userInfo.keys.count == 0 {
return false
}
if let aps = userInfo["aps"] as? [AnyHashable: Any] {
if let avaiable = aps["content-available"] as? NSNumber {
if avaiable.intValue == 1 {
return true
}
}
} else {
return false
}
return false
}
}
================================================
FILE: BeeFun/BeeFun/SystemManager/Manager/Push/JPushManager.swift
================================================
//
// JPushManager.swift
// BeeFun
//
// Created by WengHengcong on 2018/6/9.
// Copyright © 2018年 JungleSong. All rights reserved.
//
import UIKit
import UserNotifications
class JPushManager: NSObject {
static let shared = JPushManager()
//Check list: 上线打开推送开关
var apsProduction: Bool = true
override init() {
super.init()
}
convenience init(launchOptions: [UIApplication.LaunchOptionsKey: Any]?) {
self.init()
NotificationCenter.default.addObserver(self, selector: #selector(setAlias), name: NSNotification.Name.BeeFun.DidLogin, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(deleteAlias), name: NSNotification.Name.BeeFun.DidLogout, object: nil)
register(launchOptions: launchOptions)
}
func register(launchOptions: [UIApplication.LaunchOptionsKey: Any]?) {
JPUSHService.setup(withOption: launchOptions, appKey: JPushAppKey, channel: JPushChannel, apsForProduction: apsProduction)
let pushConfig = JPUSHRegisterEntity.init()
let pushSwitch = (UIUserNotificationType.badge.rawValue|UIUserNotificationType.sound.rawValue|UIUserNotificationType.alert.rawValue)
pushConfig.types = Int(pushSwitch)
JPUSHService.register(forRemoteNotificationConfig: pushConfig, delegate: nil)
}
func checkAlias() {
if UserManager.shared.isLogin {
UserManager.shared.updateUserInfo()
setAlias()
} else {
deleteAlias()
}
}
@objc private func setAlias() {
if let userlogin = UserManager.shared.login {
JPUSHService.setAlias(userlogin, completion: { (_, _, _) in
}, seq: 0)
}
}
@objc private func deleteAlias() {
JPUSHService.deleteAlias({ (_, _, _) in
}, seq: 0)
}
// 取出通知中对应的Userinfo
func userinfoWithUNNotification(notification: AnyObject) -> [AnyHashable: Any]? {
if #available(iOS 10.0, *) {
if notification.isKind(of: UNNotification.self) {
if let noti: UNNotification = notification as? UNNotification {
return noti.request.content.userInfo
}
} else if notification.isKind(of: UNNotificationResponse.self) {
if let noti: UNNotificationResponse = notification as? UNNotificationResponse {
return noti.notification.request.content.userInfo
}
}
return nil
}
return nil
}
}
================================================
FILE: BeeFun/BeeFun/SystemManager/Manager/ThirdParty/AnswerManager.swift
================================================
//
// AnswerManager.swift
// BeeFun
//
// Created by WengHengcong on 2017/4/13.
// Copyright © 2017年 JungleSong. All rights reserved.
//
import UIKit
import Crashlytics
enum ContentViewType: String {
case pv = "pv" //用于页面willappear统计该页面的pv
case uv = "uv" //用于页面didload中统计该页面的uv
case tm = "time" //用于页面小时disappear中统计该页面的时长
case web = "webview" //用于统计网页
}
enum UserActionType: String {
case follow
case unfollow
case star
case unstar
case fork
case watch
case unwatch
}
class AnswerManager: NSObject {
/// 内容统计
///
/// - Parameters:
/// - name: 名称
/// - type: 类型
/// - id: 唯一标识
/// - attributes: 自定义字段
class func logContentView(name: String?, type: String?, id: String?, attributes: [String : Any]? = nil) {
Answers.logContentView(withName: name, contentType: type, contentId: id, customAttributes: attributes)
}
/// 登录统计
///
/// - Parameters:
/// - method: 登录方式:微信\QQ\FB\TW
/// - success: 登录结果
/// - attributes: 自定义字段
class func logLogin(method: String?, success: NSNumber?, attributes: [String : Any]? = nil) {
Answers.logLogin(withMethod: method, success: success, customAttributes: attributes)
}
/// 搜索统计
///
/// - Parameters:
/// - query: 搜索字符串
/// - attributes: 自定义字段
class func logSearch(query: String?, attributes: [String : Any]? = nil) {
Answers.logSearch(withQuery: query, customAttributes: attributes)
}
/// 分享统计
///
/// - Parameters:
/// - method: 分享途径
/// - name: 分享标题
/// - type: 分享类型:defalut、app、repository、user
/// - id: 分享唯一标识
/// - attributes: 自定义字段
class func logShare(method: String?, name: String?, type: String?, id: String?, attributes: [String : Any]? = nil) {
Answers.logShare(withMethod: method, contentName: name, contentType: type, contentId: id, customAttributes: attributes)
}
}
================================================
FILE: BeeFun/BeeFun/SystemManager/Manager/ThirdParty/KPIManager.swift
================================================
//
// KPIManager.swift
// BeeFun
//
// Created by WengHengcong on 2017/4/13.
// Copyright © 2017年 JungleSong. All rights reserved.
//
import UIKit
class KPIManager: NSObject {
static let shared = KPIManager()
override init() {
super.init()
}
}
================================================
FILE: BeeFun/BeeFun/SystemManager/Manager/ThirdParty/PayManager.swift
================================================
//
// PayManager.swift
// BeeFun
//
// Created by WengHengcong on 2017/3/30.
// Copyright © 2017年 JungleSong. All rights reserved.
//
import UIKit
class PayManager: NSObject {
class func aliPayMe() {
let aliURL = URL(string: kAliPayMe)!
if UIApplication.shared.canOpenURL(aliURL) {
UIApplication.shared.openURL(aliURL)
}
}
}
================================================
FILE: BeeFun/BeeFun/SystemManager/Manager/ThirdParty/PurchaseManager.swift
================================================
//
// PurchaseManager.swift
// BeeFun
//
// Created by WengHengcong on 2017/3/31.
// Copyright © 2017年 JungleSong. All rights reserved.
//
import UIKit
//import SwiftyStoreKit
enum PurchaseProduct: String {
case reward = "com.junglesong.coderpursue.1025"
}
class PurchaseManager: NSObject {
static let shared = PurchaseManager()
/*
func getInfo(_ purchase: PurchaseProduct) {
SwiftyStoreKit.retrieveProductsInfo([purchase.rawValue]) { result in
if let product = result.retrievedProducts.first {
let priceString = product.localizedPrice!
print("Product: \(product.localizedDescription), price: \(priceString)")
} else if let invalidProductId = result.invalidProductIDs.first {
} else {
print("Error: \(String(describing: result.error))")
}
}
}
func purchase(_ purchase: PurchaseProduct) {
SwiftyStoreKit.purchaseProduct(purchase.rawValue, atomically: true) { result in
if case .success(let product) = result {
// Deliver content from server, then:
if product.needsFinishTransaction {
SwiftyStoreKit.finishTransaction(product.transaction)
}
}
}
}
func verifyPurchase(_ purchase: PurchaseProduct) {
let appleValidator = AppleReceiptValidator(service: .production)
SwiftyStoreKit.verifyReceipt(using: appleValidator, password: "your-shared-secret") { result in
switch result {
case .success(let receipt):
let productId = purchase.rawValue
switch purchase {
case .reward:
break
default:
let purchaseResult = SwiftyStoreKit.verifyPurchase(
productId: productId,
inReceipt: receipt
)
}
case .error(let error):
if case .noReceiptData = error {
}
}
}
}
*/
}
================================================
FILE: BeeFun/BeeFun/SystemManager/Manager/ThirdParty/ShareManager.swift
================================================
//
// ShareManager.swift
// BeeFun
//
// Created by WengHengcong on 2017/3/10.
// Copyright © 2017年 JungleSong. All rights reserved.
//
import UIKit
//TODO:分享App 到微信收藏总是失败
/// 分享状态的代理
protocol shareResponseProtocol: class {
func didStateChange(state: SSDKResponseState, platform: SSDKPlatformType, userdata: [AnyHashable:Any]?, content: SSDKContentEntity?, error: Error?, end: Bool)
func didShareBegin(state: SSDKResponseState, platform: SSDKPlatformType, userdata: [AnyHashable:Any]?, content: SSDKContentEntity?, error: Error?, end: Bool)
func didShareSuccess(state: SSDKResponseState, platform: SSDKPlatformType, userdata: [AnyHashable:Any]?, content: SSDKContentEntity?, error: Error?, end: Bool)
func didShareFail(state: SSDKResponseState, platform: SSDKPlatformType, userdata: [AnyHashable:Any]?, content: SSDKContentEntity?, error: Error?, end: Bool)
func didShareCancel(state: SSDKResponseState, platform: SSDKPlatformType, userdata: [AnyHashable:Any]?, content: SSDKContentEntity?, error: Error?, end: Bool)
}
public enum ShareSource: String {
case defalult = "defalut"
case app = "app"
case repository = "repository"
case user = "user"
}
class ShareContent: NSObject {
var source: ShareSource = .defalult
/// 分享链接
var url: String? = ""
/// 分享链接
var URL: URL?
/// 分享标题
var title: String?
/// 分享内容
var content: String?
///分享图片
var image: AnyObject?
///分享图片数组
var images: [AnyObject]?
///分享内容类型
var contentType: SSDKContentType?
override init() {
super.init()
}
}
class ShareManager: NSObject {
static let shared = ShareManager()
/// 是否打开分享开关
/// Check list: 上线前check该开关
var enable: Bool = false
var shareContent: ShareContent? = ShareContent()
var shareInViewController: UIViewController?
weak var delegate: shareResponseProtocol?
var showPlatforms = [
SSDKPlatformType.typeSinaWeibo.rawValue, //微博
SSDKPlatformType.typeWechat.rawValue, //微信
SSDKPlatformType.typeTwitter.rawValue, //twitter
SSDKPlatformType.typeFacebook.rawValue, //facebook
//SSDKPlatformType.typeCopy.rawValue, //copy
//SSDKPlatformType.typeSMS.rawValue, //sms
SSDKPlatformType.typeQQ.rawValue, //QQ
SSDKPlatformType.subTypeQZone.rawValue, //QQ空间
SSDKPlatformType.subTypeQQFriend.rawValue, //QQ好友
SSDKPlatformType.subTypeWechatTimeline.rawValue, //微信朋友圈
SSDKPlatformType.subTypeWechatFav.rawValue //微信收藏
//new add
//SSDKPlatformType.typeYouDaoNote.rawValue,
//SSDKPlatformType.typeDingTalk.rawValue,
//SSDKPlatformType.typeLinkedIn.rawValue
]
// MARK: - 公共方法
/**
* 设置ShareSDK的appKey,如果尚未在ShareSDK官网注册过App,请移步到http://mob.com/login 登录后台进行应用注册
* 在将生成的AppKey传入到此方法中。
* 方法中的第二个第三个参数为需要连接社交平台SDK时触发,
* 在此事件中写入连接代码。第四个参数则为配置本地社交平台时触发,根据返回的平台类型来配置平台信息。
* 如果您使用的时服务端托管平台信息时,第二、四项参数可以传入nil,第三项参数则根据服务端托管平台来决定要连接的社交SDK。
*/
// MARK: 注册
/// 注册
func register() {
ShareSDK.registerActivePlatforms(showPlatforms, onImport: { (platform : SSDKPlatformType) in
// onImport 里的代码,需要连接社交平台SDK时触发
switch platform {
case .typeSinaWeibo:
ShareSDKConnector.connectWeibo(WeiboSDK.classForCoder())
case .typeWechat:
ShareSDKConnector.connectWeChat(WXApi.classForCoder())
case .typeQQ:
ShareSDKConnector.connectQQ(QQApiInterface.classForCoder(), tencentOAuthClass: TencentOAuth.classForCoder())
default:
break
}
}) { (platform: SSDKPlatformType, appInfo) in
switch platform {
case .typeSinaWeibo:
//设置新浪微博应用信息,其中authType设置为使用SSO+Web形式授权
appInfo?.ssdkSetupSinaWeibo(byAppKey:WeiboSDKAppKey, appSecret : WeiboSDKAppSecret, redirectUri :AppOfficeSite, authType : SSDKAuthTypeBoth)
case .typeWechat:
appInfo?.ssdkSetupWeChat(byAppId: WeiXinSDKAppID, appSecret: WeiXinSDKAppSecret)
case .typeFacebook:
//设置Facebook应用信息,其中authType设置为只用SSO形式授权
appInfo?.ssdkSetupFacebook(byApiKey: FackbookSDKAppID, appSecret: FackbookSDKAppSecret, authType: SSDKAuthTypeBoth)
case .typeTwitter:
//设置Twitter应用信息
appInfo?.ssdkSetupTwitter(byConsumerKey: TwitterSDKConsumerKey, consumerSecret : TwitterSDKConsumerSecret, redirectUri : AppOfficeSite)
case .typeQQ:
//设置QQ应用信息
appInfo?.ssdkSetupQQ(byAppId: TencentSDKAppID, appKey : TencentSDKAppKey, authType : SSDKAuthTypeBoth)
/*
case .typeLinkedIn:
//设置LinkedIn应用信息
appInfo?.ssdkSetupLinkedIn(byApiKey: LinkedInSDKAppID, secretKey: LinkedInSDKAppSecret, redirectUrl: SocailRedirectURL)
case .typeYouDaoNote:
//设置YouDaoNote应用信息
appInfo?.ssdkSetupYouDaoNote(byConsumerKey:YDNoteSDKConsumerKey, consumerSecret: YDNoteSDKConsumerSecret, oauthCallback: SocailRedirectURL)
case .typeDingTalk:
appInfo?.ssdkSetupDingTalk(byAppId: DingTalkSDKAppID)
*/
default:
break
}
}
}
// MARK: share方法
/// share方法
///
/// - Parameter content: 分享方法
func share(content: ShareContent) {
print((content.source))
shareContent = content
//1、创建分享参数(必要)
let shareParams = shareParamsWithDifferentPlatforms()
//2、分享视图的定制
SSUIShareActionSheetStyle.setShareActionSheetStyle(.simple)
//3、分享
ShareSDK.showShareActionSheet(BFTabbarManager.shared.jsTopView()!, items: showPlatforms, shareParams: shareParams) { (state, platform, userdata, entity: SSDKContentEntity?, error: Error?, end: Bool) in
let platformStr = String(describing:platform.rawValue)
let stateStr = String(describing:state.rawValue)
AnswerManager.logShare(method: platformStr, name: content.content, type: content.source.rawValue, id: content.title, attributes:["state": stateStr, "url": content.url ?? AppOfficeSite])
if let method = self.delegate?.didStateChange(state: platform: userdata: content: error: end:) {
method(state, platform, userdata, entity, error, end)
return
}
switch state {
case .begin:
print("开始分享")
if let method = self.delegate?.didShareBegin(state: platform: userdata: content: error: end:) {
method(state, platform, userdata, entity, error, end)
}
case SSDKResponseState.success:
print("分享成功")
JSMBHUDBridge.showSuccess("Share Success".localized)
if let method = self.delegate?.didShareSuccess(state: platform: userdata: content: error: end:) {
method(state, platform, userdata, entity, error, end)
}
case SSDKResponseState.fail:
print("授权失败,错误描述:\(String(describing: error))")
JSMBHUDBridge.showError("Share Failure".localized)
if let method = self.delegate?.didShareFail(state: platform: userdata: content: error: end:) {
method(state, platform, userdata, entity, error, end)
}
case SSDKResponseState.cancel:
print("操作取消")
// JSMBHUDBridge.showMessage("Share Cancel".localized, view: jsKeywindow!)
if let method = self.delegate?.didShareCancel(state: platform: userdata: content: error: end:) {
method(state, platform, userdata, entity, error, end)
}
case .beginUPLoad:
break
}
}
}
// MARK: 分享APP
/// 分享APP
func shareApp() {
let shareModel: ShareContent = ShareContent()
shareModel.url = SocialAppStore
shareModel.URL = URL(string: shareModel.url!)
shareModel.content = "BeeFun,excellent Github client. Download here: http://t.cn/RinAeZq \n Office website: http://www.beefun.top".cnLocalized
shareModel.title = "BeeFun Github for iOS"
shareModel.image = UIImage(named: "app_logo_90")
shareModel.contentType = .app
shareModel.source = .app
shareContent = shareModel
share(content: shareContent!)
}
// MARK: - 分享的参数
/// 分享的内容平台化定制
///
/// - Returns: <#return value description#>
func shareParamsWithDifferentPlatforms() -> NSMutableDictionary {
//处理好ShareContet中的属性
handleShareContet()
var text = shareContent?.content
let image = shareContent?.image
let images = shareContent?.images
let sURL = shareContent?.URL
let title = shareContent?.title
let contentType: SSDKContentType = (shareContent?.contentType)!
let shareParams: NSMutableDictionary = NSMutableDictionary()
shareParams.ssdkSetupShareParams(byText: text, images: images, url: sURL, title: title, type:.auto)
//微信
shareParams.ssdkSetupWeChatParams(byText: text, title: title, url: sURL, thumbImage: nil, image: image, musicFileURL: nil, extInfo: nil, fileData: nil, emoticonData: nil, sourceFileExtension: nil, sourceFileData: nil, type: contentType, forPlatformSubType: .subTypeWechatSession)
shareParams.ssdkSetupWeChatParams(byText: text, title: title, url: sURL, thumbImage: nil, image: image, musicFileURL: nil, extInfo: nil, fileData: nil, emoticonData: nil, sourceFileExtension: nil, sourceFileData: nil, type: contentType, forPlatformSubType: .subTypeWechatFav)
shareParams.ssdkSetupWeChatParams(byText: text, title: title, url: sURL, thumbImage: nil, image: image, musicFileURL: nil, extInfo: nil, fileData: nil, emoticonData: nil, sourceFileExtension: nil, sourceFileData: nil, type: contentType, forPlatformSubType: .subTypeWechatTimeline)
//QQ
//只支持Text、Image、WebPage、Audio、Video
shareParams.ssdkSetupQQParams(byText: text, title: title, url: sURL, audioFlash: nil, videoFlash: nil, thumbImage: image, images: images, type:.text, forPlatformSubType: .subTypeQQFriend)
//Qzone
//shareParams.ssdkSetupQQParams(byText: text, title: title, url: sURL, audioFlash: nil, videoFlash: nil, thumbImage: image, images: images, type: .auto, forPlatformSubType: .subTypeQZone)
//微博
// TODO: 经纬度
//Text、Image、WebPage
if shareContent?.source == .app {
shareParams.ssdkSetupSinaWeiboShareParams(byText: text, title: title, image: images, url: sURL, latitude: 0.0, longitude: 0.0, objectID: nil, type: .auto)
} else {
// TODO: 微博高级API未通过审核,原因是用户数不够,所以,暂时只能以文本分享。
shareParams.ssdkSetupSinaWeiboShareParams(byText: text, title: title, image: images, url: sURL, latitude: 0.0, longitude: 0.0, objectID: nil, type: .text)
}
//英文
// TODO: 经纬度
if shareContent?.source == .app {
//Twitter
//Text、Image
//Twitter支持140字符!!!
let en_content = "BeeFun,excellent Github client. Download here: http://t.cn/RinAeZq \n Office website: http://www.beefun.top"
let en_title = "BeeFun,Github client for iOS"
shareParams.ssdkSetupTwitterParams(byText: en_content, images: images, latitude: 0.0, longitude: 0.0, type: .auto)
//Facebook
shareParams.ssdkSetupFacebookParams(byText: en_content, image: image, url: sURL, urlTitle: en_title, urlName: nil, attachementUrl: nil, type: .webPage)
} else {
if (text?.count ?? 0) >= 140 {
text = String((text ?? "").prefix(140))
shareParams.ssdkSetupTwitterParams(byText: text, images: images, latitude: 0.0, longitude: 0.0, type: .auto)
}
shareParams.ssdkSetupFacebookParams(byText: text, image: image, url: sURL, urlTitle: title, urlName: nil, attachementUrl: nil, type: .auto)
}
return shareParams
}
/// 处理分享内容ShareContet的属性
private func handleShareContet() {
if shareContent == nil {
return
}
//1.处理图片
//先处理是否有本地的UIImage
if shareContent?.image != nil && shareContent?.images == nil {
shareContent?.images = [(shareContent?.image)!]
}
if shareContent?.image == nil && shareContent?.images == nil {
shareContent?.image = UIImage(named: "app_logo_90")
shareContent?.images = [(shareContent?.image)!]
}
//2.处理URL
if shareContent?.url == nil {
shareContent?.url = AppOfficeSite
}
if shareContent?.url != nil && shareContent?.URL == nil {
shareContent?.URL = URL(string: (shareContent?.url)!)
}
//3.title/content
if shareContent?.title == nil {
shareContent?.title = "BeeFun,Github client for iOS"
}
if shareContent?.content == nil {
shareContent?.content = "BeeFun,excellent Github client. Download here: http://t.cn/RinAeZq \n Office website: http://www.beefun.top".cnLocalized
}
if shareContent?.contentType == nil {
shareContent?.contentType = .auto
}
}
}
================================================
FILE: BeeFun/BeeFun/SystemManager/Manager/Utils/BFFeedbackManager.swift
================================================
//
// BFFeedbackManager.swift
// BeeFun
//
// Created by WengHengcong on 2018/7/6.
// Copyright © 2018年 JungleSong. All rights reserved.
//
import UIKit
class BFFeedbackManager: NSObject {
static let shared = BFFeedbackManager()
var adminLogin = "wenghengcong"
var feedbackRepo = "BeeFunFeedback"
}
================================================
FILE: BeeFun/BeeFun/SystemManager/Manager/Utils/BFGlobalHelper.swift
================================================
//
// BFGlobalHelper.swift
// BeeFun
//
// Created by wenghengcong on 16/1/31.
// Copyright © 2016年 JungleSong. All rights reserved.
//
import UIKit
import Foundation
class BFGlobalHelper {
static let shared = BFGlobalHelper()
/** calculator text size */
class func calculatorTextSize(_ text: String, size: CGSize, font: UIFont) -> CGRect {
let boundingBox: CGRect = text.boundingRect(with: size, options: NSStringDrawingOptions.usesLineFragmentOrigin, attributes: [NSAttributedString.Key.font: font], context: nil)
return boundingBox
}
class func heightWithConstrainedWidth(_ text: String, width: CGFloat, font: UIFont) -> CGFloat {
let constraintRect = CGSize(width: width, height: CGFloat.greatestFiniteMagnitude)
let boundingBox = text.boundingRect(with: constraintRect, options: NSStringDrawingOptions.usesLineFragmentOrigin, attributes: [NSAttributedString.Key.font: font], context: nil)
return boundingBox.height
}
class func widthWithConstrainedHeight(_ text: String, height: CGFloat, font: UIFont) -> CGFloat {
let constraintRect = CGSize(width: CGFloat.greatestFiniteMagnitude, height: height)
let boundingBox = text.boundingRect(with: constraintRect, options: NSStringDrawingOptions.usesLineFragmentOrigin, attributes: [NSAttributedString.Key.font: font], context: nil)
return boundingBox.width
}
/// 从Plist配置文件中读取配置
///
/// - Parameter file: plist文件名
class func readSettsingPlist(_ file: String) -> [[JSCellModel]] {
var settingsArr: [[JSCellModel]] = []
if let path = Bundle.appBundle.path(forResource: file, ofType: "plist") {
let dictArr = NSArray(contentsOfFile: path)
if dictArr != nil {
for item in dictArr! {
var section: [JSCellModel] = []
let sectionArr = item as! [AnyObject]
for rowdict in sectionArr {
let settings = JSCellModel()
settings.setValuesForKeys(rowdict as! Dictionary)
section.append(settings)
}
settingsArr.append(section)
}
}
}
return settingsArr
}
/** app version */
}
================================================
FILE: BeeFun/BeeFun/SystemManager/Manager/Utils/BFLanunchManager.swift
================================================
//
// BFLanunchManager.swift
// BeeFun
//
// Created by WengHengcong on 2018/6/19.
// Copyright © 2018年 JungleSong. All rights reserved.
//
import UIKit
import IQKeyboardManagerSwift
import Fabric
import Crashlytics
class BFLanunchManager: NSObject {
static let shared = BFLanunchManager()
// MARK: - Appdelegate
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) {
launchBeeFunService(application, didFinishLaunchingWithOptions: launchOptions)
launchThirdParty(application, didFinishLaunchingWithOptions: launchOptions)
launchDataAnalysis(application, didFinishLaunchingWithOptions: launchOptions)
launchPushAndShare(application, didFinishLaunchingWithOptions: launchOptions)
launchNetworkMonitor(application, didFinishLaunchingWithOptions: launchOptions)
}
func applicationDidBecomeActive(_ application: UIApplication) {
//UMSocialSnsService.applicationDidBecomeActive()
UIApplication.shared.applicationIconBadgeNumber = 0
}
// MARK: - Launch
func launchBeeFunService(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) {
JSCellFactory.registerCellInfo()
//启动从Github拉取数据,更新服务端数据库
BeeFunDBManager.shared.updateServerDB(showTips: false, first: false)
//设置语言
JSLanguage.initUserLanguage()
UserManager.shared.updateUserInfo()
//从GitHub获取语言列表,获取后固化为plist,不再需要
// LanguageManager.shared.requestForLanguage()
}
func launchThirdParty(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) {
//JSLog
JSSwiftyBeaver.bridgeInit()
// Override point for customization after application launch.
IQKeyboardManager.shared.enable = true
// Define a Region in Rome/Italy and set it as default region
// Our Region also uses Gregorian Calendar and Italy Locale
// let romeRegion = Region(tz: TimeZoneName.asiaShanghai, cal: CalendarName.gregorian, loc: LocaleName.chineseSimplified)
// Date.setDefaultRegion(romeRegion)
}
func launchDataAnalysis(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) {
//友盟分析
UMAnalyticsConfig.sharedInstance().appKey = UMengAppSecret
//发送策略:BATCH启动,SEND_INTERVAL,间隔发送
UMAnalyticsConfig.sharedInstance().ePolicy = SEND_INTERVAL
MobClick.setAppVersion(JSApp.appVersion)
MobClick.start(withConfigure: UMAnalyticsConfig.sharedInstance())
//bug
// CrashReporter.shared().enableLog(true)
// Bugly.start(withAppId: TencentBuglyAppID)
//Fabric
Fabric.with([Crashlytics.self])
Fabric.with([Answers.self])
#if DEBUG
// GDPerformanceMonitor.sharedInstance.startMonitoring()
#endif
}
func launchPushAndShare(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) {
UIApplication.shared.applicationIconBadgeNumber = 0
//JPush
_ = JPushManager.init(launchOptions: launchOptions)
JPushManager.shared.checkAlias()
//ShareSDK
// ShareManager.shared.register()
}
func launchNetworkMonitor(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) {
BFMonitor.shared.start()
_ = BFNetworkManager.shared.startListening()
}
}
================================================
FILE: BeeFun/BeeFun/SystemManager/Manager/Utils/BFMonitor+Handle.swift
================================================
//
// BFMonitor+Handle.swift
// BeeFun
//
// Created by WengHengcong on 2018/1/25.
// Copyright © 2018年 LuCi. All rights reserved.
//
extension BFMonitor {
/// 登陆成功
@objc func userLogin(noti: NSNotification) {
BeeFunDBManager.shared.updateServerDB(showTips: true, first: true)
AnswerManager.logLogin(method: "Github", success: true, attributes: [:])
}
/// 登出成功
@objc func userLogout(noti: NSNotification) {
}
@objc func syncStar() {
JSMBHUDBridge.showText("Sync start".localized)
}
@objc func syncEnd() {
JSMBHUDBridge.showText("Sync end".localized)
}
}
================================================
FILE: BeeFun/BeeFun/SystemManager/Manager/Utils/BFMonitor.swift
================================================
//
// BFMonitor.swift
// BeeFun
//
// Created by WengHengcong on 2018/1/25.
// Copyright © 2018年 LuCi. All rights reserved.
//
class BFMonitor: NSObject {
static let shared = BFMonitor()
override init() {
super.init()
NotificationCenter.default.addObserver(self, selector: #selector(userLogin(noti:)), name: NSNotification.Name.BeeFun.DidLogin, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(userLogout(noti:)), name: NSNotification.Name.BeeFun.DidLogout, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(syncStar), name: NSNotification.Name.BeeFun.SyncStarRepoStart, object: nil)
NotificationCenter.default.addObserver(self
, selector: #selector(syncEnd), name: NSNotification.Name.BeeFun.SyncStarRepoEnd, object: nil)
}
func start() {
}
func stop() {
}
func monitorRequest(_ url: String) {
if url == "https://github.com/" {
return
}
if url.contains("github.com/login") || url.contains("github.com/signin") {
//打开登录页面
} else if url.contains("github.com/logout") || url.contains("github.com/signout") {
//登出
UserManager.shared.userSignOut()
} else if url.contains("github.com") && url.contains("subscription") {
//star
} else if url.contains("github.com/logout") || url.contains("github.com/signout") {
//登出
}
}
}
================================================
FILE: BeeFun/BeeFun/SystemManager/Manager/Utils/BFTabbarManager.swift
================================================
//
// BFTabbarManager.swift
// BeeFun
//
// Created by WengHengcong on 27/09/2017.
// Copyright © 2017 JungleSong. All rights reserved.
//
import UIKit
class BFTabbarManager: NSObject {
static let shared = BFTabbarManager()
/// 应用的代理
static let jsAppDelegate: AppDelegate = {
return UIApplication.shared.delegate as! AppDelegate
}()
/************************************常用UI 视图**********************************/
/// 全局keywindow
static let jsKeywindow: UIWindow? = {
var window = UIApplication.shared.keyWindow
if window == nil {
window = UIApplication.shared.windows.first
}
return window
}()
static let jsTabbarController = {
return BFTabbarManager.jsAppDelegate.tabBarController
}()
/// 当前顶部视图控制器
func jsTopViewController() -> UIViewController? {
let topView = BFTabbarManager.jsTabbarController?.topViewController()
return topView
}
/// 当前顶部导航栏控制器
func jsTopNavigationViewController() -> UINavigationController? {
let nav = BFTabbarManager.jsTabbarController?.currentNavigationViewController()
return nav
}
/// 当前顶部视图
func jsTopView() -> UIView? {
let topView = jsTopViewController()
return topView?.view
}
/// 选中tab
///
/// - Parameter index: 位置
func goto(index: Int) {
BFTabbarManager.jsTabbarController?.gotoTab(index: index)
}
}
================================================
FILE: BeeFun/BeeFun/SystemManager/Manager/Utils/BFTimeHelper.swift
================================================
//
// BFTimeHelper.swift
// BeeFun
//
// Created by WengHengcong on 2017/3/6.
// Copyright © 2017年 JungleSong. All rights reserved.
//
import UIKit
import SwiftDate
class BFTimeHelper: NSObject {
static let shared = BFTimeHelper()
/// 返回互联网时间
///
/// - Parameters:
/// - rare: 原来的字符串
/// - prefix: 时间前缀
/// - Returns: 返回互联网时间
func internetTime(rare: String?, prefix: String?) -> String? {
if let rareStr: String = rare {
let createAt: Date = rareStr.date(withFormat: DateFormats.iso8601)!
var internet = createAt.toString()
if prefix != nil {
internet = prefix!.localized + " :" + internet
}
return internet
}
return nil
}
/// 返回可读时间
///
/// - Parameters:
/// - rare: 原来的时间字符串
/// - prefix: 时间前缀
/// - Returns: 返回可读时间
func readableTime(rare: String?, prefix: String?) -> String? {
if let rareStr: String = rare {
let createAt: DateInRegion = rareStr.toDate()!
var readable = createAt.toRelative()
if prefix != nil {
readable = prefix!.localized + " :" + readable
}
return readable
}
return nil
}
}
extension Date {
/// 获取当前 秒级 时间戳 - 10位
var timeStamp: Int {
let timeInterval: TimeInterval = self.timeIntervalSince1970
let timeStamp = Int(timeInterval)
return timeStamp
}
/// 获取当前 毫秒级 时间戳 - 13位
var milliStamp: Int64 {
let timeInterval: TimeInterval = self.timeIntervalSince1970
let millisecond = CLongLong(round(timeInterval*1000))
return millisecond
}
/// 获取当前 秒级 时间戳 - 10位
var timeStampString: String {
let timeInterval: TimeInterval = self.timeIntervalSince1970
let timeStamp = Int(timeInterval)
return "\(timeStamp)"
}
/// 获取当前 毫秒级 时间戳 - 13位
var milliStampString: String {
let timeInterval: TimeInterval = self.timeIntervalSince1970
let millisecond = CLongLong(round(timeInterval*1000))
return "\(millisecond)"
}
}
================================================
FILE: BeeFun/BeeFun/SystemManager/Manager/Utils/JumpManager.swift
================================================
//
// JumpManager.swift
// BeeFun
//
// Created by WengHengcong on 2017/3/30.
// Copyright © 2017年 JungleSong. All rights reserved.
//
import UIKit
import TOWebViewController
import SafariServices
class JumpManager: NSObject {
static let shared = JumpManager()
/// 跳转到Repos detail页面
///
/// - Parameter repos: 项目model
func jumpReposDetailView(repos: ObjRepos?, from: ReposDetailFrom) {
if repos != nil && (repos?.name != nil || repos?.url != nil) {
//获取该repo的user以及name
if let repoName = repos?.name {
//1. reponame不为空
//repo name格式为:ueer/reponame
let componets = repoName.split("/")
if componets.count >= 2 {
let owner = ObjUser()
owner.login = componets.first
repos?.owner = owner
repos?.name = componets.last
} else if let repoUrl = repos?.url {
//repo name格式为:reponame
//就去看repo 的url不是空的,分拆
let componets = repoUrl.split("/")
if componets.count > 2 {
let owner = ObjUser()
owner.login = componets[componets.count-2]
repos?.owner = owner
repos?.name = componets.last
}
}
} else if let repoUrl = repos?.url {
//2.reponame为空,repo 的url不为空,分拆
let componets = repoUrl.split("/")
if componets.count > 2 {
let owner = ObjUser()
owner.login = componets[componets.count-2]
repos?.owner = owner
}
}
let vc = BFRepoDetailController()
vc.hidesBottomBarWhenPushed = true
vc.repoModel = repos
vc.from = from
DispatchQueue.main.async {
BFTabbarManager.shared.jsTopNavigationViewController()?.pushViewController(vc, animated: true)
}
}
}
/// 跳转到用户详情页
///
/// - Parameter user: 用户model
func jumpUserDetailView(user: ObjUser?) {
if user != nil {
let vc = BFUserDetailController()
vc.hidesBottomBarWhenPushed = true
vc.developer = user
DispatchQueue.main.async {
BFTabbarManager.shared.jsTopNavigationViewController()?.pushViewController(vc, animated: true)
}
}
}
/// 跳转到M页
///
/// - Parameter url: M页地址
func jumpWebView(url: String?) {
if url != nil {
if let JUMPURL = URL(string: url!) {
let web = SFSafariViewController(url: JUMPURL)
web.hidesBottomBarWhenPushed = true
if #available(iOS 11.0, *) {
web.dismissButtonStyle = .close
} else {
// Fallback on earlier versions
}
DispatchQueue.main.async {
BFTabbarManager.shared.jsTopNavigationViewController()?.present(web, animated: true, completion: {
})
}
}
// let webController = BFWebViewController(urlString: url)
// webController?.loadingBarTintColor = UIColor.bfRedColor
// if let webview = webController?.webView {
// for scrollView in webview.subviews where scrollView.isKind(of: UIScrollView.self) {
// let src = scrollView as? UIScrollView
// src?.showsHorizontalScrollIndicator = false
// src?.bounces = false
// }
// webview.scalesPageToFit = true
// webview.backgroundColor = .clear
// webview.isOpaque = false
// }
//
// webController?.hidesBottomBarWhenPushed = true
// DispatchQueue.main.async {
// BFTabbarManager.shared.jsTopNavigationViewController()?.pushViewController(webController!, animated: true)
// }
}
}
/// 跳转到Issue详情页
///
/// - Parameter issue: Issue model
func jumpIssueDetailView(issue: ObjIssue?) {
if let url = issue?.html_url {
jumpWebView(url: url)
}
}
}
================================================
FILE: BeeFun/BeeFun/SystemManager/Manager/Utils/PlistHelper.swift
================================================
//
// PlistHelper.swift
// BeeFun
//
// Created by wenghengcong on 16/1/17.
// Copyright © 2016年 JungleSong. All rights reserved.
//
import UIKit
import Foundation
enum PHError: Error {
case `nil`(String)
case nsData(String)
case json(String)
}
public extension Dictionary {
/**
Load a Plist file from the app bundle into a new dictionary
:param: File name
:throws: EHError : Nil
:return: Dictionary?
*/
static func readPlist(_ filename: String) throws -> [String: AnyObject] {
guard let path = Bundle.appBundle.path(forResource: filename, ofType: "plist") else {
throw PHError.nil("[PlistHelper][readPlist] (pathForResource) The file could not be located\nFile : '\(filename).plist'")
}
guard let plistDict = NSDictionary(contentsOfFile: path) as? [String: AnyObject] else {
throw PHError.nil("[PlistHelper][readPlist] (NSDictionary) There is a file error or if the contents of the file are an invalid representation of a dictionary. File : '\(filename)'.plist")
}
return plistDict
}
}
public extension Array {
/**
Load a Plist file from the app bundle into a new array
:param: File name
:throws: EHError : Nil
:return: Dictionary?
*/
static func readPlist(_ filename: String) throws -> [String : AnyObject] {
guard let path = Bundle.appBundle.path(forResource: filename, ofType: "plist") else {
throw PHError.nil("[EasyHelper][readPList] (pathForResource) The file could not be located\nFile : '\(filename).plist'")
}
guard let plistDict = NSDictionary(contentsOfFile: path) as? [String : AnyObject] else {
throw PHError.nil("[EasyHelper][readPList] (NSDictionary) There is a file error or if the contents of the file are an invalid representation of a dictionary. File : '\(filename)'.plist")
}
return plistDict
}
}
class PlistHelper: NSObject {
}
================================================
FILE: BeeFun/BeeFun/SystemManager/Manager/Utils/UserManager.swift
================================================
//
// UserManager.swift
// BeeFun
//
// Created by wenghengcong on 16/1/16.
// Copyright © 2016年 JungleSong. All rights reserved.
//
import UIKit
import ObjectMapper
import SwiftMessages
import Crashlytics
class UserManager: NSObject {
static let shared = UserManager()
override init() {
super.init()
if isLogin {
//去请求一次用户数据
let provider = Provider.sharedProvider
provider.request(.myInfo) { (result) -> Void in
switch result {
case let .success(response):
do {
if let gitUser: ObjUser = Mapper().map(JSONObject: try response.mapJSON()) {
if gitUser.login != nil {
self.user = gitUser
self.setCrashlytics()
}
} else {
}
} catch {
}
case .failure:
break
}
}
}
}
/// 初始化Crashlytics参数
func setCrashlytics() {
if let username = self.user?.name {
Crashlytics.sharedInstance().setUserName(username)
}
if let email = self.user?.email {
Crashlytics.sharedInstance().setUserEmail(email)
}
if let login = self.user?.login {
Crashlytics.sharedInstance().setUserIdentifier(login)
}
AnswerManager.logLogin(method: "AutoLogin", success: true, attributes: [:])
}
/// 用户对象
var user: ObjUser? {
get {
let user: ObjUser? = ObjUser.loadUserInfo()
return user
}
set(newUser) {
ObjUser.saveUserInfo(newUser)
}
}
/// 是否登录,不作登录操作
var isLogin: Bool {
if user != nil {
if ((user!.login) != nil) && !((user!.login!).isEmpty) && (AppToken().access_token != nil) {
return true
}
}
return false
}
/// 判断用户类型
var isUser: Bool {
if isLogin && ( (user!.type!) == "User") {
return true
}
return false
}
/// 用户名,可能不唯一,也有可能为空
var name: String? {
return user?.name
}
/// 登录名,唯一,目前看来,不为空
var login: String? {
return user?.login
}
/// user token
var userToken: String {
get {
return AppToken().access_token!
}
set(newtoken) {
let token = AppToken.shared
token.access_token = newtoken
user?.token = newtoken
}
}
var rewardSwitch: Bool = false
/// 重载用户对象
func reloadUser() {
self.user = ObjUser.loadUserInfo()
}
/// 保存用户对象
func saveUser(user: ObjUser) {
ObjUser.saveUserInfo(user)
self.reloadUser()
}
/// 删除用户对象
func deleteUser() {
ObjUser.deleteUserInfo()
self.reloadUser()
}
/// 用户登录
func userSignIn() {
OAuthManager.shared.beginOauth()
}
/// 用户登出
func userSignOut() {
NotificationCenter.default.post(name: NSNotification.Name.BeeFun.WillLogout, object: nil)
BFNetworkManager.clearCache()
BFNetworkManager.clearCookies()
UserManager.shared.deleteUser()
AppToken.shared.clear()
NotificationCenter.default.post(name: NSNotification.Name.BeeFun.DidLogout, object: nil)
}
/// 检查是否登录,未登录时,弹出提示
///
func checkUserLogin() -> Bool {
if isLogin {
//已登录,返回true
return true
} else {
//未登录,显示提示
showNotLoginTips()
return false
}
}
/// 未登录需要提醒
func needLoginAlert() -> Bool {
return checkUserLogin()
}
/// 需要登录,未登录弹出登录页面
///
func needLogin() -> Bool {
if isLogin {
//已登录,返回true
return true
} else {
//未登录,弹出登录界面
self.userSignIn()
return false
}
}
/// 显示登录tip
fileprivate func showNotLoginTips() {
let status = MessageView.viewFromNib(layout: .messageView)
status.configureContent(title: "Sign in Now?".localized, body: "access data ask github account".localized, iconImage: nil, iconText: nil, buttonImage: nil, buttonTitle: "Sign in".localized, buttonTapHandler: { _ in
SwiftMessages.hide()
self.userSignIn()
})
status.configureTheme(.error)
status.titleLabel?.font = UIFont.bfSystemFont(ofSize: 14.0)
status.bodyLabel?.font = UIFont.bfSystemFont(ofSize: 12.0)
status.button?.titleLabel?.font = UIFont.bfSystemFont(ofSize: 14.0)
// var statusConfig = SwiftMessages.defaultConfig
// statusConfig.presentationStyle = .top
// statusConfig.duration = .seconds(seconds: 1.0)
// SwiftMessages.show(config: statusConfig, view: status)
SwiftMessages.show(view: status)
}
/// 更新User(BeeFun)
func updateUserInfo() {
if !UserManager.shared.isLogin {
return
}
if let user = UserManager.shared.user {
user.token = AppToken.shared.access_token
BeeFunProvider.sharedProvider.request(BeeFunAPI.addUser(user: user)) { (result) in
switch result {
case let .success(response):
do {
if let userResponse: BeeFunResponseModel = Mapper().map(JSONObject: try response.mapJSON()) {
if let code = userResponse.codeEnum, code == BFStatusCode.bfOk {
}
}
} catch {
}
case .failure:
break
}
}
}
}
}
================================================
FILE: BeeFun/BeeFun/SystemManager/Manager/View/MJRefreshManager.swift
================================================
//
// MJRefreshManager.swift
// BeeFun
//
// Created by WengHengcong on 2017/4/13.
// Copyright © 2017年 JungleSong. All rights reserved.
//
import UIKit
import MJRefresh
protocol MJRefreshManagerAction: class {
func headerRefresh()
func footerRefresh()
}
class MJRefreshManager: NSObject {
weak var delegate: MJRefreshManagerAction?
override init() {
super.init()
}
/// 头部刷新控件
///
/// - Returns: <#return value description#>
func header() -> MJRefreshNormalHeader {
let header = MJRefreshNormalHeader()
header.lastUpdatedTimeLabel.isHidden = true
header.stateLabel.isHidden = true
// header.setTitle(kHeaderIdelTIP.localized, for: .idle)
// header.setTitle(kHeaderPullTip, for: .pulling)
// header.setTitle(kHeaderPullingTip, for: .refreshing)
header.setRefreshingTarget(self, refreshingAction:#selector(mj_headerRefresh))
return header
}
/// 头部刷新控件
///
/// - Parameters:
/// - target: <#target description#>
/// - action: 刷新回调方法
/// - Returns: <#return value description#>
func header(_ target: Any!, refreshingAction action: Selector!) -> MJRefreshNormalHeader {
let header = MJRefreshNormalHeader()
header.lastUpdatedTimeLabel.isHidden = true
header.stateLabel.isHidden = true
// header.setTitle(kHeaderIdelTIP, for: .idle)
// header.setTitle(kHeaderPullTip, for: .pulling)
// header.setTitle(kHeaderPullingTip, for: .refreshing)
header.setRefreshingTarget(target, refreshingAction:action)
return header
}
/// 内部代理方法
@objc func mj_headerRefresh() {
if self.delegate != nil {
self.delegate?.headerRefresh()
}
}
/// 底部加载控件
///
/// - Returns: <#return value description#>
func footer() -> MJRefreshAutoNormalFooter {
let footer = MJRefreshAutoNormalFooter()
// footer.isAutomaticallyHidden = true
// footer.setTitle(kFooterIdleTip, for: .idle)
// footer.setTitle(kFooterLoadTip, for: .refreshing)
// footer.setTitle(kFooterLoadNoDataTip, for: .noMoreData)
footer.setRefreshingTarget(self, refreshingAction:#selector(mj_footerRefresh))
footer.stateLabel.isHidden = true
footer.isRefreshingTitleHidden = true
return footer
}
/// 底部加载控件
///
/// - Parameters:
/// - target: <#target description#>
/// - action: 加载回调方法
/// - Returns: <#return value description#>
func footer(_ target: Any!, refreshingAction action: Selector!) -> MJRefreshAutoNormalFooter {
let footer = MJRefreshAutoNormalFooter()
// footer.setTitle(kFooterIdleTip, for: .idle)
// footer.setTitle(kFooterLoadTip, for: .refreshing)
// footer.setTitle(kFooterLoadNoDataTip, for: .noMoreData)
footer.setRefreshingTarget(target, refreshingAction:action)
footer.stateLabel.isHidden = true
footer.isRefreshingTitleHidden = true
return footer
}
/// 内部代理方法
@objc func mj_footerRefresh() {
if self.delegate != nil {
self.delegate?.footerRefresh()
}
}
}
================================================
FILE: BeeFun/BeeFun/SystemManager/Manager/View/YYTextManager.swift
================================================
//
// YYTextManager.swift
// BeeFun
//
// Created by WengHengcong on 16/09/2017.
// Copyright © 2017 JungleSong. All rights reserved.
//
import UIKit
import YYText
class YYTextManager: NSObject {
class func enableDebug() {
let debugOption = YYTextDebugOption()
debugOption.baselineColor = UIColor.red
debugOption.ctFrameFillColor = UIColor.red
debugOption.ctLineFillColor = UIColor(red: 0.000, green: 0.463, blue: 1.000, alpha: 0.180)
debugOption.cgGlyphBorderColor = UIColor(red: 1.000, green: 0.524, blue: 0.000, alpha: 0.200)
YYTextDebugOption.setShared(debugOption)
}
class func addLineBreakCharacterAttribute(orginal: NSAttributedString?) -> NSMutableAttributedString {
if orginal == nil {
return self.newLineCharacterAttribute()
}
let mutable = NSMutableAttributedString(attributedString: orginal!)
mutable.append(self.newLineCharacterAttribute())
return mutable
}
/// 换行符属性文本
class func newLineCharacterAttribute() -> NSMutableAttributedString {
return NSMutableAttributedString(string: "\n")
}
class func addBlankSpaceCharacterAttribute(orginal: NSAttributedString?, count: Int) -> NSMutableAttributedString {
if orginal == nil {
return self.newLineCharacterAttribute()
}
let mutable = NSMutableAttributedString(attributedString: orginal!)
mutable.append(self.blankSpaceCharacterAttribute(count: count))
return mutable
}
/// 空白字符
///
/// - Parameter count: <#count description#>
/// - Returns: <#return value description#>
class func blankSpaceCharacterAttribute(count: Int) -> NSMutableAttributedString {
let blank = String(repeating: " ", count: count)
return NSMutableAttributedString(string: blank)
}
class func moreDotCharacterAttribute(count: Int) -> NSMutableAttributedString {
let blank = String(repeating: ".", count: count)
return NSMutableAttributedString(string: blank)
}
}
extension NSMutableAttributedString {
/// 增加换行符
func addLineBreakCharacterAttribute() {
append(YYTextManager.newLineCharacterAttribute())
}
/// 增加空白字符
///
/// - Parameter count: 空白字符的个数
func addBlankSpaceCharacterAttribute(_ count: Int) {
append(YYTextManager.blankSpaceCharacterAttribute(count: count))
}
/// 增加.符号
///
/// - Parameter count: <#count description#>
func addMoreDotCharacterAttribute(_ count: Int) {
append(YYTextManager.moreDotCharacterAttribute(count: count))
}
}
================================================
FILE: BeeFun/BeeFun/SystemManager/Manager/iCloud/BFPathManager.swift
================================================
//
// BFPathManager.swift
// BeeFunMac
//
// Created by WengHengcong on 2017/12/4.
// Copyright © 2017年 LuCi. All rights reserved.
//
import Foundation
class BFPathManager: NSObject {
static let shared = BFPathManager()
#if DEBUG
var zipFileName = "github_debug.zip"
#else
var zipFileName = "github.zip"
#endif
// MARK: - For zip
/// Zip 本地路径
/// ...../github.zip
func localZipFilePath() -> URL? {
return BFPathManager.shared.localDocumentURL(fileName: zipFileName)
}
/// Zip iCloud路径
/// ...../github.zip
func iCloudZipFilePath() -> URL? {
return BFPathManager.shared.iCloudDocumentURL(fileName: zipFileName)
}
/// 需要压缩的路径
/// .../..../github.sqlite
func needZipFilePath() -> URL? {
return BFPathManager.shared.localDocumentURL(fileName: SQLManager.githubDatabaseName)
}
/// 需要解压缩的路径
/// .../....com.beefun.mac./
func unZipFilePath() -> URL? {
return BFPathManager.shared.localDocumentURL()
}
// MARK: - Local Path
func localDocumentURL(fileName: String) -> URL? {
let docUrl = localDocumentURL()
var fileUrl = docUrl?.appendingPathComponent(fileName)
if let urlString = fileUrl?.absoluteString, urlString.lastCharacter == "/" {
let nweUrlString = urlString.substring(to: urlString.length-1)
fileUrl = URL.init(string: nweUrlString)
}
return fileUrl
}
func localDocumentURL() -> URL? {
let fm = FileManager.default
let urlPaths = fm.urls(for: .documentDirectory, in: .userDomainMask)
var userDocumentDirectory = URL(string: "")
if let appDirectory = urlPaths.last {
userDocumentDirectory = appDirectory
if !fm.fileExists(atPath: appDirectory.path) {
do {
try fm.createDirectory(at: appDirectory, withIntermediateDirectories: false, attributes: nil)
} catch {
}
}
}
return userDocumentDirectory
}
// MARK: - iCloud Path
/// iCloud.../Document/fileName
func iCloudDocumentURL(fileName: String) -> URL? {
return iCloudDocumentURL(nil, fileName: fileName)
}
func iCloudDocumentURL(_ containerId: String?, fileName: String) -> URL? {
if containerId != nil {
if let url = FileManager.default.url(forUbiquityContainerIdentifier: containerId) {
return url.appendingPathComponent("Documents").appendingPathComponent(fileName)
}
} else {
if let url = FileManager.default.url(forUbiquityContainerIdentifier: nil) {
return url.appendingPathComponent("Documents").appendingPathComponent(fileName)
}
}
return nil
}
}
================================================
FILE: BeeFun/BeeFun/SystemManager/Manager/iCloud/BFZipManager.swift
================================================
//
// BFZipManager.swift
// BeeFun
//
// Created by WengHengcong on 2018/1/25.
// Copyright © 2018年 LuCi. All rights reserved.
//
/*
import Zip
class BFZipManager: NSObject {
static let shared = BFZipManager()
func zipDB() -> Bool {
do {
if let needZipFile = BFPathManager.shared.needZipFilePath(), let zipFile = BFPathManager.shared.localZipFilePath() {
try Zip.zipFiles(paths: [needZipFile], zipFilePath: zipFile, password: nil, compression: .BestCompression, progress: { (progress) in
print("zip file progress: \(progress)")
})
print("zip file path \(needZipFile)")
return true
}
} catch {
print("zip db file went wrong")
SQLManager.checkDBValid()
}
return false
}
func unZipDB() -> Bool {
do {
if let unZipFile = BFPathManager.shared.localZipFilePath() ,let des = BFPathManager.shared.unZipFilePath() {
try Zip.unzipFile(unZipFile, destination: des, overwrite: true, password: nil, progress: { (progress) -> () in
print("unzip file progress: \(progress)")
})
return true
}
} catch {
print("unzip db file went wrong")
//解压缩错误,就要检查是否有github.sqlite数据库,无就要创建
SQLManager.checkDBValid()
}
return false
}
}
*/
================================================
FILE: BeeFun/BeeFun/SystemManager/Network/BFNetworkManager.swift
================================================
//
// BFNetworkManager.swift
// BeeFun
//
// Created by wenghengcong on 16/1/10.
// Copyright © 2016年 JungleSong. All rights reserved.
//
import UIKit
import WebKit
import Reachability
class BFNetworkManager: NSObject {
static let shared = BFNetworkManager()
var lastState: Reachability.Connection = .none
let reachabilityManager = Reachability()!
var isReachable: Bool {
lastState = reachabilityManager.connection
return reachabilityManager.connection != .none
}
var isReachableOnCellular: Bool {
lastState = reachabilityManager.connection
return reachabilityManager.connection == .cellular
}
var isReachableOnWiFi: Bool {
lastState = reachabilityManager.connection
return reachabilityManager.connection == .wifi
}
func startListening() {
reachabilityManager.whenReachable = { reachability in
if reachability.connection == .wifi {
print("The network is reachable via WiFi: \(self.reachabilityManager.connection)")
NotificationCenter.default.post(name: NSNotification.Name.BeeFun.ReachableWiFi, object: nil)
} else {
print("The network is reachable via Cellular: \(self.reachabilityManager.connection)")
NotificationCenter.default.post(name: NSNotification.Name.BeeFun.ReachableCellular, object: nil)
}
if self.lastState == .none && (reachability.connection == .wifi || reachability.connection == .cellular) {
print("The network is reachable after unreachable: \(self.reachabilityManager.connection)")
NotificationCenter.default.post(name: NSNotification.Name.BeeFun.ReachableAfterUnreachable, object: nil)
}
self.lastState = reachability.connection
}
reachabilityManager.whenUnreachable = { reachability in
print("The network is not reachable: \(self.reachabilityManager.connection)")
NotificationCenter.default.post(name: NSNotification.Name.BeeFun.NotReachable, object: nil)
if (self.lastState == .wifi || self.lastState == .cellular) && reachability.connection == .none {
print("The network is not reachable after reachable: \(self.reachabilityManager.connection)")
NotificationCenter.default.post(name: NSNotification.Name.BeeFun.UnReachableAfterReachable, object: nil)
}
self.lastState = reachability.connection
}
do {
try reachabilityManager.startNotifier()
} catch {
print("Unable to start notifier")
}
}
func stopListening() {
lastState = .none
reachabilityManager.stopNotifier()
}
// MARK: - 清除工具
/// 清除Cookies
class func clearCookies() {
let storage: HTTPCookieStorage = HTTPCookieStorage.shared
for cookie in storage.cookies! {
storage.deleteCookie(cookie)
}
}
/// 清除缓存
class func clearCache() {
if #available(iOS 9.0, *) {
let websiteDataTypes = NSSet(array: [WKWebsiteDataTypeDiskCache, WKWebsiteDataTypeMemoryCache, WKWebsiteDataTypeOfflineWebApplicationCache, WKWebsiteDataTypeCookies, WKWebsiteDataTypeSessionStorage, WKWebsiteDataTypeLocalStorage])
let date = NSDate(timeIntervalSince1970: 0)
WKWebsiteDataStore.default().removeData(ofTypes: websiteDataTypes as! Set, modifiedSince: date as Date, completionHandler: { })
} else {
var libraryPath = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.libraryDirectory, FileManager.SearchPathDomainMask.userDomainMask, false).first!
libraryPath += "/Cookies"
do {
try FileManager.default.removeItem(atPath: libraryPath)
} catch {
print("error")
}
URLCache.shared.removeAllCachedResponses()
}
}
}
================================================
FILE: BeeFun/BeeFun/SystemManager/Network/BFStatusCode.swift
================================================
//
// BFResponseStatusCode.swift
// BeeFun
//
// Created by WengHengcong on 2018/5/5.
// Copyright © 2018年 JungleSong. All rights reserved.
//
import UIKit
public enum BFStatusCode: Int {
case bfOk = 0
// Informational
case `continue` = 100
case switchingProtocols = 101
case processing = 102
// Success
case ok = 200
case created = 201
case accepted = 202
case nonAuthoritativeInformation = 203
case noContent = 204
case resetContent = 205
case partialContent = 206
case multiStatus = 207
case alreadyReported = 208
case imUsed = 226
// Redirections
case multipleChoices = 300
case movedPermanently = 301
case found = 302
case seeOther = 303
case notModified = 304
case useProxy = 305
case switchProxy = 306
case temporaryRedirect = 307
case permanentRedirect = 308
// Client Errors
case badRequest = 400
case unauthorized = 401
case paymentRequired = 402
case forbidden = 403
case notFound = 404
case methodNotAllowed = 405
case notAcceptable = 406
case proxyAuthenticationRequired = 407
case requestTimeout = 408
case conflict = 409
case gone = 410
case lengthRequired = 411
case preconditionFailed = 412
case requestEntityTooLarge = 413
case requestURITooLong = 414
case unsupportedMediaType = 415
case requestedRangeNotSatisfiable = 416
case expectationFailed = 417
case imATeapot = 418
case authenticationTimeout = 419
case unprocessableEntity = 422
case locked = 423
case failedDependency = 424
case upgradeRequired = 426
case preconditionRequired = 428
case tooManyRequests = 429
case requestHeaderFieldsTooLarge = 431
case loginTimeout = 440
case noResponse = 444
case retryWith = 449
case unavailableForLegalReasons = 451
case requestHeaderTooLarge = 494
case certError = 495
case noCert = 496
case httpToHTTPS = 497
case tokenExpired = 498
case clientClosedRequest = 499
// Server Errors
case internalServerError = 500
case notImplemented = 501
case badGateway = 502
case serviceUnavailable = 503
case gatewayTimeout = 504
case httpVersionNotSupported = 505
case variantAlsoNegotiates = 506
case insufficientStorage = 507
case loopDetected = 508
case bandwidthLimitExceeded = 509
case notExtended = 510
case networkAuthenticationRequired = 511
case networkTimeoutError = 599
//以下是BeeFun api特俗定义的
case addTagWhenExist = 1102
}
public extension BFStatusCode {
/// Informational - Request received, continuing process.
public var isInformational: Bool {
return inRange( (100...199) )
}
/// Success - The action was successfully received, understood, and accepted.
public var isSuccess: Bool {
return inRange( (200...299) )
}
/// Redirection - Further action must be taken in order to complete the request.
public var isRedirection: Bool {
return inRange( (300...399) )
}
/// Client Error - The request contains bad syntax or cannot be fulfilled.
public var isClientError: Bool {
return inRange(400...499)
}
/// Server Error - The server failed to fulfill an apparently valid request.
public var isServerError: Bool {
return inRange(500...599)
}
/// - returns: `true` if the status code is in the provided range, false otherwise.
//see http://stackoverflow.com/questions/25308978/what-are-intervals-in-swift-ranges
fileprivate func inRange(_ range: ClosedRange) -> Bool {
return range.contains(rawValue)
}
}
================================================
FILE: BeeFun/BeeFun/SystemManager/Network/BeeFunAPI.swift
================================================
//
// BeeFunAPI.swift
// BeeFun
//
// Created by WengHengcong on 2018/4/22.
// Copyright © 2018年 JungleSong. All rights reserved.
//
import UIKit
import Foundation
import Moya
import Alamofire
import ObjectMapper
class InsideBeeFunProvider: MoyaProvider where Target: TargetType {
override init(endpointClosure: @escaping (Target) -> Endpoint, requestClosure: @escaping (Endpoint, @escaping
MoyaProvider.RequestResultClosure) -> Void, stubClosure: @escaping (Target) -> StubBehavior, callbackQueue: DispatchQueue?, manager: Manager, plugins: [PluginType], trackInflights: Bool) {
super.init(endpointClosure: endpointClosure, requestClosure: requestClosure, stubClosure: stubClosure, callbackQueue: callbackQueue, manager: manager, plugins: plugins, trackInflights: trackInflights)
}
}
struct BeeFunProvider {
fileprivate static var endpointsClosure = { (target: BeeFunAPI) -> Endpoint in
var endpoint: Endpoint = Endpoint(url: url(target), sampleResponseClosure: {.networkResponse(200, target.sampleData)}, method: target.method, task: target.task, httpHeaderFields: target.headers)
return endpoint
}
static func stubBehaviour(_: BeeFunAPI) -> Moya.StubBehavior {
return .never
}
static func DefaultProvider() -> InsideBeeFunProvider {
return InsideBeeFunProvider(endpointClosure: endpointsClosure, requestClosure: MoyaProvider.defaultRequestMapping, stubClosure: MoyaProvider.neverStub, callbackQueue: DispatchQueue.main, manager: Alamofire.SessionManager.default, plugins: [], trackInflights: false)
}
fileprivate struct SharedProvider {
static var instance = BeeFunProvider.DefaultProvider()
}
static var sharedProvider: InsideBeeFunProvider {
get {
return SharedProvider.instance
}
set (newSharedProvider) {
SharedProvider.instance = newSharedProvider
}
}
}
public enum BeeFunAPI {
//更新数据库
//1. 每次启动时 2.
case updateServerDB(first: Bool, update: Bool)
// User
case addUser(user: ObjUser)
//从BeeFun获取到github starrd 的页数,每页100
case repoPage(owner: String)
case repos(tag: String, language: String, page: Int, perpage: Int, sort: String, direction: String)
case delRepo(repoid: Int)
case addRepo(repo: ObjRepos)
//tag
// MARK: - page或perpage传0,就返回所有数据
case getAllTags(filter: [String: Any])
case getTag(name: String)
case addTag(tagModel: ObjTag)
case addTagToRepo(change:Bool, star_tags: String, delete_tags:[String], repoId: Int)
case updateTag(name: String, to: String)
case deleteTag(name: String)
//language
case getLanguages(page:Int, perpage:Int, sort:String, direction:String)
// MARK: - Tringding
case getGithubTrending(model: BFGithubTrendingRequsetModel)
}
extension BeeFunAPI: TargetType {
public var headers: [String: String]? {
let token = AppToken.shared.access_token ?? ""
let owner = UserManager.shared.login ?? ""
var header = ["User-Agent": "BeeFuniOS", "Authorization": token, "timeoutInterval": "15.0", "owner": owner]
switch self {
case .addUser(_):
header = ["User-Agent": "BeeFuniOS", "Authorization": token, "timeoutInterval": "15.0", "owner": owner, "Content-Type": "application/json"]
return header
case .addTag(_):
header = ["User-Agent": "BeeFuniOS", "Authorization": token, "timeoutInterval": "15.0", "owner": owner, "Content-Type": "application/json"]
return header
default:
header = ["User-Agent": "BeeFuniOS", "Authorization": token, "timeoutInterval": "15.0", "owner": owner]
return header
}
}
public var parameterEncoding: ParameterEncoding {
return Alamofire.ParameterEncoding.self as! ParameterEncoding
}
public var baseURL: URL {
switch self {
default:
//Check list: 修改上线环境及证书
// beefun.top 已经下线
return URL(string: "https://www.beefun.top:8082/beefun")! //远程环境
// return URL(string: "http://localhost:8082")! //本地测试环境
}
}
public var path: String {
switch self {
case .addRepo(_):
return "/v1/repo/client"
case .updateServerDB(_, _):
return "/v1/db/update"
case .addUser(_):
return "/v1/user"
case .repoPage(let owner):
return "/v1/reponum/\(owner)"
case .repos(let tag, _, _, _, _, _):
return "/v1/repos/\(tag)"
case .delRepo(let repoid):
return "/v1/repo/\(repoid)"
case .getGithubTrending(_):
return "/v1/explore/trending"
// tag操作
case .getAllTags(_):
return "/v2/tags"
case .getTag(let name):
return "/v1/tag/\(name)"
case .addTag(_):
return "/v1/tag"
case .addTagToRepo(_, _, _, let repoId):
return "/v1/repo/tag/\(repoId)"
case .updateTag(let name, _):
return "/v1/tag/\(name)"
case .deleteTag(let name):
return "/v1/tag/\(name)"
case .getLanguages(_, _, _, _):
return "/v1/lans"
}
}
public var method: Moya.Method {
switch self {
case .addUser(_):
return .post
case .addRepo(_):
return .post
case .addTag(_):
return .post
case .updateTag(_, _):
return .put
case .deleteTag(_):
return .delete
case .addTagToRepo(_, _,_, _):
return .post
case .delRepo(_):
return .delete
default:
return .get
}
}
public var parameters: [String: Any]? {
switch self {
case .updateServerDB(let first, let update):
return [
"first": first as AnyObject,
"update": update as AnyObject
]
case .addUser(let user):
return user.toJSON()
case .addRepo(let repo):
return repo.toJSON()
case .getGithubTrending(let model):
return model.toJSON()
case .getAllTags(let filter):
return filter
case .updateTag(_, let to):
return [
"to": to
]
case .addTag(let tagModel):
return tagModel.toJSON()
case .addTagToRepo(let change, let star_tags, let delete_tags, _):
return [
"change": change,
"star_tags": star_tags,
"del_tags": delete_tags
]
case .repos(_,let language, let page, let perpage, let sort, let direction):
return [
"source" : 0,
"language": language as AnyObject,
"page": page as AnyObject,
"perpage": perpage as AnyObject,
"sort": sort as AnyObject,
"direction": direction as AnyObject
]
case .getLanguages(let page, let perpage, let sort, let direction):
return [
"page": page as AnyObject,
"perpage": perpage as AnyObject,
"sort": sort as AnyObject,
"direction": direction as AnyObject
]
default:
return nil
}
}
public var task: Task {
let encoding: ParameterEncoding
switch self.method {
case .post:
encoding = JSONEncoding.default
default:
encoding = URLEncoding.default
}
if let requestParameters = parameters {
return .requestParameters(parameters: requestParameters, encoding: encoding)
}
return .requestPlain
}
//Any target you want to hit must provide some non-nil NSData that represents a sample response. This can be used later for tests or for providing offline support for developers. This should depend on self.
public var sampleData: Data {
switch self {
default :
return "default".data(using: String.Encoding.utf8)!
}
}
}
================================================
FILE: BeeFun/BeeFun/SystemManager/Network/BeeFunDBManager.swift
================================================
//
// BeeFunDBManager.swift
// BeeFun
//
// Created by WengHengcong on 2018/5/14.
// Copyright © 2018年 JungleSong. All rights reserved.
//
import UIKit
import ObjectMapper
class BeeFunDBManager: NSObject {
static let shared = BeeFunDBManager()
var lastTimeStampKey = "lastUpdateFromGithub"
func updateServerDB(showTips: Bool, first: Bool) {
if !UserManager.shared.needLoginAlert() {
return
}
if showTips {
NotificationCenter.default.post(name: NSNotification.Name.BeeFun.SyncStarRepoStart, object: nil)
}
let nowDate = Date().timeStamp
let lastUpdate = UserDefaults.standard.integer(forKey: lastTimeStampKey)
if (nowDate - lastUpdate > 1 * 24 * 60 * 60) || first {
updateRequest(showTips: showTips, first: first, update: true)
} else {
updateRequest(showTips: showTips, first: first, update: false)
}
}
/// 更新请求
///
/// - Parameter update: 是否更新所有已经在server db存在repo的信息
func updateRequest(showTips: Bool, first: Bool, update: Bool) {
BeeFunProvider.sharedProvider.request(BeeFunAPI.updateServerDB(first: first, update: update)) { (result) in
switch result {
case let .success(response):
do {
if let tagResponse: BeeFunResponseModel = Mapper().map(JSONObject: try response.mapJSON()) {
if let code = tagResponse.codeEnum, code == BFStatusCode.bfOk {
if showTips {
NotificationCenter.default.post(name: NSNotification.Name.BeeFun.SyncStarRepoEnd, object: nil)
}
if update {
//添加成功
UserDefaults.standard.set(Date().timeStamp, forKey: self.lastTimeStampKey)
}
}
}
} catch {
}
case .failure:
break
}
}
}
}
================================================
FILE: BeeFun/BeeFun/SystemManager/Network/EventAPI.swift
================================================
//
// EventAPI.swift
// BeeFun
//
// Created by WengHengcong on 10/09/2017.
// Copyright © 2017 JungleSong. All rights reserved.
//
import UIKit
import Foundation
import Moya
import Alamofire
import ObjectMapper
class InsideEventProvider: MoyaProvider where Target: TargetType {
override init(endpointClosure: @escaping (Target) -> Endpoint, requestClosure: @escaping (Endpoint, @escaping MoyaProvider.RequestResultClosure) -> Void, stubClosure: @escaping (Target) -> StubBehavior, callbackQueue: DispatchQueue?, manager: Manager, plugins: [PluginType], trackInflights: Bool) {
super.init(endpointClosure: endpointClosure, requestClosure: requestClosure, stubClosure: stubClosure, callbackQueue: callbackQueue, manager: manager, plugins: plugins, trackInflights: trackInflights)
}
}
struct EventProvider {
fileprivate static var endpointsClosure = { (target: EventAPI) -> Endpoint in
// Sign all non-XApp token requests
var endpoint: Endpoint = Endpoint(url: url(target), sampleResponseClosure: {.networkResponse(200, target.sampleData)}, method: target.method, task: target.task, httpHeaderFields: target.headers)
return endpoint
}
static func stubBehaviour(_: EventAPI) -> Moya.StubBehavior {
return .never
}
static func DefaultProvider() -> InsideEventProvider {
return InsideEventProvider(endpointClosure: endpointsClosure, requestClosure: MoyaProvider.defaultRequestMapping, stubClosure: MoyaProvider.neverStub, callbackQueue: DispatchQueue.main, manager: Alamofire.SessionManager.default, plugins: [], trackInflights: false)
}
fileprivate struct SharedProvider {
static var instance = EventProvider.DefaultProvider()
}
static var sharedProvider: InsideEventProvider {
get {
return SharedProvider.instance
}
set (newSharedProvider) {
SharedProvider.instance = newSharedProvider
}
}
}
/// Event API
///
/// - publicEvents: List public events
/// - repoEvents: List repository events
/// - repoIssueEvents: List issue events for a repository,Repository issue events have a different format than other events, as documented in the Issue Events API(https://developer.github.com/v3/issues/events/).
/// - repoPublicNetworkEvents: List public events for a network of repositories
/// - orgPublicEvent: List public events for an organization
/// - userReceivedEvents: List events that a user has received,These are events that you've received by watching repos and following users. If you are authenticated as the given user, you will see private events. Otherwise, you'll only see public events.
/// - userReceivedPublicEvents: List public events that a user has received
/// - userEvents: List events performed by a user. If you are authenticated as the given user, you will see your private events. Otherwise, you'll only see public events.
/// - userPublicEvents: List public events performed by a user
/// - orgEvents: List events for an organization
public enum EventAPI {
case publicEvents(page:Int, perpage:Int)
case repoEvents(owner:String, repo:String, page:Int, perpage:Int)
case repoIssueEvents(owner:String, repo:String, page:Int, perpage:Int)
case repoPublicNetworkEvents(owner:String, repo:String, page:Int, perpage:Int)
case orgPublicEvent(organization:String, page:Int, perpage:Int)
case userReceivedEvents(username:String, page:Int, perpage:Int)
case userReceivedPublicEvents(username:String, page:Int, perpage:Int)
case userEvents(username:String, page:Int, perpage:Int)
case userPublicEvents(username:String, page:Int, perpage:Int)
case orgEvents(username:String, organization:String, page:Int, perpage:Int)
}
extension EventAPI: TargetType {
public var headers: [String : String]? {
var header = ["User-Agent": "BeeFunMac","Authorization": AppToken.shared.access_token ?? "", "timeoutInterval": "15.0", "Accept": "application/vnd.github.v3.star+json"]
switch self {
default:
header = ["User-Agent": "BeeFunMac","Authorization": AppToken.shared.access_token ?? "", "timeoutInterval": "15.0"]
return header
}
}
public var parameterEncoding: ParameterEncoding {
return (Alamofire.ParameterEncoding.self as? ParameterEncoding)!
}
public var baseURL: URL {
switch self {
default:
return URL(string: "https://api.github.com")!
}
}
public var path: String {
switch self {
//Event
case .publicEvents:
return "/events"
case .repoEvents(let owner, let repo, _, _):
return "/repos/\(owner)/\(repo)/events"
case .repoIssueEvents(let owner, let repo, _, _):
return "/repos/\(owner)/\(repo)/issues/events"
case .repoPublicNetworkEvents(let owner, let repo, _, _):
return "/networks/\(owner)/\(repo)/events"
case .orgPublicEvent(let organization, _, _):
return "/orgs/\(organization)/events"
case .userReceivedEvents(let username, _, _):
return "/users/\(username)/received_events"
case .userReceivedPublicEvents(let username, _, _):
return "/users/\(username)/received_events/public"
case .userEvents(let username, _, _):
return "/users/\(username)/events"
case .userPublicEvents(let username, _, _):
return "/users/\(username)/events/public"
case .orgEvents(let username, let organization, _, _):
return "/users/\(username)/events/orgs/\(organization)"
}
}
public var method: Moya.Method {
switch self {
default:
return .get
}
}
public var parameters: [String: Any]? {
switch self {
//Event
case .publicEvents(let page, let perpage):
return [
"page": page as AnyObject,
"per_page": perpage as AnyObject
]
case .repoEvents(_, _, let page, let perpage):
return [
"page": page as AnyObject,
"per_page": perpage as AnyObject
]
case .repoIssueEvents(_, _, let page, let perpage):
return [
"page": page as AnyObject,
"per_page": perpage as AnyObject
]
case .repoPublicNetworkEvents(_, _, let page, let perpage):
return [
"page": page as AnyObject,
"per_page": perpage as AnyObject
]
case .orgPublicEvent(_, let page, let perpage):
return [
"page": page as AnyObject,
"per_page": perpage as AnyObject
]
case .userReceivedEvents(_, let page, let perpage):
return [
"page": page as AnyObject,
"per_page": perpage as AnyObject
]
case .userReceivedPublicEvents(_, let page, let perpage):
return [
"page": page as AnyObject,
"per_page": perpage as AnyObject
]
case .userEvents(_, let page, let perpage):
return [
"page": page as AnyObject,
"per_page": perpage as AnyObject
]
case .userPublicEvents(_, let page, let perpage):
return [
"page": page as AnyObject,
"per_page": perpage as AnyObject
]
case .orgEvents(_, _, let page, let perpage):
return [
"page": page as AnyObject,
"per_page": perpage as AnyObject
]
}
}
public var task: Task {
let encoding: ParameterEncoding
switch self.method {
case .post:
encoding = JSONEncoding.default
default:
encoding = URLEncoding.default
}
if let requestParameters = parameters {
return .requestParameters(parameters: requestParameters, encoding: encoding)
}
return .requestPlain
}
//Any target you want to hit must provide some non-nil NSData that represents a sample response. This can be used later for tests or for providing offline support for developers. This should depend on self.
public var sampleData: Data {
switch self {
default :
return "default".data(using: String.Encoding.utf8)!
}
}
}
================================================
FILE: BeeFun/BeeFun/SystemManager/Network/GitHubAPI.swift
================================================
//
// GitV3API.swift
// BeeFun
//
// Created by wenghengcong on 16/1/10.
// Copyright © 2016年 JungleSong. All rights reserved.
//
import UIKit
import Foundation
import Moya
import Alamofire
import ObjectMapper
typealias SuccessClosure = (_ result: AnyObject) -> Void
//typealias SuccessClosure = (result: Mappable) -> Void
typealias FailClosure = (_ errorMsg: String?) -> Void
// MARK: - Provider setup
class GitHupPorvider: MoyaProvider where Target: TargetType {
override init(endpointClosure: @escaping (Target) -> Endpoint, requestClosure: @escaping (Endpoint, @escaping MoyaProvider.RequestResultClosure) -> Void, stubClosure: @escaping (Target) -> StubBehavior, callbackQueue: DispatchQueue?, manager: Manager, plugins: [PluginType], trackInflights: Bool) {
super.init(endpointClosure: endpointClosure, requestClosure: requestClosure, stubClosure: stubClosure, callbackQueue: callbackQueue, manager: manager, plugins: plugins, trackInflights: trackInflights)
}
}
struct Provider {
fileprivate static var endpointsClosure = { (target: GitHubAPI) -> Endpoint in
var endpoint: Endpoint = Endpoint(url: url(target), sampleResponseClosure: {.networkResponse(200, target.sampleData)}, method: target.method, task: target.task, httpHeaderFields: target.headers)
return endpoint
}
static func stubBehaviour(_: GitHubAPI) -> Moya.StubBehavior {
return .never
}
static func DefaultProvider() -> GitHupPorvider {
return GitHupPorvider(endpointClosure: endpointsClosure, requestClosure: MoyaProvider.defaultRequestMapping, stubClosure: MoyaProvider.neverStub, callbackQueue: DispatchQueue.main, manager: Alamofire.SessionManager.default, plugins: [], trackInflights: false)
}
fileprivate struct SharedProvider {
static var instance = Provider.DefaultProvider()
}
static var sharedProvider: GitHupPorvider {
get {
return SharedProvider.instance
}
set (newSharedProvider) {
SharedProvider.instance = newSharedProvider
}
}
}
struct APIKeyName {
static let sortKey = "sort"
static let dirctionKey = "direction"
}
public enum GitHubAPI {
//url
case gerUrl(url:String)
case postUrl(url:String)
case headtUrl(url:String)
case putUrl(url:String)
case patchUrl(url:String)
case deleteUrl(url:String)
case traceUrl(url:String)
case connectUrl(url:String)
//user
case myInfo
case userInfo(username:String)
case updateUserInfo(name:String, email:String, blog:String, company:String, location:String, hireable:Bool, bio:String)
case allUsers(page:Int, perpage:Int)
//user email
case userEmails
case addEmail
case delEmail
//user followers
case userFollowers(page:Int, perpage:Int, username:String)
case myFollowers
case userFollowing(page:Int, perpage:Int, username:String)
case myFollowing
case checkUserFollowing(username:String)
case checkFollowing(username:String, target_user:String)
case follow(username:String)
case unfollow(username:String)
//repository
case myRepos(page:Int, perpage:Int, type:String, sort:String, direction:String)
case userRepos( username:String, page:Int, perpage:Int, type:String, sort:String, direction:String)
case orgRepos(type:String, organization:String)
case pubRepos(page:Int, perpage:Int)
case userSomeRepo(owner:String, repo:String)
//starring
case reposStargazers(owner:String, repo:String)
case userStarredRepos(username:String, sort:String, direction:String)
case myStarredRepos(page:Int, perpage:Int, sort:String, direction:String)
case allMyStarredRepos(sort:String, direction:String)
case checkStarred(owner:String, repo:String)
case starRepo(owner:String, repo:String)
case unstarRepo(owner:String, repo:String)
//notification
// case MyNotifications(page:Int,perpage:Int,all:Bool ,participating:Bool,since:String,before:String)
case myNotifications(page:Int, perpage:Int, all:String, participating:String)
case repoNotifications(owner:String, repo:String, all:String, participating:String)
case markNotificationsAsRead(last_read_at:String)
case markRepoNotificationsAsRead(owner:String, repo:String, last_read_at:String)
//watching
case repoWatchers(page:Int, perpage:Int, owner:String, repo:String)
case userWatchedRepos(page:Int, perpage:Int, username:String)
case myWatchedRepos(page:Int, perpage:Int)
case checkWatched(owner:String, repo:String)
case watchingRepo(owner:String, repo:String, subscribed:String, ignored:String)
case unWatchingRepo(owner:String, repo:String)
//forks
case userReposForks(page:Int, perpage:Int, sort:String, owner:String, repo:String)
case createFork(owner:String, repo:String)
//gist
}
extension GitHubAPI: TargetType {
public var headers: [String : String]? {
var header = ["User-Agent": "BeeFunMac","Authorization": AppToken.shared.access_token ?? "", "timeoutInterval": "15.0", "Accept": "application/vnd.github.v3.star+json"]
switch self {
case .reposStargazers( _, _):
return header
case .myStarredRepos:
return header
case .allMyStarredRepos:
return header
case .userStarredRepos(_ , _, _):
return header
case .checkStarred( _, _):
return header
case .starRepo( _, _):
return header
case .unstarRepo( _, _):
return header
default:
header = ["User-Agent": "BeeFunMac", "Authorization": AppToken.shared.access_token ?? "", "timeoutInterval": "15.0"]
return header
}
}
public var parameterEncoding: ParameterEncoding {
return Alamofire.ParameterEncoding.self as! ParameterEncoding
}
public var baseURL: URL {
switch self {
default:
return URL(string: "https://api.github.com")!
}
}
public var path: String {
switch self {
//url
case .gerUrl(let url):
return url
case .postUrl(let url):
return url
case .headtUrl(let url):
return url
case .putUrl(let url):
return url
case .patchUrl(let url):
return url
case .deleteUrl(let url):
return url
case .traceUrl(let url):
return url
case .connectUrl(let url):
return url
//user
case .myInfo:
return "/user"
case .userInfo(let username):
return "/users/\(username)"
case .updateUserInfo:
return "/user"
case .allUsers(_, _):
return "/users"
//user email
case .userEmails:
return "/user/emails"
case .addEmail:
return "/user/emails"
case .delEmail:
return "/user/emails"
//user followers
case .userFollowers(_, _, let username):
return "/users/\(username)/followers"
case .myFollowers:
return "/users/followers"
case .userFollowing(_, _, let username):
return "/users/\(username)/following"
case .myFollowing:
return "/users/following"
case .checkUserFollowing(let username):
return "/user/following/\(username)"
case .checkFollowing(let username, let target_user):
return "/users/\(username)/following/\(target_user)"
case .follow(let username):
return "/user/following/\(username)"
case .unfollow(let username):
return "/user/following/\(username)"
case .myRepos:
return "/user/repos"
case .userRepos(let username, _, _, _, _, _):
return "/users/\(username)/repos"
case .orgRepos(_, let organization):
return "/orgs/\(organization)/repos"
case .pubRepos:
return "/repositories"
case .userSomeRepo(let owner, let repo):
return "/repos/\(owner)/\(repo)"
//starring
case .reposStargazers(let owner, let repo):
return "/repos/\(owner)/\(repo)/stargazers"
case .myStarredRepos:
return "/user/starred"
case .allMyStarredRepos:
return "/user/starred"
case .userStarredRepos(let username, _, _):
return "/users/\(username)/starred"
case .checkStarred(let owner, let repo):
return "/user/starred/\(owner)/\(repo)"
case .starRepo(let owner, let repo):
return "/user/starred/\(owner)/\(repo)"
case .unstarRepo(let owner, let repo):
return "/user/starred/\(owner)/\(repo)"
//notification
case .myNotifications:
return "/notifications"
case .repoNotifications(let owner, let repo, _, _):
return "/repos/\(owner)/\(repo)/notifications"
case .markNotificationsAsRead:
return "/notifications"
case .markRepoNotificationsAsRead(let owner, let repo, _):
return "/repos/\(owner)/\(repo)/notifications"
//watching
case .repoWatchers(_, _, let owner, let repo):
return "/repos/\(owner)/\(repo)/subscribers"
case .userWatchedRepos(_, _, let username):
return "/users/\(username)/subscriptions"
case .myWatchedRepos:
return "/user/subscriptions"
case .checkWatched(let owner, let repo):
return "/repos/\(owner)/\(repo)/subscription"
case .watchingRepo(let owner, let repo, _, _):
return "/user/subscriptions/\(owner)/\(repo)"
case .unWatchingRepo(let owner, let repo):
return "/repos/\(owner)/\(repo)/subscription"
//forks
case .userReposForks(_, _, _, let owner, let repo):
return "/repos/\(owner)/\(repo)/forks"
case .createFork(let owner, let repo):
return "/repos/\(owner)/\(repo)/forks"
}
}
public var method: Moya.Method {
switch self {
//url
case .gerUrl:
return .get
case .postUrl:
return .post
case .headtUrl:
return .head
case .putUrl:
return .put
case .patchUrl:
return .patch
case .deleteUrl:
return .delete
case .traceUrl:
return .trace
case .connectUrl:
return .connect
case .updateUserInfo:
return .patch
//user email
case .addEmail:
return .post
case .delEmail:
return .delete
//user followers
case .follow(_):
return .put
case .unfollow(_):
return .delete
//starring
case .starRepo(_, _):
return .put
case .unstarRepo(_, _):
return .delete
case .markRepoNotificationsAsRead:
return .put
case .markNotificationsAsRead:
return .put
//watching
case .watchingRepo:
return .put
case .unWatchingRepo:
return .delete
case .createFork:
return .post
default:
return .get
}
}
public var parameters: [String: Any]? {
switch self {
//follower
case .userFollowers(let page, let perpage, _):
return [
"page": page as AnyObject,
"per_page": perpage as AnyObject
]
case .userFollowing(let page, let perpage, _):
return [
"page": page as AnyObject,
"per_page": perpage as AnyObject
]
case .updateUserInfo(let name, let email, let blog, let company, let location, let hireable, let bio):
return [
"name": name as AnyObject,
"email": email as AnyObject,
"blog": blog as AnyObject,
"company": company as AnyObject,
"location": location as AnyObject,
"hireable": hireable as AnyObject,
"bio": bio as AnyObject
]
case .allUsers(let page, let perpage):
return [
"page": page as AnyObject,
"per_page": perpage as AnyObject
]
case .myRepos(let page, let perpage, let type, let sort, let direction):
return [
"page": page as AnyObject,
"per_page": perpage as AnyObject,
"type": type as AnyObject,
"sort": sort as AnyObject,
"direction": direction as AnyObject
]
case .userRepos(_, let page, let perpage, let type, let sort, let direction):
return [
"page": page as AnyObject,
"per_page": perpage as AnyObject,
"type": type as AnyObject,
"sort": sort as AnyObject,
"direction": direction as AnyObject
]
case .orgRepos(let type, _):
return [
"type": type as AnyObject
]
case .pubRepos(let page, let perpage):
return [
"page": page as AnyObject,
"per_page": perpage as AnyObject
]
//starring
case .userStarredRepos(_, let sort, let direction):
return [
"sort": sort as AnyObject,
"direction": direction as AnyObject
]
case .myStarredRepos( let page, let perpage, let sort, let direction):
return [
"sort": sort as AnyObject,
"direction": direction as AnyObject,
"page": page as AnyObject,
"per_page": perpage as AnyObject
]
case .allMyStarredRepos(let sort, let direction):
return [
"sort": sort as AnyObject,
"direction": direction as AnyObject,
]
//notification
case .myNotifications(let page, let perpage, let all, let participating):
return [
"all": all as AnyObject,
"participating": participating as AnyObject,
"page": page as AnyObject,
"per_page": perpage as AnyObject
]
case .repoNotifications(_, _, let all, let participating):
return [
"all": all as AnyObject,
"participating": participating as AnyObject
]
case .markNotificationsAsRead(let last_read_at):
return [
"last_read_at": last_read_at as AnyObject
]
case .markRepoNotificationsAsRead(_, _, let last_read_at):
return [
"last_read_at": last_read_at as AnyObject
]
//watching
case .repoWatchers(let page, let perpage, _, _):
return [
"page": page as AnyObject,
"per_page": perpage as AnyObject
]
case .userWatchedRepos(let page, let perpage, _):
return [
"page": page as AnyObject,
"per_page": perpage as AnyObject
]
case .myWatchedRepos(let page, let perpage):
return [
"page": page as AnyObject,
"per_page": perpage as AnyObject
]
// case WatchingRepo(_,_,let subscribed,let ignored):
// return [
// "subscribed":subscribed,
// "ignored":ignored
// ]
//forks
case .userReposForks(let page, let perpage, let sort, _, _):
return [
"page": page as AnyObject,
"per_page": perpage as AnyObject,
"sort": sort as AnyObject
]
default:
return nil
}
}
public var task: Task {
let encoding: ParameterEncoding
switch self.method {
case .post:
encoding = JSONEncoding.default
default:
encoding = URLEncoding.default
}
if let requestParameters = parameters {
return .requestParameters(parameters: requestParameters, encoding: encoding)
}
return .requestPlain
}
//Any target you want to hit must provide some non-nil NSData that represents a sample response. This can be used later for tests or for providing offline support for developers. This should depend on self.
public var sampleData: Data {
switch self {
case .myInfo:
return "get user info.".data(using: String.Encoding.utf8)!
case .myRepos:
return "get user repos.".data(using: String.Encoding.utf8)!
default :
return "default".data(using: String.Encoding.utf8)!
}
}
}
// MARK: - Provider support
public extension String {
var URLEscapedString: String {
return self.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlHostAllowed)!
}
}
public func url(_ route: TargetType) -> String {
print("api:\(route.baseURL.appendingPathComponent(route.path).absoluteString)")
return route.baseURL.appendingPathComponent(route.path).absoluteString
}
================================================
FILE: BeeFun/BeeFun/SystemManager/Network/IdentityAndTrust.swift
================================================
//
// IdentityAndTrust.swift
// BeeFun
//
// Created by 翁恒丛 on 2018/6/19.
// Copyright © 2018年 JungleSong. All rights reserved.
//
import UIKit
/// 定义一个结构体,存储认证相关信息
struct IdentityAndTrust {
var identityRef: SecIdentity
var trust: SecTrust
var certArray: AnyObject
static func extractIdentity(certificate path: String, type: String, password: String) -> IdentityAndTrust {
var identityAndTrust: IdentityAndTrust?
var securityError: OSStatus = errSecSuccess
let path: String = Bundle.main.path(forResource: path, ofType: type)!
let PKCS12Data = NSData(contentsOfFile: path)!
let key: NSString = kSecImportExportPassphrase as NSString
let options: NSDictionary = [key: password] //客户端证书密码
//create variable for holding security information
//var privateKeyRef: SecKeyRef? = nil
var items: CFArray?
securityError = SecPKCS12Import(PKCS12Data, options, &items)
if securityError == errSecSuccess {
let certItemsArray = items as? [[String: AnyObject]]
let dict: AnyObject? = certItemsArray?.first as AnyObject?
if let certEntry: Dictionary = dict as? Dictionary {
// grab the identity
let identityPointer: AnyObject? = certEntry["identity"]
let secIdentityRef = identityPointer as! SecIdentity
print("\(String(describing: identityPointer)) :::: \(secIdentityRef)")
// grab the trust
let trustPointer: AnyObject? = certEntry["trust"]
let trustRef = trustPointer as! SecTrust
print("\(String(describing: trustPointer)) :::: \(trustRef)")
// grab the cert
let chainPointer: AnyObject? = certEntry["chain"]
identityAndTrust = IdentityAndTrust(identityRef: secIdentityRef,
trust: trustRef, certArray: chainPointer!)
}
}
return identityAndTrust!
}
}
================================================
FILE: BeeFun/BeeFun/SystemManager/Network/IssueAPI.swift
================================================
//
// IssueAPI.swift
// BeeFun
//
// Created by WengHengcong on 2017/4/14.
// Copyright © 2017年 JungleSong. All rights reserved.
//
import UIKit
import Foundation
import Moya
import Alamofire
import ObjectMapper
class InsideIssueProvider: MoyaProvider where Target: TargetType {
override init(endpointClosure: @escaping (Target) -> Endpoint, requestClosure: @escaping (Endpoint, @escaping MoyaProvider.RequestResultClosure) -> Void, stubClosure: @escaping (Target) -> StubBehavior, callbackQueue: DispatchQueue?, manager: Manager, plugins: [PluginType], trackInflights: Bool) {
super.init(endpointClosure: endpointClosure, requestClosure: requestClosure, stubClosure: stubClosure, callbackQueue: callbackQueue, manager: manager, plugins: plugins, trackInflights: trackInflights)
}
}
struct IssueProvider {
fileprivate static var endpointsClosure = { (target: IssueAPI) -> Endpoint in
var endpoint: Endpoint = Endpoint(url: url(target), sampleResponseClosure: {.networkResponse(200, target.sampleData)}, method: target.method, task: target.task, httpHeaderFields: target.headers)
return endpoint
}
static func stubBehaviour(_: IssueAPI) -> Moya.StubBehavior {
return .never
}
static func DefaultProvider() -> InsideIssueProvider {
return InsideIssueProvider(endpointClosure: endpointsClosure, requestClosure: MoyaProvider.defaultRequestMapping, stubClosure: MoyaProvider.neverStub, callbackQueue: DispatchQueue.main, manager: Alamofire.SessionManager.default, plugins: [], trackInflights: false)
}
fileprivate struct SharedProvider {
static var instance = IssueProvider.DefaultProvider()
}
static var sharedProvider: InsideIssueProvider {
get {
return SharedProvider.instance
}
set (newSharedProvider) {
SharedProvider.instance = newSharedProvider
}
}
}
/// Issue https://developer.github.com/v3/issues/
///
/// - allIssues: List all issues assigned to the authenticated user across all visible repositories including owned repositories, member repositories, and organization repositories
/// - myIssues: List all issues across owned and member repositories assigned to the authenticated user
/// - orgIssues: List all issues for a given organization assigned to the authenticated user
/// - repoIssues: List issues for a repository
/*
{
"page": page
"per_page"
milestone integer or string
If an integer is passed, it should refer to a milestone by its number field. If the string * is passed, issues with any milestone are accepted. If the string none is passed, issues without milestones are returned.
state string
Indicates the state of the issues to return. Can be either open, closed, or all. Default: open
assignee string
Can be the name of a user. Pass in none for issues with no assigned user, and * for issues assigned to any user.
creator string
The user that created the issue.
mentioned string
A user that's mentioned in the issue.
labels string
A list of comma separated label names. Example: bug,ui,@high
sort string
What to sort results by. Can be either created, updated, comments. Default: created
direction string
The direction of the sort. Can be either asc or desc. Default: desc
since string
Only issues updated at or after this time are returned. This is a timestamp in ISO 8601 format: YYYY-MM-DDTHH:MM:SSZ.
}
*/
/// - repoSigleIssue: Get a single issue
/// - createIssue: Create an issue
/*
{
"title": "Found a bug",
"body": "I'm having a problem with this.",
"assignees": [
"octocat"
],
"milestone": 1,
"labels": [
"bug"
]
}
*/
/// - editIssue: Edit an issue
/// - lockIssue: Lock an issue
/// - unlockIssue: Unlock an issue
public enum IssueAPI {
case allIssues(page:Int, perpage:Int, filter:String, state:String, labels:String, sort:String, direction:String)
case myIssues(page:Int, perpage:Int, filter:String, state:String, labels:String, sort:String, direction:String)
case orgIssues(page:Int, perpage:Int, organization:String, filter:String, state:String, labels:String, sort:String, direction:String)
case repoIssues(owner:String, repo:String, para: [String: Any])
case repoSigleIssue(owner:String, repo:String, number:Int)
case createIssue(owner:String, repo:String, body: [String: Any])
case editIssue(owner:String, repo:String, number:Int, title:String, body:String, assignee:String, milestone:Int, labels:String)
case lockIssue(owner:String, repo:String, number:Int)
case unlockIssue(owner:String, repo:String, number:Int)
}
extension IssueAPI: TargetType {
public var headers: [String : String]? {
var header = ["User-Agent": "BeeFunMac","Authorization": AppToken.shared.access_token ?? "", "timeoutInterval": "15.0", "Accept": "application/vnd.github.v3.star+json"]
switch self {
default:
header = ["User-Agent": "BeeFunMac","Authorization": AppToken.shared.access_token ?? "", "timeoutInterval": "15.0"]
return header
}
}
public var parameterEncoding: ParameterEncoding {
return Alamofire.ParameterEncoding.self as! ParameterEncoding
}
public var baseURL: URL {
switch self {
default:
return URL(string: "https://api.github.com")!
}
}
public var path: String {
switch self {
//issue
case .allIssues:
return "/issues"
case .myIssues:
return "/user/issues"
case .orgIssues(_, _, let organization, _, _, _, _, _):
return "/orgs/\(organization)/issues"
case .repoIssues(let owner, let repo, _):
return "/repos/\(owner)/\(repo)/issues"
case .repoSigleIssue(let owner, let repo, let number):
return "/repos/\(owner)/\(repo)/issues/\(number)"
case .createIssue(let owner, let repo, _):
return "/repos/\(owner)/\(repo)/issues"
case .editIssue(let owner, let repo, let number, _, _, _, _, _):
return "/repos/\(owner)/\(repo)/issues/\(number)"
case .lockIssue(let owner, let repo, let number):
return "/repos/\(owner)/\(repo)/issues/\(number)/lock"
case .unlockIssue(let owner, let repo, let number):
return "/repos/\(owner)/\(repo)/issues/\(number)/lock"
}
}
public var method: Moya.Method {
switch self {
case .createIssue(_, _, _):
return .post
case .editIssue(_, _, _, _, _, _, _, _):
return .patch
case .lockIssue(_, _, _):
return .put
case .unlockIssue(_, _, _):
return .delete
default:
return .get
}
}
public var parameters: [String : Any]? {
switch self {
case .allIssues(let page, let perpage, let filter, let state, let labels, let sort, let direction):
return [
"page": page as AnyObject,
"per_page": perpage as AnyObject,
"filter": filter as AnyObject,
"state": state as AnyObject,
"labels": labels as AnyObject,
"sort": sort as AnyObject,
"direction": direction as AnyObject
]
case .myIssues(let page, let perpage, let filter, let state, let labels, let sort, let direction):
return [
"page": page as AnyObject,
"per_page": perpage as AnyObject,
"filter": filter as AnyObject,
"state": state as AnyObject,
"labels": labels as AnyObject,
"sort": sort as AnyObject,
"direction": direction as AnyObject
]
case .orgIssues(let page, let perpage, _, let filter, let state, let labels, let sort, let direction):
return [
"page": page as AnyObject,
"per_page": perpage as AnyObject,
"filter": filter as AnyObject,
"state": state as AnyObject,
"labels": labels as AnyObject,
"sort": sort as AnyObject,
"direction": direction as AnyObject
]
case .repoIssues(_, _, let para):
return para
case .createIssue(_, _, let body):
return body
case .editIssue(_, _, _, let title, let body, let assignee, let milestone, let labels):
return [
"title": title as AnyObject,
"body": body as AnyObject,
"assignee": assignee as AnyObject,
"milestone": milestone as AnyObject,
"labels": labels as AnyObject
]
default:
return nil
}
}
public var task: Task {
let encoding: ParameterEncoding
switch self.method {
case .post:
encoding = JSONEncoding.default
default:
encoding = URLEncoding.default
}
if let requestParameters = parameters {
return .requestParameters(parameters: requestParameters, encoding: encoding)
}
return .requestPlain
}
//Any target you want to hit must provide some non-nil NSData that represents a sample response. This can be used later for tests or for providing offline support for developers. This should depend on self.
public var sampleData: Data {
switch self {
default :
return "default".data(using: String.Encoding.utf8)!
}
}
}
================================================
FILE: BeeFun/BeeFun/SystemManager/Network/LanguageManager.swift
================================================
//
// LanguageManager.swift
// BeeFun
//
// Created by WengHengcong on 11/07/2017.
// Copyright © 2017 JungleSong. All rights reserved.
//
import UIKit
import Kanna
import Alamofire
import Moya
/// 语言生成器
class LanguageManager {
static let shared = LanguageManager()
func generateLanguage() -> URL {
let urlStr = "https://github.com/trending"
guard let trendingURL = URL(string: urlStr) else {
print("Error: \(urlStr) doesn't seem to be a valid URL")
let defaultURL = URL(string: "https://github.com/trending")
return defaultURL!
}
return trendingURL
}
func requestForLanguage() {
var languageArr: [String]? = []
let trendingURL = generateLanguage()
var request = URLRequest(url: trendingURL)
request.httpMethod = "get"
request.setValue("BeeFun", forHTTPHeaderField: "User-Agent")
request.setValue(AppToken.shared.access_token ?? "", forHTTPHeaderField: "Authorization")
Alamofire.request(request).responseString(completionHandler: { (response) in
switch response.result {
case .success:
if let htmlSourceStirng = response.result.value {
do {
let doc = try HTML(html: htmlSourceStirng, encoding: .utf8)
for repo in doc.xpath("//div[@class='select-menu js-menu-container js-select-menu']/div/div/div/div/a") {
let repoStr = repo.content!
let language = repoStr.trimmed
if languageArr != nil {
languageArr?.append(language)
}
}
DispatchQueue.main.async {
let nsArr = NSArray(array: languageArr!)
let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true) as NSArray
if let documentDirectory = paths[0] as? String {
let path = documentDirectory.appending("/lan.plist")
let fail = nsArr.write(toFile: path, atomically: true)
if fail {
}
}
}
} catch {
}
}
case .failure:
break
}
})
}
}
================================================
FILE: BeeFun/BeeFun/SystemManager/Network/Response+ObjectMapper.swift
================================================
//
// Observable+ObjectMapper.swift
//
// Created by Ivan Bruel on 09/12/15.
// Copyright © 2015 Ivan Bruel. All rights reserved.
//
import Foundation
import Moya
import ObjectMapper
public extension Response {
/// Maps data received from the signal into an object which implements the Mappable protocol.
/// If the conversion fails, the signal errors.
public func mapObject(_ type: T.Type) throws -> T {
guard let object = Mapper().map(JSONObject: try mapJSON()) else {
throw MoyaError.jsonMapping(self)
}
return object
}
/// Maps data received from the signal into an array of objects which implement the Mappable
/// protocol.
/// If the conversion fails, the signal errors.
public func mapArray(_ type: T.Type) throws -> [T] {
guard let objects = Mapper().mapArray(JSONObject: try mapJSON()) else {
throw MoyaError.jsonMapping(self)
}
return objects
}
}
================================================
FILE: BeeFun/BeeFun/SystemManager/Network/SVGProcessor.swift
================================================
//
// SVGProcessor.swift
// BeeFun
//
// Created by WengHengcong on 04/07/2017.
// Copyright © 2017 JungleSong. All rights reserved.
//
import UIKit
import Kingfisher
/*
struct SVGProcessor: ImageProcessor {
let imgSize: CGSize?
init(size: CGSize? = CGSize(width:250, height:250)) {
imgSize = size
}
// `identifier` should be the same for processors with same properties/functionality
// It will be used when storing and retrieving the image to/from cache.
let identifier = "com.junglesong.beefun"
// Convert input data/image to target image and return it.
func process(item: ImageProcessItem, options: KingfisherOptionsInfo) -> Image? {
switch item {
case .image(let image):
//already an image
return image
case .data(let data):
return generateSVGImage(data: data, size: imgSize) ?? DefaultImageProcessor().process(item: item, options: options)
}
}
}
struct SVGCacheSerializer: CacheSerializer {
func data(with image: Image, original: Data?) -> Data? {
return original
}
func image(with data: Data, options: KingfisherOptionsInfo?) -> Image? {
return generateSVGImage(data: data) ?? image(with: data, options: options)
}
}
func generateSVGImage(svgXml: String, size: CGSize? = CGSize(width:250, height:250)) -> UIImage?{
let frame = CGRect(x: 0, y: 0, width: size!.width, height: size!.height)
if let _ = svgXml.base64Decoded {
let svgLayer = SVGLayer(svgSource: svgXml)
svgLayer.frame = frame
return snapshotImage(for: svgLayer)
}
return nil
}
func generateSVGImage(data: Data, size: CGSize? = CGSize(width:250, height:250)) -> UIImage?{
let frame = CGRect(x: 0, y: 0, width: size!.width, height: size!.height)
if let svgString = String(data: data, encoding: .utf8){
let svgLayer = SVGLayer(svgSource: svgString)
svgLayer.frame = frame
return snapshotImage(for: svgLayer)
}
return nil
}
func snapshotImage(for layer: CALayer) -> UIImage? {
UIGraphicsBeginImageContextWithOptions(layer.bounds.size, false, UIScreen.main.scale)
guard let context = UIGraphicsGetCurrentContext() else { return nil }
layer.render(in: context)
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
}
*/
================================================
FILE: BeeFun/BeeFun/SystemManager/Network/SearchAPI.swift
================================================
//
// SearchAPI.swift
// BeeFun
//
// Created by WengHengcong on 09/09/2017.
// Copyright © 2017 JungleSong. All rights reserved.
//
import UIKit
import Foundation
import Moya
import Alamofire
import ObjectMapper
class InsideSearchProvider: MoyaProvider where Target: TargetType {
override init(endpointClosure: @escaping (Target) -> Endpoint, requestClosure: @escaping (Endpoint, @escaping MoyaProvider.RequestResultClosure) -> Void, stubClosure: @escaping (Target) -> StubBehavior, callbackQueue: DispatchQueue?, manager: Manager, plugins: [PluginType], trackInflights: Bool) {
super.init(endpointClosure: endpointClosure, requestClosure: requestClosure, stubClosure: stubClosure, callbackQueue: callbackQueue, manager: manager, plugins: plugins, trackInflights: trackInflights)
}
}
struct SearchProvider {
fileprivate static var endpointsClosure = { (target: SearchAPI) -> Endpoint in
var endpoint: Endpoint = Endpoint(url: url(target), sampleResponseClosure: {.networkResponse(200, target.sampleData)}, method: target.method, task: target.task, httpHeaderFields: target.headers)
return endpoint
}
static func stubBehaviour(_: SearchAPI) -> Moya.StubBehavior {
return .never
}
static func DefaultProvider() -> InsideSearchProvider {
return InsideSearchProvider(endpointClosure: endpointsClosure, requestClosure: MoyaProvider.defaultRequestMapping, stubClosure: MoyaProvider.neverStub, callbackQueue: DispatchQueue.main, manager: Alamofire.SessionManager.default, plugins: [], trackInflights: false)
}
fileprivate struct SharedProvider {
static var instance = SearchProvider.DefaultProvider()
}
static var sharedProvider: InsideSearchProvider {
get {
return SharedProvider.instance
}
set (newSharedProvider) {
SharedProvider.instance = newSharedProvider
}
}
}
public enum SearchAPI {
//search
case search(para: SESearchBaseModel)
case searchCommit(para: SESearchBaseModel)
}
extension SearchAPI: TargetType {
public var headers: [String: String]? {
var header = ["User-Agent": "BeeFunMac", "Authorization": AppToken.shared.access_token ?? "", "timeoutInterval": "15.0", "Accept": "application/vnd.github.v3.star+json"]
switch self {
case .searchCommit:
//https://developer.github.com/v3/search/#search-commits
header = ["User-Agent": "BeeFunMac", "Authorization": AppToken.shared.access_token ?? "", "timeoutInterval": "15.0", "Accept": "application/vnd.github.cloak-preview"]
default:
header = ["User-Agent": "BeeFunMac", "Authorization": AppToken.shared.access_token ?? "", "timeoutInterval": "15.0"]
return header
}
return header
}
public var parameterEncoding: ParameterEncoding {
return Alamofire.ParameterEncoding.self as! ParameterEncoding
}
public var baseURL: URL {
switch self {
default:
return URL(string: "https://api.github.com/search")!
}
}
public var path: String {
switch self {
//search
case .search(let para):
return "/\(para.requestUrl)"
case .searchCommit(let para):
return "/\(para.requestUrl)"
}
}
public var method: Moya.Method {
switch self {
default:
return .get
}
}
public var parameters: [String: Any]? {
switch self {
case .search(let para):
return [
"q": para.q as AnyObject,
"sort": para.sort as AnyObject,
"order": para.order as AnyObject,
"page": para.page as AnyObject,
"per_page": para.perPage as AnyObject
]
case .searchCommit(let para):
return [
"q": para.q as AnyObject,
"sort": para.sort as AnyObject,
"order": para.order as AnyObject,
"page": para.page as AnyObject,
"per_page": para.perPage as AnyObject
]
}
}
public var task: Task {
let encoding: ParameterEncoding
switch self.method {
case .post:
encoding = JSONEncoding.default
default:
encoding = URLEncoding.default
}
if let requestParameters = parameters {
return .requestParameters(parameters: requestParameters, encoding: encoding)
}
return .requestPlain
}
//Any target you want to hit must provide some non-nil NSData that represents a sample response. This can be used later for tests or for providing offline support for developers. This should depend on self.
public var sampleData: Data {
switch self {
default :
return "default".data(using: String.Encoding.utf8)!
}
}
}
================================================
FILE: BeeFun/BeeFun/SystemManager/Network/TrendingManager.swift
================================================
//
// TrendingManager.swift
// BeeFun
//
// Created by WengHengcong on 30/06/2017.
// Copyright © 2017 JungleSong. All rights reserved.
//
import UIKit
import Kanna
import Alamofire
import Moya
typealias TrendingRepositoriesDone = ((_ repos: [ObjRepos]) -> Void)?
typealias TrendingDevelopersDone = ((_ repos: [ObjUser]) -> Void)?
typealias TrendingShowcasessDone = ((_ repos: [ObjShowcase]) -> Void)?
typealias TrendingShowcasessDetailDone = ((_ repos: [ObjRepos]) -> Void)?
/// 参考: https://www.raywenderlich.com/14172/how-to-parse-html-on-ios
class TrendingManager {
static let shared = TrendingManager()
// MARK: - Trending Reops
func generateTrendingRepositoriesUrl(since: String, language: String) -> URL {
//https://github.com/trending?since=weekly
//https://github.com/trending/java?since=weekly
var urlStr = "https://github.com/trending"
if !since.isEmpty && !language.isEmpty {
if language.lowercased() == "all".localized {
urlStr = String(format: "https://github.com/trending?since=%@", since.lowercased())
} else {
urlStr = String(format: "https://github.com/trending/%@?since=%@", language.lowercased(), since.lowercased())
}
}
guard let trendingURL = URL(string: urlStr) else {
print("Error: \(urlStr) doesn't seem to be a valid URL")
let defaultURL = URL(string: "https://github.com/trending")
return defaultURL!
}
return trendingURL
}
func requestForTrendingRepositories(since: String, language: String, done: TrendingRepositoriesDone) {
let trendingURL = generateTrendingRepositoriesUrl(since: since, language: language)
var request = URLRequest(url: trendingURL)
request.httpMethod = "get"
// request.setValue("BeeFun", forHTTPHeaderField: "User-Agent")
// request.setValue(AppToken.shared.access_token ?? "", forHTTPHeaderField: "Authorization")
Alamofire.request(request).responseString(completionHandler: { (response) in
switch response.result {
case .success:
if let htmlSourceStirng = response.result.value {
do {
//............
let doc = try HTML(html: htmlSourceStirng, encoding: .utf8)
var reposArr: [ObjRepos] = []
for repo in doc.xpath("//ol[@class='repo-list']/li") {
let repoStr = repo.content!
let orginArr = repoStr.split("\n")
var itemArr: [String] = []
for value in orginArr {
let trimmedValue = value.trimmed
if trimmedValue != "Star" && trimmedValue != "Unstar" && trimmedValue != "Built by" {
itemArr.append(trimmedValue)
}
}
let obj = ObjRepos()
//owner name/ repo name
obj.full_name = itemArr[0]
let owner = ObjUser()
owner.login = obj.full_name?.split("/")[0].trimmed
obj.owner = owner
obj.name = obj.full_name?.split("/")[1].trimmed
//0、1 默认未name/desc
if itemArr.count == 6 {
/*
- 0 : "wearehive / project-guidelines"
- 1 : "A set of best practices for JavaScript projects"
- 2 : "JavaScript"
- 3 : "2,550"
- 4 : "132"
- 5 : "2,033 stars today"
*/
obj.cdescription = itemArr[1]
obj.language = itemArr[2]
obj.trending_star_text = itemArr[3]
obj.trending_fork_text = itemArr[4]
obj.trending_star_interval_text = itemArr[5]
} else if itemArr.count == 5 {
obj.cdescription = itemArr[1]
if itemArr[2].isOnlyNumeric {
/*
- 2 : "929"
- 3 : "35"
- 4 : "298 stars today"
*/
obj.trending_star_text = itemArr[2]
if itemArr[3].isOnlyNumeric {
obj.trending_fork_text = itemArr[3]
}
if itemArr[4].contains("star") {
obj.trending_star_interval_text = itemArr[4]
}
} else {
/*
- 2 : " MQL4"
- 3 : " 34"
- 4 : " 2"
*/
obj.language = itemArr[2]
if itemArr[3].isOnlyNumeric {
obj.trending_star_text = itemArr[3]
}
if itemArr[4].isOnlyNumeric {
obj.trending_fork_text = itemArr[4]
}
}
} else if itemArr.count == 4 {
/*
- 2 : " MQL4"
- 3 : " 4"
or
- 2 : " 55"
- 3 : " 4"
or
- 2 : " 4"
- 3 : " 98 stars today"
or
- 0 : "breakermind / Mql4"
- 1 : "MQL4"
- 2 : "7"
- 3 : "11"
*/
if itemArr[1].lowercased() == language.lowercased() {
obj.language = itemArr[1]
}
if itemArr[2].isOnlyNumeric {
obj.trending_star_text = itemArr[2]
if itemArr[3].contains("star") {
obj.trending_star_interval_text = itemArr[3]
} else if itemArr[3].isOnlyNumeric {
obj.trending_fork_text = itemArr[3]
}
} else {
obj.language = itemArr[2]
if itemArr[3].isOnlyNumeric {
obj.trending_star_text = itemArr[3]
}
}
} else if itemArr.count == 3 {
/*
- 0 : "Lucas170 / Chapter-13-All-Files"
- 1 : "MQL4"
- 2 : "1"
or
- 0 : "Lucas170 / Chapter-13-All-Files"
- 1 : "desc"
- 2 : "1"
or
- 0 : "Lucas170 / Chapter-13-All-Files"
- 1 : "5"
- 2 : "1"
or
- 0 : "Lucas170 / Chapter-13-All-Files"
- 1 : "5"
- 2 : "1 star today"
*/
if itemArr[1].lowercased() == language.lowercased() {
obj.language = itemArr[1]
obj.trending_star_text = itemArr[2]
} else if itemArr[1].isOnlyNumeric {
obj.trending_star_text = itemArr[1]
if itemArr[2].isOnlyNumeric {
obj.trending_fork_text = itemArr[2]
} else if itemArr[3].contains("star") {
obj.trending_star_interval_text = itemArr[2]
}
} else {
obj.cdescription = itemArr[1]
obj.trending_star_text = itemArr[2]
}
}
reposArr.append(obj)
}
DispatchQueue.main.async {
if let doneCom = done {
doneCom(reposArr)
}
}
//............
} catch {
}
}
case .failure:
break
}
})
}
// MARK: - Trending Developer
func generateTrendingDeveloperUrl(since: String, language: String) -> URL {
//https://github.com/trending/developers/java?since=weekly
//https://github.com/trending/developers?since=weekly
var urlStr = "https://github.com/trending/developers"
if !since.isEmpty && !language.isEmpty {
if language.lowercased() == "all".localized {
urlStr = String(format: "https://github.com/trending/developers?since=%@", since.lowercased())
} else {
urlStr = String(format: "https://github.com/trending/developers/%@?since=%@", language.lowercased(), since.lowercased())
}
}
guard let trendingURL = URL(string: urlStr) else {
print("Error: \(urlStr) doesn't seem to be a valid URL")
let defaultURL = URL(string: "https://github.com/trending")
return defaultURL!
}
return trendingURL
}
func requestForTrendingDeveloper(since: String, language: String, done: TrendingDevelopersDone) {
let trendingURL = generateTrendingDeveloperUrl(since: since, language: language)
var request = URLRequest(url: trendingURL)
request.httpMethod = "get"
// request.setValue("BeeFun", forHTTPHeaderField: "User-Agent")
// request.setValue(AppToken.shared.access_token ?? "", forHTTPHeaderField: "Authorization")
Alamofire.request(request).responseString(completionHandler: { (response) in
switch response.result {
case .success:
if let htmlSourceStirng = response.result.value {
// print("HTML : \(myHTMLString)")
do {
//............
let doc = try HTML(html: htmlSourceStirng, encoding: .utf8)
// print(doc.title)
// Search for nodes by CSS
// for link in doc.css("a, link") {
// print(link.text)
// print(link["href"])
// }
// Search for nodes by XPath
var userArr: [ObjUser] = []
for (index, user) in doc.xpath("//div[@class='explore-content']/ol/li").enumerated() {
let userStr = user.content!
let orginArr = userStr.split("\n")
var itemArr: [String] = []
for value in orginArr {
let trimmedValue = value.trimmed
if trimmedValue != "Follow" && trimmedValue != "Unfollow" {
itemArr.append(trimmedValue)
}
}
let obj = ObjUser()
/*
- 0 : " 3"
- 1 : " Bogdan-Lyashenko"
*/
obj.trend_repo_order = itemArr[0].int
obj.login = itemArr[1]
if itemArr.count == 5 {
/*
- 2 : " (Bohdan Liashenko)"
- 3 : " Under-the-hood-ReactJS"
- 4 : " Entire ReactJS code base explanation by visual block schemes (Stack+Fiber versions) "
*/
obj.trend_user_name = itemArr[2]
obj.trend_repo_name = itemArr[3]
obj.trend_repo_desc = itemArr[4]
} else if itemArr.count == 4 {
/*
- 2 : " Under-the-hood-ReactJS"
- 3 : " Entire ReactJS code base explanation by visual block schemes (Stack+Fiber versions) "
*/
obj.trend_repo_name = itemArr[2]
obj.trend_repo_desc = itemArr[3]
}
//头像
let imgXpath = String(format: "(//div[@class='d-flex']/div[@class='mx-2']/a/img)[%d]", index+1)
for img in user.xpath(imgXpath) {
if let avatarUrl = img["src"] {
obj.avatar_url = avatarUrl
}
}
userArr.append(obj)
}
DispatchQueue.main.async {
if let doneCom = done {
doneCom(userArr)
}
}
//............
} catch {
}
}
case .failure:
break
}
})
}
// MARK: - Trending Showcase
func generateTrendingShowcaseUrl(page: Int) -> URL {
//https://github.com/showcases
//https://github.com/showcases?page=2
var urlStr = "https://github.com/showcases"
if page > 1 {
urlStr = String(format: "https://github.com/showcases?page=%d", page)
} else {
urlStr = "https://github.com/showcases"
}
guard let trendingURL = URL(string: urlStr) else {
print("Error: \(urlStr) doesn't seem to be a valid URL")
let defaultURL = URL(string: "https://github.com/trending")
return defaultURL!
}
return trendingURL
}
func requestForTrendingShowcase(page: Int, done: TrendingShowcasessDone) {
let trendingURL = generateTrendingShowcaseUrl(page: page)
var request = URLRequest(url: trendingURL)
request.httpMethod = "get"
request.setValue("BeeFun", forHTTPHeaderField: "User-Agent")
request.setValue(AppToken.shared.access_token ?? "", forHTTPHeaderField: "Authorization")
Alamofire.request(request).responseString(completionHandler: { (response) in
switch response.result {
case .success:
if let htmlSourceStirng = response.result.value {
do {
let doc = try HTML(html: htmlSourceStirng, encoding: .utf8)
var caseArr: [ObjShowcase] = []
for (_, showcase) in doc.xpath("//ul[@class='exploregrid gutter']/li").enumerated() {
let userStr = showcase.content!
let itemArr = userStr.split("\n")
let obj = ObjShowcase()
if itemArr.count >= 4 {
obj.name = itemArr[0].trimmed
obj.cdescription = itemArr[1].trimmed
obj.trend_repo_text = itemArr[2].trimmed
obj.trend_lan_text = itemArr[3].trimmed
}
//背景
let svgXpath = String(format: "//a/div[@class='exploregrid-item-header']")
for svgDiv in showcase.xpath(svgXpath) {
if let avatarUrl = svgDiv["style"] {
var base64Content = avatarUrl.replacing("background-image: url(data:image/svg+xml;base64,", with: "")
base64Content = base64Content.replacing(");", with: "")
obj.svgXml = base64Content
}
}
caseArr.append(obj)
}
DispatchQueue.main.async {
if let doneCom = done {
doneCom(caseArr)
}
}
} catch {
}
}
case .failure:
break
}
})
}
// MARK: - Trending Showcase Detail
func generateTrendingShowcaseDetailUrl(showcase: String) -> URL {
//https://github.com/showcases/web-accessibility
var urlStr = "https://github.com/showcases/swift"
if !showcase.isEmpty {
let showcaseTranser = showcase.trimmed.replacing(" ", with: "-")
urlStr = String(format: "https://github.com/showcases/%@", showcaseTranser)
} else {
urlStr = "https://github.com/showcases/swift"
}
guard let trendingURL = URL(string: urlStr) else {
print("Error: \(urlStr) doesn't seem to be a valid URL")
let defaultURL = URL(string: "https://github.com/trending")
return defaultURL!
}
return trendingURL
}
func requestForTrendingShowcaseDetail(showcase: String, done: TrendingShowcasessDetailDone) {
let trendingURL = generateTrendingShowcaseDetailUrl(showcase: showcase)
var request = URLRequest(url: trendingURL)
request.httpMethod = "get"
request.setValue("BeeFun", forHTTPHeaderField: "User-Agent")
request.setValue(AppToken.shared.access_token ?? "", forHTTPHeaderField: "Authorization")
Alamofire.request(request).responseString(completionHandler: { (response) in
switch response.result {
case .success:
if let htmlSourceStirng = response.result.value {
do {
let doc = try HTML(html: htmlSourceStirng, encoding: .utf8)
var reposArr: [ObjRepos] = []
for (index, repoLi) in doc.xpath("//ul[@class='repo-list showcase-page-repo-list']/li").enumerated() {
let userStr = repoLi.content!
let orginArr = userStr.split("\n")
var itemArr: [String] = []
for value in orginArr {
let trimmedValue = value.trimmed.lowercased()
if trimmedValue.contains("Starred".lowercased()) || trimmedValue.contains("people".lowercased()) || trimmedValue.contains("know".lowercased()) {
} else {
itemArr.append(value.trimmed)
}
}
let obj = ObjRepos()
obj.full_name = itemArr[0].trimmed
let owner = ObjUser()
owner.login = obj.full_name?.split("/")[0].trimmed
obj.owner = owner
obj.name = obj.full_name?.split("/")[1].trimmed
if itemArr.count == 6 {
/*
- 0 : " buunguyen / octotree"
- 1 : " Code tree for GitHub"
- 2 : " JavaScript"
- 3 : " 9,355"
- 4 : " 769"
- 5 : " Updated May 16, 2017"
*/
obj.cdescription = itemArr[1]
obj.language = itemArr[2]
obj.trending_star_text = itemArr[3]
obj.trending_fork_text = itemArr[4]
obj.trending_showcase_update_text = itemArr[5]
//头像
let imgXpath = String(format: "(//ul[@class='repo-list showcase-page-repo-list']/li/a/img)[%d]", index+1)
for img in doc.xpath(imgXpath) {
if let avatarUrl = img["src"] {
obj.owner?.avatar_url = avatarUrl
}
}
} else if itemArr.count == 5 {
/*
- 0 : " sindresorhus / notifier-for-github"
- 1 : " Browser extension that displays your GitHub notifications unread count. Available on Chrome, Firefox, Opera, Safari."
- 2 : " 233"
- 3 : " 21"
- 4 : " Updated Jun 9, 2017"
or
- 0 : " bitoiu / github-red-alert"
- 1 : " Changes the GitHub notification icon to red if you have unread participating notifications."
- 2 : " CoffeeScript"
- 3 : " 3"
- 4 : " Updated Oct 31, 2016"
*/
obj.cdescription = itemArr[1]
//无语言
if itemArr[2].trimmed.isOnlyNumeric {
obj.trending_star_text = itemArr[2]
obj.trending_fork_text = itemArr[3]
obj.trending_showcase_update_text = itemArr[4]
} else {
//有语言,只读star
obj.language = itemArr[2]
obj.trending_star_text = itemArr[3]
obj.trending_showcase_update_text = itemArr[4]
}
//头像
let imgXpath = String(format: "(//ul[@class='repo-list showcase-page-repo-list']/li/a/img)[%d]", index+1)
for img in doc.xpath(imgXpath) {
if let avatarUrl = img["src"] {
obj.owner?.avatar_url = avatarUrl
}
}
}
reposArr.append(obj)
}
DispatchQueue.main.async {
if let doneCom = done {
doneCom(reposArr)
}
}
} catch {
}
}
case .failure:
break
}
})
}
}
================================================
FILE: BeeFun/BeeFun/SystemManager/ProConfig/BFCommonString.swift
================================================
//
// ComonString.swift
// BeeFun
//
// Created by WengHengcong on 2017/3/9.
// Copyright © 2017年 JungleSong. All rights reserved.
//
public let kSignEmptySpace = " "
/// 省略号
public let kSignApostrophe = "..."
/// 登录提示
public let kLoginFirstTip = "Please login first".localized
/// 无数据提示
public let kNoDataFoundTip = "No Data Found".localized
/// 网络出错提示
public let kNetworkErrorTip = "Network error /(ㄒoㄒ)/~~".localized
/// 下拉刷新提示
public let kHeaderIdelTIP = "Pull down to refresh".localized
/// 下拉刷新提示
public let kHeaderPullTip = "Release to refresh".localized
/// 下拉中
public let kHeaderPullingTip = "Loading".localized+kSignApostrophe
/// 上拉加载无数据提示
public let kFooterIdleTip = "".localized
/// 上拉加载提示
public let kFooterLoadTip = "Load".localized+"More".localized+kSignApostrophe
/// 上拉加载无数据提示
public let kFooterLoadNoDataTip = "No More data".localized
public let kChineseLanguage = "zh-Hans"
public let kEnglishLanguage = "en"
public let kWatchingTip = "registers the user to receive notifications on new discussions".localized
public let kStaringTip = "lets users bookmark repositories.".localized
public let KForkingTip = "A fork is a copy of a repository.".localized
public let KMailSubject = "Suggestions or report bugs".localized
public let KMyIcloudEmail = "wenghengcong@icloud.com"
public let KSendEmailErrorTitle = "Could not send Email"
public let KSendEmailErrorContent = "Your device could not send e-mail. Please check e-mail configuration and try again."
public let kAliPayMe = "alipayqr://platformapi/startapp?saId=10000007&qrcode=HTTPS%3a%2f%2fQR.ALIPAY.COM%2fFKX02008UEOALIPOFQRDAF"
public let kAliPayPing = "alipayqr://platformapi/startapp?saId=10000007&qrcode=HTTPS%3a%2f%2fQR.ALIPAY.COM%2fFKX010935UVTHIGVFBSM2B"
================================================
FILE: BeeFun/BeeFun/SystemManager/ProConfig/BFNotificationName.swift
================================================
//
// DeviceCfg.swift
// BeeFun
//
// Created by wenghengcong on 16/1/3.
// Copyright © 2016年 JungleSong. All rights reserved.
//
extension Notification.Name {
public struct BeeFun {
public static let WillLogin = Notification.Name(rawValue: "com.luci.beefun.mac.willlogin")
public static let DidLogin = Notification.Name(rawValue: "com.luci.beefun.mac.didlogin")
/// 获取到oauth token
public static let GetOAuthToken = Notification.Name(rawValue: "com.luci.beefun.mac.gettoken")
/// 登录后,获取到用户信息
public static let GetUserInfo = Notification.Name(rawValue: "com.luci.beefun.mac.getuserinfo")
/// 用户操作改变了数据库
public static let databaseChanged = Notification.Name(rawValue: "com.luci.beefun.mac.databaseChanged")
/// 同步操作
public static let SyncStarRepoStart = Notification.Name(rawValue: "com.luci.beefun.mac.syncStarRepoStart")
public static let SyncStarRepoEnd = Notification.Name(rawValue: "com.luci.beefun.mac.syncStarRepoEnd")
public static let WillLogout = Notification.Name(rawValue: "com.luci.beefun.mac.willlogout")
public static let DidLogout = Notification.Name(rawValue: "com.luci.beefun.mac.didlogout")
public static let AddTag = Notification.Name(rawValue: "com.luci.beefun.mac.addtag")
public static let UpdateTag = Notification.Name(rawValue: "com.luci.beefun.mac.updatetag")
public static let DelTag = Notification.Name(rawValue: "com.luci.beefun.mac.deltag")
public static let RepoUpdateTag = Notification.Name(rawValue: "com.luci.beefun.mac.repoupdatetag")
/// Network reachablity
public static let NotReachable = Notification.Name(rawValue: "com.luci.beefun.mac.NotReachable")
public static let Unknown = Notification.Name(rawValue: "com.luci.beefun.mac.Unknown")
public static let ReachableAfterUnreachable = Notification.Name(rawValue: "com.luci.beefun.mac.ReachableAfterUnreachable")
public static let ReachableWiFi = Notification.Name(rawValue: "com.luci.beefun.mac.ReachableWiFi")
public static let ReachableCellular = Notification.Name(rawValue: "com.luci.beefun.mac.ReachableCellular")
public static let UnReachableAfterReachable = Notification.Name(rawValue: "com.luci.beefun.mac.UnReachableAfterReachable")
/// Star Action
public static let didStarRepo = Notification.Name(rawValue: "com.luci.beefun.mac.didStarRepo")
/// UnStar Action
public static let didUnStarRepo = Notification.Name(rawValue: "com.luci.beefun.mac.ddiUnStarRepo")
}
}
================================================
FILE: BeeFun/BeeFun/SystemManager/ProConfig/BFPlistResourcesKey.swift
================================================
//
// BFPlistStoreKey.swift
// BeeFun
//
// Created by WengHengcong on 09/09/2017.
// Copyright © 2017 JungleSong. All rights reserved.
//
public let kStoreHistoryRecordsKey = "kStoreHistoryRecordsKey"
================================================
FILE: BeeFun/BeeFun/SystemManager/ProConfig/BFStyleGuide.swift
================================================
//
// BFStyleGuide.swift
// BeeFun
//
// Created by wenghengcong on 16/1/6.
// Copyright © 2016年 JungleSong. All rights reserved.
//
import Foundation
import UIKit
class BFStyleGuide {
class func textFieldPlaceholderAttributes() -> [NSAttributedString.Key: Any] {
let font = UIFont.middleSizeSystemFont()
let color = UIColor.iOS11MidGray
return [
NSAttributedString.Key.font: font,
NSAttributedString.Key.foregroundColor: color
]
}
class func textFieldTextAttributes() -> [NSAttributedString.Key: Any] {
let font = UIFont.largeSizeSystemFont()
let color = UIColor.iOS11Black
return [
NSAttributedString.Key.font: font,
NSAttributedString.Key.foregroundColor: color
]
}
class func navTitleTextAttributes() -> [NSAttributedString.Key: Any] {
let font = UIFont.hugeSizeSystemFont()
let color = UIColor.iOS11White
return [
NSAttributedString.Key.font: font,
NSAttributedString.Key.foregroundColor: color
]
}
}
================================================
FILE: BeeFun/BeeFun/SystemManager/ProConfig/BFThirdLibKey.swift
================================================
//
// Key+Project.swift
// BeeFun
//
// Created by wenghengcong on 16/1/8.
// Copyright © 2016年 JungleSong. All rights reserved.
//
// MARK: - Apple https://developer.apple.com/library/archive/qa/qa1633/_index.html
public let AppleAppID = ""
public let SocialAppStore = "https://itunes.apple.com/app/id1393808664"
public let BeeFunAppStore = "itms-apps://itunes.apple.com/app/id1393808664"
public let AppBundleIdentifier = "com.luci.beefun.ios"
public let APNsAuthKeyID = ""
// MARK: - BeeFun,已经下线,后期补上
public let AppOfficeSite = "http://www.beefun.top"
public let AppOfficeShortSite = "www.beefun.top"
// MARK: - Github
public let GithubAppClientId = ""
public let GithubAppClientSecret = ""
public let GithubAppRedirectUrl = "beefunios://www.beefun.top"
//https://developer.github.com/apps/building-oauth-apps/understanding-scopes-for-oauth-apps/
public let GithubAppScope = "user,repo,notifications,gist,admin:repo_hook,admin:org_hook,admin:org"
// MARK: - 新浪
// MARK: 短链接服务
public let ShortSocialAppStore = "http://t.cn/RdxKhoY"
public let ShortSocailGithub = "http://t.cn/Rqvjd6W"
public let ShortOfficeWebsite = "http://t.cn/R0QpGhp"
// MARK: 微博
public let WeiboSDKAppKey = ""
public let WeiboSDKAppSecret = ""
// MARK: - 腾讯
// MARK: Bugly
public let TencentBuglyAppID = ""
// MARK: 微信
public let WeiXinSDKAppID = ""
public let WeiXinSDKAppSecret = ""
// MARK: 腾讯开发平台
public let TencentSDKAppID = ""
public let TencentSDKAppKey = ""
// MARK: - 阿里
// MARK: 友盟
public let UMengAppSecret = ""
public let SocailGithub = "https://github.com/wenghengcong/BeeFun-Pro"
// MARK: 钉钉
public let DingTalkSDKAppID = ""
public let DingTalkSDKAppSecret = ""
// MARK: - Share SDK
public let ShareSDKAppKey = ""
public let ShareSDKAppSecret = ""
// MARK: - 极光
// https://www.jiguang.cn/
public let JPushAppKey = ""
public let JPushAppSecret = ""
public let JPushChannel = "App Store"
// MARK: - 国外服务
// MARK:facebook
public let FackbookSDKAppID = ""
public let FackbookSDKAppSecret = ""
// MARK: twitter
public let TwitterSDKConsumerKey = ""
public let TwitterSDKConsumerSecret = ""
// MARK: linkedin
public let LinkedInSDKAppID = ""
public let LinkedInSDKAppSecret = ""
// MARK: - 有道云笔记
public let YDNoteSDKConsumerKey = ""
public let YDNoteSDKConsumerSecret = ""
================================================
FILE: BeeFun/BeeFun/SystemManager/ProConfig/BFUserDefaultManager.swift
================================================
//
// BFUserDefaultKey.swift
// BeeFun
//
// Created by WengHengcong on 2018/1/30.
// Copyright © 2018年 JungleSong. All rights reserved.
//
import UIKit
public class BFUserDefaultManager {
static let shared = BFUserDefaultManager()
fileprivate let userDefaults = UserDefaults.standard
// MARK: - Key
// MARK: 搜索记录
fileprivate let searchHistoryKey = "searchHistoryKey"
// MARK: - Private
fileprivate init() {
registerUserDefault()
}
fileprivate func registerUserDefault() {
}
// MARK: - Public for use
/// 搜索结果记录
var searchHistory: [String]? {
get {
return userDefaults.object(forKey: searchHistoryKey) as? [String]
}
set {
userDefaults.set(newValue, forKey: searchHistoryKey)
userDefaults.synchronize()
}
}
}
================================================
FILE: BeeFun/BeeFun/SystemManager/ProConfig/UIColor+Project.swift
================================================
//
// UIColor+Project.swift
// BeeFun
//
// Created by wenghengcong on 16/1/3.
// Copyright © 2016年 JungleSong. All rights reserved.
//
import UIKit
import Foundation
extension UIColor {
// MARK: - iOS 11 Gray scale
class var iOS11White: UIColor {
return UIColor.hex("ffffff", alpha: 1.0)
}
class var iOS11GrayLevel1: UIColor {
return UIColor.hex("efeff4", alpha: 1.0)
}
// MARK: GrayLevel2 = LightGray
class var iOS11GrayLevel2: UIColor {
return UIColor.hex("e5e5ea", alpha: 1.0)
}
class var iOS11LightGray: UIColor {
return UIColor.hex("e5e5ea", alpha: 1.0)
}
class var iOS11GrayLevel3: UIColor {
return UIColor.hex("d1d1d6", alpha: 1.0)
}
// MARK: GrayLevel4 = MidGray
class var iOS11GrayLevel4: UIColor {
return UIColor.hex("c7c7c7", alpha: 1.0)
}
class var iOS11MidGray: UIColor {
return UIColor.hex("c7c7c7", alpha: 1.0)
}
class var iOS11GrayLevel5: UIColor {
return UIColor.hex("8e8e93", alpha: 1.0)
}
class var iOS11Gray: UIColor {
return UIColor.hex("8e8e93", alpha: 1.0)
}
class var iOS11Black: UIColor {
//black
return UIColor.hex("000000", alpha: 1.0)
}
// MARK: - iOS 11 Spectrum
class var iOS11Red: UIColor {
return UIColor.hex("ff3b30", alpha: 1.0)
}
class var iOS11Orange: UIColor {
return UIColor.hex("ff9500", alpha: 1.0)
}
class var iOS11Yellow: UIColor {
return UIColor.hex("ffcc00", alpha: 1.0)
}
class var iOS11Green: UIColor {
return UIColor.hex("4cd964", alpha: 1.0)
}
class var iOS11TealBlue: UIColor {
return UIColor.hex("5ac8fa", alpha: 1.0)
}
class var iOS11Blue: UIColor {
return UIColor.hex("007aff", alpha: 1.0)
}
class var iOS11Purple: UIColor {
return UIColor.hex("5856d6", alpha: 1.0)
}
class var iOS11Pink: UIColor {
return UIColor.hex("ff2d55", alpha: 1.0)
}
// MARK: - BeeFun Color
class var bfTabBarTitleTextColor: UIColor {
//red
return UIColor.hex("d81e06", alpha: 1.0)
}
// MARK: label
class var bfLabelSubtitleTextColor: UIColor {
//black
return UIColor.hex("7b7b7b", alpha: 1.0)
}
// MARK: view
class var bfViewBackgroundColor: UIColor {
return UIColor.hex("f5f5f5", alpha: 1.0)
}
//line
class var bfLineBackgroundColor: UIColor {
return UIColor.hex("ceced2", alpha: 1.0)
}
class var bfRedColor: UIColor {
//red
return UIColor.hex("e31100", alpha: 1.0)
}
class var bfBlueColor: UIColor {
//red
return UIColor.hex("5677fc", alpha: 1.0)
}
}
================================================
FILE: BeeFun/BeeFun/SystemManager/ProConfig/UIFont+Project.swift
================================================
//
// UIFont+Project.swift
// BeeFun
//
// Created by wenghengcong on 16/1/3.
// Copyright © 2016年 JungleSong. All rights reserved.
//
import UIKit
extension UIFont {
//PingFang Light、Medium、Regular、Thin、Ultralight、Semibold
enum CPEFontSize: CGFloat {
case tinyFontSize = 10
case smallFontSize = 12
case middleFontSize = 14
case largeFontSize = 15
case hugeFontSize = 17
}
class func bfSystemFont(ofSize: CGFloat) -> UIFont {
if iOSVersion.iOS9Later {
return UIFont(name: "PingFang-SC-Regular", size: ofSize)!
}
return UIFont.systemFont(ofSize: ofSize)
}
class func bfBoldSystemFont(ofSize: CGFloat) -> UIFont {
if iOSVersion.iOS9Later {
return UIFont(name: "PingFang-SC-Medium", size: ofSize)!
}
return UIFont.systemFont(ofSize: ofSize)
}
// MARK: system font
class func tinySizeSystemFont() -> UIFont {
if iOSVersion.iOS9Later {
return UIFont(name: "PingFang-SC-Regular", size: CPEFontSize.tinyFontSize.rawValue)!
}
return UIFont.systemFont(ofSize: CPEFontSize.tinyFontSize.rawValue)
}
class func smallSizeSystemFont() -> UIFont {
if iOSVersion.iOS9Later {
return UIFont(name: "PingFang-SC-Regular", size: CPEFontSize.smallFontSize.rawValue)!
}
return UIFont.systemFont(ofSize: CPEFontSize.smallFontSize.rawValue)
}
class func middleSizeSystemFont() -> UIFont {
if iOSVersion.iOS9Later {
return UIFont(name: "PingFang-SC-Regular", size: CPEFontSize.middleFontSize.rawValue)!
}
return UIFont.systemFont(ofSize: CPEFontSize.middleFontSize.rawValue)
}
class func largeSizeSystemFont() -> UIFont {
if iOSVersion.iOS9Later {
return UIFont(name: "PingFang-SC-Regular", size: CPEFontSize.largeFontSize.rawValue)!
}
return UIFont.systemFont(ofSize: CPEFontSize.largeFontSize.rawValue)
}
class func hugeSizeSystemFont() -> UIFont {
if iOSVersion.iOS9Later {
return UIFont(name: "PingFang-SC-Regular", size: CPEFontSize.hugeFontSize.rawValue)!
}
return UIFont.systemFont(ofSize: CPEFontSize.hugeFontSize.rawValue)
}
// MARK: system bold font
class func tinySizeBoldSystemFont() -> UIFont {
if iOSVersion.iOS9Later {
return UIFont(name: "PingFang-SC-Medium", size: CPEFontSize.tinyFontSize.rawValue)!
}
return UIFont.boldSystemFont(ofSize: CPEFontSize.tinyFontSize.rawValue)
}
class func smallSizeBoldSystemFont() -> UIFont {
if iOSVersion.iOS9Later {
return UIFont(name: "PingFang-SC-Medium", size: CPEFontSize.smallFontSize.rawValue)!
}
return UIFont.boldSystemFont(ofSize: CPEFontSize.smallFontSize.rawValue)
}
class func middleSizeBoldSystemFont() -> UIFont {
if iOSVersion.iOS9Later {
return UIFont(name: "PingFang-SC-Medium", size: CPEFontSize.middleFontSize.rawValue)!
}
return UIFont.boldSystemFont(ofSize: CPEFontSize.middleFontSize.rawValue)
}
class func largeSizeBoldSystemFont() -> UIFont {
if iOSVersion.iOS9Later {
return UIFont(name: "PingFang-SC-Medium", size: CPEFontSize.largeFontSize.rawValue)!
}
return UIFont.boldSystemFont(ofSize: CPEFontSize.largeFontSize.rawValue)
}
class func hugeSizeBoldSystemFont() -> UIFont {
if iOSVersion.iOS9Later {
return UIFont(name: "PingFang-SC-Medium", size: CPEFontSize.hugeFontSize.rawValue)!
}
return UIFont.boldSystemFont(ofSize: CPEFontSize.hugeFontSize.rawValue)
}
}
================================================
FILE: BeeFun/BeeFun/SystemManager/Storage/BFDocument.swift
================================================
//
// BFDocument.swift
// BeeFun
//
// Created by WengHengcong on 2017/12/5.
// Copyright © 2017年 JungleSong. All rights reserved.
//
import UIKit
class BFDocument: UIDocument {
var data: NSData?
override func load(fromContents contents: Any, ofType typeName: String?) throws {
// Load your document from contents
if let validData: NSData = contents as? NSData {
self.data = validData.copy() as? NSData
}
}
override func contents(forType typeName: String) throws -> Any {
// Encode your document with an instance of NSData or NSFileWrapper
if self.data == nil {
self.data = NSData()
}
return self.data ?? NSData()
}
}
================================================
FILE: BeeFun/BeeFun/SystemManager/Storage/Manager/SQLConnection.swift
================================================
//
// SQLConnection.swift
// BeeFunMac
//
// Created by WengHengcong on 2017/12/28.
// Copyright © 2017年 LuCi. All rights reserved.
//
import SQLite
extension Connection {
public func exists(column: String, in table: String) throws -> Bool {
let stmt = try prepare("PRAGMA table_info(\(table))")
let columnNames = stmt.makeIterator().map { (row) -> String in
return row[1] as? String ?? ""
}
return columnNames.contains(where: { dbColumn -> Bool in
return dbColumn.caseInsensitiveCompare(column) == ComparisonResult.orderedSame
})
}
func tableExists(tableName: String) -> Bool {
var exist = false
do {
exist = try SQLManager.githubDb.scalar(
"SELECT EXISTS (SELECT * FROM sqlite_master WHERE type = 'table' AND name = ?)",
tableName
) as! Int64 > 0
} catch {
}
return exist
}
}
================================================
FILE: BeeFun/BeeFun/SystemManager/Storage/Manager/SQLHelper.swift
================================================
//
// SQLManagerHelper.swift
// BeeFun
//
// Created by WengHengcong on 23/05/2017.
// Copyright © 2017 JungleSong. All rights reserved.
//
import UIKit
import SQLite
/// sql order
///
/// - asc: 升序
/// - desc: 降序
enum SQLOrder {
case asc
case desc
}
struct SQLHelper {
static func SQLBlob(stringarray: [String]?) -> Blob {
let blob = NSKeyedArchiver.archivedData(withRootObject: stringarray ?? [String]() ).datatypeValue
return blob
}
static func SQLBlob(intarray: [Int]?) -> Blob {
let blob = NSKeyedArchiver.archivedData(withRootObject: intarray ?? [Int]() ).datatypeValue
return blob
}
static func stringArray(blob: Blob? ) -> [String] {
var array: [String] = []
if blob != nil {
let data = Data.fromDatatypeValue(blob!)
array = NSKeyedUnarchiver.unarchiveObject(with: data) as! [String]
}
return array
}
static func intArray(blob: Blob? ) -> [Int] {
var array: [Int] = []
if blob != nil {
let data = Data.fromDatatypeValue(blob!)
array = NSKeyedUnarchiver.unarchiveObject(with: data) as! [Int]
}
return array
}
}
================================================
FILE: BeeFun/BeeFun/SystemManager/Storage/Manager/SQLLists.swift
================================================
//
// SQLLists.swift
// BeeFun
//
// Created by WengHengcong on 02/06/2017.
// Copyright © 2017 JungleSong. All rights reserved.
//
import UIKit
class SQLLists {
}
================================================
FILE: BeeFun/BeeFun/SystemManager/Storage/Manager/SQLManager.swift
================================================
//
// SQLManager.swift
// BeeFun
//
// Created by WengHengcong on 19/05/2017.
// Copyright © 2017 JungleSong. All rights reserved.
//
import UIKit
import SQLite
enum SQLiteError: Error {
case connecttion
}
enum SQLiteAction: Int {
case insert
case update
case delete
case query
}
struct SQLManager {
static let githubDatabaseName = "github.sqlite3"
static func createAllTables() {
//建表
SQLStars.crateStarReposTable()
SQLTags.crateStarTagsTable()
}
static var githubDb: Connection = {
let sqlBridge = JSSQLiteSwiftBridge()
sqlBridge.dbName = githubDatabaseName
return sqlBridge.connection()
}()
static func checkDBValid() {
if let url = BFPathManager.shared.localDocumentURL(fileName: SQLManager.githubDatabaseName), !FileManager.default.fileExists(atPath: url.path) {
//无本地数据库,开始下载创建本地数据库
_ = SQLManager.githubDb
SQLManager.createAllTables()
} else if !self.checkTableExist(SQLStars.starTableName) || !self.checkTableExist(SQLTags.starTagsName) {
//有本地数据库,则重新下载最新数据
SQLStars.crateStarReposTable()
SQLManager.beginDownloadDataToDB()
}
}
static func checkTableExist(_ tableName: String) -> Bool {
return SQLManager.githubDb.tableExists(tableName: tableName)
}
static func beginDownloadDataToDB() {
/// 首次启动同步网络数据
}
}
================================================
FILE: BeeFun/BeeFun/SystemManager/Storage/Manager/SQLStar+Delete.swift
================================================
//
// SQLStar+Delete.swift
// BeeFun
//
// Created by WengHengcong on 2018/2/1.
// Copyright © 2018年 LuCi. All rights reserved.
//
import SQLite
extension SQLStars {
// MARK: - 针对所有repos
/// 针对所有repos, 删除tag
static func delete(tag: ObjTag) {
var changeArr: [ObjRepos] = []
let findTagStar = SQLStars.findStarRepos(tag: tag)
if findTagStar != nil && !findTagStar!.isEmpty {
for item in findTagStar! {
if let repotags = item.star_tags {
if repotags.contains(tag.name!) {
item.star_tags?.removeAll(tag.name!)
changeArr.append(item)
}
}
}
}
if !changeArr.isEmpty {
SQLStars.insert(repos: changeArr)
}
}
// MARK: - 针对单条repos数据
/// 针对单条repos, 删除tag字符串对象
static func delete(repo: ObjRepos, tagObj: ObjTag) {
if tagObj.name!.isEmpty || repo.id == nil {
return
}
self.delete(repo: repo, tag: tagObj.name!)
}
/// 针对单条repos, 删除tag字符串
static func delete(repo: ObjRepos, tag: String) {
if tag.isEmpty || repo.id == nil {
return
}
do {
if let needUpdateId = repo.id {
if let repotags = repo.star_tags {
var afterDel = repotags
//删除tag后的tags
if afterDel.contains(tag) {
afterDel.removeAll(tag)
}
if check(id: needUpdateId) {
let filterRow = starReposTable.filter(repoId == needUpdateId)
_ = try SQLManager.githubDb.run(filterRow.update(star_tags <- SQLHelper.SQLBlob(stringarray: afterDel)))
} else {
_ = try SQLManager.githubDb.run(starReposTable.insert(SQLStarReposSetters(repos: repo, action: .insert)))
}
}
}
} catch {
print(error)
}
}
// MARK: - 根据id删除repo
static func delete(id: Int) {
let query = starReposTable.filter(repoId == id)
do {
if try SQLManager.githubDb.run(query.delete()) > 0 {
print("deleted id:\(id)")
} else {
print("not found id:\(id)")
}
} catch {
print("delete failed: \(error)")
}
}
}
================================================
FILE: BeeFun/BeeFun/SystemManager/Storage/Manager/SQLStar+Update.swift
================================================
//
// SQLStar+Update.swift
// BeeFun
//
// Created by WengHengcong on 2018/2/1.
// Copyright © 2018年 LuCi. All rights reserved.
//
import SQLite
extension SQLStars {
// MARK: - 插入整条repo数据
/// 插入一个repos数组
static func insert(repos: [ObjRepos]) {
assert(!repos.isEmpty)
do {
try SQLManager.githubDb.transaction {
for repo in repos {
insert(repo: repo)
}
}
} catch {
}
}
/// 插入一个repos对象
static func insert(repo: ObjRepos) {
do {
assert(repo.id != nil )
assert(repo.owner?.id != nil)
if check(id: repo.id!) {
let filterRow = starReposTable.filter(repoId == repo.id!)
_ = try SQLManager.githubDb.run(filterRow.update(SQLStarReposSetters(repos: repo, action: .update)))
// print("stars table updated id: \(repoId)")
} else {
_ = try SQLManager.githubDb.run(starReposTable.insert(SQLStarReposSetters(repos: repo, action: .insert)))
// print("stars table inserted id: \(repoId)")
}
} catch {
print("stars table insertion failed: \(error)")
}
}
// MARK: - 针对所有Repos更新tag
/// 针对所有Repos,从旧tag更新到新tag
static func update(orginal from: ObjTag, change to: ObjTag) {
do {
let all = Array(try SQLManager.githubDb.prepare(starReposTable))
for item in all {
let tags = SQLHelper.stringArray(blob: item[star_tags])
if tags.contains(from.name!) {
let obj = convertObjRepos(item: item)
let oriIndex = obj.star_tags!.index(of: from.name!)
obj.star_tags![oriIndex!] = to.name!
if let eachId = obj.id {
if check(id: eachId) {
let filterRow = starReposTable.filter(repoId == eachId)
_ = try SQLManager.githubDb.run(filterRow.update(star_tags <- SQLHelper.SQLBlob(stringarray: obj.star_tags)))
} else {
_ = try SQLManager.githubDb.run(starReposTable.insert(SQLStarReposSetters(repos: obj, action: .insert)))
}
}
}
}
} catch {
print(error)
}
}
// MARK: - 针对单个repos更新tag
/// 根据tag 字符串数组更新repos数据
static func update(repo: ObjRepos, tags: [String]) {
if tags.isEmpty || repo.id == nil {
return
}
do {
if let needUpdateId = repo.id {
if check(id: needUpdateId) {
let filterRow = starReposTable.filter(repoId == needUpdateId)
_ = try SQLManager.githubDb.run(filterRow.update(star_tags <- SQLHelper.SQLBlob(stringarray: tags)))
} else {
_ = try SQLManager.githubDb.run(starReposTable.insert(SQLStarReposSetters(repos: repo, action: .insert)))
}
}
} catch {
print(error)
}
}
/// 根据tag对象类更新repos数据
static func update(repo: ObjRepos, tagObjs: [ObjTag]) {
if tagObjs.isEmpty || repo.id == nil {
return
}
var startags: [String] = []
for obj in tagObjs {
startags.append(obj.name!)
}
self.update(repo: repo, tags: startags)
}
}
================================================
FILE: BeeFun/BeeFun/SystemManager/Storage/Manager/SQLStars+Base.swift
================================================
//
// SQLStars+Action.swift
// BeeFun
//
// Created by WengHengcong on 04/06/2017.
// Copyright © 2017 JungleSong. All rights reserved.
//
import SQLite
extension SQLStars {
// MARK: - 获取所有Star项目的语言
static func getLanguageList() -> [String] {
var languageArr: [String] = []
do {
let query = "SELECT DISTINCT language FROM \(starTableName) ORDER BY language ASC"
let languageList = try SQLManager.githubDb.prepare(query)
for item in languageList {
let lan = item[0] as? String ?? "None"
if languageArr.contains(lan) {
continue
} else {
languageArr.append(lan)
}
}
if languageArr.isEmpty {
languageArr.append("Swift")
}
languageArr.sort { $0 < $1 }
return languageArr
} catch {
return ["Swift"]
}
}
// MARK: - 检查repos是否存在
static func check(id: Int) -> Bool {
let query = starReposTable.where(repoId == id)
let all = try? SQLManager.githubDb.prepare(query)
if all != nil {
for item in all! where (id == item[repoId]) {
return true
}
}
return false
}
}
================================================
FILE: BeeFun/BeeFun/SystemManager/Storage/Manager/SQLStars+Find.swift
================================================
//
// SQLStars+Find.swift
// BeeFun
//
// Created by WengHengcong on 2018/2/1.
// Copyright © 2018年 LuCi. All rights reserved.
//
import SQLite
enum StarOrderType: Int {
case time = 0
case star = 1
case a_z = 2
}
extension SQLStars {
// MARK: - 粗粒度查询——根据是否打标签
/// 查找全部Star repos
static func findAllStar() -> [ObjRepos]? {
var reposArr: [ObjRepos] = []
do {
let all = Array(try SQLManager.githubDb.prepare(starReposTable))
for item in all {
let repo = convertObjRepos(item: item)
reposArr.append(repo)
}
return reposArr
} catch {
print(error)
return nil
}
}
/// 查找全部untagged repos
static func findUntaggedStar() -> [ObjRepos]? {
var untaggedRepo: [ObjRepos] = []
do {
let all = Array(try SQLManager.githubDb.prepare(starReposTable))
var obj: ObjRepos = ObjRepos()
for item in all {
obj = convertObjRepos(item: item)
if let startags = obj.star_tags {
if startags.isEmpty {
untaggedRepo.append(obj)
}
} else {
untaggedRepo.append(obj)
}
}
return untaggedRepo
} catch {
print(error)
return nil
}
}
// MARK: - 细粒度查询——根据repos id查询
/// 根据id查找repos对象
static func find(id: Int) -> ObjRepos? {
let query = starReposTable.where(repoId == id)
let all = try? SQLManager.githubDb.prepare(query)
var obj: ObjRepos = ObjRepos()
if all != nil {
for item in all! {
obj = convertObjRepos(item: item)
return obj
}
}
return nil
}
// MARK: - 综合查询
/// 根据编程员以及排序查询repos
///
/// - Parameters:
/// - lang: 编程语言
/// - order: 排序
static func find(lang: String, order: StarOrderType) -> [ObjRepos]? {
var reposArr: [ObjRepos] = []
var obj: ObjRepos = ObjRepos()
var myFilter = Expression(value: true)
if lang == "All" {
} else {
myFilter = myFilter && (language == lang)
}
var query = starReposTable.filter(myFilter)
switch order {
case .time:
query = starReposTable.filter(myFilter).order(starred_at.desc)
case .star:
query = starReposTable.filter(myFilter).order(stargazers_count.desc)
case .a_z:
query = starReposTable.filter(myFilter).order(name.asc)
}
let all = try? SQLManager.githubDb.prepare(query)
if all != nil {
for item in all! {
obj = convertObjRepos(item: item)
reposArr.append(obj)
}
}
return reposArr
}
/// 查询
///
/// - Parameters:
/// - lang: 编程语言
/// - order: 排序
/// - tags: 标签
/// - all: 是否在全部repos中查询
/// - untagged: 是否在全部未有标签中查询
static func find(lang: String, order: StarOrderType, tags: [ObjTag], all: Bool, untagged: Bool) -> [ObjRepos]? {
var reposArr: [ObjRepos] = []
var objRepo: ObjRepos = ObjRepos()
var tagString: [String] = []
if !tags.isEmpty {
for tag in tags {
tagString.append(tag.name!)
}
}
var myFilter = Expression(value: true)
if lang == "All" {
} else {
myFilter = myFilter && (language == lang)
}
var query = starReposTable.filter(myFilter)
switch order {
case .time:
query = starReposTable.filter(myFilter).order(starred_at.desc)
case .star:
query = starReposTable.filter(myFilter).order(stargazers_count.desc)
case .a_z:
query = starReposTable.filter(myFilter).order(name.asc)
}
let allRepo = try? SQLManager.githubDb.prepare(query)
if allRepo != nil {
for item in allRepo! {
objRepo = convertObjRepos(item: item)
if untagged {
//未标记
if let startags = objRepo.star_tags {
if startags.isEmpty {
reposArr.append(objRepo)
}
} else {
reposArr.append(objRepo)
}
} else if all {
//全部
reposArr.append(objRepo)
} else {
//某几个tag下
if tags.count == 0 {
reposArr.append(objRepo)
} else {
let startags = SQLHelper.stringArray(blob: item[star_tags])
for tagsFromRepo in startags {
if tagString.contains(tagsFromRepo) {
reposArr.append(objRepo)
}
}
}
}
}
}
return reposArr
}
// MARK: - 根据Tag查询
/// 查找tag下的所有repos
static func findStarRepos(tag: ObjTag) -> [ObjRepos]? {
var reposArr: [ObjRepos] = []
do {
let all = Array(try SQLManager.githubDb.prepare(starReposTable))
for item in all {
let tags = SQLHelper.stringArray(blob: item[star_tags])
if tags.contains(tag.name!) {
let obj = convertObjRepos(item: item)
reposArr.append(obj)
}
}
return reposArr
} catch {
print(error)
return nil
}
}
/// 查找tags下的所有repos
static func findStarRepos(tags: [ObjTag]) -> [ObjRepos]? {
assert(!tags.isEmpty)
var reposArr: [ObjRepos] = []
var tagString: [String] = []
for tag in tags {
tagString.append(tag.name!)
}
do {
let all = Array(try SQLManager.githubDb.prepare(starReposTable))
for item in all {
let tags = SQLHelper.stringArray(blob: item[star_tags])
if tags.contains(tagString) {
let obj = convertObjRepos(item: item)
reposArr.append(obj)
}
}
return reposArr
} catch {
print(error)
return nil
}
}
}
================================================
FILE: BeeFun/BeeFun/SystemManager/Storage/Manager/SQLStars.swift
================================================
//
// SQLManagerStars.swift
// BeeFun
//
// Created by WengHengcong on 22/05/2017.
// Copyright © 2017 JungleSong. All rights reserved.
//
import SQLite
class SQLStars: NSObject {
static var retryCount: Int = 0
/// 表格相关
static let starTableName = "star_repos"
internal static let starReposTable = Table(starTableName)
// MARK: - 字段
internal static let archive_url = Expression("archive_url")
internal static let assignees_url = Expression("assignees_url")
internal static let blobs_url = Expression("blobs_url")
internal static let branches_url = Expression("branches_url")
internal static let clone_url = Expression("clone_url")
internal static let collaborators_url = Expression("collaborators_url")
internal static let comments_url = Expression("comments_url")
internal static let commits_url = Expression("commits_url")
internal static let compare_url = Expression("compare_url")
internal static let contents_url = Expression("contents_url")
internal static let contributors_url = Expression("contributors_url")
internal static let created_at = Expression("created_at")
internal static let default_branch = Expression("default_branch")
internal static let deployments_url = Expression("deployments_url")
internal static let description = Expression("description")
internal static let downloads_url = Expression("downloads_url")
internal static let events_url = Expression("events_url")
internal static let fork = Expression("fork")
internal static let forks = Expression("forks")
internal static let forks_count = Expression("forks_count")
internal static let forks_url = Expression("forks_url")
internal static let full_name = Expression("full_name")
internal static let git_commits_url = Expression("git_commits_url")
internal static let git_refs_url = Expression("git_refs_url")
internal static let git_tags_url = Expression("git_tags_url")
internal static let git_url = Expression("git_url")
internal static let has_downloads = Expression("has_downloads")
internal static let has_projects = Expression("has_projects")
internal static let has_issues = Expression("has_issues")
internal static let has_pages = Expression("has_pages")
internal static let has_wiki = Expression("has_wiki")
internal static let homepage = Expression("homepage")
internal static let hooks_url = Expression("hooks_url")
internal static let html_url = Expression("html_url")
internal static let repoId = Expression("id")
internal static let issue_comment_url = Expression("issue_comment_url")
internal static let issue_events_url = Expression("issue_events_url")
internal static let issues_url = Expression("issues_url")
internal static let keys_url = Expression("keys_url")
internal static let labels_url = Expression("labels_url")
internal static let language = Expression("language")
internal static let languages_url = Expression("languages_url")
internal static let merges_url = Expression("merges_url")
internal static let milestones_url = Expression("milestones_url")
internal static let mirror_url = Expression("mirror_url")
internal static let name = Expression("name")
internal static let notifications_url = Expression("notifications_url")
internal static let open_issues = Expression("open_issues")
internal static let open_issues_count = Expression("open_issues_count")
/// owner id去追踪owner(ObjUser)
internal static let owner = Expression("owner")
internal static let owner_login = Expression("owner_login")
internal static let owner_avatar_url = Expression("owner_avatar_url")
//ObjPermissions
internal static let permissions = Expression("permissions")
internal static let cprivate = Expression("private")//private同关键字冲突,加c前缀
internal static let pulls_url = Expression("pulls_url")
internal static let pushed_at = Expression("pushed_at")
internal static let releases_url = Expression("releases_url")
internal static let size = Expression("size")
internal static let ssh_url = Expression("ssh_url")
internal static let stargazers_count = Expression("stargazers_count")
internal static let stargazers_url = Expression("stargazers_url")
internal static let statuses_url = Expression("statuses_url")
internal static let subscribers_url = Expression("subscribers_url")
internal static let subscription_url = Expression("subscription_url")
internal static let svn_url = Expression("svn_url")
internal static let tags_url = Expression("tags_url")
internal static let teams_url = Expression("teams_url")
internal static let trees_url = Expression("trees_url")
internal static let updated_at = Expression("updated_at")
internal static let url = Expression("url")
internal static let watchers = Expression("watchers")
internal static let watchers_count = Expression("watchers_count")
internal static let subscribers_count = Expression("subscribers_count")
//以下字段为单独增加
internal static let star_tags = Expression("star_tags")
internal static let star_lists = Expression("star_lists")
internal static let watched = Expression("watched")
internal static let starred = Expression("starred")
internal static let starred_at = Expression("starred_at")
}
// MARK: - 创建表格
extension SQLStars {
/// 创建Star Repos
static func crateStarReposTable() {
if retryCount > 3 {
return
}
do {
try SQLManager.githubDb.run(starReposTable.create(ifNotExists: true) { (t) in
t.column(repoId, primaryKey: true)
t.column(archive_url)
t.column(assignees_url)
t.column(blobs_url)
t.column(branches_url)
t.column(clone_url)
t.column(collaborators_url)
t.column(comments_url)
t.column(commits_url)
t.column(compare_url)
t.column(contents_url)
t.column(contributors_url)
t.column(created_at)
t.column(default_branch)
t.column(deployments_url)
t.column(description)
t.column(downloads_url)
t.column(events_url)
t.column(fork)
t.column(forks)
t.column(forks_count)
t.column(forks_url)
t.column(full_name)
t.column(git_commits_url)
t.column(git_refs_url)
t.column(git_tags_url)
t.column(git_url)
t.column(has_downloads)
t.column(has_projects)
t.column(has_issues)
t.column(has_pages)
t.column(has_wiki)
t.column(homepage)
t.column(hooks_url)
t.column(html_url)
t.column(issue_comment_url)
t.column(issue_events_url)
t.column(issues_url)
t.column(keys_url)
t.column(labels_url)
t.column(language)
t.column(languages_url)
t.column(merges_url)
t.column(milestones_url)
t.column(mirror_url)
t.column(name)
t.column(notifications_url)
t.column(open_issues)
t.column(open_issues_count)
t.column(owner)
t.column(owner_login)
t.column(owner_avatar_url)
t.column(permissions)
t.column(cprivate)
t.column(pulls_url)
t.column(pushed_at)
t.column(releases_url)
t.column(size)
t.column(ssh_url)
t.column(stargazers_count)
t.column(stargazers_url)
t.column(statuses_url)
t.column(subscribers_url)
t.column(subscription_url)
t.column(svn_url)
t.column(tags_url)
t.column(teams_url)
t.column(trees_url)
t.column(updated_at)
t.column(url)
t.column(watchers)
t.column(watchers_count)
t.column(subscribers_count)
t.column(star_tags)
t.column(star_lists)
t.column(starred)
t.column(watched)
t.column(starred_at)
})
/// 新增starred_at列,注意以后新增需要升级
let existStarredAtColumn = try SQLManager.githubDb.exists(column: "starred_at", in: starTableName)
if !existStarredAtColumn {
try SQLManager.githubDb.run(starReposTable.addColumn(starred_at))
}
} catch {
retryCount += 1
crateStarReposTable()
print(error)
}
}
}
// MARK: - 工具方法
extension SQLStars {
static func convertObjRepos(item: Row) -> ObjRepos {
let repo = ObjRepos()
repo.id = item[repoId]
repo.archive_url = item[archive_url]
repo.assignees_url = item[assignees_url]
repo.blobs_url = item[blobs_url]
repo.branches_url = item[branches_url]
repo.collaborators_url = item[collaborators_url]
repo.comments_url = item[comments_url]
repo.commits_url = item[commits_url]
repo.compare_url = item[compare_url]
repo.contents_url = item[contents_url]
repo.contributors_url = item[contributors_url]
repo.created_at = item[created_at]
repo.default_branch = item[default_branch]
repo.deployments_url = item[deployments_url]
repo.cdescription = item[description]
repo.downloads_url = item[downloads_url]
repo.events_url = item[events_url]
repo.fork = item[fork]
repo.forks = item[forks]
repo.forks_count = item[forks_count]
repo.forks_url = item[forks_url]
repo.full_name = item[full_name]
repo.git_commits_url = item[git_commits_url]
repo.git_refs_url = item[git_refs_url]
repo.git_tags_url = item[git_tags_url]
repo.git_url = item[git_url]
repo.has_downloads = item[has_downloads]
repo.has_projects = item[has_projects]
repo.has_issues = item[has_issues]
repo.has_pages = item[has_pages]
repo.has_wiki = item[has_wiki]
repo.homepage = item[homepage]
repo.hooks_url = item[hooks_url]
repo.html_url = item[html_url]
repo.issue_comment_url = item[issue_comment_url]
repo.issue_events_url = item[issue_events_url]
repo.issues_url = item[issues_url]
repo.keys_url = item[keys_url]
repo.labels_url = item[labels_url]
repo.language = item[language]
repo.languages_url = item[languages_url]
repo.merges_url = item[merges_url]
repo.milestones_url = item[milestones_url]
repo.mirror_url = item[mirror_url]
repo.name = item[name]
repo.notifications_url = item[notifications_url]
repo.open_issues = item[open_issues]
repo.open_issues_count = item[open_issues_count]
let objOnwer = ObjUser()
objOnwer.id = item[owner]
objOnwer.login = item[owner_login]
objOnwer.avatar_url = item[owner_avatar_url]
repo.owner = objOnwer
// repo.permissions = item[permissions]
repo.cprivate = item[cprivate]
repo.pulls_url = item[pulls_url]
repo.pushed_at = item[pushed_at]
repo.releases_url = item[releases_url]
repo.size = item[size]
repo.ssh_url = item[ssh_url]
repo.stargazers_count = item[stargazers_count]
repo.stargazers_url = item[stargazers_url]
repo.statuses_url = item[statuses_url]
repo.subscribers_url = item[subscribers_url]
repo.subscription_url = item[subscription_url]
repo.svn_url = item[svn_url]
repo.tags_url = item[tags_url]
repo.teams_url = item[teams_url]
repo.trees_url = item[trees_url]
repo.updated_at = item[updated_at]
repo.url = item[url]
repo.watchers = item[watchers]
repo.watchers_count = item[watchers_count]
repo.subscribers_count = item[subscribers_count]
repo.star_tags = SQLHelper.stringArray(blob: item[star_tags])
repo.star_lists = SQLHelper.stringArray(blob: item[star_lists])
repo.watched = item[watched]
repo.starred = item[starred]
repo.starred_at = item[starred_at]
return repo
}
static func SQLStarReposSetters(repos: ObjRepos, action: SQLiteAction) -> [SQLite.Setter] {
var setters = [
archive_url <- repos.archive_url,
assignees_url <- repos.assignees_url,
blobs_url <- repos.blobs_url,
branches_url <- repos.branches_url,
clone_url <- repos.clone_url,
collaborators_url <- repos.collaborators_url,
comments_url <- repos.comments_url,
commits_url <- repos.commits_url,
compare_url <- repos.compare_url,
contents_url <- repos.contents_url,
contributors_url <- repos.contributors_url,
created_at <- repos.created_at,
default_branch <- repos.default_branch,
deployments_url <- repos.deployments_url,
description <- repos.cdescription,
downloads_url <- repos.downloads_url,
events_url <- repos.events_url,
fork <- repos.fork,
forks <- repos.forks,
forks_count <- repos.forks_count,
forks_url <- repos.forks_url,
full_name <- repos.full_name,
git_commits_url <- repos.git_commits_url,
git_refs_url <- repos.git_refs_url,
git_tags_url <- repos.git_tags_url,
git_url <- repos.git_url,
has_downloads <- repos.has_downloads,
has_projects <- repos.has_projects,
has_issues <- repos.has_issues,
has_pages <- repos.has_pages,
has_wiki <- repos.has_wiki,
homepage <- repos.homepage,
hooks_url <- repos.hooks_url,
html_url <- repos.html_url,
issue_comment_url <- repos.issue_comment_url,
issue_events_url <- repos.issue_events_url,
issues_url <- repos.issues_url,
keys_url <- repos.keys_url,
labels_url <- repos.labels_url,
language <- repos.language,
languages_url <- repos.languages_url,
merges_url <- repos.merges_url,
milestones_url <- repos.milestones_url,
mirror_url <- repos.mirror_url,
name <- repos.name,
notifications_url <- repos.notifications_url,
open_issues <- repos.open_issues,
open_issues_count <- repos.open_issues_count,
owner <- repos.owner!.id!,
owner_login <- repos.owner!.login,
owner_avatar_url <- repos.owner?.avatar_url,
cprivate <- repos.cprivate,
pulls_url <- repos.pulls_url,
pushed_at <- repos.pushed_at,
releases_url <- repos.releases_url,
size <- repos.size,
ssh_url <- repos.ssh_url,
stargazers_count <- repos.stargazers_count,
stargazers_url <- repos.stargazers_url,
statuses_url <- repos.statuses_url,
subscribers_url <- repos.subscribers_url,
subscription_url <- repos.subscription_url,
svn_url <- repos.svn_url,
tags_url <- repos.tags_url,
teams_url <- repos.teams_url,
trees_url <- repos.trees_url,
updated_at <- repos.updated_at,
url <- repos.url,
watchers <- repos.watchers,
watchers_count <- repos.watchers_count,
subscribers_count <- repos.subscribers_count,
starred_at <- repos.starred_at
]
let idSetter: SQLite.Setter = repoId <- repos.id!
//以下自增的字段均通过不同手段更新
let watchedSetter: SQLite.Setter = watched <- repos.watched
let starredSetter: SQLite.Setter = starred <- repos.starred
let startagsSetter: SQLite.Setter = star_tags <- SQLHelper.SQLBlob(stringarray: repos.star_tags)
let starlistSetter: SQLite.Setter = star_lists <- SQLHelper.SQLBlob(stringarray: repos.star_lists)
switch action {
case .insert:
setters.append(idSetter)
setters.append(watchedSetter)
setters.append(starredSetter)
setters.append(starlistSetter)
setters.append(startagsSetter)
default:
break
}
return setters
}
}
================================================
FILE: BeeFun/BeeFun/SystemManager/Storage/Manager/SQLTags.swift
================================================
//
// SQLTags.swift
// BeeFun
//
// Created by WengHengcong on 02/06/2017.
// Copyright © 2017 JungleSong. All rights reserved.
//
import SQLite
class SQLTags {
static var retryCount: Int = 0
static let starTagsName = "star_tags"
fileprivate static let starTagsTable = Table(starTagsName)
// MARK: - 字段
/// name为唯一字段,不可重复,区分大小写
fileprivate static let nameId = Expression("name")
/// 该tag下对应多少个repos
fileprivate static let count = Expression("count")
/// 该tag下对应的repos,集合中为reposid
fileprivate static let star_repos = Expression("repos")
/// order
fileprivate static let tag_order = Expression("tag_order")
}
extension SQLTags {
/// 创建Star Repos
static func crateStarTagsTable() {
if retryCount > 3 {
return
}
do {
try SQLManager.githubDb.run(starTagsTable.create(ifNotExists: true) { (t) in
t.column(nameId, primaryKey: true)
t.column(count)
t.column(star_repos)
t.column(tag_order)
})
} catch {
retryCount += 1
crateStarTagsTable()
print(error)
}
}
}
// MARK: - 增/改
extension SQLTags {
/// 插入一个repos对象
static func insert(tag: ObjTag) {
do {
if check(name: tag.name!) {
let filterRow = starTagsTable.filter(nameId == tag.name!)
let rowid = try SQLManager.githubDb.run(filterRow.update([
count <- tag.count,
tag_order <- tag.sort,
// star_repos <- SQLHelper.SQLBlob(intarray: tag.repos)
]))
print("tag updated id: \(rowid)")
} else {
let rowid = try SQLManager.githubDb.run(starTagsTable.insert([
nameId <- tag.name!,
count <- tag.count,
tag_order <- tag.sort,
// star_repos <- SQLHelper.SQLBlob(intarray: tag.repos!)
]))
print("tag inserted id: \(rowid)")
}
} catch {
print("tag insertion failed: \(error)")
}
}
/// 重命名tag
static func rename(oriTag: ObjTag, newTag: ObjTag) {
do {
try SQLManager.githubDb.transaction {
delete(tag: oriTag)
insert(tag: newTag)
}
} catch {
}
}
}
// MARK: - 检查tags是否存在
extension SQLTags {
/// 检查该id是否已经存在
static func check(name: String) -> Bool {
let query = starTagsTable.where(name == nameId)
let all = try? SQLManager.githubDb.prepare(query)
if all != nil {
for item in all! where (name == item[nameId]) {
return true
}
}
return false
}
}
// MARK: - 查询
extension SQLTags {
/// 根据顺序查找tags
///
/// - Parameters:
/// - order: 顺序
static func findAll(order: SQLOrder) -> [ObjTag]? {
let query = starTagsTable.order((order == .asc ? tag_order.asc : tag_order.desc))
var tagsArr: [ObjTag] = []
do {
let all = Array(try SQLManager.githubDb.prepare(query))
for item in all {
let tag = convertObjTags(item: item)
tagsArr.append(tag)
}
return tagsArr
} catch {
print(error)
return nil
}
}
/// 查找全部tags
static func findAll() -> [ObjTag]? {
var tagsArr: [ObjTag] = []
do {
let all = Array(try SQLManager.githubDb.prepare(starTagsTable))
for item in all {
let tag = convertObjTags(item: item)
tagsArr.append(tag)
}
return tagsArr
} catch {
print(error)
return nil
}
}
/// 查找全部tags,并获取字符串
static func findAllByString() -> [String] {
var tags: [String] = []
if let all = findAll() {
for item in all {
tags.append(item.name!)
}
}
return tags
}
/// 根据id查找repos对象
static func find(name: String) -> ObjTag {
let query = starTagsTable.where(nameId == name)
let all = try? SQLManager.githubDb.prepare(query)
var obj: ObjTag = ObjTag()
if all != nil {
for item in all! {
obj = convertObjTags(item: item)
}
}
return obj
}
static func convertObjTags(item: Row) -> ObjTag {
let tag = ObjTag()
tag.name = item[nameId]
tag.count = item[count]
tag.sort = item[tag_order]
// tag.repos = SQLHelper.intArray(blob: item[star_repos])
return tag
}
}
// MARK: - 删
extension SQLTags {
static func delete(name: String) {
let query = starTagsTable.filter(name == nameId)
do {
if try SQLManager.githubDb.run(query.delete()) > 0 {
print("deleted tag id:\(name)")
} else {
print("not found tag id:\(name)")
}
} catch {
print("delete tag failed: \(error)")
}
}
static func delete(tag: ObjTag) {
let query = starTagsTable.filter(tag.name! == nameId)
do {
if try SQLManager.githubDb.run(query.delete()) > 0 {
print("deleted tag id:\(tag.name)")
} else {
print("not found tag id:\(tag.name)")
}
} catch {
print("delete tag failed: \(error)")
}
}
}
================================================
FILE: BeeFun/BeeFun/SystemManager/Storage/Model/ObjList.swift
================================================
//
// ObjStarList.swift
// BeeFun
//
// Created by WengHengcong on 23/05/2017.
// Copyright © 2017 JungleSong. All rights reserved.
//
import UIKit
class ObjList: NSObject {
}
================================================
FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/IMOBBaseUser.h
================================================
//
// IMOBBaseUser.h
// MOBFoundation
//
// Created by 冯鸿杰 on 2017/9/5.
// Copyright © 2017年 MOB. All rights reserved.
//
#import
#import "IMOBFDataModel.h"
/**
基础用户信息
*/
@protocol IMOBBaseUser
/**
获取用户ID
@return 用户ID
*/
- (NSString *)uid;
/**
获取用户头像
@return 头像
*/
- (NSString *)avatar;
/**
获取用户昵称
@return 昵称
*/
- (NSString *)nickname;
@end
================================================
FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/IMOBFDataModel.h
================================================
//
// IJIMDataModel.h
// Jimu
//
// Created by 冯鸿杰 on 17/2/10.
// Copyright © 2017年 Mob. All rights reserved.
//
#import
/**
数据模型协议
*/
@protocol IMOBFDataModel
/**
初始化数据模型
@param dict 初始化数据
@return 数据模型
*/
- (instancetype)initWithDict:(NSDictionary *)dict;
/**
设置数据
@param data 数据
@param key 名称
*/
- (void)set:(id)data key:(NSString *)key;
/**
获取数据
@param key 名称
*/
- (id)get:(NSString *)key;
/**
返回一个字典结构
@return 字段数据对象
*/
- (NSDictionary *)dictionaryValue;
/**
返回字段映射字典
说明:类如果实现此方法,并返回映射字典,在使用initWithDict初始化时,则会按照映射查找属性;key 为真正想要设定的、存在的属性 ,value为需要映射的字段
@return 字段映射字典
*/
- (NSDictionary *)mappingDictionary;
/**
当类中有属性为数组,且数组元素同为MOBFDataModel时,应该置制定该属性属性及其元素类型
例如有 @property NSArray *array;
应主动实现本方法,并返回 @{@"array" : @"OtherDataModel"}
@return 映射配置
*/
- (NSDictionary *)confirmArrayElementType;
@end
================================================
FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/IMOBFPlugin.h
================================================
//
// IMOBFPlugin.h
// MOBFoundation
//
// Created by fenghj on 15/6/2.
// Copyright (c) 2015年 MOB. All rights reserved.
//
#import
/**
* 插件协议
*/
@protocol IMOBFPlugin
@required
/**
* 插件加载时调用
*
* @param key 插件标识
*/
- (void)load:(NSString *)key;
/**
* 插件卸载时调用
*/
- (void)unload;
@end
================================================
FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MOBFApplication.h
================================================
//
// MOBFApplicationUtils.h
// MOBFoundation
//
// Created by vimfung on 15-1-20.
// Copyright (c) 2015年 MOB. All rights reserved.
//
#import
/**
* 应用工具类
*/
@interface MOBFApplication : NSObject
/**
* 获取应用名称
*
* @return 应用名称
*/
+ (NSString *)name;
/**
* 获取应用包名
*
* @return 包名
*/
+ (NSString *)bundleId;
/**
* 获取应用编译版本
*
* @return 编译版本
*/
+ (NSString *)buildVersion;
/**
* 获取应用版本号
*
* @return 应用版本号
*/
+ (NSString *)shortVersion;
/**
* 获取应用版本号
*
* @return 版本号
*/
+ (NSString *)version __deprecated_msg("use [buildVersion] method instead");
/**
* 检测是否启用ATS功能
*/
+ (BOOL)enabledATS;
/**
* 获取应用运行经过的时间(单位:毫秒)
*
* @return 经过时间
*/
+ (uint64_t)elapsedTime;
/**
* 判断链接是否能打开
*
* @param url 链接
*
* @return YES 可以打开,NO 不能打开
*/
+ (BOOL)canOpenUrl:(NSURL *)url;
/**
* 打开链接
*
* @param url 链接
*/
+ (void)openUrl:(NSURL *)url;
@end
================================================
FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MOBFColor.h
================================================
//
// MOBFColorUtils.h
// MOBFoundation
//
// Created by vimfung on 15-1-19.
// Copyright (c) 2015年 MOB. All rights reserved.
//
#import
#import
/**
* 颜色工具类
*/
@interface MOBFColor : NSObject
/**
* 获取颜色对象
*
* @param rgb RGB颜色值
*
* @return 颜色对象
*/
+ (UIColor *)colorWithRGB:(NSUInteger)rgb;
/**
* 获取颜色对象
*
* @param argb ARGB颜色值
*
* @return 颜色对象
*/
+ (UIColor *)colorWithARGB:(NSUInteger)argb;
@end
================================================
FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MOBFData.h
================================================
//
// MOBFDataUtils.h
// MOBFoundation
//
// Created by vimfung on 15-1-16.
// Copyright (c) 2015年 MOB. All rights reserved.
//
#import
#import
#import
/**
* 数据工具类
*/
@interface MOBFData : NSObject
/**
* 使用HMAC-SHA1进行加密
*
* @param data 原始数据
* @param key 密钥
*
* @return 加密后数据
*/
+ (NSData *)hmacSha1Data:(NSData *)data forKey:(NSData *)key;
/**
使用HMAC-MD5进行签名
@param data 原始数据
@param key 密钥
@return 加密后数据
*/
+ (NSData *)hmacMd5Data:(NSData *)data forKey:(NSData *)key;
/**
* 对数据进行MD5签名
*
* @param data 原始数据
*
* @return 签名后数据
*/
+ (NSData *)md5Data:(NSData *)data;
/**
* 对数据进行AES128加密
*
* @param data 原始数据
* @param key 密钥
* @param encoding 字符串编码
*
* @return 加密后数据
*/
+ (NSData *)aes128EncryptData:(NSData *)data
key:(NSString *)key
encoding:(NSStringEncoding)encoding;
/**
* 对数据进行AES128解密
*
* @param data 原始数据
* @param key 密钥
* @param encoding 字符串编码
*
* @return 解密后数据
*/
+ (NSData *)aes128DecryptData:(NSData *)data
key:(NSString *)key
encoding:(NSStringEncoding)encoding;
/**
* 对数据进行AES128加密
*
* @param data 原始数据
* @param key 密钥
* @param options 选项
*
* @return 加密后数据
*/
+ (NSData *)aes128EncryptData:(NSData *)data
key:(NSData *)key
options:(CCOptions)options;
/**
* 对数据进行AES128解密
*
* @param data 原始数据
* @param key 密钥
* @param options 选项
*
* @return 解密后数据
*/
+ (NSData *)aes128DecryptData:(NSData *)data
key:(NSData *)key
options:(CCOptions)options;
/**
* 使用GZip压缩数据
*
* @param data 原始数据
*
* @return 压缩后数据
*/
+ (NSData *)compressDataUsingGZip:(NSData *)data;
/**
* 使用GZip解压缩数据
*
* @param data 原始数据
*
* @return 解压缩后数据
*/
+ (NSData *)uncompressDataUsingGZip:(NSData *)data;
/**
* 对数据进行MD5签名
*
* @param data 原始数据
*
* @return 签名后字符串
*/
+ (NSString *)stringByMD5Data:(NSData *)data;
/**
* 使用BASE64编码数据
*
* @param data 原始数据
*
* @return 编码后字符串
*/
+ (NSString *)stringByBase64EncodeData:(NSData *)data;
/**
* 对数据进行CRC32校验
*
* @param data 数据对象
*
* @return 校验值
*/
+ (uLong)valueByCRC32Data:(NSData *)data;
/**
* 对数据进行CRC32检验
*
* @param data 原始数据
*
* @return 检验值
*/
+ (NSString *)stringByCRC32Data:(NSData *)data;
/**
* 将数据转换成16进制字符串
*
* @param data 原始数据
*
* @return 字符串
*/
+ (NSString *)hexStringByData:(NSData *)data;
/**
* 写入一个32位整数到数据对象中
*
* @param value 整数值
* @param data 数据对象
*/
+ (void)writeInt32:(int32_t)value toData:(NSMutableData *)data;
/**
* 写入一个16位整数到数据对象中
*
* @param value 整数值
* @param data 数据对象
*/
+ (void)writeInt16:(int16_t)value toData:(NSMutableData *)data;
/**
* 读取一个16位整数
*
* @param data 数据对象
* @param offset 偏移位置
*
* @return 短整型数据
*/
+ (int16_t)readInt16FromData:(NSData *)data offset:(NSInteger)offset;
/**
* 读取一个32位整数
*
* @param data 数据对象
* @param offset 偏移位置
*
* @return 整型数据
*/
+ (int32_t)readInt32FromData:(NSData *)data offset:(NSInteger)offset;
@end
================================================
FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MOBFDataModel.h
================================================
//
// MOBFDataModel.h
// MOBFoundation
//
// Created by 冯鸿杰 on 17/2/15.
// Copyright © 2017年 MOB. All rights reserved.
//
#import
#import "IMOBFDataModel.h"
/**
数据模型
*/
@interface MOBFDataModel : NSObject
/**
初始化数据模型
@param dict 初始化数据
@return 数据模型
*/
- (instancetype)initWithDict:(NSDictionary *)dict;
/**
设置数据
@param data 数据
@param key 名称
*/
- (void)set:(id)data key:(NSString *)key;
/**
获取数据
@param key 名称
*/
- (id)get:(NSString *)key;
/**
返回一个字典结构
@return 字段数据对象
*/
- (NSDictionary *)dictionaryValue;
@end
================================================
FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MOBFDataService.h
================================================
//
// MOBFDataService.h
// MOBFoundation
//
// Created by vimfung on 15-1-21.
// Copyright (c) 2015年 MOB. All rights reserved.
//
#import
/**
* 数据服务
*/
@interface MOBFDataService : NSObject
/**
* 获取数据服务共享实例对象
*
* @return 数据服务对象
*/
+ (MOBFDataService *)sharedInstance;
/**
* 设置共享数据
*
* @param data 数据
* @param key 标识
*/
- (void)setSharedData:(id)data forKey:(NSString *)key;
/**
* 获取共享数据
*
* @param key 标识
*
* @return 数据
*/
- (id)sharedDataForKey:(NSString *)key;
/**
* 开始缓存数据事务
*
* @param domain 数据域
*/
- (void)beginCacheDataTransForDomain:(NSString *)domain;
/**
* 结束缓存数据事务
*
* @param domain 数据域
*/
- (void)endCacheDataTransForDomain:(NSString *)domain;
/**
* 设置缓存数据
*
* @param data 数据
* @param key 标识
* @param domain 数据域
*/
- (void)setCacheData:(id)data forKey:(NSString *)key domain:(NSString *)domain;
/**
* 获取缓存数据
*
* @param key 标识
* @param domain 数据域
*
* @return 数据
*/
- (id)cacheDataForKey:(NSString *)key domain:(NSString *)domain;
/**
* 开始安全数据事务
*/
- (void)beginSecureDataTrans;
/**
* 结束安全数据事务
*/
- (void)endSecureDataTrans;
/**
* 设置安全数据
*
* @param data 数据
* @param key 标识
*/
- (void)setSecureData:(id)data forKey:(NSString *)key;
/**
* 获取安全数据
*
* @param key 标识
*
* @return 数据
*/
- (id)secureDataForKey:(NSString *)key;
@end
================================================
FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MOBFDate.h
================================================
//
// MOBFDateUtils.h
// MOBFoundation
//
// Created by vimfung on 15-1-19.
// Copyright (c) 2015年 MOB. All rights reserved.
//
#import
/**
* 时间工具类
*/
@interface MOBFDate : NSObject
/**
* 获取时间的年份
*
* @param date 时间
*
* @return 年份
*/
+ (NSInteger)fullYearByDate:(NSDate *)date;
/**
* 获取时间的月份
*
* @param date 时间
*
* @return 月份
*/
+ (NSInteger)monthByDate:(NSDate *)date;
/**
* 获取时间的日期
*
* @param date 时间
*
* @return 日期部分
*/
+ (NSInteger)dayByDate:(NSDate *)date;
/**
* 获取时间的小时部分
*
* @param date 时间
*
* @return 小时部分
*/
+ (NSInteger)hourByDate:(NSDate *)date;
/**
* 获取时间的分钟部分
*
* @param date 时间
*
* @return 分钟部分
*/
+ (NSInteger)minuteByDate:(NSDate *)date;
/**
* 获取时间的秒部分
*
* @param date 时间
*
* @return 秒部分
*/
+ (NSInteger)secondByDate:(NSDate *)date;
/**
* 将时间转换为指定格式字符串
*
* @param date 时间
* @param format 格式字符串
*
* @return 转换后字符串
*/
+ (NSString *)stringByDate:(NSDate *)date
withFormat:(NSString *)format;
/**
* 将字符串转换为时间对象
*
* @param format 格式字符串
* @param dateString 日期时间字符串
*
* @return 时间对象
*/
+ (NSDate *)dateWithFormat:(NSString *)format
dateString:(NSString *)dateString;
/**
* 将字符串转换为时间对象
*
* @param format 格式字符串
* @param dateString 日期时间字符串
* @param locale 本地化参数
*
* @return 时间对象
*/
+ (NSDate *)dateWithFormat:(NSString *)format
dateString:(NSString *)dateString
locale:(NSLocale *)locale;
/**
* 创建日期时间对象
*
* @param year 年份
* @param month 月份
* @param date 日期
* @param hour 小时
* @param minute 分钟
* @param second 秒
*
* @return 日期时间对象
*/
+ (NSDate *)dateWithYear:(NSInteger)year
month:(NSInteger)month
date:(NSInteger)date
hour:(NSInteger)hour
minute:(NSInteger)minute
second:(NSInteger)second;
@end
================================================
FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MOBFDebug.h
================================================
//
// MOBFDebug.h
// MOBFoundation
//
// Created by 冯 鸿杰 on 15/2/4.
// Copyright (c) 2015年 MOB. All rights reserved.
//
#import
/**
* 调试工具类
*/
@interface MOBFDebug : NSObject
/**
* 输出调试日志
*
* @param format 日志格式
* @param ... 日志参数
*/
+ (void)log:(NSString *)format, ... NS_FORMAT_FUNCTION(1, 2);
/**
* 观察释放对象,指定类型的被释放对象会打印在Console中。
*
* @param type 对象类型
*/
+ (void)watchDeallocObjectWithType:(Class)type;
@end
================================================
FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MOBFDevice.h
================================================
//
// MOBFDeviceUtils.h
// MOBFoundation
//
// Created by vimfung on 15-1-19.
// Copyright (c) 2015年 MOB. All rights reserved.
//
#import
#import
/**
* 网络类型
*/
typedef NS_ENUM(NSUInteger, MOBFNetworkType)
{
/**
* 无网咯
*/
MOBFNetworkTypeNone = 0,
/**
* 蜂窝网络
*/
MOBFNetworkTypeCellular = 2,
/**
* WIFI
*/
MOBFNetworkTypeWifi = 1,
/**
* 2G网络
*/
MOBFNetworkTypeCellular2G = 3,
/**
* 3G网络
*/
MOBFNetworkTypeCellular3G = 4,
/**
* 4G网络
*/
MOBFNetworkTypeCellular4G = 5,
};
/**
IP版本
- MOBFIPVersion4: IPv4
- MOBFIPVersion6: IPv6
*/
typedef NS_ENUM(NSUInteger, MOBFIPVersion)
{
MOBFIPVersion4 = 0,
MOBFIPVersion6 = 1,
};
/**
* 设备工具类
*/
@interface MOBFDevice : NSObject
/**
* 获取网卡物理地址
*
* @return 网卡物理地址
*/
+ (NSString *)macAddress;
/**
* 获取设备型号
*
* @return 设备型号
*/
+ (NSString *)deviceModel;
/**
* 获取当前网络类型
*
* @return 网络类型
*/
+ (MOBFNetworkType)currentNetworkType;
/**
* 获取手机运营商代码
*
* @return 手机运营商代码
*/
+ (NSString *)carrier;
/**
* 获取手机运营商名称
*
* @return 运营商名称
*/
+ (NSString *)carrierName;
/**
* 获取手机运营商国家码
*
* @return 运营商国家码
*/
+ (NSString *)mobileCountryCode;
/**
* 获取手机运营商网络编号
*
* @return 运营商网络编号
*/
+ (NSString *)mobileNetworkCode;
/**
* 与当前系统版本比较
*
* @param other 需要对比的版本
*
* @return < 0 低于指定版本; = 0 跟指定版本相同;> 0 高于指定版本
*/
+ (NSInteger)versionCompare:(NSString *)other;
/**
* 判断是否已经越狱
*
* @return YES 已经越狱,NO 尚未越狱
*/
+ (BOOL)hasJailBroken;
/**
* 获取运行进程信息
*
* @return 进程信息列表
*/
+ (NSArray *)runningProcesses;
/**
* 判断当前设备是否为iPad
*
* @return YES 是,NO 否
*/
+ (BOOL)isPad;
/**
* 获取设备唯一标识
*
* @return 标识码
*/
+ (NSString *)duid;
/**
* 获取屏幕真实尺寸
*
* @return 屏幕尺寸
*/
+ (CGSize)nativeScreenSize;
/**
* 获取无线局域网的服务集标识(WIFI名称)
*
* @return 服务集标识
*/
+ (NSString *)ssid;
/**
* 获取基础服务集标识(站点的MAC地址)
*
* @return 基础服务集标识
*/
+ (NSString *)bssid;
/**
* 获取当前语言
*
* @return 语言描述
*/
+ (NSString *)currentLanguage;
/**
* 获取设备IP地址
*
* @return IP地址
*/
+ (NSString *)ipAddress:(MOBFIPVersion)ver;
/**
* 获取开发商ID
*
* @return 开发商ID
*/
+ (NSString *)idfv;
@end
================================================
FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MOBFHttpPostedFile.h
================================================
//
// MOBHttpPostedFile.h
// MOBFoundation
//
// Created by 冯 鸿杰 on 15/1/30.
// Copyright (c) 2015年 MOB. All rights reserved.
//
#import
/**
* @brief HTTP上传文件
*/
@interface MOBFHttpPostedFile : NSObject
/**
* @brief 文件名称
*/
@property (nonatomic, copy) NSString *fileName;
/**
* @brief 内容类型
*/
@property (nonatomic, copy) NSString *contentType;
/**
* @brief 文件数据
*/
@property (nonatomic, retain) NSData *fileData;
/**
* @brief 内容传输编码
*/
@property (nonatomic, copy) NSString *transferEncoding;
/**
* @brief 创建上传文件
*
* @param fileName 文件名称
* @param data 文件数据
* @param contentType 内容类型
* @param transferEncoding 传输编码
*
* @return 上传文件信息
*/
+ (MOBFHttpPostedFile *)httpPostedFileByFileName:(NSString *)fileName
data:(NSData *)data
contentType:(NSString *)contentType
transferEncoding:(NSString *)transferEncoding;
/**
* @brief 创建上传文件
*
* @param path 文件路径
* @param contentType 内容类型
*
* @return 上传文件信息
*/
+ (MOBFHttpPostedFile *)httpPostedFileByPath:(NSString *)path
contentType:(NSString *)contentType;
@end
================================================
FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MOBFHttpService.h
================================================
//
// MOBFHttpService.h
// MOBFoundation
//
// Created by vimfung on 15-1-20.
// Copyright (c) 2015年 MOB. All rights reserved.
//
#import
@class MOBFHttpService;
/**
* GET方式
*/
extern NSString *const kMOBFHttpMethodGet;
/**
* POST方式
*/
extern NSString *const kMOBFHttpMethodPost;
/**
* DELETE方式
*/
extern NSString *const kMOBFHttpMethodDelete;
/**
* HEAD方式
*/
extern NSString *const kMOBFHttpMethodHead;
/**
* HTTP返回事件
*
* @param response 回复对象
* @param responseData 回复数据
*/
typedef void(^MOBFHttpResultEvent) (NSHTTPURLResponse *response, NSData *responseData);
/**
* HTTP错误事件
*
* @param error 错误信息
*/
typedef void(^MOBFHttpFaultEvent) (NSError *error);
/**
* HTTP上传数据事件
*
* @param totalBytes 总字节数
* @param loadedBytes 上传字节数据
*/
typedef void(^MOBFHttpUploadProgressEvent) (int64_t totalBytes, int64_t loadedBytes);
/**
* HTTP下载数据事件
*
* @param totalBytes 总字节数
* @param loadedBytes 上传字节数据
*/
typedef void(^MOBFHttpDownloadProgressEvent) (int64_t totalBytes, int64_t loadedBytes);
/**
* HTTP服务类
*/
@interface MOBFHttpService : NSObject
/**
* @brief 提交方式,默认为GET
*/
@property (nonatomic, copy) NSString *method;
/**
超时时间
*/
@property (nonatomic) NSTimeInterval timeout;
/**
* @brief 是否缓存回复对象,默认为YES
*/
@property (nonatomic) BOOL isCacheResponse;
/**
* 自动填充请求表单,默认为YES,如果为NO则表示使用自定义的方式发起请求。
*/
@property (nonatomic) BOOL autoFillRequestForm;
/**
* 初始化HTTP服务
*
* @param urlString URL地址字符串
*
* @return HTTP服务对象
*/
- (id)initWithURLString:(NSString *)urlString;
/**
* 初始化HTTP服务
*
* @param URL URL地址对象
*
* @return HTTP服务对象
*/
- (id)initWithURL:(NSURL *)URL;
/**
* 初始化HTTP服务
*
* @param request 请求对象
*
* @return HTTP服务对象
*/
- (id)initWithRequest:(NSURLRequest *)request;
/**
* 添加HTTP头
*
* @param header 名称
* @param value 值
*/
- (void)addHeader:(NSString *)header value:(NSString *)value;
/**
* 添加HTTP头集合
*
* @param headers 头集合
*/
- (void)addHeaders:(NSDictionary *)headers;
/**
* 添加参数
*
* @param value 参数值
* @param key 参数名字
*/
- (void)addParameter:(id)value forKey:(NSString *)key;
/**
* 添加多个参数
*
* @param parameters 参数集合
*/
- (void)addParameters:(NSDictionary *)parameters;
/**
* 添加上传文件参数
*
* @param fileData 文件数据
* @param fileName 文件名称
* @param mimeType MIME类型
* @param transferEncoding 传输编码
* @param key 参数名字
*/
- (void)addFileParameter:(NSData *)fileData
fileName:(NSString *)fileName
mimeType:(NSString *)mimeType
transferEncoding:(NSString *)transferEncoding
forKey:(NSString *)key;
/**
* 设置请求体数据,可以为NSData或者NSInputStream
*
* @param body 请求体数据
*/
- (void)setBody:(id)body;
/**
* 发送请求
*
* @param resultHandler 返回回调
* @param faultHandler 错误回调
* @param uploadProgressHandler 上传数据进度回调
*/
- (void)sendRequestOnResult:(MOBFHttpResultEvent)resultHandler
onFault:(MOBFHttpFaultEvent)faultHandler
onUploadProgress:(MOBFHttpUploadProgressEvent)uploadProgressHandler;
/**
发送请求
@param resultHandler 返回回调
@param faultHandler 错误回调
@param uploadProgressHandler 上传数据进度回调
@param downloadProgressHandler 下载数据进度回调
*/
- (void)sendRequestOnResult:(MOBFHttpResultEvent)resultHandler
onFault:(MOBFHttpFaultEvent)faultHandler
onUploadProgress:(MOBFHttpUploadProgressEvent)uploadProgressHandler
onDownloadProgress:(MOBFHttpDownloadProgressEvent)downloadProgressHandler;
/**
* 取消请求
*/
- (void)cancelRequest;
/**
* 发送HTTP请求
*
* @param urlString 请求地址
* @param method 请求方式
* @param parameters 请求参数
* @param headers 请求头集合
* @param resultHandler 返回回调
* @param faultHandler 错误回调
* @param uploadProgressHandler 上传数据进度回调
*
* @return HTTP服务对象
*/
+ (MOBFHttpService *)sendHttpRequestByURLString:(NSString *)urlString
method:(NSString *)method
parameters:(NSDictionary *)parameters
headers:(NSDictionary *)headers
onResult:(MOBFHttpResultEvent)resultHandler
onFault:(MOBFHttpFaultEvent)faultHandler
onUploadProgress:(MOBFHttpUploadProgressEvent)uploadProgressHandler;
/**
* 发送HTTP请求
*
* @param urlString 请求地址
* @param method 请求方式
* @param parameters 请求参数
* @param headers 请求头集合
* @param timeout 请求超时
* @param resultHandler 返回回调
* @param faultHandler 错误回调
* @param uploadProgressHandler 上传数据进度回调
*
* @return HTTP服务对象
*/
+ (MOBFHttpService *)sendHttpRequestByURLString:(NSString *)urlString
method:(NSString *)method
parameters:(NSDictionary *)parameters
headers:(NSDictionary *)headers
timeout:(NSTimeInterval)timeout
onResult:(MOBFHttpResultEvent)resultHandler
onFault:(MOBFHttpFaultEvent)faultHandler
onUploadProgress:(MOBFHttpUploadProgressEvent)uploadProgressHandler;
/**
* 发送HTTP请求
*
* @param urlString 请求地址
* @param method 请求方式
* @param parameters 请求参数
* @param headers 请求头集合
* @param timeout 请求超时
* @param resultHandler 返回回调
* @param faultHandler 错误回调
* @param uploadProgressHandler 上传数据进度回调
* @param downloadProgressHandler 下载数据进度回调
*
* @return HTTP服务对象
*/
+ (MOBFHttpService *)sendHttpRequestByURLString:(NSString *)urlString
method:(NSString *)method
parameters:(NSDictionary *)parameters
headers:(NSDictionary *)headers
timeout:(NSTimeInterval)timeout
onResult:(MOBFHttpResultEvent)resultHandler
onFault:(MOBFHttpFaultEvent)faultHandler
onUploadProgress:(MOBFHttpUploadProgressEvent)uploadProgressHandler
onDownloadProgress:(MOBFHttpDownloadProgressEvent)downloadProgressHandler;
@end
================================================
FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MOBFImage.h
================================================
//
// MOBFImageUtils.h
// MOBFoundation
//
// Created by vimfung on 15-1-19.
// Copyright (c) 2015年 MOB. All rights reserved.
//
#import
#import
/**
* 圆角类型
*/
typedef NS_ENUM(NSUInteger, MOBFOvalType)
{
/**
* 无圆角
*/
MOBFOvalTypeNone = 0x00,
/**
* 左上角
*/
MOBFOvalTypeLeftTop = 0x01,
/**
* 左下角
*/
MOBFOvalTypeLeftBottom = 0x02,
/**
* 右上角
*/
MOBFOvalTypeRightTop = 0x04,
/**
* 右下角
*/
MOBFOvalTypeRightBottom = 0x08,
/**
* 全部
*/
MOBFOvalTypeAll = MOBFOvalTypeLeftTop | MOBFOvalTypeLeftBottom | MOBFOvalTypeRightTop | MOBFOvalTypeRightBottom
};
/**
* 图像工具类
*/
@interface MOBFImage : NSObject
/**
* 裁剪图片
*
* @param image 原始图片
* @param rect 裁剪范围
*
* @return 裁剪后图片
*/
+ (UIImage *)clipImage:(UIImage *)image withRect:(CGRect)rect;
/**
* 将图片边角裁剪为圆角
*
* @param image 原始图片
* @param size 图像尺寸
* @param ovalWidth 圆角宽度
* @param ovalHeight 圆角高度
* @param ovalType 圆角类型
*
* @return 裁剪后图像
*/
+ (UIImage *)roundRectImage:(UIImage *)image
withSize:(CGSize)size
ovalWidth:(CGFloat)ovalWidth
ovalHeight:(CGFloat)ovalHeight
ovalType:(MOBFOvalType)ovalType;
/**
* 等比缩放图片
*
* @param image 原始图片
* @param size 缩放的图片尺寸
*
* @return 缩放后图片
*/
+ (UIImage *)scaleImage:(UIImage *)image withSize:(CGSize)size;
/**
* 获取图片对象
*
* @param name 图片名称
* @param bundle 资源包对象
*
* @return 图片对象
*/
+ (UIImage *)imageName:(NSString *)name bundle:(NSBundle *)bundle;
/**
* 通过指定视图生成图片
*
* @param view 视图对象
*
* @return 图片对象
*/
+ (UIImage *)imageByView:(UIView *)view;
/**
* 通过制定视图生成图片
*
* @param view 视图对象
* @param opaque 是否为不透明图片,YES,不透明,NO,透明
*
* @return 图片对象
*/
+ (UIImage *)imageByView:(UIView *)view opaque:(BOOL)opaque;
@end
================================================
FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MOBFImageCachePolicy.h
================================================
//
// MOBFImageCachePolicy.h
// MOBFoundation
//
// Created by 冯鸿杰 on 2017/4/12.
// Copyright © 2017年 MOB. All rights reserved.
//
#import
#import "MOBFImageServiceTypeDef.h"
@interface MOBFImageCachePolicy : NSObject
/**
缓存名称,用于对不同的图片缓存划分到不同的缓存路径中,如果名称相同则缓存位置相同。
*/
@property (nonatomic, copy) NSString *cacheName;
/**
缓存处理回调,当有图片需要进行缓存时会先调用该方法
*/
@property (nonatomic, strong) MOBFImageGetterCacheHandler cacheHandler;
/**
获取默认的缓存策略
@return 缓存策略
*/
+ (instancetype)defaultCachePolicy;
@end
================================================
FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MOBFImageGetter.h
================================================
//
// MOBFImageGetter.h
// MOBFoundation
//
// Created by fenghj on 16/1/21.
// Copyright © 2016年 MOB. All rights reserved.
//
#import "MOBFImageObserver.h"
#import "MOBFImageServiceTypeDef.h"
#import
@class MOBFImageCachePolicy;
/**
* 图片获取器
*/
@interface MOBFImageGetter : NSObject
/**
* 获取共享图片服务实例
*
* @return 图片服务实例
*/
+ (instancetype)sharedInstance;
/**
初始化图片服务实例
@param cachePolicy 缓存策略
@return 图片服务实例
*/
- (instancetype)initWithCachePolicy:(MOBFImageCachePolicy *)cachePolicy;
/**
* 是否存在图片缓存
*
* @param url 图片URL
*
* @return YES 表示图片已缓存,NO 图片未缓存
*/
- (BOOL)existsImageCacheWithURL:(NSURL *)url;
/**
* 获取图片
*
* @param url 图片路径
* @param resultHandler 返回事件
*
* @return 服务观察者
*/
- (MOBFImageObserver *)getImageWithURL:(NSURL *)url
result:(MOBFImageGetterResultHandler)resultHandler;
/**
获取图片数据
@param url 图片路径
@param resultHandler 返回事件
@return 服务观察者
*/
- (MOBFImageObserver *)getImageDataWithURL:(NSURL *)url
result:(MOBFImageDataGetterResultHandler)resultHandler;
/**
* 移除图片观察者
*
* @param imageObserver 图片观察者
*/
- (void)removeImageObserver:(MOBFImageObserver *)imageObserver;
@end
================================================
FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MOBFImageObserver.h
================================================
//
// MOBFImageObserver.h
// MOBFoundation
//
// Created by fenghj on 16/1/21.
// Copyright © 2016年 MOB. All rights reserved.
//
#import
/**
* 图片观察者
*/
@interface MOBFImageObserver : NSObject
/**
* 图片链接
*/
@property (nonatomic, strong, readonly) NSURL *url;
@end
================================================
FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MOBFImageServiceTypeDef.h
================================================
//
// MOBFImageServiceTypeDef.h
// MOBFoundation
//
// Created by fenghj on 15/6/8.
// Copyright (c) 2015年 MOB. All rights reserved.
//
#ifndef MOBFoundation_MOBFImageServiceTypeDef_h
#define MOBFoundation_MOBFImageServiceTypeDef_h
#import
/**
图片缓存处理
@param image 图片对象
@param imageData 图片的数据
*/
typedef NSData* (^MOBFImageGetterCacheHandler)(NSData *imageData);
/**
* 图片加载返回
*
* @param image 图片对象
* @param error 错误信息
*/
typedef void (^MOBFImageGetterResultHandler)(UIImage *image, NSError *error);
/**
* 图片加载返回
*
* @param imageData 图片数据
* @param error 错误信息
*/
typedef void (^MOBFImageDataGetterResultHandler)(NSData *imageData, NSError *error);
#endif
================================================
FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MOBFJSContext.h
================================================
//
// MOBFJSContext.h
// MOBFoundation
//
// Created by 冯 鸿杰 on 15/2/27.
// Copyright (c) 2015年 MOB. All rights reserved.
//
#import
#import "MOBFJSTypeDefine.h"
@class JSContext;
/**
* JavaScript上下文环境
*/
@interface MOBFJSContext : NSObject
/**
* 获取默认的上下文环境
*
* @return JS上下文环境
*/
+ (instancetype)defaultContext;
/**
初始化
@param webview Web视图,如果传入视图带有委托处理,请在传入该参数前将委托设置,否则会导致Context无法正常工作。
@return JS上下文
*/
- (instancetype)initWithWebView:(UIWebView *)webview;
/**
初始化
@param context JS上下文
@return JS上下文
*/
- (instancetype)initWithContext:(JSContext *)context;
/**
* 注册方法
*
* @param name 方法名称
* @param block 方法执行
*/
- (void)registerJSMethod:(NSString *)name block:(MOBFJSMethodIMP)block;
/**
* 调用方法
*
* @param name 方法名称
* @param arguments 参数
*
* @return 返回值
*/
- (NSString *)callJSMethod:(NSString *)name arguments:(NSArray *)arguments;
/**
* 加载插件
*
* @param path 插件脚本文件路径
* @param name 插件名称
*/
- (void)loadPluginWithPath:(NSString *)path forName:(NSString *)name;
/**
* 加载插件
*
* @param content 插件脚本内容
* @param name 插件名称
*/
- (void)loadPlugin:(NSString *)content forName:(NSString *)name;
/**
* 执行脚本
*
* @param script 脚本
*/
- (void)runScript:(NSString *)script;
@end
================================================
FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MOBFJSMethod.h
================================================
//
// MOBFJSMethod.h
// MOBFoundation
//
// Created by 冯 鸿杰 on 15/2/27.
// Copyright (c) 2015年 MOB. All rights reserved.
//
#import
#import "MOBFJSTypeDefine.h"
/**
* JS方法
*/
@interface MOBFJSMethod : NSObject
/**
* 方法名称
*/
@property (nonatomic, copy, readonly) NSString *name;
/**
* 方法实现
*/
@property (nonatomic, strong, readonly) MOBFJSMethodIMP imp;
/**
* 初始化方法
*
* @param name 方法名称
* @param imp 方法实现
*
* @return 方法对象
*/
- (id)initWithName:(NSString *)name imp:(MOBFJSMethodIMP)imp;
@end
================================================
FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MOBFJSTypeDefine.h
================================================
//
// MOBFJSTypeDefine.h
// MOBFoundation
//
// Created by 冯 鸿杰 on 15/2/27.
// Copyright (c) 2015年 MOB. All rights reserved.
//
#ifndef MOBFoundation_MOBFJSTypeDefine_h
#define MOBFoundation_MOBFJSTypeDefine_h
/**
* JS方法实现
*
* @param arguments 传入参数
*/
typedef void(^MOBFJSMethodIMP) (NSArray *arguments);
#endif
================================================
FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MOBFJson.h
================================================
//
// MOBFJson.h
// MOBFoundation
//
// Created by vimfung on 15-1-20.
// Copyright (c) 2015年 MOB. All rights reserved.
//
#import
/**
* JSON工具类
*/
@interface MOBFJson : NSObject
/**
* 通过JSON字符串反序列化为对象
*
* @param jsonString JSON字符串
*
* @return 对象
*/
+ (id)objectFromJSONString:(NSString *)jsonString;
/**
* 通过JSON数据反序列化为对象
*
* @param jsonData JSON数据
*
* @return 对象
*/
+ (id)objectFromJSONData:(NSData *)jsonData;
/**
* 通过对象序列化为JSON字符串
*
* @param object 对象
*
* @return JSON字符串
*/
+ (NSString *)jsonStringFromObject:(id)object;
/**
* 通过对象序列化为JSON字符串
*
* @param object 对象
* @param block 未解析类型回调
*
* @return JSON字符串
*/
+ (NSString *)jsonStringFromObject:(id)object serializeUnsupportedClassesUsingBlock:(id(^)(id object))block;
/**
* 通过对象序列化为JSON数据
*
* @param object 对象
*
* @return JSON数据
*/
+ (NSData *)jsonDataFromObject:(id)object;
/**
* 通过对象序列化为JSON数据
*
* @param object 对象
* @param block 未解析类型回调
*
* @return JSON数据
*/
+ (NSData *)jsonDataFromObject:(id)object serializeUnsupportedClassesUsingBlock:(id(^)(id object))block;
@end
================================================
FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MOBFLogService.h
================================================
//
// MOBFLogService.h
// MOBFoundation
//
// Created by 冯鸿杰 on 17/2/16.
// Copyright © 2017年 MOB. All rights reserved.
//
#import
@class MOBFLogService;
/**
日志服务协议
*/
@protocol MOBFLogServiceDelegate
/**
是否需要发送日志
@param logService 日志服务
@param logs 已有日志信息集合
@return YES 表示需要发送日志,NO 表示不需要发送日志
*/
- (BOOL)logService:(MOBFLogService *)logService
needsSendLogs:(NSArray *)logs;
/**
发送日志
@param logService 日志服务
@param logs 需要发送的日志信息集合
@param result 发送完成回调,成功时传入YES,否则传入NO
*/
- (void)logService:(MOBFLogService *)logService
didSendLogs:(NSArray *)logs
result:(void (^)(BOOL succeed, NSArray *sentLogs))result;
@end
/**
日志服务
*/
@interface MOBFLogService : NSObject
/**
委托对象
*/
@property (nonatomic, weak) id delegate;
/**
失败最大重试次数
*/
@property (nonatomic) NSInteger failRetryMaxCount;
/**
初始化
@param name 日志服务名称
@return 日志服务对象
*/
- (instancetype)initWithName:(NSString *)name;
/**
初始化
@param name 日志服务名称
@param secretKey 密钥(AES)
@return 日志服务对象
*/
- (instancetype)initWithName:(NSString *)name
secretKey:(NSString *)secretKey;
/**
写入数据
@param data 日志数据
*/
- (void)writeData:(id)data;
/**
同步写入数据
@param data 日志数据
*/
- (void)syncWriteData:(id)data;
/**
需要发送日志,服务会对当前日志进行检测,如果发现存在日志会跟委托进行确认是否需要发送,然后再进行后续操作
*/
- (void)needsSendLog;
/**
需要发送日志,服务会对当前日志进行检测,如果发现存在日志会跟委托进行确认是否需要发送,然后再进行后续操作
@param time 延时检测时间
*/
- (void)needsSendLogAfterTime:(NSTimeInterval)time;
@end
================================================
FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MOBFNotificationCenter.h
================================================
//
// MOBFCore.h
// MOBFoundation
//
// Created by fenghj on 15/8/31.
// Copyright (c) 2015年 MOB. All rights reserved.
//
#import
/**
* 应用程序崩溃通知
*/
extern NSString *const MOBFApplicationCrashNotif;
/**
* 核心对象
*/
@interface MOBFNotificationCenter : NSObject
/**
* 添加观察者
*
* @param observer 观察者对象
* @param selector 处理器方法
* @param name 通知名称
* @param object 对象信息
*/
+ (void)addObserver:(NSObject *)observer
selector:(SEL)selector
name:(NSString *)name
object:(id)object;
/**
* 移除观察者
*
* @param observer 观察者对象
*/
+ (void)removeObserver:(NSObject *)observer;
/**
* 移除观察者
*
* @param observer 观察者对象
* @param name 通知名称
* @param object 对象信息
*/
+ (void)removeObserver:(NSObject *)observer
name:(NSString *)name
object:(id)object;
@end
================================================
FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MOBFNumber.h
================================================
//
// MOBFNumberUtils.h
// MOBFoundation
//
// Created by vimfung on 15-1-20.
// Copyright (c) 2015年 MOB. All rights reserved.
//
#import
/**
* 数值工具类
*/
@interface MOBFNumber : NSObject
/**
* 获取随机整型值
*
* @param max 最大随机数
*
* @return 随机整数
*/
+ (NSInteger)randomInteger:(NSInteger)max;
@end
================================================
FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MOBFOAuthService.h
================================================
//
// MOBFOAuthService.h
// MOBFoundation
//
// Created by fenghj on 15/6/9.
// Copyright (c) 2015年 MOB. All rights reserved.
//
#import
/**
* OAuth服务
*/
@interface MOBFOAuthService : MOBFHttpService
/**
* 设置密钥
*
* @param consumerSecret 消费者密钥,不允许为nil
* @param oauthTokenSecret 令牌密钥,如果尚未取得令牌密钥,可以传入nil
*/
- (void)setSecretByConsumerSecret:(NSString *)consumerSecret
oauthTokenSecret:(NSString *)oauthTokenSecret;
/**
* 添加OAuth参数
*
* @param value 参数值
* @param key 参数名字
*/
- (void)addOAuthParameter:(id)value forKey:(NSString *)key;
/**
* 添加OAuth参数
*
* @param oauthParameters OAuth参数集合
*/
- (void)addOAuthParameters:(NSDictionary *)oauthParameters;
/**
* 发送HTTP请求
*
* @param urlString 请求地址
* @param method 请求方式
* @param parameters 请求参数
* @param headers 请求头集合
* @param oauthParameters OAuth请求参数
* @param consumerSecret 消费者密钥
* @param oauthSecret OAuth令牌密钥
* @param resultHandler 返回回调
* @param faultHandler 错误回调
* @param uploadProgressHandler 上传数据进度回调
*
* @return HTTP服务对象
*/
+ (MOBFOAuthService *)sendRequestByURLString:(NSString *)urlString
method:(NSString *)method
parameters:(NSDictionary *)parameters
headers:(NSDictionary *)headers
oauthParameters:(NSDictionary *)oauthParameters
consumerSecret:(NSString *)consumerSecret
oauthTokenSecret:(NSString *)oauthTokenSecret
onResult:(MOBFHttpResultEvent)resultHandler
onFault:(MOBFHttpFaultEvent)faultHandler
onUploadProgress:(MOBFHttpUploadProgressEvent)uploadProgressHandler;
@end
================================================
FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MOBFPluginManager.h
================================================
//
// MOBFPluginManager.h
// MOBFoundation
//
// Created by fenghj on 15/6/2.
// Copyright (c) 2015年 MOB. All rights reserved.
//
#import
#import "IMOBFPlugin.h"
/**
* 插件创建事件处理
*
* @return 插件对象
*/
typedef id(^MOBFPluginConstructHandler) ();
/**
* 插件管理器
*/
@interface MOBFPluginManager : NSObject
/**
* 获取默认的插件管理器
*
* @return 插件管理器
*/
+ (instancetype) defaultManager;
/**
* 注册插件
*
* @param pluginConstructHandler 插件构造事件处理器
* @param key 插件标识
*
* @return YES 表示注册成功,NO 表示注册失败,有可能已存在此插件
*/
- (BOOL)registerPlugin:(MOBFPluginConstructHandler)pluginConstructHandler forKey:(NSString *)key;
/**
* 判断是否已经注册插件
*
* @param key 插件标识
*
* @return YES 表示已经注册, NO 表示尚未注册
*/
- (BOOL)isRegisterPluginForKey:(NSString *)key;
/**
* 获取插件对象
*
* @param key 插件标识
*
* @return 插件对象,nil 表示该标志的插件不存在
*/
- (id)pluginForKey:(NSString *)key;
/**
* 卸载插件
*
* @param key 插件标识
*/
- (void)unloadPluginForKey:(NSString *)key;
@end
================================================
FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MOBFRSAHelper.h
================================================
//
// MOBFRSAHelper.h
// MOBFoundation
//
// Created by fenghj on 15/7/29.
// Copyright (c) 2015年 MOB. All rights reserved.
//
#import
#import "MOBFRSAKey.h"
/**
* RSA加解密助手
*/
@interface MOBFRSAHelper : NSObject
/**
* 密钥信息
*/
@property (nonatomic, readonly) MOBFRSAKey *key;
/**
* 初始化RSA加密器
*
* @param keySize 密钥长度
*
* @return 加密器对象
*/
- (instancetype)initWithKeySize:(int)keySize;
/**
* 初始化RSA加密器
*
* @param keySize 密钥长度
* @param publicKey 公钥
* @param privateKey 私钥
* @param modulus 模数
*
* @return 加密器对象
*/
- (instancetype)initWithKeySize:(int)keySize
publicKey:(NSString *)publicKey
privateKey:(NSString *)privateKey
modulus:(NSString *)modulus;
/**
* 加密数据
*
* @param data 数据
*
* @return 加密后数据
*/
- (NSData *)encryptWithData:(NSData *)data;
/**
* 解密数据
*
* @param data 加密后数据
*
* @return 解密后数据
*/
- (NSData *)decryptWithData:(NSData *)data;
@end
================================================
FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MOBFRSAKey.h
================================================
//
// MOBFRSAKey.h
// MOBFoundation
//
// Created by fenghj on 15/7/29.
// Copyright (c) 2015年 MOB. All rights reserved.
//
#import
@class MOBFBigInteger;
@interface MOBFRSAKey : NSObject
/**
* bits in key
*/
@property (nonatomic) int bits;
/**
* modulus
*/
@property (nonatomic, strong) MOBFBigInteger *n;
/**
* public exponent
*/
@property (nonatomic, strong) MOBFBigInteger *e;
/**
* private exponent
*/
@property (nonatomic, strong) MOBFBigInteger *d;
@end
================================================
FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MOBFRegex.h
================================================
//
// MOBFRegex.h
// MOBFoundation
//
// Created by vimfung on 15-1-20.
// Copyright (c) 2015年 MOB. All rights reserved.
//
#import
/**
* 替换处理
*
* @param captureCount 捕获数量
* @param capturedStrings 捕获字符串集合
* @param capturedRanges 捕获字符串范围集合
* @param stop 是否停止捕获标识
*
* @return 替换后的字符串
*/
typedef NSString *(^MOBFReplacingOccurrencesHandler) (NSInteger captureCount, NSString *const capturedStrings[captureCount], const NSRange capturedRanges[captureCount], volatile BOOL * const stop);
/**
正则表达式选项
- MOBFRegexOptionsNoOptions: 无匹配
- MOBFRegexOptionsCaseless: 不区分字母大小写的模式
- MOBFRegexOptionsComments: 忽略掉正则表达式中的空格和#号之后的字符
- MOBFRegexOptionsIgnoreMetacharacters: 将正则表达式整体作为字符串处理
- MOBFRegexOptionsDotAll: 允许.匹配任何字符,包括换行符
- MOBFRegexOptionsMultiline: 允许^和$符号匹配整段文本的开头和结尾
- MOBFRegexOptionsUseUnixLineSeparators: 设置\n为唯一的行分隔符,否则所有的都有效。
- MOBFRegexOptionsUnicodeWordBoundaries: 使用Unicode TR#29标准作为词的边界,否则所有传统正则表达式的词边界都有效
*/
typedef NS_ENUM(NSUInteger, MOBFRegexOptions)
{
MOBFRegexOptionsNoOptions = 0,
MOBFRegexOptionsCaseless = 1 << 0,
MOBFRegexOptionsComments = 1 << 1,
MOBFRegexOptionsIgnoreMetacharacters = 1 << 2,
MOBFRegexOptionsDotAll = 1 << 3,
MOBFRegexOptionsMultiline = 1 << 4,
MOBFRegexOptionsUseUnixLineSeparators = 1 << 5,
MOBFRegexOptionsUnicodeWordBoundaries = 1 << 6,
};
/**
* 正则表达式工具类
*/
@interface MOBFRegex : NSObject
/**
* 替换字符串
*
* @param regex 正则表达式
* @param string 原始字符串
* @param block 块回调处理替换规则
*
* @return 字符串
*/
+ (NSString *)stringByReplacingOccurrencesOfRegex:(NSString *)regex
withString:(NSString *)string
usingBlock:(MOBFReplacingOccurrencesHandler)block;
/**
* 匹配字符串
*
* @param regex 正则表达式
* @param options 表达式选项
* @param range 匹配范围
* @param string 原始字符串
*
* @return YES 匹配,NO 不匹配
*/
+ (BOOL)isMatchedByRegex:(NSString *)regex
options:(MOBFRegexOptions)options
inRange:(NSRange)range
withString:(NSString *)string;
/**
* 匹配字符串
*
* @param regex 正则表达式
* @param string 原始字符串
*
* @return 匹配的字符串集合
*/
+ (NSArray *)captureComponentsMatchedByRegex:(NSString *)regex
withString:(NSString *)string;
@end
================================================
FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MOBFString.h
================================================
//
// MOBFStringUtils.h
// MOBFoundation
//
// Created by vimfung on 15-1-16.
// Copyright (c) 2015年 MOB. All rights reserved.
//
#import
/**
* 字符串工具
*/
@interface MOBFString : NSObject
/**
* URL编码
*
* @param string 原始字符串
* @param encoding 字符串编码
*
* @return 编码后字符串
*/
+ (NSString *)urlEncodeString:(NSString *)string forEncoding:(NSStringEncoding)encoding;
/**
* URL解码
*
* @param string 原始字符串
* @param encoding 字符串编码
*
* @return 解码后字符串
*/
+ (NSString *)urlDecodeString:(NSString *)string forEncoding:(NSStringEncoding)encoding;
/**
* 使用SHA1算法进行字符串签名
*
* @param string 原始字符串
*
* @return 签名后字符串
*/
+ (NSString *)sha1String:(NSString *)string;
/**
* 使用MD5算法进行字符串签名
*
* @param string 原始字符串
*
* @return 签名后字符串
*/
+ (NSString *)md5String:(NSString *)string;
/**
* 获取GUID字符串
*
* @return GUID字符串
*/
+ (NSString *)guidString;
/**
* 使用HMAC-SHA1进行签名
*
* @param string 原始字符串
* @param key 密钥
*
* @return 签名后的数据
*/
+ (NSData *)dataByHMACSha1String:(NSString *)string forKey:(NSString *)key;
/**
使用HMAC-MD5进行签名
@param string 原始字符串
@param key 密钥
@return 签名后的数据
*/
+ (NSData *)dataByHMACMd5String:(NSString *)string forKey:(NSString *)key;
/**
* 使用BASE64进行解码
*
* @param string 原始字符串
*
* @return 解码后数据
*/
+ (NSData *)dataByBase64DecodeString:(NSString *)string;
/**
* 判断字符串中是否包含链接
*
* @param string 原始字符串
*
* @return YES 表示包含URL,NO 表示不包含
*/
+ (BOOL)containsURLByString:(NSString *)string;
/**
* @brief 解析HTTP参数字符串,字符串格式为:参数名=参数值&参数名=参数值
*
* @param string 参数字符串
*
* @return 解析后字典对象
*/
+ (NSDictionary *)parseURLParametersString:(NSString *)string;
/**
* @brief 转换16进制字符串为NSData
*
* @param string 二进制流的16进制字符串
*
* @return 二进制数据对象
*/
+ (NSData *)dataByHexString:(NSString *)string;
@end
================================================
FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MOBFUser.h
================================================
//
// MOBFUser.h
// MOBFoundation
//
// Created by 冯鸿杰 on 17/3/17.
// Copyright © 2017年 MOB. All rights reserved.
//
#import
#import "IMOBBaseUser.h"
#import "MOBFDataModel.h"
/**
用户信息
*/
@interface MOBFUser : MOBFDataModel
/**
用户标识
*/
@property (nonatomic, copy, readonly, nullable) NSString * uid;
/**
应用的用户标识
*/
@property (nonatomic, copy, readonly, nullable) NSString * appUid;
/**
用户头像
*/
@property (nonatomic, copy, nullable) NSString * avatar;
/**
用户昵称
*/
@property (nonatomic, copy, nullable) NSString * nickname;
/**
用户自定义数据
*/
@property (nonatomic, strong, nullable) NSDictionary * userdata;
/**
创建第三方用户信息
@param uid 用户标识,能够表示你的用户唯一性的标识
@param avatar 用户头像地址
@param nickname 用户名称
@return 用户信息
*/
+ (MOBFUser* _Nullable)userWithUid:(NSString * _Nonnull)uid
avatar:(NSString * _Nullable)avatar
nickname:(NSString * _Nullable)nickname __deprecated_msg("use userWithAppUid:avatar:nickname:userData: method instead.");
/**
创建第三方用户信息
@param appUid 用户标识,能够表示你的用户唯一性的标识
@param avatar 用户头像地址
@param nickname 用户名称
@param userdata 用户自定义数据
@return 用户信息
*/
+ (MOBFUser* _Nullable)userWithAppUid:(NSString * _Nonnull )appUid
avatar:(NSString * _Nullable)avatar
nickname:(NSString * _Nullable)nickname
userdata:(NSDictionary * _Nullable)userdata;
@end
================================================
FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MOBFViewController.h
================================================
//
// MOBFViewControllerUtils.h
// MOBFoundation
//
// Created by vimfung on 15-1-19.
// Copyright (c) 2015年 MOB. All rights reserved.
//
#import
#import
/**
* 视图控制器工具类
*/
@interface MOBFViewController : NSObject
/**
* 获取当前视图控制器
*
* @return 视图控制器
*/
+ (UIViewController *)currentViewController;
/**
* 获取当前视图控制器
*
* @param window 窗口
*
* @return 视图控制器
*/
+ (UIViewController *)currentViewControllerFromWindow:(UIWindow *)window;
@end
================================================
FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MOBFXml.h
================================================
//
// MOBFXml.h
// MOBFoundation
//
// Created by fenghj on 15/9/16.
// Copyright © 2015年 MOB. All rights reserved.
//
#import
@class MOBFXmlNode;
/**
* XML工具类
*/
@interface MOBFXml : NSObject
/**
* 根节点
*/
@property (nonatomic, strong, readonly) MOBFXmlNode *rootNode;
/**
* 初始化XML实例对象
*
* @param path XML文件路径
*
* @return XML实例对象
*/
- (instancetype)initWithPath:(NSString *)path;
/**
* 初始化XML实例对象
*
* @param string XML字符串描述
*
* @return XML实例对象
*/
- (instancetype)initWithString:(NSString *)string;
/**
* 获取XML字典描述对象
*
* @return 字典对象
*/
- (NSDictionary *)dictionaryValue;
@end
================================================
FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MOBFXmlNode.h
================================================
//
// MOBFXmlNode.h
// MOBFoundation
//
// Created by fenghj on 15/9/17.
// Copyright © 2015年 MOB. All rights reserved.
//
#import
/**
* XML节点
*/
@interface MOBFXmlNode : NSObject
/**
* 父级节点
*/
@property (nonatomic, weak) MOBFXmlNode *parentNode;
/**
* 节点名称
*/
@property (nonatomic, copy) NSString *name;
/**
* 属性集合
*/
@property (nonatomic, strong, readonly) NSMutableDictionary *attributes;
/**
* 子节点
*/
@property (nonatomic, strong, readonly) NSMutableArray *children;
/**
* 文本信息
*/
@property (nonatomic, copy) NSString *text;
/**
* 获取节点的字典结构描述
*
* @return 字典结构
*/
- (NSDictionary *)dictionaryValue;
@end
================================================
FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MOBFoundation.h
================================================
//
// MOBFoundation.h
// MOBFoundation
//
// Created by vimfung on 15-1-16.
// Copyright (c) 2015年 MOB. All rights reserved.
//
#ifndef MOBFoundation_MOBFoundation_h
#define MOBFoundation_MOBFoundation_h
#import
#import
#import
#import
#import
#import
#import
#import
#import
#import
#import
#import
#import
#import
#import
#import
#import
#import
#import
#endif
================================================
FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MobSDK.h
================================================
//
// MobSDK.h
// MOBFoundation
//
// Created by 冯鸿杰 on 17/2/23.
// Copyright © 2017年 MOB. All rights reserved.
//
#import
/**
MobSDK
*/
@interface MobSDK : NSObject
/**
获取版本号
@return 版本号
*/
+ (NSString * _Nonnull)version;
/**
获取应用标识
@return 应用标识
*/
+ (NSString * _Nullable)appKey;
/**
获取应用密钥
@return 应用密钥
*/
+ (NSString * _Nullable)appSecret;
/**
变更应用密钥,针对服务器刷新应用密钥后,可以通过该方法进行修改
@param appSecret 应用密钥
*/
+ (void)changeAppSecret:(NSString * _Nonnull)appSecret;
/**
注册appKey、appSecret
@param appKey appKey
@param appSecret appSecret
*/
+ (void)registerAppKey:(NSString * _Nonnull)appKey
appSecret:(NSString * _Nonnull)appSecret;
#pragma mark - User
/**
设置用户
@param uid 用户标识,对应应用自身用户系统的用户唯一标志,不一定是实际的用户ID,可以通过数据变换的方式(如:MD5(userID))来生成该ID,但一定要能够唯一标识用户。设置nil表示注销用户,解除绑定
@param nickname 昵称
@param avatar 头像
@param userData 用户自定义数据
*/
+ (void)setUserWithUid:(NSString * _Nullable)uid
nickName:(NSString * _Nullable)nickname
avatar:(NSString * _Nullable)avatar
userData:(NSDictionary * _Nullable)userData;
/**
清空用户
*/
+ (void)clearUser;
@end
================================================
FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/MOBFoundation
================================================
[File too large to display: 11.1 MB]
================================================
FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/readme
================================================
=========================================
MOBFoundation.framework
=========================================
1、引用此库需要添加下面依赖库:
libz.tdb
libstdc++.tdb
================================================
FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/ShareSDK.framework/Headers/IMOBFContentEntity.h
================================================
//
// IMOBFContentEntity.h
// ShareSDK
//
// Created by youzu on 2017/9/18.
// Copyright © 2017年 掌淘科技. All rights reserved.
//
#import
@protocol IMOBFContentEntity
/**
* 内容标识
*/
@property (nonatomic, copy) NSString *cid;
/**
* 分享文本
*/
@property (nonatomic, copy) NSString *text;
/**
* 分享图片列表,元素为SSDKImage
*/
@property (nonatomic, strong) NSArray *images;
/**
* 分享链接列表,元素为NSURL
*/
@property (nonatomic, strong) NSArray *urls;
/**
* 原始数据
*/
@property (nonatomic, strong) NSDictionary *rawData;
@end
================================================
FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/ShareSDK.framework/Headers/IMOBFShareComponent.h
================================================
//
// IMOBFShareComponent.h
// MOBFoundation
//
// Created by 冯鸿杰 on 17/2/14.
// Copyright © 2017年 MOB. All rights reserved.
//
#import
#import
@protocol IMOBFSocialUser;
@protocol IMOBFContentEntity;
/**
分享组件
*/
@protocol IMOBFShareComponent
/**
* 分享平台授权
*
* @param platformType 平台类型
* @param settings 授权设置,目前只接受SSDKAuthSettingKeyScopes属性设置,如新浪微博关注官方微博:@{SSDKAuthSettingKeyScopes : @[@"follow_app_official_microblog"]},类似“follow_app_official_microblog”这些字段是各个社交平台提供的。
* @param stateChangedHandler 授权状态变更回调处理
*/
+ (void)authorize:(NSInteger)platformType
settings:(NSDictionary *)settings
onStateChanged:(void (^) (NSInteger state, id user, NSError *error))stateChangedHandler;
/**
* 获取授权用户信息
*
* @param platformType 平台类型
* @param stateChangedHandler 状态变更回调处理
*/
+ (void)getUserInfo:(NSInteger)platformType
onStateChanged:(void (^) (NSInteger state, id user, NSError *error))stateChangedHandler;
/**
* 取消分享平台授权
*
* @param platformType 平台类型
*/
+ (void)cancelAuthorize:(NSInteger)platformType;
/**
* 判断分享平台是否授权
*
* @param platformTypem 平台类型
* @return YES 表示已授权,NO 表示尚未授权
*/
+ (BOOL)hasAuthorized:(NSInteger)platformTypem;
/**
* 分享内容
*
* @param platformType 平台类型
* @param parameters 分享参数
* @param stateChangedHandler 状态变更回调处理
*/
+ (void)share:(NSInteger)platformType
parameters:(NSMutableDictionary *)parameters
onStateChanged:(void (^)(NSInteger state, NSDictionary *userData, id contentEntity, NSError *error))stateChangedHandler;
@optional
#pragma mark - share 参数设置
/**
设置分享参数
@param text 文本
@param images 图片集合,传入参数可以为单张图片信息,也可以为一个NSArray,数组元素可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage。如: @"http://www.mob.com/images/logo_black.png" 或 @[@"http://www.mob.com/images/logo_black.png"]
@param url 网页路径/应用路径
@param title 标题
@param type 分享类型
@param dataDictionary 数据存储字典 如果传入nil将新建
*/
+ (NSMutableDictionary *)SSDKSetupShareParamsByText:(NSString *)text
images:(id)images
url:(NSURL *)url
title:(NSString *)title
type:(NSInteger)type
dataDictionary:(NSMutableDictionary *)dataDictionary;
/*
设置新浪微博分享参数
@param text 文本
@param title 标题
@param image 图片对象,可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage
@param url 分享链接
@param latitude 纬度
@param longitude 经度
@param objectID 对象ID,标识系统内内容唯一性,应传入系统中分享内容的唯一标识,没有时可以传入nil
@param type 分享类型,仅支持Text、Image、WebPage 类型
设置 SSDKEnableSinaWeiboAPIShare 使用API进行分享 但text中需要附 安全域 安全域在新浪微博开放平台设置
@param dataDictionary 数据存储字典 如果传入nil将新建
*/
+ (NSMutableDictionary *)SSDKSetupSinaWeiboShareParamsByText:(NSString *)text
title:(NSString *)title
image:(id)image
url:(NSURL *)url
latitude:(double)latitude
longitude:(double)longitude
objectID:(NSString *)objectID
type:(NSInteger)type
dataDictionary:(NSMutableDictionary *)dataDictionary;
/*
设置微信分享参数
@param text 文本
@param title 标题
@param url 分享链接
@param thumbImage 缩略图,可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage
@param image 图片,可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage
@param musicFileURL 音乐文件链接地址
@param extInfo 扩展信息
@param fileData 文件数据,可以为NSData、UIImage、NSString、NSURL(文件路径)、SSDKData、SSDKImage
@param emoticonData 表情数据,可以为NSData、UIImage、NSURL(文件路径)、SSDKData、SSDKImage
@param fileExtension 源文件后缀名
@param sourceFileData 源文件数据,可以为NSData、NSString、NSURL(文件路径)、SSDKData
@param type 分享类型,支持SSDKContentTypeText、SSDKContentTypeImage、SSDKContentTypeWebPage、SSDKContentTypeApp、SSDKContentTypeAudio和SSDKContentTypeVideo
@param platformSubType 平台子类型,只能传入其中一个
@param dataDictionary 数据存储字典 如果传入nil将新建
分享文本时:
设置type为SSDKContentTypeText, 并填入text参数
分享图片时:
设置type为SSDKContentTypeImage, 非gif图片时:填入title和image参数,如果为gif图片则需要填写title和emoticonData参数
分享网页时:
设置type为SSDKContentTypeWebPage, 并设置text、title、url以及thumbImage参数,如果尚未设置thumbImage则会从image参数中读取图片并对图片进行缩放操作。
分享应用时:
设置type为SSDKContentTypeApp,并设置text、title、extInfo(可选)以及fileData(可选)参数。
分享音乐时:
设置type为SSDKContentTypeAudio,并设置text、title、url以及musicFileURL(可选)参数。
分享视频时:
设置type为SSDKContentTypeVideo,并设置text、title、url参数
分享文件时:
设置type为SSDKContentTypeFile(例如.mp3、.mp4、.pdf、.docx的分享),设置title、sourceFileExtension、sourceFileData,以及thumbImage参数,如果尚未设置thumbImage则会从image参数中读取图片并对图片进行缩放操作参数
*/
+ (NSMutableDictionary *)SSDKSetupWeChatParamsByText:(NSString *)text
title:(NSString *)title
url:(NSURL *)url
thumbImage:(id)thumbImage
image:(id)image
musicFileURL:(NSURL *)musicFileURL
extInfo:(NSString *)extInfo
fileData:(id)fileData
emoticonData:(id)emoticonData
sourceFileExtension:(NSString *)fileExtension
sourceFileData:(id)sourceFileData
type:(NSInteger)type
forPlatformSubType:(NSInteger)platformSubType
dataDictionary:(NSMutableDictionary *)dataDictionary;
/*
设置QQ分享参数
@param text 分享内容
@param title 分享标题
@param url 分享链接(如果分享类型为音频/视频时,应该传入音频/视频的网络URL地址)
[特别说明:分享视频到QZone时,视频为网络视频,请传入视频网络URL地址;视频为本地视频的,请传入来源于手机系统相册的相关的Asset URL地址]
@param audioFlashURL 分享音频时缩略图播放源,仅平台子类型为SSDKPlatformSubTypeQQFriend,且分享类型为Audio时生效
@param videoFlashURL 分享视频时缩略图播放源,仅平台子类型为SSDKPlatformSubTypeQQFriend,且分享类型为Video时生效
@param thumbImage 缩略图,可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage
@param images 图片集合,传入参数可以为单张图片信息,也可以为一个NSArray,数组元素可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage
QQ会采用首张图片,QZone则支持图片数组
@param type 分享类型, 仅支持Text、Image、WebPage、Audio、Video类型
@param platformSubType 平台子类型,只能传入SSDKPlatformSubTypeQZone或者SSDKPlatformSubTypeQQFriend其中一个
@param dataDictionary 数据存储字典 如果传入nil将新建
*/
+ (NSMutableDictionary *)SSDKSetupQQParamsByText:(NSString *)text
title:(NSString *)title
url:(NSURL *)url
audioFlashURL:(NSURL *)audioFlashURL
videoFlashURL:(NSURL *)videoFlashURL
thumbImage:(id)thumbImage
images:(id)images
type:(NSInteger)type
forPlatformSubType:(NSInteger)platformSubType
dataDictionary:(NSMutableDictionary *)dataDictionary;
/**
设置Facebook分享参数
@param text 分享内容
分享类型为Text类型时,作为文字主体内容
分享类型为WebPage类型时,作为连接描述
@param image 图片,可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage
分享类型为Image类型时,若使用客户端分享,可传入 单张/多张 的 本地/网络 图片;如果不使用客户端分享,仅支持单张的本地/网络图片
*【Facebook通过客户端分享图片,可不需依赖任何权限;否则需要申请publish_actions权限】*
分享类型为WebPage类型时,无论是否使用客户端,仅支持单张的网络图片
@param url 链接
分享类型为WebPage类型时,为链接地址
[如果分享的连接是AppStore/GooglePlay/Facebook个人/公共主页,所对应的图片,标题,描述等参数可能不会生效,而实际生效的是FB通过爬虫网络根据连接搜刮而来的信息]
分享类型为Video类型时,需传入视频地址且但必须是相册地址
@param title 链接标题
分享类型为WebPage类型时,为链接标题
@param urlName 连接名称
分享类型为WebPage类型时,为链接名称,仅在非客户端分享时生效
@param attachementUrl 附件链接(附加的媒体文件(SWF 或 MP3)的网址。如果是 SWF,还必须指定image以提供视频的缩略图)
分享类型为WebPage类型时,为链,仅在非客户端分享时生效
@param type 分享类型
当使用客户端分享时,支持Image、WebPage,Video类型
当不适用客户端分享是,支持Text、Image、WebPage类型
@param dataDictionary 数据存储字典 如果传入nil将新建
*/
- (NSMutableDictionary *)SSDKSetupFacebookParamsByText:(NSString *)text
image:(id)image
url:(NSURL *)url
urlTitle:(NSString *)title
urlName:(NSString *)urlName
attachementUrl:(NSURL *)attachementUrl
type:(NSInteger)type
dataDictionary:(NSMutableDictionary *)dataDictionary;
#pragma mark - ShareUI
/**
* 显示分享菜单
*
* @param view 要显示菜单的视图, iPad版中此参数作为弹出菜单的参照视图
* @param items 菜单项,如果传入nil,则显示已集成的平台列表
* @param shareParams 分享内容参数
* @param shareStateChangedHandler 分享状态变更事件
*
* @return 分享菜单控制器 SSUIShareActionSheetController
*/
+ (id)showShareActionSheet:(UIView *)view
items:(NSArray *)items
shareParams:(NSMutableDictionary *)shareParams
onShareStateChanged:(void (^) (NSInteger state,
NSInteger platformType,
NSDictionary *userData,
id contentEntity,
NSError *error,
BOOL end))shareStateChangedHandler;
/**
* 显示内容编辑视图
*
* @param platformType 分享的平台类型
* @param otherPlatformTypes 除分享平台外,还可以分享的平台类型。
* @param shareParams 分享内容参数
* @param shareStateChangedHandler 分享状态变更事件
*
* @return 内容编辑视图控制器 SSUIShareContentEditorViewController
*/
+ (id)showShareEditor:(NSInteger)platformType
otherPlatformTypes:(NSArray *)otherPlatformTypes
shareParams:(NSMutableDictionary *)shareParams
onShareStateChanged:(void (^) (NSInteger state,
NSInteger platformType,
NSDictionary *userData,
id contentEntity,
NSError *error,
BOOL end))shareStateChangedHandler;
/**
* 根据配置文件显示分享菜单
*
* @param view 要显示菜单的视图, iPad版中此参数作为弹出菜单的参照视图
* @param items 菜单项,如果传入nil,则显示已集成的平台列表
* @param contentName ShareContent.xml内标签name属性的值
* @param customFields 自定义字段
* @param shareStateChangedHandler 分享状态变更事件
*
* @return 分享菜单控制器 SSUIShareActionSheetController
*/
+ (id)showShareActionSheet:(UIView *)view
items:(NSArray *)items
contentName:(NSString *)contentName
customFields:(NSDictionary *)customFields
onShareStateChanged:(void (^) (NSInteger state,
NSInteger platformType,
NSDictionary *userData,
id contentEntity,
NSError *error,
BOOL end))shareStateChangedHandler;
/**
* 根据配置文件显示内容编辑视图
*
* @param platformType 分享的平台类型
* @param otherPlatformTypes 除分享平台外,还可以分享的平台类型。
* @param contentName ShareContent.xml内标签name属性的值
* @param customFields 自定义字段
* @param shareStateChangedHandler 分享状态变更事件
*
* @return 内容编辑视图控制器 SSUIShareContentEditorViewController
*/
+ (id)showShareEditor:(NSInteger)platformType
otherPlatformTypes:(NSArray *)otherPlatformTypes
contentName:(NSString *)contentName
customFields:(NSDictionary *)customFields
onShareStateChanged:(void (^) (NSInteger state,
NSInteger platformType,
NSDictionary *userData,
id contentEntity,
NSError *error,
BOOL end))shareStateChangedHandler;
/**
* 设置支持的页面方向
*/
+ (void)setSupportedInterfaceOrientation:(UIInterfaceOrientationMask)toInterfaceOrientation;
@end
================================================
FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/ShareSDK.framework/Headers/IMOBFSocialUser.h
================================================
//
// IMOBFSocialUser.h
// MOBFoundation
//
// Created by 冯鸿杰 on 17/2/28.
// Copyright © 2017年 MOB. All rights reserved.
//
#import
/**
社交用户信息协议
*/
@protocol IMOBFSocialUser
/**
* 平台类型
*/
@property (nonatomic) NSInteger platformType;
/**
* 用户标识
*/
@property (nonatomic, copy) NSString *uid;
/**
* 昵称
*/
@property (nonatomic, copy) NSString *nickname;
/**
* 头像
*/
@property (nonatomic, copy) NSString *icon;
/**
* 性别
*/
@property (nonatomic) NSInteger gender;
/**
* 用户主页
*/
@property (nonatomic, copy) NSString *url;
/**
* 用户简介
*/
@property (nonatomic, copy) NSString *aboutMe;
/**
* 认证用户类型
*/
@property (nonatomic) NSInteger verifyType;
/**
* 认证描述
*/
@property (nonatomic, copy) NSString *verifyReason;
/**
* 生日
*/
@property (nonatomic, strong) NSDate *birthday;
/**
* 粉丝数
*/
@property (nonatomic) NSInteger followerCount;
/**
* 好友数
*/
@property (nonatomic) NSInteger friendCount;
/**
* 分享数
*/
@property (nonatomic) NSInteger shareCount;
/**
* 注册时间
*/
@property (nonatomic) NSTimeInterval regAt;
/**
* 用户等级
*/
@property (nonatomic) NSInteger level;
/**
* 教育信息
*/
@property (nonatomic, strong) NSArray *educations;
/**
* 职业信息
*/
@property (nonatomic, strong) NSArray *works;
/**
* 原始数据
*/
@property (nonatomic, strong) NSDictionary *rawData;
@end
================================================
FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/ShareSDK.framework/Headers/ISSDKAuthView.h
================================================
//
// ISSDKAuthView.h
// ShareSDK
//
// Created by fenghj on 15/12/2.
// Copyright © 2015年 掌淘科技. All rights reserved.
//
#import
#import "SSDKTypeDefine.h"
@protocol ISSDKAuthView
/**
* 取消授权
*/
- (void)cancel;
/**
* 授权状态变更时触发
*
* @param stateChangedHandler 授权状态变更处理器
*/
- (void)onAuthStateChanged:(SSDKAuthorizeStateChangedHandler)stateChangedHandler;
@end
================================================
FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/ShareSDK.framework/Headers/NSMutableDictionary+SSDKInit.h
================================================
//
// NSMutableDictionary+ShareSDK.h
// ShareSDK
//
// Created by 冯 鸿杰 on 15/2/6.
// Copyright (c) 2015年 掌淘科技. All rights reserved.
//
#import
#import "SSDKTypeDefine.h"
/**
* 初始化分享平台相关
*/
@interface NSMutableDictionary (SSDKInit)
/**
* 设置平台的授权配置
*
* @param authSettings 授权配置信息
* 例如在配置新浪微博的初始化信息中设置授权配置信息:
* [appInfo SSDKSetAuthSettings:@[@"follow_app_official_microblog"]];
*/
- (void)SSDKSetAuthSettings:(NSArray *)authSettings;
/**
* 设置新浪微博应用信息
*
* @param appKey 应用标识
* @param appSecret 应用密钥
* @param redirectUri 回调地址
* @param authType 授权方式。值可以是:SSDKAuthTypeSSO、SSDKAuthTypeWeb、SSDKAuthTypeBoth,分别代表SSO、网页授权、SSO+网页授权。
*/
- (void)SSDKSetupSinaWeiboByAppKey:(NSString *)appKey
appSecret:(NSString *)appSecret
redirectUri:(NSString *)redirectUri
authType:(NSString *)authType;
/**
* 设置微信(微信好友,微信朋友圈、微信收藏)应用信息
*
* @param appId 应用标识
* @param appSecret 应用密钥
*/
- (void)SSDKSetupWeChatByAppId:(NSString *)appId
appSecret:(NSString *)appSecret;
/**
* 设置微信(微信好友,微信朋友圈、微信收藏)应用信息
*
* @param appId 应用标识
* @param appSecret 应用密钥
* @param backUnionID 是否默认返回unionID 否返回 openID 是则返回 unionID
*/
- (void)SSDKSetupWeChatByAppId:(NSString *)appId
appSecret:(NSString *)appSecret
backUnionID:(BOOL)backUnionID;
/**
* 设置Twitter应用信息
*
* @param consumerKey 应用标识
* @param consumerSecret 应用密钥
* @param redirectUri 回调地址
*/
- (void)SSDKSetupTwitterByConsumerKey:(NSString *)consumerKey
consumerSecret:(NSString *)consumerSecret
redirectUri:(NSString *)redirectUri;
/**
* 设置QQ分享平台(QQ空间,QQ好友分享)应用信息
*
* @param appId 应用标识
* @param appKey 应用Key
* @param authType 授权方式。值可以是:SSDKAuthTypeSSO、SSDKAuthTypeWeb、SSDKAuthTypeBoth,分别代表SSO、网页授权、SSO+网页授权。
*/
- (void)SSDKSetupQQByAppId:(NSString *)appId
appKey:(NSString *)appKey
authType:(NSString *)authType;
/**
* 设置QQ分享平台(QQ空间,QQ好友分享)应用信息 4.0.0增加
*
* @param appId 应用标识
* @param appKey 应用Key
* @param authType 授权方式。值可以是:SSDKAuthTypeSSO、SSDKAuthTypeWeb、SSDKAuthTypeBoth,分别代表SSO、网页授权、SSO+网页授权。
* @param useTIM 是否优先使用TIM进行授权及分享
*/
- (void)SSDKSetupQQByAppId:(NSString *)appId
appKey:(NSString *)appKey
authType:(NSString *)authType
useTIM:(BOOL)useTIM;
/**
* 设置QQ分享平台(QQ空间,QQ好友分享)应用信息 4.0.0增加
*
* @param appId 应用标识
* @param appKey 应用Key
* @param authType 授权方式。值可以是:SSDKAuthTypeSSO、SSDKAuthTypeWeb、SSDKAuthTypeBoth,分别代表SSO、网页授权、SSO+网页授权。
* @param useTIM 是否优先使用TIM进行授权及分享
* @param backUnionID 是否默认返回unionID 否返回 openID 是则返回 unionID
*/
- (void)SSDKSetupQQByAppId:(NSString *)appId
appKey:(NSString *)appKey
authType:(NSString *)authType
useTIM:(BOOL)useTIM
backUnionID:(BOOL)backUnionID;
/**
* 设置Facebook应用信息 不需要使用facebook客户端分享
*
* @param apiKey 应用标识
* @param appSecret 应用密钥
* @param authType 授权方式。值可以是:SSDKAuthTypeSSO、SSDKAuthTypeWeb、SSDKAuthTypeBoth,分别代表SSO、网页授权、SSO+网页授权。
*/
- (void)SSDKSetupFacebookByApiKey:(NSString *)apiKey
appSecret:(NSString *)appSecret
authType:(NSString *)authType;
/**
设置Facebook应用信息 使用facebook客户端分享使用此方法 displayName必须
@since ver 3.6.0
@param apiKey 应用标识
@param appSecret 应用密钥
@param displayName 分享后显示的app名称 需与facebook后台配置一致 使用facebook客户端分享必须
@param authType 授权方式。值可以是:SSDKAuthTypeSSO、SSDKAuthTypeWeb、SSDKAuthTypeBoth,分别代表SSO、网页授权、SSO+网页授权。
*/
- (void)SSDKSetupFacebookByApiKey:(NSString *)apiKey
appSecret:(NSString *)appSecret
displayName:(NSString *)displayName
authType:(NSString *)authType;
/**
* 设置腾讯微博应用信息
*
* @param appKey 应用标识
* @param appSecret 应用密钥
* @param redirectUri 回调地址
*/
- (void)SSDKSetupTencentWeiboByAppKey:(NSString *)appKey
appSecret:(NSString *)appSecret
redirectUri:(NSString *)redirectUri;
/**
* 设置豆瓣应用信息
*
* @param apiKey 应用标识
* @param secret 应用密钥
* @param redirectUri 回调地址
*/
- (void)SSDKSetupDouBanByApiKey:(NSString *)apiKey
secret:(NSString *)secret
redirectUri:(NSString *)redirectUri;
/**
* 设置人人网应用信息
*
* @param appId 应用标识
* @param appKey 应用Key
* @param secretKey 应用密钥
* @param authType 授权方式。值可以是:SSDKAuthTypeSSO、SSDKAuthTypeWeb、SSDKAuthTypeBoth,分别代表SSO、网页授权、SSO+网页授权。
*/
- (void)SSDKSetupRenRenByAppId:(NSString *)appId
appKey:(NSString *)appKey
secretKey:(NSString *)secretKey
authType:(NSString *)authType;
/**
* 设置开心网应用信息
*
* @param apiKey 应用标识
* @param secretKey 应用密钥
* @param redirectUri 回调地址
*/
- (void)SSDKSetupKaiXinByApiKey:(NSString *)apiKey
secretKey:(NSString *)secretKey
redirectUri:(NSString *)redirectUri;
/**
* 设置Pocket应用信息
*
* @param consumerKey 应用标识
* @param redirectUri 回调地址
* @param authType 授权方式。值可以是:SSDKAuthTypeSSO、SSDKAuthTypeWeb、SSDKAuthTypeBoth,分别代表SSO、网页授权、SSO+网页授权。
*/
- (void)SSDKSetupPocketByConsumerKey:(NSString *)consumerKey
redirectUri:(NSString *)redirectUri
authType:(NSString *)authType;
/**
* 设置Google+应用信息
*
* @param clientId 应用标识
* @param clientSecret 应用密钥
* @param redirectUri 回调地址
*/
- (void)SSDKSetupGooglePlusByClientID:(NSString *)clientId
clientSecret:(NSString *)clientSecret
redirectUri:(NSString *)redirectUri;
/**
* 设置Instagram应用信息
*
* @param clientId 应用标识
* @param clientSecret 应用密钥
* @param redirectUri 回调地址
*/
- (void)SSDKSetupInstagramByClientID:(NSString *)clientId
clientSecret:(NSString *)clientSecret
redirectUri:(NSString *)redirectUri;
/**
* 设置LinkedIn应用信息
*
* @param apiKey 应用标识
* @param secretKey 应用密钥
* @param redirectUrl 回调地址
*/
- (void)SSDKSetupLinkedInByApiKey:(NSString *)apiKey
secretKey:(NSString *)secretKey
redirectUrl:(NSString *)redirectUrl;
/**
* 设置Tumblr应用信息
*
* @param consumerKey 应用标识
* @param consumerSecret 应用密钥
* @param callbackUrl 回调地址
*/
- (void)SSDKSetupTumblrByConsumerKey:(NSString *)consumerKey
consumerSecret:(NSString *)consumerSecret
callbackUrl:(NSString *)callbackUrl;
/**
* 设置Flickr应用信息
*
* @param apiKey 应用标识
* @param apiSecret 应用密钥
*/
- (void)SSDKSetupFlickrByApiKey:(NSString *)apiKey
apiSecret:(NSString *)apiSecret;
/**
* 设置有道云笔记应用信息
*
* @param consumerKey 应用标识
* @param consumerSecret 应用密钥
* @param oauthCallback 回调地址
*/
- (void)SSDKSetupYouDaoNoteByConsumerKey:(NSString *)consumerKey
consumerSecret:(NSString *)consumerSecret
oauthCallback:(NSString *)oauthCallback;
/**
* 设置印象笔记应用信息,注:中国版和国际版都是调用此接口进行初始化操作。
*
* @param consumerKey 应用标识
* @param consumerSecret 应用密钥
* @param sandbox 是否为沙箱模式, YES 沙箱模式,NO 非沙箱模式
*/
- (void)SSDKSetupEvernoteByConsumerKey:(NSString *)consumerKey
consumerSecret:(NSString *)consumerSecret
sandbox:(BOOL)sandbox;
/**
* 设置支付宝好友应用信息
*
* @param appId 应用标识
*/
- (void)SSDKSetupAliPaySocialByAppId:(NSString *)appId;
/**
* 设置Pinterest应用信息
*
* @param clientId 应用标识
*/
- (void)SSDKSetupPinterestByClientId:(NSString *)clientId;
/**
* 设置KaKao应用信息
*
* @param appKey 应用标识, 当使用客户端授权分享和授权时需要传入该标识
* @param restApiKey RestApi标识
* @param redirectUri 回调地址
* @param authType 授权方式。值可以是:SSDKAuthTypeSSO、SSDKAuthTypeWeb、SSDKAuthTypeBoth,分别代表SSO、网页授权、SSO+网页授权。
*/
- (void)SSDKSetupKaKaoByAppKey:(NSString *)appKey
restApiKey:(NSString *)restApiKey
redirectUri:(NSString *)redirectUri
authType:(NSString *)authType;
/**
* 设置Dropbox应用信息
*
* @param appKey 应用标识
* @param appSecret 应用密钥
* @param oauthCallback 回调地址
*/
- (void)SSDKSetupDropboxByAppKey:(NSString *)appKey
appSecret:(NSString *)appSecret
oauthCallback:(NSString *)oauthCallback;
/**
* 设置VKontakte应用信息
*
* @param applicationId 应用标识
* @param secretKey 应用密钥
*/
- (void)SSDKSetupVKontakteByApplicationId:(NSString *)applicationId
secretKey:(NSString *)secretKey;
- (void)SSDKSetupVKontakteByApplicationId:(NSString *)applicationId
secretKey:(NSString *)secretKey
authType:(NSString *)authType;
/**
* 设置明道应用信息
*
* @param appKey 应用标识
* @param appSecret 应用密钥
* @param redirectUri 回调地址
*/
- (void)SSDKSetupMingDaoByAppKey:(NSString *)appKey
appSecret:(NSString *)appSecret
redirectUri:(NSString *)redirectUri;
/**
* 设置易信(易信好友,易信朋友圈、易信收藏)应用信息
*
* @param appId 应用标识
* @param appSecret 应用密钥
* @param redirectUri 回调地址
* @param authType 授权方式。值可以是:SSDKAuthTypeSSO、SSDKAuthTypeWeb、SSDKAuthTypeBoth,分别代表SSO、网页授权、SSO+网页授权。
*/
- (void)SSDKSetupYiXinByAppId:(NSString *)appId
appSecret:(NSString *)appSecret
redirectUri:(NSString *)redirectUri
authType:(NSString *)authType;
/**
* 设置Instapaper
*
* @param consumerKey 应用标识
* @param consumerSecret 应用密钥
*/
- (void)SSDKSetupInstapaperByConsumerKey:(NSString *)consumerKey
consumerSecret:(NSString *)consumerSecret;
/**
* 设置钉钉应用信息
*
* @param appId 应用标识
*/
- (void)SSDKSetupDingTalkByAppId:(NSString *)appId;
/**
设置美拍应用信息
@param appKey 应用标识
*/
- (void)SSDKSetupMeiPaiByAppKey:(NSString *)appKey;
/**
设置youtube应用信息
@param clientId 应用标识
@param clientSecret 应用密钥 没有则填 ""
@param redirectUri 回调地址 redirectUri 可以使用 http://localhost 或 iOSURLscheme:/ 例如:com.googleusercontent.apps.906418427202-jinnbqal1niq4s8isbg2ofsqc5ddkcgr:/
*/
- (void)SSDKSetupYouTubeByClientId:(NSString *)clientId
clientSecret:(NSString *)clientSecret
redirectUri:(NSString *)redirectUri;
/**
* 设置Line应用信息
* @param authType 授权方式。值可以是:SSDKAuthTypeSSO、SSDKAuthTypeWeb、SSDKAuthTypeBoth,分别代表SSO、网页授权、SSO+网页授权。
*/
- (void)SSDKSetupLineAuthType:(NSString *)authType;
//打开短信登录的国家列表选择
- (void)SSDKSetpSMSOpenCountryList:(BOOL)open;
@end
================================================
FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/ShareSDK.framework/Headers/NSMutableDictionary+SSDKShare.h
================================================
//
// NSMutableDictionary+SSDKShare.h
// ShareSDK
//
// Created by 冯 鸿杰 on 15/2/9.
// Copyright (c) 2015年 掌淘科技. All rights reserved.
//
#import
#import "SSDKTypeDefine.h"
#import "SSDKImage.h"
#import "SSDKData.h"
/**
* 分享参数构造相关
*/
@interface NSMutableDictionary (SSDKShare)
/**
* 设置分享标识
*
* @param flags 标识数组,元素为NSString。
*/
- (void)SSDKSetShareFlags:(NSArray *)flags;
/**
* 使用客户端分享
*/
- (void)SSDKEnableUseClientShare;
/**
可设置新浪微博使用高级接口进行分享(即应用内使用 statuses/update 和 statuses/upload_url_text这两个高级接口进行分享)
statuses/update 原为普通接口 2017年6月30日后修改为高级接口 应用内普通分享接口改变为 statuses/share
statuses/share 规则 http://open.weibo.com/wiki/2/statuses/share
注:
v4.0.1 废弃此接口 由于使用接口需要设置安全域 并且 无法分享话题所以都统一使用微博SDK进行分享
如果仍需要使用api接口进行分享请调用 SSDKEnableSinaWeiboAPIShare 接口
*/
- (void)SSDKEnableAdvancedInterfaceShare __deprecated_msg("discard form v4.0.1");
/**
新浪微博应用内分享 指定使用api进行分享 v4.0.1
*/
- (void)SSDKEnableSinaWeiboAPIShare;
/**
使用第三方应用插件进行分享 (暂只支持微信 QQ TIM) iOS11 不可用
微信 支持 本地图片(1-9张) 本地视频(SSDKContentTypeFile) 本地音频(SSDKContentTypeFile) 链接(只有链接有作用标题 说明设置无效)
QQ&TIM 支持 本地图片(1-9张) 本地视频(SSDKContentTypeFile) 本地音频(SSDKContentTypeFile) 链接(只有链接有作用标题 说明设置无效)
QQiPad版本不支持
*/
- (void)SSDKEnableExtensionShare;
/**
* 设置分享参数
*
* @param text 文本
* @param images 图片集合,传入参数可以为单张图片信息,也可以为一个NSArray,数组元素可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage。如: @"http://www.mob.com/images/logo_black.png" 或 @[@"http://www.mob.com/images/logo_black.png"]
* @param url 网页路径/应用路径
* @param title 标题
* @param type 分享类型
*/
- (void)SSDKSetupShareParamsByText:(NSString *)text
images:(id)images
url:(NSURL *)url
title:(NSString *)title
type:(SSDKContentType)type;
/**
* 设置新浪微博分享参数
*
* @param text 文本
* @param title 标题
* @param image 图片对象,可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage
* @param url 分享链接
* @param latitude 纬度
* @param longitude 经度
* @param objectID 对象ID,标识系统内内容唯一性,应传入系统中分享内容的唯一标识,没有时可以传入nil
* @param type 分享类型,仅支持Text、Image、WebPage 类型
设置 SSDKEnableSinaWeiboAPIShare 使用API进行分享 但text中需要附 安全域 安全域在新浪微博开放平台设置
*/
- (void)SSDKSetupSinaWeiboShareParamsByText:(NSString *)text
title:(NSString *)title
image:(id)image
url:(NSURL *)url
latitude:(double)latitude
longitude:(double)longitude
objectID:(NSString *)objectID
type:(SSDKContentType)type;
/**
* 设置腾讯微博分享参数
*
* @param text 文本
* @param images 分享图片列表,传入参数可以为单张图片信息,也可以为一个NSArray,数组元素可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage。如: @"http://www.mob.com/images/logo_black.png" 或 @[@"http://www.mob.com/images/logo_black.png"]
* @param latitude 纬度
* @param longitude 经度
* @param type 分享类型, 仅支持Text、Image类型
*/
- (void)SSDKSetupTencentWeiboShareParamsByText:(NSString *)text
images:(id)images
latitude:(double)latitude
longitude:(double)longitude
type:(SSDKContentType)type;
/**
* 设置微信分享参数
*
* @param text 文本
* @param title 标题
* @param url 分享链接
* @param thumbImage 缩略图,可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage
* @param image 图片,可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage
* @param musicFileURL 音乐文件链接地址
* @param extInfo 扩展信息
* @param fileData 文件数据,可以为NSData、UIImage、NSString、NSURL(文件路径)、SSDKData、SSDKImage
* @param emoticonData 表情数据,可以为NSData、UIImage、NSURL(文件路径)、SSDKData、SSDKImage
* @param type 分享类型,支持SSDKContentTypeText、SSDKContentTypeImage、SSDKContentTypeWebPage、SSDKContentTypeApp、SSDKContentTypeAudio和SSDKContentTypeVideo
* @param platformSubType 平台子类型,只能传入SSDKPlatformSubTypeWechatSession、SSDKPlatformSubTypeWechatTimeline和SSDKPlatformSubTypeWechatFav其中一个
*
* 分享文本时:
* 设置type为SSDKContentTypeText, 并填入text参数
*
* 分享图片时:
* 设置type为SSDKContentTypeImage, 非gif图片时:填入title和image参数,如果为gif图片则需要填写title和emoticonData参数
*
* 分享网页时:
* 设置type为SSDKContentTypeWebPage, 并设置text、title、url以及thumbImage参数,如果尚未设置thumbImage则会从image参数中读取图片并对图片进行缩放操作。
*
* 分享应用时:
* 设置type为SSDKContentTypeApp,并设置text、title、extInfo(可选)以及fileData(可选)参数。
*
* 分享音乐时:
* 设置type为SSDKContentTypeAudio,并设置text、title、url以及musicFileURL(可选)参数。
*
* 分享视频时:
* 设置type为SSDKContentTypeVideo,并设置text、title、url参数
*/
- (void)SSDKSetupWeChatParamsByText:(NSString *)text
title:(NSString *)title
url:(NSURL *)url
thumbImage:(id)thumbImage
image:(id)image
musicFileURL:(NSURL *)musicFileURL
extInfo:(NSString *)extInfo
fileData:(id)fileData
emoticonData:(id)emoticonData
type:(SSDKContentType)type
forPlatformSubType:(SSDKPlatformType)platformSubType;
/**
* 设置微信分享参数
*
* @param text 文本
* @param title 标题
* @param url 分享链接
* @param thumbImage 缩略图,可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage
* @param image 图片,可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage
* @param musicFileURL 音乐文件链接地址
* @param extInfo 扩展信息
* @param fileData 文件数据,可以为NSData、UIImage、NSString、NSURL(文件路径)、SSDKData、SSDKImage
* @param emoticonData 表情数据,可以为NSData、UIImage、NSURL(文件路径)、SSDKData、SSDKImage
* @param fileExtension 源文件后缀名
* @param sourceFileData 源文件数据,可以为NSData、NSString、NSURL(文件路径)、SSDKData
* @param type 分享类型,支持SSDKContentTypeText、SSDKContentTypeImage、SSDKContentTypeWebPage、SSDKContentTypeApp、SSDKContentTypeAudio和SSDKContentTypeVideo
* @param platformSubType 平台子类型,只能传入其中一个
*
* 分享文本时:
* 设置type为SSDKContentTypeText, 并填入text参数
*
* 分享图片时:
* 设置type为SSDKContentTypeImage, 非gif图片时:填入title和image参数,如果为gif图片则需要填写title和emoticonData参数
*
* 分享网页时:
* 设置type为SSDKContentTypeWebPage, 并设置text、title、url以及thumbImage参数,如果尚未设置thumbImage则会从image参数中读取图片并对图片进行缩放操作。
*
* 分享应用时:
* 设置type为SSDKContentTypeApp,并设置text、title、extInfo(可选)以及fileData(可选)参数。
*
* 分享音乐时:
* 设置type为SSDKContentTypeAudio,并设置text、title、url以及musicFileURL(可选)参数。
*
* 分享视频时:
* 设置type为SSDKContentTypeVideo,并设置text、title、url参数
*
* 分享文件时:
* 设置type为SSDKContentTypeFile(例如.mp3、.mp4、.pdf、.docx的分享),设置title、sourceFileExtension、sourceFileData,以及thumbImage参数,如果尚未设置thumbImage则会从image参数中读取图片并对图片进行缩放操作参数
*/
- (void)SSDKSetupWeChatParamsByText:(NSString *)text
title:(NSString *)title
url:(NSURL *)url
thumbImage:(id)thumbImage
image:(id)image
musicFileURL:(NSURL *)musicFileURL
extInfo:(NSString *)extInfo
fileData:(id)fileData
emoticonData:(id)emoticonData
sourceFileExtension:(NSString *)fileExtension
sourceFileData:(id)sourceFileData
type:(SSDKContentType)type
forPlatformSubType:(SSDKPlatformType)platformSubType;
//3.6.3 为微信小程序分享增加
/**
设置微信小程序分享
@param title 标题
@param description 详细说明
@param webpageUrl 网址(6.5.6以下版本微信会自动转化为分享链接 必填)
@param path 跳转到页面路径
@param thumbImage 缩略图 (必填)
@param userName 小程序的userName (必填)
@param platformSubType 分享自平台 微信小程序暂只支持 SSDKPlatformSubTypeWechatSession(微信好友分享)
*/
- (void)SSDKSetupWeChatParamsByTitle:(NSString *)title
description:(NSString *)description
webpageUrl:(NSURL *)webpageUrl
path:(NSString *)path
thumbImage:(id)thumbImage
userName:(NSString *)userName
forPlatformSubType:(SSDKPlatformType)platformSubType;
/**
* 设置Twitter分享参数
*
* @param text 分享内容
* @param images 分享图片列表,传入参数可以为单张图片信息,也可以为一个NSArray,数组元素可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage。如: @"http://www.mob.com/images/logo_black.png" 或 @[@"http://www.mob.com/images/logo_black.png"]
* @param latitude 地理位置,纬度
* @param longitude 地理位置,经度
* @param type 分享类型,仅支持Text、Image类型
*/
- (void)SSDKSetupTwitterParamsByText:(NSString *)text
images:(id)images
latitude:(double)latitude
longitude:(double)longitude
type:(SSDKContentType)type;
/**
Twitter 视频分享
@param text 分享内容
@param video 本地文件地址
@param latitude 地理位置,纬度
@param longitude 地理位置,经度
@param str 自定义标示 用于方便管理上传过程 建议使用 (平台_xxx 如: Twitter_0001)
视频的规格要求
https://dev.twitter.com/rest/media/uploading-media.html Video specifications and recommendations
*/
- (void)SSDKSetupTwitterParamsByText:(NSString *)text
video:(NSURL*)video
latitude:(double)latitude
longitude:(double)longitude
tag:(NSString *)str;
/**
* 设置QQ分享参数
*
* @param text 分享内容
* @param title 分享标题
* @param url 分享链接
* @param thumbImage 缩略图,可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage
* @param image 图片,可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage
* @param type 分享类型, 仅支持Text(仅QQFriend)、Image(仅QQFriend)、WebPage、Audio、Video类型
* @param platformSubType 平台子类型,只能传入SSDKPlatformSubTypeQZone或者SSDKPlatformSubTypeQQFriend其中一个
*/
- (void)SSDKSetupQQParamsByText:(NSString *)text
title:(NSString *)title
url:(NSURL *)url
thumbImage:(id)thumbImage
image:(id)image
type:(SSDKContentType)type
forPlatformSubType:(SSDKPlatformType)platformSubType;
/**
* 设置QQ分享参数
*
* @param text 分享内容
* @param title 分享标题
* @param url 分享链接(如果分享类型为音频/视频时,应该传入音频/视频的网络URL地址)
[特别说明:分享视频到QZone时,视频为网络视频,请传入视频网络URL地址;视频为本地视频的,请传入来源于手机系统相册的相关的Asset URL地址]
* @param audioFlashURL 分享音频时缩略图播放源,仅平台子类型为SSDKPlatformSubTypeQQFriend,且分享类型为Audio时生效
* @param videoFlashURL 分享视频时缩略图播放源,仅平台子类型为SSDKPlatformSubTypeQQFriend,且分享类型为Video时生效
* @param thumbImage 缩略图,可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage
* @param images 图片集合,传入参数可以为单张图片信息,也可以为一个NSArray,数组元素可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage
QQ会采用首张图片,QZone则支持图片数组
* @param type 分享类型, 仅支持Text、Image、WebPage、Audio、Video类型
* @param platformSubType 平台子类型,只能传入SSDKPlatformSubTypeQZone或者SSDKPlatformSubTypeQQFriend其中一个
*/
- (void)SSDKSetupQQParamsByText:(NSString *)text
title:(NSString *)title
url:(NSURL *)url
audioFlashURL:(NSURL *)audioFlashURL
videoFlashURL:(NSURL *)videoFlashURL
thumbImage:(id)thumbImage
images:(id)images
type:(SSDKContentType)type
forPlatformSubType:(SSDKPlatformType)platformSubType;
/**
* 设置Facebook分享参数
*
* @param text 分享内容
* @param image 图片,可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage
* @param type 分享类型,仅支持Text、Image类型
*/
- (void)SSDKSetupFacebookParamsByText:(NSString *)text
image:(id)image
type:(SSDKContentType)type;
/**
* 设置Facebook分享参数
*
* @param text 分享内容
分享类型为Text类型时,作为文字主体内容
分享类型为WebPage类型时,作为连接描述
* @param image 图片,可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage
分享类型为Image类型时,若使用客户端分享,可传入 单张/多张 的 本地/网络 图片;如果不使用客户端分享,仅支持单张的本地/网络图片
*【Facebook通过客户端分享图片,可不需依赖任何权限;否则需要申请publish_actions权限】*
分享类型为WebPage类型时,无论是否使用客户端,仅支持单张的网络图片
* @param url 链接
分享类型为WebPage类型时,为链接地址
[如果分享的连接是AppStore/GooglePlay/Facebook个人/公共主页,所对应的图片,标题,描述等参数可能不会生效,而实际生效的是FB通过爬虫网络根据连接搜刮而来的信息]
分享类型为Video类型时,需传入视频地址且但必须是相册地址
* @param title 链接标题
分享类型为WebPage类型时,为链接标题
* @param urlName 连接名称
分享类型为WebPage类型时,为链接名称,仅在非客户端分享时生效
* @param attachementUrl 附件链接(附加的媒体文件(SWF 或 MP3)的网址。如果是 SWF,还必须指定image以提供视频的缩略图)
分享类型为WebPage类型时,为链,仅在非客户端分享时生效
* @param type 分享类型
当使用客户端分享时,支持Image、WebPage,Video类型
当不适用客户端分享是,支持Text、Image、WebPage类型
*/
- (void)SSDKSetupFacebookParamsByText:(NSString *)text
image:(id)image
url:(NSURL *)url
urlTitle:(NSString *)title
urlName:(NSString *)urlName
attachementUrl:(NSURL *)attachementUrl
type:(SSDKContentType)type;
/**
* 设置短信分享参数
*
* @param text 文本
* @param title 标题
* @param images 分享图片列表,传入参数可以为单张图片信息,也可以为一个NSArray,数组元素可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage。如: @"http://www.mob.com/images/logo_black.png" 或 @[@"http://www.mob.com/images/logo_black.png"]
* @param attachments 附件列表, 可以为单个附件也可以为一个数组,元素可以为NSData、UIImage、NSString、NSURL(文件路径)、SSDKData、SSDKImage,注:只允许指定本地资源
* @param recipients 接收人信息,如:@[@"400-685-2216"]
* @param type 分享类型,仅支持Text、Image video类型 video在 attachments 附件列表中设置
*/
- (void)SSDKSetupSMSParamsByText:(NSString *)text
title:(NSString *)title
images:(id)images
attachments:(id)attachments
recipients:(NSArray *)recipients
type:(SSDKContentType)type;
/**
* 设置邮件分享参数
*
* @param text 文本
* @param title 标题
* @param images 分享图片列表,传入参数可以为单张图片信息,也可以为一个NSArray,数组元素可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage。如: @"http://www.mob.com/images/logo_black.png" 或 @[@"http://www.mob.com/images/logo_black.png"]
* @param attachments 附件列表, 可以为单个附件也可以为一个数组,元素可以为NSData、UIImage、NSString、NSURL(文件路径)、SSDKData、SSDKImage,注:只允许指定本地资源
* @param recipients 接收人信息,如:@["tester@163.com"]
* @param ccRecipients 抄送人信息,如:@["tester2@163.com"]
* @param bccRecipients 密送人信息,如:@["tester3@163.com"]
* @param type 分享类型,仅支持Text、Image video类型 video在 attachments 附件列表中设置
*/
- (void)SSDKSetupMailParamsByText:(NSString *)text
title:(NSString *)title
images:(id)images
attachments:(id)attachments
recipients:(NSArray *)recipients
ccRecipients:(NSArray *)ccRecipients
bccRecipients:(NSArray *)bccRecipients
type:(SSDKContentType)type;
/**
* 设置拷贝参数
*
* @param text 文本,仅在type为Text时有效
* @param images 分享图片列表,传入参数可以为单张图片信息,也可以为一个NSArray,数组元素可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage。如: @"http://www.mob.com/images/logo_black.png" 或 @[@"http://www.mob.com/images/logo_black.png"]
* @param url 链接,仅在type为WebPage时有效
* @param type 分享类型,仅支持Text、Image、WebPage类型
*/
- (void)SSDKSetupCopyParamsByText:(NSString *)text
images:(id)images
url:(NSURL *)url
type:(SSDKContentType)type;
/**
* 设置豆瓣分享参数
*
* @param text 文本
* @param image 分享图片,当type为Image时,可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage。当type为WebPage时,只能为网络图片,可以传入NSString(图片路径)、NSURL(图片路径)。
* @param title 网页标题,仅在type为WebPage时有效。
* @param url 网页链接,仅在type为WebPage时有效。
* @param urlDesc 网页描述,仅在type为WebPage时有效。
* @param type 分享类型,仅支持Text、Image、WebPage类型
*/
- (void)SSDKSetupDouBanParamsByText:(NSString *)text
image:(id)image
title:(NSString *)title
url:(NSURL *)url
urlDesc:(NSString *)urlDesc
type:(SSDKContentType)type;
/**
* 设置人人网分享参数
*
* @param text 文本
* @param image 分享图片,可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage,仅在type为Image时有效。
* @param url 网页链接,仅在type为WebPage时有效。
* @param albumId 相册ID,指定分享的图片要放入哪个相册,默认为nil,仅在type为Image时有效。
* @param type 分享类型,仅支持Image、WebPage类型
*/
- (void)SSDKSetupRenRenParamsByText:(NSString *)text
image:(id)image
url:(NSURL *)url
albumId:(NSString *)albumId
type:(SSDKContentType)type;
/**
* 设置开心网分享参数
*
* @param text 文本
* @param image 分享图片,可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage,仅在type为Image时有效。
* @param type 分享类型,仅支持Text、Image类型
*/
- (void)SSDKSetupKaiXinParamsByText:(NSString *)text
image:(id)image
type:(SSDKContentType)type;
/**
* 设置Pocket分享参数
*
* @param url 分享链接
* @param title 标题
* @param tags 标签,可以为NSString或者NSArray。为NSString时,标签名称要以逗号分隔;为NSArray时,元素为NSString。
* @param tweetId 关联的推文ID
*/
- (void)SSDKSetupPocketParamsByUrl:(NSURL *)url
title:(NSString *)title
tags:(id)tags
tweetId:(NSString *)tweetId;
/**
* 设置GooglePlus分享参数
*
* @param text 文本
* @param url 分享链接,仅在type为WebPage时有效
* @param type 分享类型,仅支持Text、WebPage类型
*/
- (void)SSDKSetupGooglePlusParamsByText:(NSString *)text
url:(NSURL *)url
type:(SSDKContentType)type;
/**
* 设置Instagram分享参数
*
* @param image 分享图片,可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage,仅在type为Image时有效。
* @param point 分享菜单的显示位置,仅用于iPad版
*/
- (void)SSDKSetupInstagramByImage:(id)image
menuDisplayPoint:(CGPoint)point;
/**
设置Instagram 视频分享参数 video 视频地址 可以为相册地址 或 本地文件地址
@param video 视频地址 可以为相册地址 或 本地文件地址
使用相册地址时 注:为了效果需要确保其为相册的最新文件
*/
- (void)SSDKSetupInstagramByVideo:(NSURL *)video;
/**
* 设置LinkedIn分享参数
*
* @param text 分享文本
* @param image 分享图片,只能够是网络图片,传入类型可以为NSString(图片路径), NSURL(图片路径)。
* @param url 分享链接
* @param title 标题
* @param urlDesc 链接的相关描述
* @param visibility 可见性,可以传入anyone或者connections-only,默认为anyone
* @param type 分享类型,仅支持Text和WebPage
*/
- (void)SSDKSetupLinkedInParamsByText:(NSString *)text
image:(id)image
url:(NSURL *)url
title:(NSString *)title
urlDesc:(NSString *)urlDesc
visibility:(NSString *)visibility
type:(SSDKContentType)type;
/**
* 设置Tumblr分享参数
*
* @param text 分享文本
* @param image 分享图片,分享图片 可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage,仅在type为Image时有效。
* @param url 分享链接
* @param title 标题
* @param blogName 博客名称,如果为nil,则默认分享到默认博客中。
* @param type 分享类型,仅支持Text和Image
*/
- (void)SSDKSetupTumblrParamsByText:(NSString *)text
image:(id)image
url:(NSURL *)url
title:(NSString *)title
blogName:(NSString *)blogName
type:(SSDKContentType)type;
/**
* 设置Flickr分享参数
*
* @param text 图片描述
* @param image 分享图片,可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage。
* @param title 图片标题
* @param tags 图片标签列表
* @param isPublic 指定是否公开图片,NO 私有 YES 公开。
* @param isFriend 指定好友是否可以查看图片,NO 不允许,YES 允许
* @param isFamily 指定家人是否可以查看图片,NO 不允许,YES 允许
* @param safetyLevel 安全级别。1 安全 2 辅导级 3 限制级。
* @param contentType 1 照片、2 屏幕截图、3 其他。
* @param hidden 1 照片、2 屏幕截图、3 其他。
*/
- (void)SSDKSetupFlickrParamsByText:(NSString *)text
image:(id)image
title:(NSString *)title
tags:(NSArray *)tags
isPublic:(BOOL)isPublic
isFriend:(BOOL)isFriend
isFamily:(BOOL)isFamily
safetyLevel:(NSInteger)safetyLevel
contentType:(NSInteger)contentType
hidden:(NSInteger)hidden;
/**
* 设置WhatsApp分享参数
*
* @param text 分享文本
* @param image 分享图片,可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage。
* @param audio 分享音频, 可以为NSData、NSString、NSURL(文件路径)、SSDKData、注:只允许指定本地资源
* @param video 分享视频, 可以为NSData、NSString、NSURL(文件路径)、SSDKData、注:只允许指定本地资源
* @param point 分享菜单的显示位置,仅用于iPad版
* @param type 分享类型,仅支持Text、Image、Audio、Video
*/
- (void)SSDKSetupWhatsAppParamsByText:(NSString *)text
image:(id)image
audio:(id)audio
video:(id)video
menuDisplayPoint:(CGPoint)point
type:(SSDKContentType)type;
/**
* 设置有道云笔记分享参数
*
* @param text 分享文本
* @param images 分享图片列表,传入参数可以为单张图片信息,也可以为一个NSArray,数组元素可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage,
*
* @param title 标题
* @param source 来源
* @param author 作者
* @param notebook 笔记本
*/
- (void)SSDKSetupYouDaoNoteParamsByText:(NSString *)text
images:(id)images
title:(NSString *)title
source:(NSString *)source
author:(NSString *)author
notebook:(NSString *)notebook;
/**
* 设置Line分享参数
*
* @param text 分享文本
* @param image 分享图片,可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage。
* @param type 分享类型,仅支持Text、Image
*/
- (void)SSDKSetupLineParamsByText:(NSString *)text
image:(id)image
type:(SSDKContentType)type;
/**
* 设置印象笔记分享参数,注:中国版和国际版都是调用此接口进行分享参数设置。
*
* @param text 分享文本
* @param images 分享图片列表,传入参数可以为单张图片信息,也可以为一个NSArray,数组元素可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage,如: @"http://www.mob.com/images/logo_black.png" 或 @[@"http://www.mob.com/images/logo_black.png"]
* @param title 标题 必须
* @param notebook 笔记本GUID
* @param tags 标签GUID列表
* @param platformType 分享平台类型,仅支持输入SSDKPlatformTypeYinXiang和SSDKPlatformTypeEvernote
*/
- (void)SSDKSetupEvernoteParamsByText:(NSString *)text
images:(id)images
title:(NSString *)title
notebook:(NSString *)notebook
tags:(NSArray *)tags
platformType:(SSDKPlatformType)platformType;
/** v4.0.0
* 设置印象笔记分享参数,注:中国版和国际版都是调用此接口进行分享参数设置。
*
* @param text 分享文本
* @param images 分享图片列表,传入参数可以为单张图片信息,也可以为一个NSArray,数组元素可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage,如: @"http://www.mob.com/images/logo_black.png" 或 @[@"http://www.mob.com/images/logo_black.png"]
* @param video 分享的视频的本地地址 仅支持本地视频 仅支持 mp4格式视频
* @param title 标题
* @param notebook 笔记本GUID
* @param tags 标签GUID列表
* @param platformType 分享平台类型,仅支持输入SSDKPlatformTypeYinXiang和SSDKPlatformTypeEvernote
*/
- (void)SSDKSetupEvernoteParamsByText:(NSString *)text
images:(id)images
video:(NSURL *)video
title:(NSString *)title
notebook:(NSString *)notebook
tags:(NSArray *)tags
platformType:(SSDKPlatformType)platformType;
/**
* 设置支付宝好友分享参数
*
* @param text 分享文本
* @param image 分享图片,可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage。
* @param title 标题
* @param url 分享链接
* @param type 分享类型,仅支持Text、Image、WebPage
*/
- (void)SSDKSetupAliPaySocialParamsByText:(NSString *)text
image:(id)image
title:(NSString *)title
url:(NSURL *)url
type:(SSDKContentType)type __deprecated_msg("use [SSDKSetupAliPaySocialParamsByText:image:title:url:type:platformType:] method instead");
/**
* 设置支付宝分享参数
*
* @param text 分享文本
* @param image 分享图片,可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage。
* @param title 标题
* @param url 分享链接
* @param type 分享类型,仅支持Text、Image、WebPage
* @param platformType 分享平台类型,仅支持输入SSDKPlatformTypeAliPaySocial和SSDKPlatformTypeAliPaySocialTimeline
* 分享类型,平台支持情况如下:
* SSDKPlatformTypeAliPaySocial(支付宝好友):支持Text、Image、WebPage
* SSDKPlatformTypeAliPaySocialTimeline(支付宝朋友圈):支持Image、WebPage
*
*/
- (void)SSDKSetupAliPaySocialParamsByText:(NSString *)text
image:(id)image
title:(NSString *)title
url:(NSURL *)url
type:(SSDKContentType)type
platformType:(SSDKPlatformType)platformType;
/**
* 设置Pinterest分享参数
*
* @param image 分享图片,可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage。
* @param desc 图片描述
* @param url 链接地址
* @param boardName Board名称
*/
- (void)SSDKSetupPinterestParamsByImage:(id)image
desc:(NSString *)desc
url:(NSURL *)url
boardName:(NSString *)boardName;
/**
* 设置KaKao分享参数
*
* @param text 分享文本
* @param images 分享图片列表,传入参数可以为单张图片信息,也可以为一个NSArray,数组元素可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage,如: @"http://www.mob.com/images/logo_black.png" 或 @[@"http://www.mob.com/images/logo_black.png"]
注:SSDKPlatformSubTypeKakaoTalk 只支持网络图片
* @param title 分享链接标题,用于SSDKPlatformSubTypeKaKaoTalk分享
* @param url 分享链接
* @param permission 查看权限:F 表示好友可以查看,A 表示任何人可以查看,M 表示私有,默认为A
* @param enableShare 是否允许分享,当查看权限为好友查看时,该选项有效,可以设置内容是否允许再分享。
* @PARAM imageSize 图片尺寸,,用于SSDKPlatformSubTypeKaKaoTalk分享时指定图片尺寸
* @param appButtonTitle 应用按钮标题,用于SSDKPlatformSubTypeKaKaoTalk分享App类型时设置
* @param androidExecParam 启动安卓版应用时传入参数,如果没有可以为nil,如:@{@"key" : @"value", @"key2" : @"value2"}。
* @param androidMarkParam 安卓版应用的下载地址,如果没有可以为nil
* @param iphoneExecParams 启动iPhone应用时传入参数,如果没有可以为nil,如:@{@"key" : @"value", @"key2" : @"value2"}。
* @param iphoneMarkParam iPhone应用的下载地址,如果没有可以nil
* @param ipadExecParams iPad应用时传入参数,如果没有可以为nil,如:@{@"key" : @"value", @"key2" : @"value2"}。此参数仅用于Kakao Talk平台。
* @param ipadMarkParam iPad应用的下载地址,如果没有可以为nil,此参数仅用于Kakao Talk平台。
* @param type 分享类型,仅支持Text、Image、WebPage、App
* @param platformSubType 子平台类型,只能传入SSDKPlatformSubTypeKaKaoTalk或者SSDKPlatformSubTypeKaKaoStory
*
* 分享类型,平台支持情况如下:
* Kakao Talk Kakao Story
*
* Text 仅支持客户端分享 应用内分享和客户端分享
* Image 仅支持网络图片的客户端分享 仅支持应用内分享
* WebPage 仅支持客户端分享 仅支持应用内分享
* App 仅支持客户端分享 不支持
*/
- (void)SSDKSetupKaKaoParamsByText:(NSString *)text
images:(id)images
title:(NSString *)title
url:(NSURL *)url
permission:(NSString *)permission
enableShare:(BOOL)enableShare
imageSize:(CGSize)imageSize
appButtonTitle:(NSString *)appButtonTitle
androidExecParam:(NSDictionary *)androidExecParam
androidMarkParam:(NSString *)androidMarkParam
iphoneExecParams:(NSDictionary *)iphoneExecParams
iphoneMarkParam:(NSString *)iphoneMarkParam
ipadExecParams:(NSDictionary *)ipadExecParams
ipadMarkParam:(NSString *)ipadMarkParam
type:(SSDKContentType)type
forPlatformSubType:(SSDKPlatformType)platformSubType;
/**
* 设置Dropbox分享参数
*
* @param attachment 分享附件。附可以为NSData、UIImage、NSString、NSURL(文件路径)、SSDKData、SSDKImage,注:只允许指定本地资源
*/
- (void)SSDKSetupDropboxParamsByAttachment:(id)attachment;
/**
* 设置VKontakte分享参数
*
* @param text 分享文本
* @param images 分享图片列表,传入参数可以为单张图片信息,也可以为一个NSArray,数组元素可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage。如: @"http://www.mob.com/images/logo_black.png" 或 @[@"http://www.mob.com/images/logo_black.png"]
* @param url 分享的链接
* @param groupId 圈子标识,默认为nil,分享到share圈子
* @param friendsOnly 是否为好友可见,默认为NO,表示所有人可以看到。
* @param latitude 纬度
* @param longitude 经度
* @param type 分享类型,仅支持Text、Image、WebPage
*/
- (void)SSDKSetupVKontakteParamsByText:(NSString *)text
images:(id)images
url:(NSURL *)url
groupId:(NSString *)groupId
friendsOnly:(BOOL)friendsOnly
latitude:(double)latitude
longitude:(double)longitude
type:(SSDKContentType)type;
/**
* 设置明道分享参数
*
* @param text 分享文本
* @param image 分享图片,可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage。分享WebPage时需要指定为网络图片
* @param url 分享链接,仅在WebPage时有效。
* @param title 标题,仅在WebPage时有效
* @param type 分享类型,仅支持Text、Image、WebPage
*/
- (void)SSDKSetupMingDaoParamsByText:(NSString *)text
image:(id)image
url:(NSURL *)url
title:(NSString *)title
type:(SSDKContentType)type;
/**
* 设置Instapaper分享参数
*
* @param url 分享链接,如果isPrivateFromSource为YES并且content不为空时将忽略此参数
* @param title 分享标题
* @param desc 分享的链接描述
* @param content 内容
* @param isPrivateFromSource 是否为私有源
* @param folderId 文件夹ID
* @param resolveFinalUrl 解决最终URL问题标识,默认开启,用于解决跳转页面问题,设置为NO则表示不进行跳转
*/
- (void)SSDKSetupInstapaperParamsByUrl:(NSURL *)url
title:(NSString *)title
desc:(NSString *)desc
content:(NSString *)content
isPrivateFromSource:(BOOL)isPrivateFromSource
folderId:(NSInteger)folderId
resolveFinalUrl:(BOOL)resolveFinalUrl;
/**
* 设置微信分享参数
*
* @param text 文本
* @param title 标题
* @param url 分享链接
* @param thumbImage 缩略图,可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage
* @param image 图片,可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage
* @param musicFileURL 音乐文件链接地址
* @param extInfo 扩展信息
* @param fileData 文件数据,可以为NSData、UIImage、NSString、NSURL(文件路径)、SSDKData、SSDKImage
* @param comment 评论信息,在应用内分享朋友圈时该字段有效
* @param userId 发送給指定用户的唯一标识,在应用内分享好友时需要指定。注:如果双方为非好友关系发送消息即使提示成功,对方也无法接受。
* @param type 分享类型,支持SSDKContentTypeText、SSDKContentTypeImage、SSDKContentTypeWebPage、SSDKContentTypeApp、SSDKContentTypeAudio和SSDKContentTypeVideo
* @param platformSubType 平台子类型,只能传入SSDKPlatformTypeYiXinSession、SSDKPlatformTypeYiXinTimeline和SSDKPlatformTypeYiXinFav其中一个
*
* 分享文本时:
* 设置type为SSDKContentTypeText, 并填入text参数
*
* 分享图片时:
* 设置type为SSDKContentTypeImage, 非gif图片时:填入title和image参数
*
* 分享网页时:
* 设置type为SSDKContentTypeWebPage, 并设置text、title、url以及thumbImage参数,如果尚未设置thumbImage则会从image参数中读取图片并对图片进行缩放操作。
*
* 分享应用时:
* 设置type为SSDKContentTypeApp,并设置text、title、extInfo(可选)以及fileData(可选)参数。
*
* 分享音乐时:
* 设置type为SSDKContentTypeAudio,并设置text、title、url以及musicFileURL(可选)参数。
*
* 分享视频时:
* 设置type为SSDKContentTypeVideo,并设置text、title、url参数
*/
- (void)SSDKSetupYiXinParamsByText:(NSString *)text
title:(NSString *)title
url:(NSURL *)url
thumbImage:(id)thumbImage
image:(id)image
musicFileURL:(NSURL *)musicFileURL
extInfo:(NSString *)extInfo
fileData:(id)fileData
comment:(NSString *)comment
toUserId:(NSString *)userId
type:(SSDKContentType)type
forPlatformSubType:(SSDKPlatformType)platformSubType;
/**
* 设置Facebook Messenger分享参数
*
* @param image 分享图片,可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage。
* @param audio 分享音频, 可以为NSData、NSString、NSURL(文件路径)、SSDKData。
* @param video 分享视频, 可以为NSData、NSString、NSURL(文件路径)、SSDKData。
* @param type 分享类型,仅支持Image、Audio、Video
*/
- (void)SSDKSetupFacebookMessengerParamsByImage:(id)image
gif:(id)gif
audio:(id)audio
video:(id)video
type:(SSDKContentType)type;
/**
设置Facebook Messenger分享参数 WebPage类型时 image参数 仅支持单张网络图片
@since ver 3.6.0
@param title WebPage类型 标题
@param url WebPage类型 网址
@param text WebPage类型 链接的引用说明
@param images 分享图片,可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage。NSArray 图片数组
WebPage类型仅支持单张 网络图片
@param gif 分享GIF图片,可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage。
@param audio 分享音频, 可以为NSData、NSString、NSURL(文件路径)、SSDKData。
@param video 分享视频, 可以为NSData、NSString、NSURL(文件路径)、SSDKData。
@param type 分享类型,支持Image、Audio、Video WebPage
*/
- (void)SSDKSetupFacebookMessengerParamsByTitle:(NSString *)title
url:(NSURL *)url
quoteText:(NSString *)text
images:(id)images
gif:(id)gif
audio:(id)audio
video:(id)video
type:(SSDKContentType)type;
/**
* 设置Ding Talk分享参数
*
* @param text 文本内容
* @param image 图片
* @param title 标题
* @param url 链接
* @param type 分享类型,仅支持Text、Image、Webpage、Audio
*/
- (void)SSDKSetupDingTalkParamsByText:(NSString *)text
image:(id)image
title:(NSString *)title
url:(NSURL *)url
type:(SSDKContentType)type;
/**
设置 美拍分享参数
@param url 相册地址 或 本地图片 视频 路径
@param type 分享类型,仅支持Image、Video Auto的自动类型判断需要 MeiPaiConnector.framework 进行支持
*/
- (void)SSDKSetupMeiPaiParamsByUrl:(NSURL *)url
type:(SSDKContentType)type;
/**
设置 YouTube 分享参数
@param video 分享视频, 可以为NSData、NSString、NSURL(文件路径)、SSDKData
@param title 标题
@param description 描述
@param tags 标签,可以为NSString或者NSArray。为NSString时,标签名称要以逗号分隔 为NSArray时,元素为NSString。
@param privacyStatus 视频的隐私权限
只支持 Video类型
*/
- (void)SSDKSetupYouTubeParamsByVideo:(id)video
title:(NSString *)title
description:(NSString *)description
tags:(id)tags
privacyStatus:(SSDKPrivacyStatus)privacyStatus;
/**
设置 YouTube 分享参数
可完全自定义 发布参数
@param video video 分享视频, 可以为NSData、NSString、NSURL(文件路径)、SSDKData
@param parts 多个使用逗号隔开 例如 snippet,status 参考 https://developers.google.com/youtube/v3/docs/videos/insert#part
@param jsonString Video resource 的 json数据 参考 https://developers.google.com/youtube/v3/docs/videos
*/
- (void)SSDKSetupYouTubeParamsByVideo:(id)video
parts:(NSString *)parts
jsonString:(NSString *)jsonString;
@end
================================================
FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/ShareSDK.framework/Headers/SSDKAuthViewStyle.h
================================================
//
// SSDKAuthViewStyle.h
// ShareSDK
//
// Created by fenghj on 15/4/13.
// Copyright (c) 2015年 掌淘科技. All rights reserved.
//
#import
/**
* 授权视图样式
*/
@interface SSDKAuthViewStyle : NSObject
/**
* 设置导航栏背景
*
* @param image 背景图片
*/
+ (void)setNavigationBarBackgroundImage:(UIImage *)image;
/**
* 设置导航栏颜色
*
* @param color 背景颜色
*/
+ (void)setNavigationBarBackgroundColor:(UIColor *)color;
/**
* 设置标题
*
* @param title 标题
*/
+ (void)setTitle:(NSString *)title;
/**
* 设置标题文本颜色
*
* @param color 颜色
*/
+ (void)setTitleColor:(UIColor *)color;
/**
* 设置取消按钮标签
*
* @param label 取消按钮标签
*/
+ (void)setCancelButtonLabel:(NSString *)label;
/**
* 设置取消按钮标签文本颜色
*
* @param color 颜色
*/
+ (void)setCancelButtonLabelColor:(UIColor *)color;
/**
* 设置取消按钮图片
*
* @param image 图片
*/
+ (void)setCancelButtonImage:(UIImage *)image;
/**
* 设置取消按钮的左边距
*
* @param margin 边距
*/
+ (void)setCancelButtonLeftMargin:(CGFloat)margin;
/**
* 设置导航栏右边按钮
*
* @param button 右边按钮
*/
+ (void)setRightButton:(UIButton *)button;
/**
* 设置导航栏右边按钮的右边距
*
* @param margin 边距
*/
+ (void)setRightButtonRightMargin:(CGFloat)margin;
/**
* 设置支持的页面方向
*/
+ (void)setSupportedInterfaceOrientation:(UIInterfaceOrientationMask)toInterfaceOrientation;
/**
* 设置状态栏样式
*
* @param style 样式
*/
+ (void)setStatusBarStyle:(UIStatusBarStyle)style;
@end
================================================
FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/ShareSDK.framework/Headers/SSDKContentEntity.h
================================================
//
// SSDKContentEntity.h
// ShareSDK
//
// Created by 冯 鸿杰 on 15/2/9.
// Copyright (c) 2015年 掌淘科技. All rights reserved.
//
#import
#import
#import
/**
* 内容实体
*/
@interface SSDKContentEntity : MOBFDataModel
/**
* 内容标识
*/
@property (nonatomic, copy) NSString *cid;
/**
* 分享文本
*/
@property (nonatomic, copy) NSString *text;
/**
* 分享图片列表,元素为SSDKImage
*/
@property (nonatomic, retain) NSArray *images;
/**
* 分享链接列表,元素为NSURL
*/
@property (nonatomic, retain) NSArray *urls;
/**
* 原始数据
*/
@property (nonatomic, retain) id rawData;
@end
================================================
FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/ShareSDK.framework/Headers/SSDKCredential.h
================================================
//
// SSDKAuthorizeCredential.h
// ShareSDK
//
// Created by 冯 鸿杰 on 15/2/6.
// Copyright (c) 2015年 掌淘科技. All rights reserved.
//
#import
/**
* 授权类型
*/
typedef NS_ENUM(NSUInteger, SSDKCredentialType)
{
/**
* 未知
*/
SSDKCredentialTypeUnknown = 0,
/**
* OAuth 1.x
*/
SSDKCredentialTypeOAuth1x = 1,
/**
* OAuth 2
*/
SSDKCredentialTypeOAuth2 = 2,
//4.0.2 短信
SSDKCredentialTypeSMS = 3,
};
/**
* 授权凭证
*/
@interface SSDKCredential : NSObject
/**
* 用户标识
*/
@property (nonatomic, copy) NSString *uid;
/**
* 用户令牌
*/
@property (nonatomic, copy) NSString *token;
/**
* 用户令牌密钥
*/
@property (nonatomic, copy) NSString *secret;
/**
* 过期时间
*/
@property (nonatomic, strong) NSDate *expired;
/**
* 授权类型
*/
@property (nonatomic) SSDKCredentialType type;
/**
* 原始数据
*/
@property (nonatomic, strong) NSDictionary *rawData;
/**
* 标识授权是否可用,YES 可用, NO 已过期
*/
@property (nonatomic, readonly) BOOL available;
@end
================================================
FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/ShareSDK.framework/Headers/SSDKData.h
================================================
//
// SSDKData.h
// ShareSDK
//
// Created by fenghj on 15/6/5.
// Copyright (c) 2015年 掌淘科技. All rights reserved.
//
#import
/**
* 数据
*/
@interface SSDKData : NSObject
/**
* 初始化数据
*
* @param URL 数据的地址
*
* @return 数据对象
*/
- (id)initWithURL:(NSURL *)URL;
/**
* 初始化数据
*
* @param data 原始数据对象
*
* @return 数据对象
*/
- (id)initWithData:(NSData *)data;
@end
================================================
FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/ShareSDK.framework/Headers/SSDKHttpServiceModel.h
================================================
//
// SSDKHttpServiceModel.h
// ShareSDK
//
// Created by youzu on 17/2/28.
// Copyright © 2017年 掌淘科技. All rights reserved.
//
#import
#import
#import
typedef NS_ENUM (NSUInteger, SSPHttpServiceType)
{
SSPHttpServiceInit = 0,
SSPHttpServiceAppend = 1,
SSPHttpServiceFinalize = 2,
SSPHttpServiceFinish = 3
};
@interface SSDKHttpServiceModel : NSObject
@property (nonatomic, copy) NSString *fileURL;
@property (nonatomic) NSInteger totalBytes;
@property (nonatomic) NSInteger uploadedBytes;
@property (nonatomic, copy) NSString *sessionID;
@property (nonatomic, weak) MOBFHttpService *httpService;
@property (nonatomic, copy) NSString *tag;
@property (nonatomic, copy) NSString *callback;
@property (nonatomic, copy) NSString *consumerKey;
@property (nonatomic, copy) NSString *consumerSecret;
@property (nonatomic, copy) NSString *token;
@property (nonatomic, copy) NSString *tokenSecret;
@property (nonatomic, copy) NSString *mediaID; //facebook video_id
@property (nonatomic) NSTimeInterval expiresTime;
@property (nonatomic) NSInteger segmentIndex;
@property (nonatomic) NSInteger maxIndex;
@property (nonatomic, copy)NSString *youtubeJsonString;
@property (nonatomic, copy)NSString *youtubeAuthorization;
@property (nonatomic, copy)NSString *youtubeParts;
@property (nonatomic, copy)NSString *youtubeLocation;
@property (nonatomic, copy)NSString *facebookUploadURL;
@property (nonatomic, copy)NSString *facebookUploadSessionID;
@property (nonatomic) NSInteger facebookStartOffset;
@property (nonatomic) NSInteger facebookEndOffset;
@property (nonatomic, copy) NSString *dropboxUploadSessionID;
@property (nonatomic) SSDKPlatformType platformType;
@property (nonatomic) SSPHttpServiceType serviceType;
@property (nonatomic, copy) MOBFHttpUploadProgressEvent uploadProgressEvent;
@end
================================================
FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/ShareSDK.framework/Headers/SSDKImage.h
================================================
//
// SSDKImage.h
// ShareSDK
//
// Created by 冯 鸿杰 on 15/2/25.
// Copyright (c) 2015年 掌淘科技. All rights reserved.
//
#import
#import
/**
* JPG图片格式
*/
extern NSString *const SSDKImageFormatJpeg;
/**
* PNG图片格式
*/
extern NSString *const SSDKImageFormatPng;
/**
* 图片质量键,当图片为JPG时有效
*/
extern NSString *const SSDKImageSettingQualityKey;
/**
* 图片
*/
@interface SSDKImage : NSObject
/**
* 初始化图片
*
* @param URL 图片路径
*
* @return 图片对象
*/
- (id)initWithURL:(NSURL *)URL;
/**
* 初始化图片
*
* @param image 原始的图片对象
* @param format 图片格式,由SSDKImageFormatJpeg和SSDKImageFormatPng来指定分享出去的是JPG还是PNG图片,如果传入其他值则默认为JPG
*
* @return 图片对象
*/
- (id)initWithImage:(UIImage *)image format:(NSString *)format settings:(NSDictionary *)settings;
/**
* 获取原生图片对象
*
* @param handler 处理器
*/
- (void)getNativeImage:(void(^)(UIImage *image))handler;
/**
* 获取图片数据
*
* @param imagePath 图片路径
* @param thumbImagePath 缩略图路径
* @param handler 返回回调
*/
+ (void)getImage:(NSString *)imagePath
thumbImagePath:(NSString *)thumbImagePath
result:(void(^)(NSData *thumbImage, NSData *image))handler;
/**
* 检测缩略图,由于微信限制缩略图不能大于32k,此方法就是用于检测图片大小使用的方法。
*
* @param thumbImageData 缩略图数据
*
* @return 调整后缩略图数据
*/
+ (NSData *)checkThumbImageSize:(NSData *)thumbImageData;
@end
================================================
FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/ShareSDK.framework/Headers/SSDKPlatform.h
================================================
//
// SSDKPlatform.h
// ShareSDK
//
// Created by 冯 鸿杰 on 15/2/6.
// Copyright (c) 2015年 掌淘科技. All rights reserved.
//
#import
#import "SSDKTypeDefine.h"
/**
* 分享平台信息
*/
@interface SSDKPlatform : NSObject
/**
* 平台类型
*/
@property (nonatomic) SSDKPlatformType type;
/**
* 平台名称
*/
@property (nonatomic, copy) NSString *name;
/**
* 平台图标
*/
@property (nonatomic, retain) UIImage *icon;
@end
================================================
FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/ShareSDK.framework/Headers/SSDKTypeDefine.h
================================================
//
// SSDKTypeDefine.h
// ShareSDK
//
// Created by 冯 鸿杰 on 15/2/6.
// Copyright (c) 2015年 掌淘科技. All rights reserved.
//
#ifndef ShareSDK_SSDKTypeDefine_h
#define ShareSDK_SSDKTypeDefine_h
#import "SSDKContentEntity.h"
@protocol ISSDKAuthView;
@class SSDKUser;
@class SSDKFriendsPaging;
@class UIView;
@class SSDKAddFriendView;
/**
* 结合SSO和Web授权方式
*/
extern NSString *const SSDKAuthTypeBoth;
/**
* SSO授权方式
*/
extern NSString *const SSDKAuthTypeSSO;
/**
* 网页授权方式
*/
extern NSString *const SSDKAuthTypeWeb;
/**
* HTTP的GET请求方式
*/
extern NSString *const SSDKHttpMethodGet;
/**
* HTTP的POST请求方式
*/
extern NSString *const SSDKHttpMethodPost;
/**
* HTTP的DELETE请求方式
*/
extern NSString *const SSDKHttpMethodDelete;
/**
* HTTP的PUT请求方式
*/
extern NSString *const SSDKHttpMethodPut;
/**
* HTTP的HEAD请求方式
*/
extern NSString *const SSDKHttpMethodHead;
/**
* 授权设置键名, 其对应键值为NSArray,数组中元素为NSString,如:@{SSDKAuthSettingKeyScopes : @[@"all", @"mail"]}
*/
extern NSString *const SSDKAuthSettingKeyScopes;
/**
* 平台类型
*/
typedef NS_ENUM(NSUInteger, SSDKPlatformType){
/**
* 未知
*/
SSDKPlatformTypeUnknown = 0,
/**
* 新浪微博
*/
SSDKPlatformTypeSinaWeibo = 1,
/**
* 腾讯微博
*/
SSDKPlatformTypeTencentWeibo = 2,
/**
* 豆瓣
*/
SSDKPlatformTypeDouBan = 5,
/**
* QQ空间
*/
SSDKPlatformSubTypeQZone = 6,
/**
* 人人网
*/
SSDKPlatformTypeRenren = 7,
/**
* 开心网
*/
SSDKPlatformTypeKaixin = 8,
/**
* Facebook
*/
SSDKPlatformTypeFacebook = 10,
/**
* Twitter
*/
SSDKPlatformTypeTwitter = 11,
/**
* 印象笔记
*/
SSDKPlatformTypeYinXiang = 12,
/**
* Google+
*/
SSDKPlatformTypeGooglePlus = 14,
/**
* Instagram
*/
SSDKPlatformTypeInstagram = 15,
/**
* LinkedIn
*/
SSDKPlatformTypeLinkedIn = 16,
/**
* Tumblr
*/
SSDKPlatformTypeTumblr = 17,
/**
* 邮件
*/
SSDKPlatformTypeMail = 18,
/**
* 短信
*/
SSDKPlatformTypeSMS = 19,
/**
* 打印
*/
SSDKPlatformTypePrint = 20,
/**
* 拷贝
*/
SSDKPlatformTypeCopy = 21,
/**
* 微信好友
*/
SSDKPlatformSubTypeWechatSession = 22,
/**
* 微信朋友圈
*/
SSDKPlatformSubTypeWechatTimeline = 23,
/**
* QQ好友
*/
SSDKPlatformSubTypeQQFriend = 24,
/**
* Instapaper
*/
SSDKPlatformTypeInstapaper = 25,
/**
* Pocket
*/
SSDKPlatformTypePocket = 26,
/**
* 有道云笔记
*/
SSDKPlatformTypeYouDaoNote = 27,
/**
* Pinterest
*/
SSDKPlatformTypePinterest = 30,
/**
* Flickr
*/
SSDKPlatformTypeFlickr = 34,
/**
* Dropbox
*/
SSDKPlatformTypeDropbox = 35,
/**
* VKontakte
*/
SSDKPlatformTypeVKontakte = 36,
/**
* 微信收藏
*/
SSDKPlatformSubTypeWechatFav = 37,
/**
* 易信好友
*/
SSDKPlatformSubTypeYiXinSession = 38,
/**
* 易信朋友圈
*/
SSDKPlatformSubTypeYiXinTimeline = 39,
/**
* 易信收藏
*/
SSDKPlatformSubTypeYiXinFav = 40,
/**
* 明道
*/
SSDKPlatformTypeMingDao = 41,
/**
* Line
*/
SSDKPlatformTypeLine = 42,
/**
* WhatsApp
*/
SSDKPlatformTypeWhatsApp = 43,
/**
* KaKao Talk
*/
SSDKPlatformSubTypeKakaoTalk = 44,
/**
* KaKao Story
*/
SSDKPlatformSubTypeKakaoStory = 45,
/**
* Facebook Messenger
*/
SSDKPlatformTypeFacebookMessenger = 46,
/**
* 支付宝好友
*/
SSDKPlatformTypeAliPaySocial = 50,
/**
* 支付宝朋友圈
*/
SSDKPlatformTypeAliPaySocialTimeline= 51,
/**
* 钉钉
*/
SSDKPlatformTypeDingTalk = 52,
/**
* youtube
*/
SSDKPlatformTypeYouTube = 53,
/**
* 美拍
*/
SSDKPlatformTypeMeiPai = 54,
/**
* 易信
*/
SSDKPlatformTypeYiXin = 994,
/**
* KaKao
*/
SSDKPlatformTypeKakao = 995,
/**
* 印象笔记国际版
*/
SSDKPlatformTypeEvernote = 996,
/**
* 微信平台,
*/
SSDKPlatformTypeWechat = 997,
/**
* QQ平台
*/
SSDKPlatformTypeQQ = 998,
/**
* 任意平台
*/
SSDKPlatformTypeAny = 999
};
/**
* 印象笔记服务器类型
*/
typedef NS_ENUM(NSUInteger, SSDKEvernoteHostType){
/**
* 沙箱
*/
SSDKEvernoteHostTypeSandbox = 0,
/**
* 印象笔记
*/
SSDKEvernoteHostTypeCN = 1,
/**
* Evernote International
*/
SSDKEvernoteHostTypeUS = 2,
};
/**
* 回复状态
*/
typedef NS_ENUM(NSUInteger, SSDKResponseState){
/**
* 开始
*/
SSDKResponseStateBegin = 0,
/**
* 成功
*/
SSDKResponseStateSuccess = 1,
/**
* 失败
*/
SSDKResponseStateFail = 2,
/**
* 取消
*/
SSDKResponseStateCancel = 3,
//视频文件开始上传
SSDKResponseStateBeginUPLoad = 4
};
/**
* 内容类型
*/
typedef NS_ENUM(NSUInteger, SSDKContentType){
/**
* 自动适配类型,视传入的参数来决定
*/
SSDKContentTypeAuto = 0,
/**
* 文本
*/
SSDKContentTypeText = 1,
/**
* 图片
*/
SSDKContentTypeImage = 2,
/**
* 网页
*/
SSDKContentTypeWebPage = 3,
/**
* 应用
*/
SSDKContentTypeApp = 4,
/**
* 音频
*/
SSDKContentTypeAudio = 5,
/**
* 视频
*/
SSDKContentTypeVideo = 6,
/**
* 文件类型(暂时仅微信可用)
*/
SSDKContentTypeFile = 7,
//图片类型 仅FacebookMessage 分享图片并需要明确结果时 注此类型分享后不会显示应用名称与icon
//v3.6.2 增加
SSDKContentTypeFBMessageImages = 8,
//图片类型 仅FacebookMessage 分享视频并需要明确结果时 注此类型分享后不会显示应用名称与icon
//所分享的视频地址必须为相册地址
//v3.6.2 增加
SSDKContentTypeFBMessageVideo = 9,
//3.6.3 小程序分享(暂时仅微信可用)
SSDKContentTypeMiniProgram = 10
};
/**
YouTube 视频的隐私状态
*/
typedef NS_ENUM(NSUInteger, SSDKPrivacyStatus){
/**
* 私有(只有自己可以观看)
*/
SSDKPrivacyStatusPublic = 0,
/**
* 公开(任何人都可以搜索和观看)
*/
SSDKPrivacyStatusPrivate = 1,
/**
* 不公开(知道链接的人可以观看)
*/
SSDKPrivacyStatusUnlisted = 2
};
/**
* 配置分享平台回调处理器
*
* @param platformType 需要初始化的分享平台类型
* @param appInfo 需要初始化的分享平台应用信息
*/
typedef void(^SSDKConfigurationHandler) (SSDKPlatformType platformType, NSMutableDictionary *appInfo);
/**
* 导入原平台SDK回调处理器
*
* @param platformType 需要导入原平台SDK的平台类型
*/
typedef void(^SSDKImportHandler) (SSDKPlatformType platformType);
/**
* 授权视图显示回调处理器
*
* @param view 授权视图
*/
typedef void(^SSDKAuthorizeViewDisplayHandler) (UIView *view);
/**
* 添加好友视图显示回调处理器,仅用于Facebook添加好友时触发
*
* @param view 添加好友视图
*/
typedef void(^SSDKAddFriendViewDisplayHandler) (SSDKAddFriendView *view);
/**
* 授权状态变化回调处理器
*
* @param state 状态
* @param user 授权用户信息,当且仅当state为SSDKResponseStateSuccess时返回
* @param error 错误信息,当且仅当state为SSDKResponseStateFail时返回
*/
typedef void(^SSDKAuthorizeStateChangedHandler) (SSDKResponseState state, SSDKUser *user, NSError *error);
/**
* 获取用户状态变更回调处理器
*
* @param state 状态
* @param user 用户信息,当且仅当state为SSDKResponseStateSuccess时返回
* @param error 错误信息,当且仅当state为SSDKResponseStateFail时返回
*/
typedef void(^SSDKGetUserStateChangedHandler) (SSDKResponseState state, SSDKUser *user, NSError *error);
/**
* 分享内容状态变更回调处理器
*
* @param state 状态
* @param userData 附加数据, 返回状态以外的一些数据描述,如:邮件分享取消时,标识是否保存草稿等
* @param contentEntity 分享内容实体,当且仅当state为SSDKResponseStateSuccess时返回
* @param error 错误信息,当且仅当state为SSDKResponseStateFail时返回
*/
typedef void(^SSDKShareStateChangedHandler) (SSDKResponseState state, NSDictionary *userData, SSDKContentEntity *contentEntity, NSError *error);
/**
* 调用API状态变更回调处理器
*
* @param state 状态
* @param data 返回数据
* @param error 错误信息
*/
typedef void(^SSDKCallApiStateChangedHandler)(SSDKResponseState state, id data, NSError *error);
/**
* 需要授权回调处理器
*
* @param authorizeStateChangedHandler 授权状态回调
*/
typedef void(^SSDKNeedAuthorizeHandler)(SSDKAuthorizeStateChangedHandler authorizeStateChangedHandler);
/**
* HTTP上传数据情况
*
* @param totalBytes 总字节数
* @param loadedBytes 上传字节数据
*/
typedef void(^SSDKHttpUploadProgressHandler) (int64_t totalBytes, int64_t loadedBytes);
#endif
================================================
FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/ShareSDK.framework/Headers/SSDKUser.h
================================================
//
// SSDKUser.h
// ShareSDK
//
// Created by 冯 鸿杰 on 15/2/6.
// Copyright (c) 2015年 掌淘科技. All rights reserved.
//
#import
#import "SSDKTypeDefine.h"
#import
#import
@class SSDKCredential;
/**
* 性别
*/
typedef NS_ENUM(NSUInteger, SSDKGender)
{
/**
* 男
*/
SSDKGenderMale = 0,
/**
* 女
*/
SSDKGenderFemale = 1,
/**
* 未知
*/
SSDKGenderUnknown = 2,
};
/**
* 用户信息
*/
@interface SSDKUser : MOBFDataModel
/**
* 平台类型
*/
@property (nonatomic) NSInteger platformType;
/**
* 授权凭证, 为nil则表示尚未授权
*/
@property (nonatomic, retain) SSDKCredential *credential;
/**
* 用户标识
*/
@property (nonatomic, copy) NSString *uid;
/**
* 昵称
*/
@property (nonatomic, copy) NSString *nickname;
/**
* 头像
*/
@property (nonatomic, copy) NSString *icon;
/**
* 性别
*/
@property (nonatomic) NSInteger gender;
/**
* 用户主页
*/
@property (nonatomic, copy) NSString *url;
/**
* 用户简介
*/
@property (nonatomic, copy) NSString *aboutMe;
/**
* 认证用户类型
*/
@property (nonatomic) NSInteger verifyType;
/**
* 认证描述
*/
@property (nonatomic, copy) NSString *verifyReason;
/**
* 生日
*/
@property (nonatomic, strong) NSDate *birthday;
/**
* 粉丝数
*/
@property (nonatomic) NSInteger followerCount;
/**
* 好友数
*/
@property (nonatomic) NSInteger friendCount;
/**
* 分享数
*/
@property (nonatomic) NSInteger shareCount;
/**
* 注册时间
*/
@property (nonatomic) NSTimeInterval regAt;
/**
* 用户等级
*/
@property (nonatomic) NSInteger level;
/**
* 教育信息
*/
@property (nonatomic, retain) NSArray *educations;
/**
* 职业信息
*/
@property (nonatomic, retain) NSArray *works;
/**
* 原始数据
*/
@property (nonatomic, retain) NSDictionary *rawData;
@end
================================================
FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/ShareSDK.framework/Headers/SSDKUserQueryConditional.h
================================================
//
// SSDKUserQuery.h
// ShareSDK
//
// Created by 冯 鸿杰 on 15/2/6.
// Copyright (c) 2015年 掌淘科技. All rights reserved.
//
#import
/**
* 用户查询条件
*/
@interface SSDKUserQueryConditional : NSObject
/**
* 创建用户标识查询条件
*
* @param uid 用户标识
*
* @return 查询条件对象
*/
+ (SSDKUserQueryConditional *)userQueryConditionalByUserId:(NSString *)uid;
/**
* 创建用户名称查询条件
*
* @param userName 用户名称
*
* @return 查询条件对象
*/
+ (SSDKUserQueryConditional *)userQueryConditionalByUserName:(NSString *)userName;
/**
* 创建用户路径查询条件
*
* @param path 用户主页路径
*
* @return 查询条件对象
*/
+ (SSDKUserQueryConditional *)userQueryConditionalByPath:(NSString *)path;
@end
================================================
FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/ShareSDK.framework/Headers/SSDKVideoUploadCenter.h
================================================
//
// SSDKVideoUploadCenter.h
// ShareSDK
//
// Created by youzu on 17/2/28.
// Copyright © 2017年 掌淘科技. All rights reserved.
//
#import
#import
#import "SSDKTypeDefine.h"
#import "SSDKHttpServiceModel.h"
@interface SSDKVideoUploadCenter : NSObject
+ (SSDKVideoUploadCenter *)shareInstance;
//平台注册
- (void)registePlatform:(SSDKPlatformType)platform platformName:(NSString *)platformName;
/**
用于获取上传Model数据
@param platformType 分享平台
@param url 本地资源地址
@param tag 标签
@param progressEvent 上传进度
@return 上传的数据Model
*/
- (SSDKHttpServiceModel *)uploadProgressWithPlatformType:(SSDKPlatformType)platformType
fileURL:(NSURL *)url
tag:(NSString *)tag
progressEvent:(MOBFHttpUploadProgressEvent)progressEvent;
/**
指定 上传Model数据 进行暂停操作
@param model 上传Model数据
*/
- (void)stopWithModel:(SSDKHttpServiceModel *)model;
/**
指定 上传Model数据 在暂停后进行继续上传
@param model 上传Model数据
*/
- (void)continueWithModel:(SSDKHttpServiceModel *)model;
/**
指定 上传Model数据 关闭上传操作
@param model 上传Model数据
*/
- (void)closeWithModel:(SSDKHttpServiceModel *)model;
@property (nonatomic,strong) NSMutableArray *httpServiceArray;
@end
================================================
FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/ShareSDK.framework/Headers/ShareSDK+Base.h
================================================
//
// ShareSDK+Base.h
// ShareSDK
//
// Created by 冯 鸿杰 on 15/2/6.
// Copyright (c) 2015年 掌淘科技. All rights reserved.
//
#import