{"action":"created","comment":{"url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/pulls/comments/291381434","pull_request_review_id":246828030,"id":291381434,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI5MTM4MTQzNA==","diff_hunk":"@@ -0,0 +1,531 @@\n+//\n+// Copyright 2019 Esri.\n+\n+// Licensed under the Apache License, Version 2.0 (the \"License\");\n+// you may not use this file except in compliance with the License.\n+// You may obtain a copy of the License at\n+// http://www.apache.org/licenses/LICENSE-2.0\n+\n+// Unless required by applicable law or agreed to in writing, software\n+// distributed under the License is distributed on an \"AS IS\" BASIS,\n+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n+// See the License for the specific language governing permissions and\n+// limitations under the License.\n+\n+import UIKit\n+import ARKit\n+import ArcGIS\n+\n+public class ArcGISARView: UIView {\n+    \n+    // MARK: public properties\n+    \n+    /// The view used to display the `ARKit` camera image and 3D `SceneKit` content.\n+    public lazy private(set) var arSCNView = ARSCNView(frame: .zero)\n+    \n+    /// The view used to display ArcGIS 3D content.\n+    public lazy private(set) var sceneView = AGSSceneView(frame: .zero)\n+    \n+    /// The world tracking information used by `ARKit`.\n+    public var arConfiguration: ARConfiguration = {\n+        let config = ARWorldTrackingConfiguration()\n+        config.worldAlignment = .gravityAndHeading\n+        return config\n+        }() {\n+        didSet {\n+            // Start tracking using the new configuration.\n+            startTracking()\n+        }\n+    }\n+\n+    /// The viewpoint camera used to set the initial view of the sceneView instead of the devices GPS location via the locationManager.\n+    public var originCamera: AGSCamera?\n+    \n+    /// The translation factor used to support a table top AR experience.\n+    public var translationTransformationFactor: Double = 1.0\n+    \n+    // We implement ARSessionDelegate methods, but will use `sessionDelegate` to forward them to clients.\n+    weak open var sessionDelegate: ARSessionDelegate?\n+    \n+    // We implement SCNSceneRendererDelegate methods, but will use `scnSceneRendererDelegate` to forward them to clients.\n+    weak open var scnSceneRendererDelegate: SCNSceneRendererDelegate?\n+\n+    // MARK: private properties\n+    \n+    /// Whether to display the camera image or not.\n+    private var renderVideoFeed = true\n+    \n+    /// Used to determine the device location when originCamera is not set.\n+    private lazy var locationManager: CLLocationManager = { [unowned self] in\n+        let lm = CLLocationManager()\n+        lm.desiredAccuracy = kCLLocationAccuracyBest\n+        lm.delegate = self\n+        return lm\n+    }()\n+    \n+    /// Initial location from locationManager.\n+    private var initialLocation: CLLocation?\n+    \n+    /// Current horizontal accuracy of the device.\n+    private var horizontalAccuracy: CLLocationAccuracy = .greatestFiniteMagnitude\n+    \n+    /// The intial camera position and orientation whether it was set via originCamera or the locationManager.\n+    private var initialTransformationMatrix = AGSTransformationMatrix()\n+    \n+    /// Whether `ARKit` is supported on this device.\n+    private var isSupported = {\n+        return ARWorldTrackingConfiguration.isSupported\n+    }()\n+    \n+    /// Whether the client has been notfiied of start/failure.\n+    private var notifiedStartOrFailure = false\n+    \n+    /// Used when calculating framerate.\n+    private var lastUpdateTime: TimeInterval = 0\n+    \n+    // A quaternion used to compensate for the pitch beeing 90 degrees on `ARKit`; used to calculate the current device transformation for each frame.\n+    let compensationQuat:simd_quatd = simd_quaternion((sin(45 / (180 / .pi))), 0, 0, (cos(45 / (180 / .pi))))\n+    \n+    /// The quaternion used to represent the device orientation; used to calculate the current device transformation for each frame; defaults to landcape-left.\n+    var orientationQuat:simd_quatd = simd_quaternion(0, 0, 1, 0)\n+    \n+    // MARK: Initializers\n+    \n+    public override init(frame: CGRect) {\n+        super.init(frame: frame)\n+        sharedInitialization()\n+    }\n+    \n+    required public init?(coder aDecoder: NSCoder) {\n+        super.init(coder: aDecoder)\n+        sharedInitialization()\n+    }\n+    \n+    /// Initializer used to denote whether to display the live camera image.\n+    ///\n+    /// - Parameter renderVideoFeed: Whether to display the live camera image.\n+    public convenience init(renderVideoFeed: Bool){\n+        self.init(frame: .zero)\n+        self.renderVideoFeed = renderVideoFeed\n+    }\n+    \n+    deinit {\n+        stopTracking()\n+    }\n+    \n+    /// Initialization code shared between all initializers.\n+    private func sharedInitialization(){\n+        // Add the ARSCNView to our view.\n+        addSubviewWithConstraints(arSCNView)\n+        arSCNView.session.delegate = self\n+        (arSCNView as SCNSceneRenderer).delegate = self\n+        \n+        // Add sceneView to view and setup constraints.\n+        addSubviewWithConstraints(sceneView)\n+\n+        // Make our sceneView's background transparent, no atmosphereEffect.\n+        sceneView.isBackgroundTransparent = true\n+        sceneView.atmosphereEffect = .none\n+        \n+        // Tell the sceneView we will be calling `renderFrame()` manually.\n+        sceneView.isManualRendering = true\n+        \n+        // We haven't yet notified user of start or failure.\n+        notifiedStartOrFailure = false\n+        \n+        // Set intitial orientationQuat.\n+        orientationChanged(notification: nil)\n+    }\n+    \n+    // MARK: Public\n+    \n+    /// Determines the map point for the given screen point.\n+    ///\n+    /// - Parameter toLocation: The point in screen coordinates.\n+    /// - Returns: The map point corresponding to screenPoint.\n+    public func arScreen(toLocation: AGSPoint) -> AGSPoint {\n+        fatalError(\"arScreen(toLocation:) has not been implemented\")\n+    }\n+    \n+    /// Resets the device tracking, using `originCamera` if it's not nil or the device's GPS location via the locationManager.\n+    public func resetTracking() {\n+        initialLocation = nil\n+        startTracking()\n+    }\n+\n+    /// Resets the device tracking, using the device's GPS location via the locationManager.\n+    ///\n+    /// - Returns: Reset operation success or failure.\n+    public func resetUsingLocationServices() -> Bool {\n+        fatalError(\"resetUsingLocationServices() has not been implemented\")\n+    }\n+    \n+    /// Resets the device tracking using a spacial anchor.\n+    ///\n+    /// - Returns: Reset operation success or failure.\n+    public func resetUsingSpatialAnchor() -> Bool {\n+        fatalError(\"resetUsingSpatialAnchor() has not been implemented\")\n+    }\n+    \n+    /// Starts device tracking.\n+    public func startTracking() {\n+        if !isSupported {\n+            didStartOrFailWithError(ArcGISARView.notSupportedError())\n+            return\n+        }\n+        \n+        if let origin = originCamera {\n+            // We have a starting camera.\n+            initialTransformationMatrix = origin.transformationMatrix\n+            sceneView.setViewpointCamera(origin)\n+            finalizeStart()\n+        }\n+        else {\n+            // No starting camera, use location manger to get initial location.\n+            let authStatus = CLLocationManager.authorizationStatus()\n+            switch authStatus {\n+            case .notDetermined:\n+                startWithAccessNotDetermined()\n+            case .restricted, .denied:\n+                startWithAccessDenied()\n+            case .authorizedAlways, .authorizedWhenInUse:\n+                startWithAccessAuthorized()\n+            }\n+        }\n+        \n+        // We need to know when the device orientation changes in order to update the Camera transformation.\n+        UIDevice.current.beginGeneratingDeviceOrientationNotifications()\n+        NotificationCenter.default.addObserver(\n+            self,\n+            selector: #selector(self.orientationChanged(notification:)),\n+            name: UIDevice.orientationDidChangeNotification,\n+            object: nil\n+        )\n+    }\n+\n+    /// Suspends device tracking.\n+    public func stopTracking() {\n+        arSCNView.session.pause()\n+        stopUpdatingLocationAndHeading()\n+        \n+        UIDevice.current.endGeneratingDeviceOrientationNotifications()\n+        NotificationCenter.default.removeObserver(self)\n+    }\n+    \n+    // MARK: Private\n+    \n+    /// Operations that happen after device tracking has started.\n+    fileprivate func finalizeStart() {\n+        // Hide the camera image if necessary.\n+        arSCNView.isHidden = !renderVideoFeed\n+        \n+        // Run the ARSession.\n+        arSCNView.session.run(arConfiguration, options:.resetTracking)\n+        didStartOrFailWithError(nil)\n+    }\n+\n+    /// Adds subView to superView with appropriate constraints.\n+    ///\n+    /// - Parameter subview: The subView to add.\n+    fileprivate func addSubviewWithConstraints(_ subview: UIView) {\n+        // Add subview to view and setup constraints.\n+        addSubview(subview)\n+        subview.translatesAutoresizingMaskIntoConstraints = false\n+        NSLayoutConstraint.activate([\n+            subview.leadingAnchor.constraint(equalTo: self.leadingAnchor),\n+            subview.trailingAnchor.constraint(equalTo: self.trailingAnchor),\n+            subview.topAnchor.constraint(equalTo: self.topAnchor),\n+            subview.bottomAnchor.constraint(equalTo: self.bottomAnchor)\n+            ])\n+    }\n+    \n+    /// Start the locationManager with undetermined access.\n+    fileprivate func startWithAccessNotDetermined() {\n+        if (Bundle.main.object(forInfoDictionaryKey: \"NSLocationWhenInUseUsageDescription\") != nil) {\n+            locationManager.requestWhenInUseAuthorization()\n+        }\n+        if (Bundle.main.object(forInfoDictionaryKey: \"NSLocationAlwaysUsageDescription\") != nil) {\n+            locationManager.requestAlwaysAuthorization()\n+        }\n+        else{\n+            didStartOrFailWithError(ArcGISARView.missingPListKeyError())\n+        }\n+    }\n+    \n+    /// Start updating the location and heading via the locationManager.\n+    fileprivate func startUpdatingLocationAndHeading() {\n+        locationManager.startUpdatingLocation()\n+        if CLLocationManager.headingAvailable() {\n+            locationManager.startUpdatingHeading()\n+        }\n+    }\n+    \n+    /// Stop updating location and heading.\n+    fileprivate func stopUpdatingLocationAndHeading() {\n+        locationManager.stopUpdatingLocation()\n+        if CLLocationManager.headingAvailable() {\n+            locationManager.stopUpdatingHeading()\n+        }\n+    }\n+\n+    /// Start the locationManager with denied access.\n+    fileprivate func startWithAccessDenied() {\n+        didStartOrFailWithError(ArcGISARView.accessDeniedError())\n+    }\n+    \n+    /// Start the locationManager with authorized access.\n+    fileprivate func startWithAccessAuthorized() {\n+        startUpdatingLocationAndHeading()\n+    }\n+    \n+    /// Potential notification to the user of an error starting device tracking.\n+    ///\n+    /// - Parameter error: The error that occurred when starting tracking.\n+    fileprivate func didStartOrFailWithError(_ error: Error?) {\n+        if !notifiedStartOrFailure, let error = error {\n+            // TODO: present error to user...\n+            print(\"didStartOrFailWithError: \\(String(reflecting:error))\")\n+        }\n+        \n+        notifiedStartOrFailure = true\n+    }\n+    \n+    /// Handle a change in authorization status to \"denied\".\n+    fileprivate func handleAuthStatusChangedAccessDenied() {\n+        // auth status changed to denied\n+        stopUpdatingLocationAndHeading()\n+        \n+        // We were waiting for user prompt to come back, so notify.\n+        didStartOrFailWithError(ArcGISARView.accessDeniedError())\n+    }\n+    \n+    /// Handle a change in authorization status to \"authorized\".\n+    fileprivate func handleAuthStatusChangedAccessAuthorized() {\n+        // Auth status changed to authorized; now that we have authorization - start updating location and heading.\n+        didStartOrFailWithError(nil)\n+        startUpdatingLocationAndHeading()\n+    }\n+    \n+    /// Called when device orientation changes.\n+    ///\n+    /// - Parameter notification: The notification.\n+    @objc func orientationChanged(notification: Notification?) {\n+        // Handle rotation here.\n+        switch UIApplication.shared.statusBarOrientation {","path":"Toolkit/ArcGISToolkit/AR/ArcGISARView.swift","position":314,"original_position":314,"commit_id":"3c8f0c1ace58e5ce1c4d4d730a863d38f7935e14","original_commit_id":"3c8f0c1ace58e5ce1c4d4d730a863d38f7935e14","user":{"login":"mhdostal","id":3998072,"node_id":"MDQ6VXNlcjM5OTgwNzI=","avatar_url":"https://avatars2.githubusercontent.com/u/3998072?v=4","gravatar_id":"","url":"https://api.github.com/users/mhdostal","html_url":"https://github.com/mhdostal","followers_url":"https://api.github.com/users/mhdostal/followers","following_url":"https://api.github.com/users/mhdostal/following{/other_user}","gists_url":"https://api.github.com/users/mhdostal/gists{/gist_id}","starred_url":"https://api.github.com/users/mhdostal/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mhdostal/subscriptions","organizations_url":"https://api.github.com/users/mhdostal/orgs","repos_url":"https://api.github.com/users/mhdostal/repos","events_url":"https://api.github.com/users/mhdostal/events{/privacy}","received_events_url":"https://api.github.com/users/mhdostal/received_events","type":"User","site_admin":false},"body":"Fixed; using UIDevice.current.orientation, but I will look into the other things I mentioned.","created_at":"2019-06-06T21:35:53Z","updated_at":"2019-06-06T21:35:53Z","html_url":"https://github.com/Esri/arcgis-runtime-toolkit-ios/pull/57#discussion_r291381434","pull_request_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/pulls/57","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/pulls/comments/291381434"},"html":{"href":"https://github.com/Esri/arcgis-runtime-toolkit-ios/pull/57#discussion_r291381434"},"pull_request":{"href":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/pulls/57"}},"in_reply_to_id":291366750},"pull_request":{"url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/pulls/57","id":284626502,"node_id":"MDExOlB1bGxSZXF1ZXN0Mjg0NjI2NTAy","html_url":"https://github.com/Esri/arcgis-runtime-toolkit-ios/pull/57","diff_url":"https://github.com/Esri/arcgis-runtime-toolkit-ios/pull/57.diff","patch_url":"https://github.com/Esri/arcgis-runtime-toolkit-ios/pull/57.patch","issue_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/issues/57","number":57,"state":"open","locked":false,"title":"AR","user":{"login":"mhdostal","id":3998072,"node_id":"MDQ6VXNlcjM5OTgwNzI=","avatar_url":"https://avatars2.githubusercontent.com/u/3998072?v=4","gravatar_id":"","url":"https://api.github.com/users/mhdostal","html_url":"https://github.com/mhdostal","followers_url":"https://api.github.com/users/mhdostal/followers","following_url":"https://api.github.com/users/mhdostal/following{/other_user}","gists_url":"https://api.github.com/users/mhdostal/gists{/gist_id}","starred_url":"https://api.github.com/users/mhdostal/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mhdostal/subscriptions","organizations_url":"https://api.github.com/users/mhdostal/orgs","repos_url":"https://api.github.com/users/mhdostal/repos","events_url":"https://api.github.com/users/mhdostal/events{/privacy}","received_events_url":"https://api.github.com/users/mhdostal/received_events","type":"User","site_admin":false},"body":"This is the initial implementation of AR functionality for the Toolkit.  The `mhd/AR_MergeBranch` is a dummy branch strictly for the PR.  The `AR` branch, going forward, will be the point of reference for all AR-related work and changes to that branch will be via PRs.  This PR is to review the initial work done and pushed directly to the `AR` branch.\r\n\r\nThere are two main files:\r\n\r\n- ARExample.swift - the Toolkit Example App example for AR\r\n- ArcGISARView.swift - a view combining ARKit with and `AGSSceneView` into an easy-to-consume object that exposes the full range of ARKit functionality and tight coordination with `AGSSceneView`\r\n\r\nSpecific things to look for/review:\r\n\r\n- Code organization; is it readable, logically laid out, and understandable?\r\n- Swift - does it use latest (4.x) Swift features and follow our Swift programming guidelines; is it good Swift code?\r\n\r\nNote that the `CLLocationManager`, associated user authorization code and code to start/stop location and heading updates (all in `ArcGISARView.swift`) *might* be replaced by an `AGSLocationDataSource`; there is a pending design issue to make the necessary changes to that class in order to support what's necessary for AR (and other use cases).\r\n\r\nDon't be afraid to be brutal as I want this to be outstanding open source code...","created_at":"2019-06-03T15:52:14Z","updated_at":"2019-06-06T21:35:53Z","closed_at":null,"merged_at":null,"merge_commit_sha":"b96c1ca9ae5f311533b5893bfdc18d4b714edf89","assignee":{"login":"mhdostal","id":3998072,"node_id":"MDQ6VXNlcjM5OTgwNzI=","avatar_url":"https://avatars2.githubusercontent.com/u/3998072?v=4","gravatar_id":"","url":"https://api.github.com/users/mhdostal","html_url":"https://github.com/mhdostal","followers_url":"https://api.github.com/users/mhdostal/followers","following_url":"https://api.github.com/users/mhdostal/following{/other_user}","gists_url":"https://api.github.com/users/mhdostal/gists{/gist_id}","starred_url":"https://api.github.com/users/mhdostal/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mhdostal/subscriptions","organizations_url":"https://api.github.com/users/mhdostal/orgs","repos_url":"https://api.github.com/users/mhdostal/repos","events_url":"https://api.github.com/users/mhdostal/events{/privacy}","received_events_url":"https://api.github.com/users/mhdostal/received_events","type":"User","site_admin":false},"assignees":[{"login":"mhdostal","id":3998072,"node_id":"MDQ6VXNlcjM5OTgwNzI=","avatar_url":"https://avatars2.githubusercontent.com/u/3998072?v=4","gravatar_id":"","url":"https://api.github.com/users/mhdostal","html_url":"https://github.com/mhdostal","followers_url":"https://api.github.com/users/mhdostal/followers","following_url":"https://api.github.com/users/mhdostal/following{/other_user}","gists_url":"https://api.github.com/users/mhdostal/gists{/gist_id}","starred_url":"https://api.github.com/users/mhdostal/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mhdostal/subscriptions","organizations_url":"https://api.github.com/users/mhdostal/orgs","repos_url":"https://api.github.com/users/mhdostal/repos","events_url":"https://api.github.com/users/mhdostal/events{/privacy}","received_events_url":"https://api.github.com/users/mhdostal/received_events","type":"User","site_admin":false}],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/pulls/57/commits","review_comments_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/pulls/57/comments","review_comment_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/pulls/comments{/number}","comments_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/issues/57/comments","statuses_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/statuses/3c8f0c1ace58e5ce1c4d4d730a863d38f7935e14","head":{"label":"Esri:AR","ref":"AR","sha":"3c8f0c1ace58e5ce1c4d4d730a863d38f7935e14","user":{"login":"Esri","id":628795,"node_id":"MDEyOk9yZ2FuaXphdGlvbjYyODc5NQ==","avatar_url":"https://avatars1.githubusercontent.com/u/628795?v=4","gravatar_id":"","url":"https://api.github.com/users/Esri","html_url":"https://github.com/Esri","followers_url":"https://api.github.com/users/Esri/followers","following_url":"https://api.github.com/users/Esri/following{/other_user}","gists_url":"https://api.github.com/users/Esri/gists{/gist_id}","starred_url":"https://api.github.com/users/Esri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Esri/subscriptions","organizations_url":"https://api.github.com/users/Esri/orgs","repos_url":"https://api.github.com/users/Esri/repos","events_url":"https://api.github.com/users/Esri/events{/privacy}","received_events_url":"https://api.github.com/users/Esri/received_events","type":"Organization","site_admin":false},"repo":{"id":85761430,"node_id":"MDEwOlJlcG9zaXRvcnk4NTc2MTQzMA==","name":"arcgis-runtime-toolkit-ios","full_name":"Esri/arcgis-runtime-toolkit-ios","private":false,"owner":{"login":"Esri","id":628795,"node_id":"MDEyOk9yZ2FuaXphdGlvbjYyODc5NQ==","avatar_url":"https://avatars1.githubusercontent.com/u/628795?v=4","gravatar_id":"","url":"https://api.github.com/users/Esri","html_url":"https://github.com/Esri","followers_url":"https://api.github.com/users/Esri/followers","following_url":"https://api.github.com/users/Esri/following{/other_user}","gists_url":"https://api.github.com/users/Esri/gists{/gist_id}","starred_url":"https://api.github.com/users/Esri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Esri/subscriptions","organizations_url":"https://api.github.com/users/Esri/orgs","repos_url":"https://api.github.com/users/Esri/repos","events_url":"https://api.github.com/users/Esri/events{/privacy}","received_events_url":"https://api.github.com/users/Esri/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/Esri/arcgis-runtime-toolkit-ios","description":"Toolkit components that will simplify your iOS app development with ArcGIS Runtime","fork":false,"url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios","forks_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/forks","keys_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/teams","hooks_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/hooks","issue_events_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/issues/events{/number}","events_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/events","assignees_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/assignees{/user}","branches_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/branches{/branch}","tags_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/tags","blobs_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/git/refs{/sha}","trees_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/statuses/{sha}","languages_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/languages","stargazers_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/stargazers","contributors_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/contributors","subscribers_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/subscribers","subscription_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/subscription","commits_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/commits{/sha}","git_commits_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/git/commits{/sha}","comments_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/comments{/number}","issue_comment_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/issues/comments{/number}","contents_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/contents/{+path}","compare_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/merges","archive_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/downloads","issues_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/issues{/number}","pulls_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/pulls{/number}","milestones_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/milestones{/number}","notifications_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/labels{/name}","releases_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/releases{/id}","deployments_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/deployments","created_at":"2017-03-21T22:49:55Z","updated_at":"2019-05-10T22:22:28Z","pushed_at":"2019-06-05T18:18:58Z","git_url":"git://github.com/Esri/arcgis-runtime-toolkit-ios.git","ssh_url":"git@github.com:Esri/arcgis-runtime-toolkit-ios.git","clone_url":"https://github.com/Esri/arcgis-runtime-toolkit-ios.git","svn_url":"https://github.com/Esri/arcgis-runtime-toolkit-ios","homepage":null,"size":939,"stargazers_count":9,"watchers_count":9,"language":"Swift","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":6,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":11,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":6,"open_issues":11,"watchers":9,"default_branch":"master"}},"base":{"label":"Esri:mhd/AR_MergeBranch","ref":"mhd/AR_MergeBranch","sha":"14a9adc50a36aa420ba6b8b1f58a5981d9d9a555","user":{"login":"Esri","id":628795,"node_id":"MDEyOk9yZ2FuaXphdGlvbjYyODc5NQ==","avatar_url":"https://avatars1.githubusercontent.com/u/628795?v=4","gravatar_id":"","url":"https://api.github.com/users/Esri","html_url":"https://github.com/Esri","followers_url":"https://api.github.com/users/Esri/followers","following_url":"https://api.github.com/users/Esri/following{/other_user}","gists_url":"https://api.github.com/users/Esri/gists{/gist_id}","starred_url":"https://api.github.com/users/Esri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Esri/subscriptions","organizations_url":"https://api.github.com/users/Esri/orgs","repos_url":"https://api.github.com/users/Esri/repos","events_url":"https://api.github.com/users/Esri/events{/privacy}","received_events_url":"https://api.github.com/users/Esri/received_events","type":"Organization","site_admin":false},"repo":{"id":85761430,"node_id":"MDEwOlJlcG9zaXRvcnk4NTc2MTQzMA==","name":"arcgis-runtime-toolkit-ios","full_name":"Esri/arcgis-runtime-toolkit-ios","private":false,"owner":{"login":"Esri","id":628795,"node_id":"MDEyOk9yZ2FuaXphdGlvbjYyODc5NQ==","avatar_url":"https://avatars1.githubusercontent.com/u/628795?v=4","gravatar_id":"","url":"https://api.github.com/users/Esri","html_url":"https://github.com/Esri","followers_url":"https://api.github.com/users/Esri/followers","following_url":"https://api.github.com/users/Esri/following{/other_user}","gists_url":"https://api.github.com/users/Esri/gists{/gist_id}","starred_url":"https://api.github.com/users/Esri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Esri/subscriptions","organizations_url":"https://api.github.com/users/Esri/orgs","repos_url":"https://api.github.com/users/Esri/repos","events_url":"https://api.github.com/users/Esri/events{/privacy}","received_events_url":"https://api.github.com/users/Esri/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/Esri/arcgis-runtime-toolkit-ios","description":"Toolkit components that will simplify your iOS app development with ArcGIS Runtime","fork":false,"url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios","forks_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/forks","keys_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/teams","hooks_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/hooks","issue_events_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/issues/events{/number}","events_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/events","assignees_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/assignees{/user}","branches_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/branches{/branch}","tags_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/tags","blobs_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/git/refs{/sha}","trees_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/statuses/{sha}","languages_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/languages","stargazers_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/stargazers","contributors_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/contributors","subscribers_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/subscribers","subscription_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/subscription","commits_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/commits{/sha}","git_commits_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/git/commits{/sha}","comments_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/comments{/number}","issue_comment_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/issues/comments{/number}","contents_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/contents/{+path}","compare_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/merges","archive_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/downloads","issues_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/issues{/number}","pulls_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/pulls{/number}","milestones_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/milestones{/number}","notifications_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/labels{/name}","releases_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/releases{/id}","deployments_url":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/deployments","created_at":"2017-03-21T22:49:55Z","updated_at":"2019-05-10T22:22:28Z","pushed_at":"2019-06-05T18:18:58Z","git_url":"git://github.com/Esri/arcgis-runtime-toolkit-ios.git","ssh_url":"git@github.com:Esri/arcgis-runtime-toolkit-ios.git","clone_url":"https://github.com/Esri/arcgis-runtime-toolkit-ios.git","svn_url":"https://github.com/Esri/arcgis-runtime-toolkit-ios","homepage":null,"size":939,"stargazers_count":9,"watchers_count":9,"language":"Swift","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":6,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":11,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":6,"open_issues":11,"watchers":9,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/pulls/57"},"html":{"href":"https://github.com/Esri/arcgis-runtime-toolkit-ios/pull/57"},"issue":{"href":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/issues/57"},"comments":{"href":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/issues/57/comments"},"review_comments":{"href":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/pulls/57/comments"},"review_comment":{"href":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/pulls/57/commits"},"statuses":{"href":"https://api.github.com/repos/Esri/arcgis-runtime-toolkit-ios/statuses/3c8f0c1ace58e5ce1c4d4d730a863d38f7935e14"}},"author_association":"MEMBER"}}
{"actor":{"display_login":"mhdostal"}}