[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-7017":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":17,"stars7d":17,"stars30d":18,"stars90d":16,"forks30d":16,"starsTrendScore":19,"compositeScore":20,"rankGlobal":10,"rankLanguage":10,"license":21,"archived":22,"fork":22,"defaultBranch":23,"hasWiki":24,"hasPages":22,"topics":25,"createdAt":10,"pushedAt":10,"updatedAt":35,"readmeContent":36,"aiSummary":37,"trendingCount":16,"starSnapshotCount":16,"syncStatus":18,"lastSyncTime":38,"discoverSource":39},7017,"mobileplayer-ios","sahin\u002Fmobileplayer-ios","sahin",":iphone: :movie_camera: A powerful and completely customizable media player for iOS","",null,"Swift",3079,352,101,42,0,1,2,3,62.34,"Other",false,"develop",true,[26,27,28,29,30,31,32,33,34],"ads","cocoapods","ios","mobile","mobile-player","player","swift","video","video-player","2026-06-12 04:00:31","![logo](http:\u002F\u002Fi.imgur.com\u002FW9QtXEp.png)\n\nMobilePlayer [![CocoaPods](https:\u002F\u002Fimg.shields.io\u002Fcocoapods\u002Fp\u002FMobilePlayer.svg?style=flat)](https:\u002F\u002Fcocoapods.org\u002Fpods\u002FMobilePlayer)\n==================\n[![codebeat badge](https:\u002F\u002Fcodebeat.co\u002Fbadges\u002Fd9492bce-7a4b-4221-b7e0-9b5abf6dda6a)](https:\u002F\u002Fcodebeat.co\u002Fprojects\u002Fgithub-com-mobileplayer-mobileplayer-ios)\n[![CocoaPods](http:\u002F\u002Fimg.shields.io\u002Fcocoapods\u002Fv\u002FMobilePlayer.svg?style=flat)](http:\u002F\u002Fcocoapods.org\u002F?q=MobilePlayer)\n[![Carthage compatible](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FCarthage-compatible-4BC51D.svg?style=flat)](https:\u002F\u002Fgithub.com\u002FCarthage\u002FCarthage)\n[![Dependencies](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fdependencies-none-brightgreen.svg)](https:\u002F\u002Fgithub.com\u002Fmobileplayer\u002Fmobileplayer-ios)\n[![StackOverflow](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FStackOverflow-Ask%20a%20question!-blue.svg)](httpx:\u002F\u002Fstackoverflow.com\u002Fquestions\u002Fask?tags=mobile+player+ios+swift+video+player)\n[![Join the chat at https:\u002F\u002Fgitter.im\u002Fmobileplayer\u002Fmobileplayer-ios](https:\u002F\u002Fbadges.gitter.im\u002FJoin%20Chat.svg)](https:\u002F\u002Fgitter.im\u002Fmobileplayer\u002Fmobileplayer-ios?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)\n\nA powerful and completely customizable media player for iOS.\n\nTable of Contents\n==================\n1. [Features](#features)\n2. [Installation](#installation)\n3. [Usage](#usage)\n4. [Customization](#customization)\n  - [Skinning](#skinning)\n  - [Showing overlays](#showing-overlays)\n  - [Showing timed overlays](#showing-timed-overlays)\n  - [Pre-roll](#pre-roll)\n  - [Pause overlay](#pause-overlay)\n  - [Post-roll](#post-roll)\n6. [Examples](#examples)\n7. [Documentation](#documentation)\n8. [License](#license)\n\nFeatures\n==================\n- Branding\n  - Flexible skinning. Add a watermark, add\u002Fremove\u002Fmove\u002Fresize interface elements, change their appearances and much more.\n  - Easily set up A\u002FB tests. You can manage multiple player skins and configurations. Player view controllers can load configuration data from a local JSON file or remote JSON data. You also have the option to initialize and pass configuration objects programmatically, which allows for greater flexibility.\n- Engagement\n  - Comes with a built-in share button.\n  - Standard sharing behavior can easily be modified.\n  - Show any view controller as pre-roll or post-roll content.\n  - Powerful overlay system. Add any view controller as an overlay to your video. Make them permanently visible, set them to appear in defined playback time intervals, or while playback is paused.\n- 100% documented.\n\n### Future plans\n- Well defined and extensive `NSNotification`s.\n- Volume button and volume slider elements.\n- Airplay support.\n- Plugin support.\n- Pre-bundled analytics plugins for various platforms.\n- VAST support.\n- Monetization.\n\nInstallation\n==================\n\n### [CocoaPods](https:\u002F\u002Fgithub.com\u002FCocoaPods\u002FCocoaPods)\nAdd the following line in your `Podfile`.\n```\npod \"MobilePlayer\"\n```\n\n### [Carthage](https:\u002F\u002Fgithub.com\u002FCarthage\u002FCarthage#installing-carthage)\nAdd the following line to your [Cartfile](https:\u002F\u002Fgithub.com\u002FCarthage\u002FCarthage\u002Fblob\u002Fmaster\u002FDocumentation\u002FArtifacts.md#cartfile).\n```\ngithub \"mobileplayer\u002Fmobileplayer-ios\"\n```\n\nUsage\n==================\n```swift\nimport MobilePlayer\n\nlet playerVC = MobilePlayerViewController(contentURL: videoURL)\nplayerVC.title = \"Vanilla Player - \\(videoTitle)\"\nplayerVC.activityItems = [videoURL] \u002F\u002F Check the documentation for more information.\npresentMoviePlayerViewControllerAnimated(playerVC)\n```\n![example-plain](http:\u002F\u002Fi.imgur.com\u002FJ6QpSKb.gif)\n\nCustomization\n==================\n\n**Initialize using local configuration file**\n```swift\nlet bundle = NSBundle.mainBundle()\nlet config = MobilePlayerConfig(fileURL: bundle.URLForResource(\n  \"WatermarkedPlayer\",\n  withExtension: \"json\")!)\nlet playerVC = MobilePlayerViewController(\n  contentURL: videoURL,\n  config: config)\nplayerVC.title = \"Watermarked Player - \\(videoTitle)\"\nplayerVC.activityItems = [videoURL]\npresent(playerVC, animated: true, completion: nil)\n```\n\n**Initialize using remote configuration data**\n```swift\nguard let configURL = NSURL(string: \"https:\u002F\u002Fgoo.gl\u002Fc73ANK\") else { return }\nlet playerVC = MobilePlayerViewController(\n  contentURL: videoURL,\n  config: MobilePlayerConfig(fileURL: configURL))\nplayerVC.title = \"Watermarked Player - \\(videoTitle)\"\nplayerVC.activityItems = [videoURL]\npresent(playerVC, animated: true, completion: nil)\n```\n\n**Configuration data**\n```json\n{\n  \"watermark\": {\n    \"image\": \"MovielalaLogo\"\n  }\n}\n```\n\n**Without a configuration file URL**\n```swift\nlet playerVC = MobilePlayerViewController(\n  contentURL: videoURL,\n  config: MobilePlayerConfig(\n    dictionary: [\"watermark\": [\"image\": \"MovielalaLogo\"]]))\nplayerVC.title = \"Watermarked Player - \\(videoTitle)\"\nplayerVC.activityItems = [videoURL]\npresent(playerVC, animated: true, completion: nil)\n```\n\n**Result**\n![example-customization](http:\u002F\u002Fi.imgur.com\u002FtGodgQx.png)\n\n### Skinning\n```json\n{\n  \"watermark\": {\n    \"image\": \"MovielalaLogo\",\n    \"position\": \"topRight\"\n  },\n  \"topBar\": {\n    \"backgroundColor\": [\"#a60500b0\", \"#a60500a0\"],\n    \"elements\": [\n      {\n        \"type\": \"button\",\n        \"identifier\": \"close\"\n      },\n      {\n        \"type\": \"slider\",\n        \"identifier\": \"playback\",\n        \"trackHeight\": 6,\n        \"trackCornerRadius\": 3,\n        \"minimumTrackTintColor\": \"#eee\",\n        \"availableTrackTintColor\": \"#9e9b9a\",\n        \"maximumTrackTintColor\": \"#cccccc\",\n        \"thumbTintColor\": \"#f9f9f9\",\n        \"thumbBorderWidth\": 1,\n        \"thumbBorderColor\": \"#fff\",\n        \"marginRight\": 4\n      }\n    ]\n  },\n  \"bottomBar\": {\n    \"backgroundColor\": [\"#a60500a0\", \"#a60500b0\"],\n    \"elements\": [\n      {\n        \"type\": \"label\",\n        \"text\": \"Now Watching\",\n        \"font\": \"Baskerville\",\n        \"size\": 12,\n        \"marginLeft\": 8,\n        \"marginRight\": 8\n      },\n      {\n        \"type\": \"label\",\n        \"identifier\": \"title\",\n        \"size\": 14\n      },\n      {\n        \"type\": \"button\",\n        \"identifier\": \"action\"\n      },\n      {\n        \"type\": \"toggleButton\",\n        \"identifier\": \"play\"\n      }\n    ]\n  }\n}\n```\nFor all available `identifier`s, check the documentation or [here](https:\u002F\u002Fgithub.com\u002Fmobileplayer\u002Fmobileplayer-ios\u002Fblob\u002Fmaster\u002FMobilePlayer\u002FConfig\u002FElementConfig.swift#L51). Same `identifier` value shouldn't be used more than once in a single configuration.\n\n**Result**\n![example-skinning](http:\u002F\u002Fi.imgur.com\u002FYyiYJCc.png)\n\n**Example designs**\n![example-design-skinning](http:\u002F\u002Fi.imgur.com\u002FqNDrx9T.gif)\n\n### Showing overlays\n```swift\nlet playerVC = MobilePlayerViewController(contentURL: videoURL)\nplayerVC.title = videoTitle\nplayerVC.activityItems = [videoURL]\npresent(playerVC, animated: true, completion: nil)\nProductStore.getProduct(\"1\", success: { product in\n  guard let product = product else { return }\n  playerVC.showOverlayViewController(\n    BuyOverlayViewController(product: product))\n})\n```\n![example-overlay](http:\u002F\u002Fi.imgur.com\u002FwAtNYjE.png)\n\n### Showing timed overlays\n```swift\nlet playerVC = MobilePlayerViewController(contentURL: videoURL)\nplayerVC.title = videoTitle\nplayerVC.activityItems = [videoURL]\npresent(playerVC, animated: true, completion: nil)\nProductStore.getProductPlacementsForVideo(\n  videoID,\n  success: { productPlacements in\n    guard let productPlacements = productPlacements else { return }\n    for placement in productPlacements {\n      ProductStore.getProduct(placement.productID, success: { product in\n        guard let product = product else { return }\n        playerVC.showOverlayViewController(\n          BuyOverlayViewController(product: product),\n          startingAtTime: placement.startTime,\n          forDuration: placement.duration)\n      })\n    }\n})\n```\n![example-timed-overlays](http:\u002F\u002Fi.imgur.com\u002FFuaJB7O.gif)\n\n### Pre-roll\n```swift\nlet playerVC = MobilePlayerViewController(\n  contentURL: videoURL,\n  prerollViewController: PrerollOverlayViewController())\nplayerVC.title = videoTitle\nplayerVC.activityItems = [videoURL]\npresent(playerVC, animated: true, completion: nil)\n```\n![example-preroll](http:\u002F\u002Fi.imgur.com\u002FoBV0HCF.png)\n\n### Pause overlay\n```swift\nlet playerVC = MobilePlayerViewController(\n  contentURL: videoURL,\n  pauseOverlayViewController: PauseOverlayViewController())\nplayerVC.title = videoTitle\nplayerVC.activityItems = [videoURL]\npresent(playerVC, animated: true, completion: nil)\n```\n\n**Result**\n![example-pause-overlay](http:\u002F\u002Fi.imgur.com\u002FwfC9a7t.gif)\n\n**Example designs**\n![example-design-pause-overlay](http:\u002F\u002Fi.imgur.com\u002FectKEwy.gif)\n\n### Post-roll\n```swift\nlet playerVC = MobilePlayerViewController(\n  contentURL: videoURL,\n  postrollViewController: PostrollOverlayViewController())\nplayerVC.title = videoTitle\nplayerVC.activityItems = [videoURL]\npresent(playerVC, animated: true, completion: nil)\n```\n\n**Result**\n![example-postroll](http:\u002F\u002Fi.imgur.com\u002FHp8NEfg.png)\n\n**Example designs**\n![example-design-postroll](http:\u002F\u002Fi.imgur.com\u002FMRVxNAt.gif)\n\nExamples\n==================\nAfter cloning the repo, run the `MobilePlayerExamples` target to see examples for many use cases.\n![examples](http:\u002F\u002Fi.imgur.com\u002FztOPUW6.gif)\n\nDocumentation\n==================\nThe entire documentation for the library can be found [here](https:\u002F\u002Fhtmlpreview.github.io\u002F?https:\u002F\u002Fgithub.com\u002Fmovielala\u002Fmobileplayer-ios\u002Fblob\u002Fmaster\u002FDocumentation\u002Findex.html).\n\nLicense\n==================\nThe use of the MobilePlayer open source edition is governed by a [Creative Commons license](http:\u002F\u002Fcreativecommons.org\u002Flicenses\u002Fby-nc-sa\u002F3.0\u002F). You can use, modify, copy, and distribute this edition as long as it’s for non-commercial use, you provide attribution, and share under a similar license.\nhttp:\u002F\u002Fmobileplayer.io\u002Flicense\u002F\n","MobilePlayer 是一个适用于 iOS 平台的强大且完全可定制的媒体播放器。它支持灵活的皮肤定制，允许添加水印、调整界面元素布局及外观等；内置了分享按钮，并可以展示预置或后置内容以及在特定时间显示覆盖层，增强了用户互动体验。此外，该播放器还提供了丰富的配置选项，既可以从本地或远程加载 JSON 配置文件，也可以通过编程方式初始化。MobilePlayer 适合需要高度自定义化视频播放功能的应用场景，如教育软件、视频流媒体服务等，能够满足开发者对品牌一致性和用户体验多样性的需求。","2026-06-11 03:10:07","top_language"]