GithubHelp home page GithubHelp logo

openedx / edx-app-ios Goto Github PK

View Code? Open in Web Editor NEW
230.0 36.0 190.0 902.28 MB

The Open edX mobile app for iOS!

Home Page: https://docs.google.com/document/d/15MYZ2LAmahB82P5wkPkQOqjszfou0Qkeae3qz7STxUQ/edit

License: Apache License 2.0

Objective-C 22.40% HTML 0.02% CSS 0.06% Ruby 0.09% Swift 75.84% JavaScript 0.03% Python 0.22% Rich Text Format 0.02% C 1.31%
open-source edx swift ios education

edx-app-ios's Introduction

Warning!

This is repository is scheduled for Link deprecation and removal, please use Link this instead.

edX iOS

This is the source code for the edX mobile iOS app. It is changing rapidly and its structure should not be relied upon. See http://code.edx.org for other parts of the edX code base.

It has been tested with the "Koa" release of open edX and may not function correctly with previous versions. See https://openedx.atlassian.net/wiki/display/COMM/Open+edX+Releases for more information.

License

This software is licensed under version 2 of the Apache License unless otherwise noted. Please see LICENSE.txt for details.

Building

  1. Check out the source code: :

    git clone https://github.com/openedx/edx-app-ios
  2. Open terminal and run command pod install
  3. Open edX.xcworkspace.
  4. Ensure that the edX scheme is selected.
  5. Click the Run button.

Note: Our build system requires Java 7 or later. If you see an error mentioning "Unsupported major.minor version 51.0 " then you should install a newer Java SDK.

Configuration

The edX mobile iOS app is designed to connect to an Open edX instance. You must configure the app with the correct server address and supply appropriate OAuth credentials. We use a configuration file mechanism similar to that of the Open edX platform. This mechanism is also used to make other values available to the app at runtime and store secret keys for third party services.

There is a default configuration that points to an edX devstack instance running on localhost. See the default_config directory. For the default configuration to work, you must add OAuth credentials specific to your installation.

Setup

To use a custom configuration in place of the default configuration, you will need to complete these tasks:

1. Create your own configuration directory somewhere else on the file system. For example, create my_config as a sibling of the edx-app-ios repository.

2. Create an edx.properties file at the top level of the edx-app-ios repository. In this edx.properties file, set the edx.dir property to the path to your configuration directory. For example, if I stored my configuration at ../my_config then I'd have the following edx.properties:

edx.dir = '../my_config'

3. In the configuration directory that you added in step 1, create another edx.properties file. This properties file contains a list of filenames. The files should be in YAML format and are for storing specific keys. These files are specified relative to the configuration directory. Keys in files earlier in the list will be overridden by keys from files later in the list. For example, if I had two files, one shared between iOS and Android called shared.yaml and one with iOS specific keys called ios.yaml, I would have the following edx.properties:

edx.ios {
    configFiles = ['shared.yaml', 'ios.yaml']
}

The full set of known keys can be found in the OEXConfig.m or see additional documentation.

Additional Customization

Right now this code is constructed specifically to build the edx.org app. We're working on making it easier for Open edX installations to apply customizations and select third party services without modifying the repository itself. Until that work is complete, you will need to modify or replace files within your fork of the repo.

To replace the edX branding you will need to replace the appicon files. These come in a number of resolutions. See Apple's documentation for more information on different app icon sizes. Additionally, you will need to replace the splash images used in the login screen.

If you need to make more in depth UI changes, most of the user interface is specified in the Main.storyboard file, editable from Interface Builder within Xcode.

As mentioned, the app relies on the presence of several third party services: Facebook, NewRelic, Google+, SegmentIO, and Crashlytics. You must remove references to each of these services you choose not to use. You can comment out the lines that mention these services. We're working to make those dependencies optional.

Whitelabel Script

  1. Checkout a new branch for your app, e.g. :

    git checkout -b my-new-app
  2. Reset to the desired base upstream ref, e.g. :

    git reset --hard master
  3. Create a virtualenv for use with the whitelabel script, and install dependencies. Either Python2.7 or Python3.x will work. :

    virtualenv edx-app-ios
    source edx-app-ios/bin/activate
    pip install pyyaml
  4. In a separate dir, create your whitelabel configuration file, e.g. ../my-app-config/whitelabel.yaml Run the whitelabel script to see the options: :

    python script/whitelabel.py --help
    python script/whitelabel.py --help-config-file
  5. In that separate dir, optionally create your resource directory and files. e.g., to update the colors.json file: :

    mkdir -p ../my-app-config/Resources/Colors
    cp Source/Resources/Colors/colors.json ../my-app-config/Resources/Colors/
    # edit ../my-app-config/Resources/Colors/colors.json as required
  6. Run the whitelabel.py script to apply your whitelabel changes to the current branch. :

    python script/whitelabel.py --config-file=../my-app-config/whitelabel.yaml -v

edx-app-ios's People

Contributors

aleffert avatar andrey-canon avatar colinbrash avatar cpennington avatar danialzahid94 avatar e0d avatar ehmadzubair avatar feanil avatar hamzaisrar12 avatar jagonzalr avatar jaimeohm avatar jeffxtang avatar jianfengqiu avatar jlim6329 avatar jotiram avatar kdmccormick avatar kevinjkim avatar kurhadeprashant avatar miankhalid avatar mikekatz avatar mumer92 avatar mzeshanarif avatar nedbat avatar pomegranited avatar rahul-clarice avatar saeedbashir avatar salman2013 avatar sarina avatar shafqat-muneer avatar tlindaliu avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

edx-app-ios's Issues

Unable to load course content. Try again later

Hi team,

I have an issues when load course content with latest release edx-app-ios. Plz help me.
When my app connect to devstack, everythings seem be OK.

But when i connect my app to fullstack server (use website OK), i can not get courseware (can view Handouts, Announcements OK). With Xcode Debug, it shows:
[ERROR|ANALYTICS] @ Optional("CourseOutlineViewController.swift"):144 - Unable to load block: Error Domain=org.edx.error Code=-100 "Unable to load course content.
Try again later." UserInfo={NSLocalizedDescription=Unable to load course content.
Try again later.}

My fullstack server user cypress release, plz tell me if i forget config somethings :( Thanks.

simulator screen shot jan 8 2016 5 51 28 pm

Unable to build the edX.xcworkspace

Tried both the ways to download the code as a zip file and Clone Desktop. and followed the steps mentioned in the ReadMe, and while building the edX.xcworkspace, it is throwing an error. Also tried updating the Pods to avoid the dependency injection.

And it seems like the issue with the grade.

Any help appreciated.

Enable ClosedCaptions(subtitles) for new videos.

Is there a way to Enable the closed captions to the new course videos. Currently it is not showing the subtitles though selected for the previous course video. But the image is enabled(with a tick mark).

You haven't downloaded any videos when logging out and then logging in again

If I installed videos and the download is complete, and after I log out then log in again and navigate to the My Video modules all the downloaded videos disappear. However, if you navigate to any course that you have previously downloaded its videos the video will appear in the module again.

I noticed while I'm debugging these log messages when the videos refuse to appear after I access the module:

2017-05-11 16:15:43.026818 edX[1041:359721] [User Defaults] Failed to write value for key ApplicationAccessibilityEnabled in CFPrefsPlistSource<0x174106a50> (Domain: com.apple.Accessibility, User: kCFPreferencesCurrentUser, ByHost: No, Container: (null)): setting preferences outside an application's container requires user-preference-write or file-write-data sandbox access, switching to read-only
2017-05-11 16:15:43.032639 edX[1041:359072] [User Defaults] attempt to set 1 for key in AccessibilityEnabled in read-only (due to a previous failed write) preferences domain CFPrefsPlistSource<0x174106a50> (Domain: com.apple.Accessibility, User: kCFPreferencesCurrentUser, ByHost: No, Container: (null))

And I also noticed that in the coursesAndVideosForDownloadState in OEXInterface.h method the [_courseVideos objectForKey : course.video_outline] is always nil before accessing any course I already downloaded its videos.

EDIT

  • The module is working fine on the simulator.

Unable to select any of the courses in Find Courses(native mode) in v2.3.1

We are trying to enroll the courses from FindCourses, but seems like didselectrow delegate is not yet enabled yet in the code. Please let us know how to proceed further.

We are working on the code v2.3.1, and I think in the edx app(v2.2.7) they are showing on the web view,
Could you tell how to achieve this approach.

Thanks in advance.

Course enrollment not responded. [swift3]

Thank you for updated to swift 3. I download and build everything work fine. but I can't enroll the course . touch the "Enroll now" button and it not respond. and I enable SEARCH_BAR_ENABLED: true but it doesn't show

--- My Config---

API_HOST_URL: 'https://mooc.test.xxx.org'
ENVIRONMENT_DISPLAY_NAME: 'XxxMOOC'
FEEDBACK_EMAIL_ADDRESS: '[email protected]'
PLATFORM_DESTINATION_NAME: 'mooc.test.xxx.org'
COURSE_SHARING_ENABLED: true
DISCUSSIONS_ENABLED: true
CERTIFICATES_ENABLED: true
USER_PROFILES_ENABLED: true
BADGES_ENABLED: true
REGISTRATION_ENABLED: false
APP_REVIEWS_ENABLED: true
VIDEO_TRANSCRIPT_ENABLED: true
DISCUSSIONS_ENABLE_PROFILE_PICTURE_PARAM: true
DEBUG: true
NEW_COURSE_NAVIGATION_ENABLED: true
COURSE_ENROLLMENT:
  TYPE: 'native'
  SEARCH_BAR_ENABLED: true
  COURSE_SEARCH_URL: 'https://mooc.test.xxx.org/courses'
  • Can't Enroll

img_9378

  • Search bar not show

img_9379

Archive Process Config

Can't archive the release project
Stopping on Running custom shell script 'Process Config'

/Users/Huatan/Library/Developer/Xcode/DerivedData/edX-etkbiplhnoaatkbopozakulmaoym/Build/Intermediates/ArchiveIntermediates/edX/IntermediateBuildFilesPath/edX.build/Release-iphoneos/edX.build/Script-77BDD65E1A44BD7300EA2A9C.sh: line 2: /Users/Huatan/Downloads/edx-app-ios-master: is a directory
Command /bin/sh failed with exit code 126

Anything wrong?

iPad support

Dear Team,

Is EDX supporting iPad application as well. It is observed that the target device is iPhone only(in the edx-master).
Also please let us know the procedure in order to give support to iPad, I want to customize the UI.

Please clarify.

Thanks..

Whitelabelling doesnt work

I followed the steps in the readme file and i dont see any results after running the python script. sorry i'm new to this whitelabelling.

Decoding error on closed captions

Hey,

Just wanted to let you know that the app has some issues decoding what I believe is the HTML from the closed captions (attached is a screenshot of an encoded apostrophe). The screenshot is from edX's official app but it also applies to the latest version of your master branch.

image

Thank you!
Miguel

Support for the Peer Instruction XBlock?

Hi,

We (at the University of British Columbia) have developed the Peer Instruction XBlock

https://github.com/ubc/ubcpi

which is integrated into the edx-platform and in use by many courses (for example, courses that are part of the Software Development Micromasters Program).

Is there support for this XBlock in the iOS app? Students accessing their courses on mobile would greatly benefit from this, and we would love to see Peer Instruction supported in the app.

Thanks,

Justin

CFNetwork SSLHandshake failed (-9847)

Hi teams ,

I have some problem about the configuration edx iOS app , this is the error and i have google the problem. It showed it's about the SSL problem .

And i have try to add the OAUTH_ENFORCE_SECURE = "" in my lms.env.json , and have try to add in #Feature and out of #Feature , but it still error .

"Environment"
I build on localhost without https

2015-09-28 2 09 04

I also try the method to add some properties on Info.plist.

2015-09-28 2 18 03

How do i fixed this problem ?

Big Thanks,
MOH

Process Config Issues

Can't build the release 2.7.0 project. Stopping on Running custom shell script 'Process Config' .
Starting Build ================================================ Start building buildSrc Evaluating root project 'buildSrc' using build file '/Users/dolphinquan/Downloads/edx-app-ios-rc-2.7.3/buildSrc/build.gradle'. Download https://repo1.maven.org/maven2/org/eclipse/jgit/org.eclipse.jgit/3.7.0.201502260915-r/org.eclipse.jgit-3.7.0.201502260915-r.jar Command /bin/sh failed with exit code 130
Anything wrong?

App crashes on orientationChanged (While playing video)

========BEFORE CRASH========
2015-11-08 22:29:56.267 edX[340:37950] BSXPCMessage received error for message: Connection interrupted
2015-11-08 22:29:59.202 edX[340:37880] Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints)
(
"<NSLayoutConstraint:0x1686da20 UIView:0x16815310.height == 0>",
"<NSLayoutConstraint:0x1682c700 UIView:0x15663e40.bottom == UILabel:0x16852070.bottom + 20>",
"<NSLayoutConstraint:0x1682c730 UILabel:0x16852070.top == UIView:0x15663e40.top + 20>",
"<NSLayoutConstraint:0x1681bac0 UIView:0x16815310.top == UIView:0x156b81b0.top>",
"<NSLayoutConstraint:0x16866ae0 UIView:0x156b81b0.bottom == UIView:0x16815310.bottom>",
"<NSLayoutConstraint:0x16866b10 UIView:0x15663e40.top == UIView:0x156b81b0.top>",
"<NSLayoutConstraint:0x16869110 UIView:0x156b81b0.bottom == UIView:0x15663e40.bottom>"
)

Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x1682c700 UIView:0x15663e40.bottom == UILabel:0x16852070.bottom + 20>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.
2015-11-08 22:29:59.289 edX[340:37880] Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints)
(
"<NSLayoutConstraint:0x1686da20 UIView:0x16815310.height == 0>",
"<NSLayoutConstraint:0x1682c700 UIView:0x15663e40.bottom == UILabel:0x16852070.bottom + 20>",
"<NSLayoutConstraint:0x1682c730 UILabel:0x16852070.top == UIView:0x15663e40.top + 20>",
"<NSLayoutConstraint:0x1681bac0 UIView:0x16815310.top == UIView:0x156b81b0.top>",
"<NSLayoutConstraint:0x16866ae0 UIView:0x156b81b0.bottom == UIView:0x16815310.bottom>",
"<NSLayoutConstraint:0x16866b10 UIView:0x15663e40.top == UIView:0x156b81b0.top>",
"<NSLayoutConstraint:0x16869110 UIView:0x156b81b0.bottom == UIView:0x15663e40.bottom>"
)

Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x1682c700 UIView:0x15663e40.bottom == UILabel:0x16852070.bottom + 20>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.

========ACTUAL CRASH========
2015-11-08 22:31:00.988 edX[340:37880] -[OEXCourseVideoDownloadTableViewController orientationChanged:]: unrecognized selector sent to instance 0x16976ec0
2015-11-08 22:31:00.989 edX[340:37880] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[OEXCourseVideoDownloadTableViewController orientationChanged:]: unrecognized selector sent to instance 0x16976ec0'
*** First throw call stack:
(0x2b1effef 0x39893c8b 0x2b1f5409 0x2b1f3327 0x2b122e78 0x2b1a7e09 0x2b102515 0x2be64749 0x2e86d867 0x2e86d61b 0x2e86cf19 0x2e8d2c31 0x32bd27d1 0x32bd241b 0x2b1b57cb 0x2b1b5767 0x2b1b3d69 0x2b100201 0x2b100013 0x32bd1201 0x2e8cca09 0x4273e5 0x39e45aaf)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb)

Analytics for Mobile applicaiton

Hi Team,

I want to have analytics for my mobile application. Also I have seen some code in edx source. So can any one let me know how to leverage this feature??

Thanks in advance:-)

No offline access for text content

The application let the user download the video for the offline access while you it's impossible to access text content when you are out of connection.
Are you serious?

400 error while signIn

I am getting the 400 error code, even though i configured the set-up as mentioned in the Readme.md file, where as I am able to login using the same credentials on the web portal.

Is there any extra web services needs to be hosted still?
Error response : { URL: /oauth2/access_token } { status code: 400, headers {
"Cache-Control" = "no-store";
Connection = "keep-alive";
"Content-Language" = en;
"Content-Type" = "application/json";
Date = "Wed, 19 Aug 2015 13:47:02 GMT";
Pragma = "no-cache";
Server = "nginx/1.1.19";
"Transfer-Encoding" = Identity;
Vary = "Accept-Language, Cookie";
"X-Frame-Options" = ALLOW;
} }

Thanks in advance.

Sign-in error

when I log in, it shows a dialog:
Sign-in error: Please make sure that your user name or e-mail address and password are correct and try again.

But the username/password is correct when I log ni with Web page.

What went wrong?

About Discover Courses

I set COURSE_ENROLLMENT to native,But there is no login button at the bottom of the course list interface,and In the course details interface, Register for a course of time did not pop up registration screen!

This is why?

Sign-in Error

When launch the emulator in the Xcode, it show:

Sign-in error: the certificate for this server is invalid, you might be connecting to a server that is pretending to
Be 42.x.x.106 which could put your confidential information at risk

Segmentation fault: 11

The last PR breaks the app.

Throws a segmentation fault: 11

It is on CourseCatalogDetailViewController on the function listen

private func listen() {
        self.courseStream.listen(self,
            success: {[weak self] (course, enrolled) in
                self?.aboutView.applyCourse(course: course)
                if enrolled {
                    self?.aboutView.actionText = Strings.CourseDetail.viewCourse
                    self?.aboutView.action = {completion in
                        self?.showCourseScreen()
                        completion()
                    }
                }
                else {
                    self?.aboutView.actionText = Strings.CourseDetail.enrollNow
                    self?.aboutView.action = {[weak self] completion in
                        self?.enrollInCourse(completion: completion)
                    } as? ((() -> Void) -> Void)
                }
            }, failure: {[weak self] error in
                self?.loadController.state = LoadState.failed(error: error)
            }
        )
        self.aboutView.loaded.listen(self) {[weak self] _ in
            self?.loadController.state = .Loaded
        }
    }

The problem seems to be on

self?.aboutView.action = {[weak self] completion in
    self?.enrollInCourse(completion: completion)
} as? ((() -> Void) -> Void)

If I comment that entire code then the app builds correctly but then the users wouldn't be able to enroll

@saeedbashir @salman2013

Videos' duration shows up as 00:00

The video's duration shows up as 00:00 on the module's menu, even though its duration is over 3 minutes long (and that's what shows up when you click on it and view it).

image

EDIT: It appears as though it's not the app's fault... the /api/courses/v1/blocks/ endpoint it's requesting is returning null for all videos' durations.

SignIn Error : 400 BAD REQUEST

Hi Team,

We've enabled the following
"FEATURES" :
{
...
"ENABLE_MOBILE_REST_API": true,

"ENABLE_OAUTH2_PROVIDER": true,

"ENABLE_COMBINED_LOGIN_REGISTRATION": true

}
in the edx/app/edxapp/lms.env.json. we are getting the 400 error code while sign in into edX iPhone Application.

Xcode Response :
{ URL: /oauth2/access_token }
{ status code: 400, headers {
"Cache-Control" = "no-store";
Connection = "keep-alive";
"Content-Language" = en;
"Content-Type" = "application/json";
Date = "Wed, 02 Sep 2015 13:26:33 GMT";
Pragma = "no-cache";
Server = "nginx/1.1.19";
"Set-Cookie" = "sessionid=ab9dbf025e7c4b5799978444127ac138; expires=Wed, 16-Sep-2015 13:26:33 GMT; httponly; Max-Age=1209600; Path=/";
"Transfer-Encoding" = Identity;
Vary = "Accept-Language, Cookie";
"X-Frame-Options" = ALLOW;
} }


Also when we are trying from the firefox REST client tool, it showing the below response.
I'm passing this as body:
{"client-id":"xxxxxxxxxxxxxx",

"username":"[email protected]",

"password":"xxxxxxxx",

"grant-type":"password"}
Response:

Status Code: 400 BAD REQUEST
Cache-Control: no-store
Connection: keep-alive
Content-Language: en
Content-Type: application/json
Date: Wed, 02 Sep 2015 14:26:35 GMT
Pragma: no-cache
Server: nginx/1.1.19
Transfer-Encoding: chunked
Vary: Accept-Language, Cookie
X-Frame-Options: ALLOW


{"error_description": "A secure connection is required.", "error": "invalid_request"}

Seems like this is breaking, Please confirm:
URL: /oauth2/access_token .

Please suggest what going wrong, we've configured the setting's as per the ReadMe Notes.

Thanks in advance!

I have a problem with (void (^)(void))

I use XCode Version 8.3.3 (8E3004b), MacOS 10.12

/Users/haian/Downloads/edx-app-ios-master/Source/OEXAppDelegate.m:172:141: Conflicting parameter types in implementation of 'application:handleEventsForBackgroundURLSession:completionHandler:': 'void (^ _Nonnull __strong)()' vs 'void (^__strong _Nonnull)(void)'

Image: https://i.imgur.com/aPUNwNw.jpg

Unable to load course content. Try again later.

NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9813)
[ERROR|ANALYTICS] @ Optional("CourseOutlineViewController.swift"):126 - Unable to load block: Error Domain=org.edx.error Code=-100 "Unable to load course content.
Try again later." UserInfo={NSLocalizedDescription=Unable to load course content.
Try again later.}

We are getting the above error while accessing the courseware in the mobile application v2.1. Please let us know if there is any way to fix? issue.
simulator screen shot jan 25 2016 6 22 29 pm

feature-request: background playback of video and/or audio

The current app stops playing as soon as you leave the app. Allowing audio streaming to continue to play in the background is fairly standard (safari allows you to do this for web videos, you just need to press play from the control center), and would be useful for many videos.

Related: allowing users to selectively chose to stream just the audio from a video file would be useful too, especially on mobile devices with limited data/bandwidth, but this might be more of a content creator concern.

SAML-Based Single Sign-On

Hey edX,

I wanted to re-open the issue that was raised by #632 , specifically as it pertains to SAML auth backends on the platform which are completely unsupported by the apps now.

What's the status of the development of this feature? If work has already been started, would there be any opportunities to contribute / help?

Thanks!
Miguel

Video Component not showing the video

Hello!

While the videos are working in Android version of the app, it's not appearing in the ios version
we still have a message that mention "you cannot see this video here, Go to youtube"
although the videos urls are set properly in the studio, also when when you press the link it goes to our url not to the youtube!

Does there any additional requirement to the video in ios rather than what required for Android version? or what is the problem there?
screen shot 2017-07-16 at 15 20 04

NSInternalInconsistencyException', reason: 'Unable to load config.'

Hello Team,

While running code I'm getting crash. Crash log is mentioned below.

*** Assertion failure in -[OEXConfig initWithAppBundleData], /Users/XYZUser/Desktop/edX/edx-app-ios-repo/edx-app-ios-master/Source/OEXConfig.m:64
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Unable to load config.'

Created "Config.yaml, edx.properties, loca.yaml" files and place as per the "Read me" document. I don't know where the problem is?

Could anyone help on this. Am I missing any additional setup?

No signature of method: java.io.File.plus() is applicable for argument types: (java.lang.String) values: [ not found. Skipping.]

When i run the app, it is running well. But when i try to archive it, i get these errors

FAILURE: Build failed with an exception.

  • Where:
    Build file '/Users/ganeshkumark/Downloads/edx-ios/edx-app-ios/build.gradle' line: 182

  • What went wrong:
    Execution failed for task ':applyConfig'.

No signature of method: java.io.File.plus() is applicable for argument types: (java.lang.String) values: [ not found. Skipping.]
Possible solutions: list(), list(java.io.FilenameFilter), use([Ljava.lang.Object;), is(java.lang.Object), split(groovy.lang.Closure), wait()

What could be the problem?
I have given the build.gradle file below...

import com.dd.plist.*
import org.edx.builder.TaskHelper

// Dependencies
buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'com.googlecode.plist:dd-plist:1.16'
    }
}

apply plugin: 'edxapp'
edx {
    platform = IOS
}

// Configuration
def workspace = 'edX.xcworkspace'
def scheme = 'edX'

class IOSHelper {
    // Environment Variable Conveniences
    // Only valid when our task is invoked by an Xcode build

    def getInfoPlistPath() {
        def env = System.getenv()
        return env['INFOPLIST_PATH']
    }

    def getBuiltProductsPath() {
        def env = System.getenv()
        return env['BUILT_PRODUCTS_DIR']
    }

    def getWrapperName() {
        def env = System.getenv()
        return env['WRAPPER_NAME']
    }

    def getBuiltInfoPlistPath() {
        return builtProductsPath + '/' + infoPlistPath
    }

    def getBundleConfigPath() {
        return builtProductsPath + '/' + wrapperName + '/config.plist'
    }

    // Saves our loaded and processed config YAML
    // to a Plist in the app bundle
    def saveProcessedConfig(config, toPath) {
        def plist = [:]

        for(c in config) {
            plist[c.key] = c.value
        }
        // Save entire config
        PropertyListParser.saveAsXML(NSObject.wrap(plist), new File(toPath))
    }

    // Modify Info.plist for specific services

    def readInfoPlist() {
        // The configuration library doesn't know how to read
        // binary plists so make sure it's an xml one
        ['plutil', '-convert', 'xml1', builtInfoPlistPath].execute().waitFor()

        def plist = PropertyListParser.parse(new File(builtInfoPlistPath)).toJavaObject()
        return plist
    }

    def writeInfoPlist(plist) {
        PropertyListParser.saveAsXML(NSObject.wrap(plist), new File(builtInfoPlistPath))

        // Restore to binary for runtime performance
        ['plutil', '-convert', 'binary1', builtInfoPlistPath].execute().waitFor()
    }

    def addURLScheme(scheme, plist) {
        def body = [
            'CFBundleTypeRole' : 'Editor',
            'CFBundleURLSchemes' : [scheme]
        ]

        def existing = plist['CFBundleURLTypes']
        if(existing) {
            // make sure we don't add it more than once
            def found = false
            for(entry in existing){
                def schemes = entry['CFBundleURLSchemes']
                if(schemes && schemes.contains(scheme)){
                    found = true
                    break
                }
            }
            if(!found) {
                def types = new ArrayList((ArrayList)existing)
                types.add(body)
                plist['CFBundleURLTypes'] = types
            }
        }
        else {
            plist["CFBundleURLTypes"] = [body]
        }
    }

    def addFacebookConfig(config, plist) {
        def facebook = config['FACEBOOK'] ?: [:]
        def key = facebook['FACEBOOK_APP_ID']
        if(!key) {
            return
        }

        plist["FacebookAppID"] = key
        def scheme = "fb" + key
        addURLScheme(scheme, plist)
    }

    def addFabricConfig(config, plist) {
        def fabric = config['FABRIC'] ?: [:]
        
        def key = fabric['FABRIC_KEY']
        if(!key) {
            return
        }

        def body = [
            'APIKey' : key,
            'Kits' : [
                [
                    'KitInfo' : [],
                    'KitName' : 'Crashlytics'
                ]
            ]
        ]
        plist["Fabric"] = body
    }

    def addGoogleConfig(config, plist) {
        def google = config['GOOGLE'] ?: [:]

        def key = google['GOOGLE_PLUS_KEY']
        if(!key) {
            return
        }

        // Google login schemes are the reverse DNS of the api key
        def scheme = key.tokenize('.').reverse().join('.')
        addURLScheme(scheme, plist)
    }

}


// Tasks 
task printBuildEnvironment(type : Exec) {
    def arguments = [
        'xcodebuild',
        '-workspace', workspace,
        '-scheme', scheme,
        '-showBuildSettings'
    ]
    commandLine arguments
}

task uploadDebuggingSymbols << {
    def taskHelper = new TaskHelper()
    def config = taskHelper.loadConfig(project)
    def fabric = config['FABRIC'] ?: [:]
    def key = fabric['FABRIC_KEY']
    def secret = fabric['FABRIC_BUILD_SECRET']
    def srcroot = System.getenv()['SRCROOT']
    if(key && secret && srcroot) {
        [srcroot + "/Pods/Fabric/Fabric.framework/run", key, secret].execute().waitFor()
    }
}

task applyConfig << {
    def taskHelper = new TaskHelper()
    def config = taskHelper.loadConfig(project)
    def helper = new IOSHelper()

    // Save all keys to config.plist
    helper.saveProcessedConfig(config, helper.bundleConfigPath)

    // Save specific fields to Info.plist
    def plist = helper.readInfoPlist()
    helper.addFacebookConfig(config, plist)
    helper.addFabricConfig(config, plist)
    helper.addGoogleConfig(config, plist)
    helper.writeInfoPlist(plist)

    // double check that the config file actually got made
    def check = ["[", "-f", helper.bundleConfigPath, "]"].execute()
    check.waitFor()

    def result = check.exitValue()
    assert result == 0
}

task wrapper(type: Wrapper) {
    gradleVersion = '2.2.1'
}

def testBuildArguments(workspace, scheme, OS, record) {
    def args = [
        'xcodebuild', '-workspace', workspace, '-scheme', scheme, '-sdk', 'iphonesimulator', '-destination', 'platform=iOS Simulator,name=iPhone 5s,OS=' + OS, 'test'
    ]
    if(record) {
        args += ["OTHER_SWIFT_FLAGS=\$(OTHER_SWIFT_FLAGS) -D RECORD_SNAPSHOTS"]
    }
    return args
}

def RTLSchemeForScheme(scheme) {
    return scheme + '-RTL'
}

def operatingSystems = ["currentOS": "10.0", "previousOS": "9.0"]
def directions = ["LTR": scheme, "RTL": RTLSchemeForScheme(scheme)]
def commands = ["test" : ["record" : false], "recordSnapshots": ["record" : true]] 

for(OS in operatingSystems) {
    for(direction in directions) {
        for(command in commands) {
            def record = command.value["record"]
            def task = project.task(type: Exec, command.key + direction.key.capitalize() + OS.key.capitalize()) {
                commandLine testBuildArguments(workspace, direction.value, OS.value, record)
            }
        }
    }
}


task test(dependsOn: tasks.findAll { task -> task.name.startsWith('test')}) {}
task recordSnapshots(dependsOn: tasks.findAll { task -> task.name.startsWith('recordSnapshots')}) {}

Can not to enter Finde Course DetailsPage In V2.4.0

Respect of the development team.I Find the Find in V2.4.0 Course, but I can't click into the details page, only Find Course list page.I want to ask what is the situation.And I download version is in the AppStore can click to Find Course page for details

about swift question

In "SnapshotTestCase.swift", there's error like this,I tried to see FBSnapshotTestCase,But I can not see it! And I tried to modify the StandardTolerance's type, and I still can not solve it! So I ask you!Thank you!

private let StandardTolerance : CGFloat = 0.005
//private let StandardTolerance : String = "0.005"
//private let StandardTolerance = 0.005
//private let StandardTolerance : Double = 0.005

protocol SnapshotTestable {
func snapshotTestWithCase(testCase : FBSnapshotTestCase, referenceImagesDirectory: String, identifier: String) throws

var snapshotSize : CGSize { get }

}

extension UIView : SnapshotTestable {
func snapshotTestWithCase(testCase : FBSnapshotTestCase, referenceImagesDirectory: String, identifier: String) throws {
try testCase.compareSnapshotOfView(self, referenceImagesDirectory: referenceImagesDirectory, identifier: identifier, tolerance : StandardTolerance)//error: Extra argument "tolerance" in call

}

var snapshotSize : CGSize {
    return bounds.size
}

}

UI issues in rc/2.0.0

Hi Team,

Found some UI issues for the error popups and my video section.
It was not there in 17th Nov release on master.

regards,
Rajesh

Sometimes it occurred the error

sometimes it occurred the error "Command /bin/sh failed with exit code 1",but it sometimes will not occurred the error! And I do not known why....

Available features and server compatibility

Hello Team,

Is there any document/link to check all the available features, server compatibility for a specific version.

Ex: 2.3.1 is compatible Dogwood server,
New Features : course enrollments.

Ping SSO

Team, can we implement Ping Identity(SSO) for authentication?
Thanks,
Prudvee

Signed URL for course videos.

Dear Team,

I am planning to use the signed URL's for the courses video. So I would like to know where can I do this customization in the edx v1.0 code. Please mention the class and method name if possible.

Thanks in advance.

Touch response for iOS 11.0.2 is unreliable

When attempting to click (touch) videos and course content on iPhone 7 iOS 11.0.2 the app is unresponsive. Upon open/reopen touch will work more reliably for one time then return to being unresponsive.

Filters in Find Course

Hi Team,

We are able to find filter/search a course in "Find Courses" page in edx v2.2 and 2.4. which was downloaded from app store. Please find attached screenshot. But we are unable to find filter/search a course in edx v2.3 and v2.5.

Could you please update us know how to enable the filter option in the Find courses, since we haven't observed that enabled from v2.3.x

Thanks in advance.
img_0190

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.