Browse Source

Development

master
Dwayne Harris 6 years ago
parent
commit
c2a34ebf65
  1. 6
      .gitmodules
  2. 195
      elpha-ios.xcodeproj/project.pbxproj
  3. 24
      elpha-ios/AppDelegate.swift
  4. 74
      elpha-ios/AuthenticateViewController.swift
  5. 6
      elpha-ios/AuthenticationManager.swift
  6. 3
      elpha-ios/Elpha.xcdatamodeld/Elpha.xcdatamodel/contents

6
.gitmodules

@ -4,3 +4,9 @@
[submodule "Frameworks/AlamofireImage"]
path = Frameworks/AlamofireImage
url = https://github.com/Alamofire/AlamofireImage.git
[submodule "Frameworks/MastodonKit"]
path = Frameworks/MastodonKit
url = https://github.com/MastodonKit/MastodonKit
[submodule "Frameworks/OAuthSwift"]
path = Frameworks/OAuthSwift
url = https://github.com/OAuthSwift/OAuthSwift

195
elpha-ios.xcodeproj/project.pbxproj

@ -29,6 +29,8 @@
15960E8021353DCF00C38CE9 /* TimelineViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15960E7F21353DCF00C38CE9 /* TimelineViewController.swift */; };
15960E822136668500C38CE9 /* TimelinesNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15960E812136668500C38CE9 /* TimelinesNavigationController.swift */; };
15960E84213774FC00C38CE9 /* InstancesTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15960E83213774FC00C38CE9 /* InstancesTableViewController.swift */; };
15A79B07215B3CD5007A326E /* MastodonKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 15A79B02215B3CC5007A326E /* MastodonKit.framework */; };
15A79B20215B439A007A326E /* OAuthSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 15A79B13215B438C007A326E /* OAuthSwift.framework */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
@ -137,6 +139,83 @@
remoteGlobalIDString = E4202FE01B667AA100C997FB;
remoteInfo = "Alamofire watchOS";
};
15A79AFF215B3CC5007A326E /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 15A79AE7215B3CC5007A326E /* MastodonKit.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = "MastodonKit::MastodonKit::Product";
remoteInfo = MastodonKit;
};
15A79B01215B3CC5007A326E /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 15A79AE7215B3CC5007A326E /* MastodonKit.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 629A4B0E213AF5B100A6386E;
remoteInfo = "MastodonKit-iOS";
};
15A79B03215B3CC5007A326E /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 15A79AE7215B3CC5007A326E /* MastodonKit.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 62864F50213AF68900823C8A;
remoteInfo = "MastodonKit-tvOS";
};
15A79B05215B3CC5007A326E /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 15A79AE7215B3CC5007A326E /* MastodonKit.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = "MastodonKit::MastodonKitTests::Product";
remoteInfo = MastodonKitTests;
};
15A79B12215B438C007A326E /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 15A79B08215B438C007A326E /* OAuthSwift.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = F435027A1A6791B200038A29;
remoteInfo = OAuthSwift;
};
15A79B14215B438C007A326E /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 15A79B08215B438C007A326E /* OAuthSwift.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = C48B28021AFA598D00C7DEF6;
remoteInfo = OAuthSwiftOSX;
};
15A79B16215B438C007A326E /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 15A79B08215B438C007A326E /* OAuthSwift.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = C4B6EE1E1BF74CE300443596;
remoteInfo = OAuthSwiftTVOS;
};
15A79B18215B438C007A326E /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 15A79B08215B438C007A326E /* OAuthSwift.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = C40890C01C11B37000E3146A;
remoteInfo = OAuthSwiftWatchOS;
};
15A79B1A215B438C007A326E /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 15A79B08215B438C007A326E /* OAuthSwift.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = F451E3C5195B8CD80051434C;
remoteInfo = OAuthSwiftDemo;
};
15A79B1C215B438C007A326E /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 15A79B08215B438C007A326E /* OAuthSwift.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = C49FD5241AFB5DF500791E1A;
remoteInfo = OAuthSwiftOSXDemo;
};
15A79B1E215B438C007A326E /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 15A79B08215B438C007A326E /* OAuthSwift.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = C4D50DF71BFB693F0053B624;
remoteInfo = OAuthSwiftTests;
};
/* End PBXContainerItemProxy section */
/* Begin PBXFileReference section */
@ -164,6 +243,8 @@
15960E7F21353DCF00C38CE9 /* TimelineViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimelineViewController.swift; sourceTree = "<group>"; };
15960E812136668500C38CE9 /* TimelinesNavigationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimelinesNavigationController.swift; sourceTree = "<group>"; };
15960E83213774FC00C38CE9 /* InstancesTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InstancesTableViewController.swift; sourceTree = "<group>"; };
15A79AE7215B3CC5007A326E /* MastodonKit.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = MastodonKit.xcodeproj; path = Frameworks/MastodonKit/MastodonKit.xcodeproj; sourceTree = "<group>"; };
15A79B08215B438C007A326E /* OAuthSwift.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = OAuthSwift.xcodeproj; path = Frameworks/OAuthSwift/OAuthSwift.xcodeproj; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@ -171,6 +252,8 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
15A79B20215B439A007A326E /* OAuthSwift.framework in Frameworks */,
15A79B07215B3CD5007A326E /* MastodonKit.framework in Frameworks */,
1517EA932159D73500DE80D6 /* AlamofireImage.framework in Frameworks */,
157405D1215890D700EEAAEB /* Alamofire.framework in Frameworks */,
);
@ -221,6 +304,8 @@
157405AF2151A5DA00EEAAEB /* README.md */,
157405B7215890BC00EEAAEB /* Alamofire.xcodeproj */,
1517EA6F2159D72200DE80D6 /* AlamofireImage.xcodeproj */,
15A79AE7215B3CC5007A326E /* MastodonKit.xcodeproj */,
15A79B08215B438C007A326E /* OAuthSwift.xcodeproj */,
15960E59213145E100C38CE9 /* elpha-ios */,
15960E58213145E100C38CE9 /* Products */,
157405D0215890D700EEAAEB /* Frameworks */,
@ -278,6 +363,31 @@
name = "View Controllers";
sourceTree = "<group>";
};
15A79AE8215B3CC5007A326E /* Products */ = {
isa = PBXGroup;
children = (
15A79B00215B3CC5007A326E /* MastodonKit.framework */,
15A79B02215B3CC5007A326E /* MastodonKit.framework */,
15A79B04215B3CC5007A326E /* MastodonKit.framework */,
15A79B06215B3CC5007A326E /* MastodonKitTests.xctest */,
);
name = Products;
sourceTree = "<group>";
};
15A79B09215B438C007A326E /* Products */ = {
isa = PBXGroup;
children = (
15A79B13215B438C007A326E /* OAuthSwift.framework */,
15A79B15215B438C007A326E /* OAuthSwift.framework */,
15A79B17215B438C007A326E /* OAuthSwift.framework */,
15A79B19215B438C007A326E /* OAuthSwift.framework */,
15A79B1B215B438C007A326E /* OAuthSwiftDemo.app */,
15A79B1D215B438C007A326E /* OAuthSwiftOSXDemo.app */,
15A79B1F215B438C007A326E /* OAuthSwiftTests.xctest */,
);
name = Products;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
@ -334,6 +444,14 @@
ProductGroup = 1517EA702159D72200DE80D6 /* Products */;
ProjectRef = 1517EA6F2159D72200DE80D6 /* AlamofireImage.xcodeproj */;
},
{
ProductGroup = 15A79AE8215B3CC5007A326E /* Products */;
ProjectRef = 15A79AE7215B3CC5007A326E /* MastodonKit.xcodeproj */;
},
{
ProductGroup = 15A79B09215B438C007A326E /* Products */;
ProjectRef = 15A79B08215B438C007A326E /* OAuthSwift.xcodeproj */;
},
);
projectRoot = "";
targets = (
@ -448,6 +566,83 @@
remoteRef = 157405CE215890BC00EEAAEB /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
15A79B00215B3CC5007A326E /* MastodonKit.framework */ = {
isa = PBXReferenceProxy;
fileType = wrapper.framework;
path = MastodonKit.framework;
remoteRef = 15A79AFF215B3CC5007A326E /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
15A79B02215B3CC5007A326E /* MastodonKit.framework */ = {
isa = PBXReferenceProxy;
fileType = wrapper.framework;
path = MastodonKit.framework;
remoteRef = 15A79B01215B3CC5007A326E /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
15A79B04215B3CC5007A326E /* MastodonKit.framework */ = {
isa = PBXReferenceProxy;
fileType = wrapper.framework;
path = MastodonKit.framework;
remoteRef = 15A79B03215B3CC5007A326E /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
15A79B06215B3CC5007A326E /* MastodonKitTests.xctest */ = {
isa = PBXReferenceProxy;
fileType = wrapper.cfbundle;
path = MastodonKitTests.xctest;
remoteRef = 15A79B05215B3CC5007A326E /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
15A79B13215B438C007A326E /* OAuthSwift.framework */ = {
isa = PBXReferenceProxy;
fileType = wrapper.framework;
path = OAuthSwift.framework;
remoteRef = 15A79B12215B438C007A326E /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
15A79B15215B438C007A326E /* OAuthSwift.framework */ = {
isa = PBXReferenceProxy;
fileType = wrapper.framework;
path = OAuthSwift.framework;
remoteRef = 15A79B14215B438C007A326E /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
15A79B17215B438C007A326E /* OAuthSwift.framework */ = {
isa = PBXReferenceProxy;
fileType = wrapper.framework;
path = OAuthSwift.framework;
remoteRef = 15A79B16215B438C007A326E /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
15A79B19215B438C007A326E /* OAuthSwift.framework */ = {
isa = PBXReferenceProxy;
fileType = wrapper.framework;
path = OAuthSwift.framework;
remoteRef = 15A79B18215B438C007A326E /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
15A79B1B215B438C007A326E /* OAuthSwiftDemo.app */ = {
isa = PBXReferenceProxy;
fileType = wrapper.application;
path = OAuthSwiftDemo.app;
remoteRef = 15A79B1A215B438C007A326E /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
15A79B1D215B438C007A326E /* OAuthSwiftOSXDemo.app */ = {
isa = PBXReferenceProxy;
fileType = wrapper.application;
path = OAuthSwiftOSXDemo.app;
remoteRef = 15A79B1C215B438C007A326E /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
15A79B1F215B438C007A326E /* OAuthSwiftTests.xctest */ = {
isa = PBXReferenceProxy;
fileType = wrapper.cfbundle;
path = OAuthSwiftTests.xctest;
remoteRef = 15A79B1E215B438C007A326E /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
/* End PBXReferenceProxy section */
/* Begin PBXResourcesBuildPhase section */

24
elpha-ios/AppDelegate.swift

@ -7,6 +7,7 @@
//
import CoreData
import OAuthSwift
import UIKit
@UIApplicationMain
@ -21,28 +22,11 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
}
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
guard let components = NSURLComponents(url: url, resolvingAgainstBaseURL: true),
let path = components.path else {
return false
if (url.host == "oauth") {
OAuthSwift.handle(url: url)
}
guard url.host == "oauth-callback" else {
return false
}
switch path {
case "authenticate":
do {
try APIRequest.handleOAuthResponse(url: url)
return true
} catch {
print("\(error)")
return false
}
default:
print("Unknown path: \(path)")
return false
}
return true
}
func applicationWillResignActive(_ application: UIApplication) {

74
elpha-ios/AuthenticateViewController.swift

@ -7,6 +7,8 @@
//
import CoreData
import MastodonKit
import OAuthSwift
import UIKit
class AuthenticateViewController: UIViewController {
@ -24,22 +26,56 @@ class AuthenticateViewController: UIViewController {
return false
}
func saveApp(id: String, clientID: String, clientSecret: String, url: String) {
func saveApp(id: String, clientID: String, clientSecret: String, url: String) -> AppMO {
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
let app = AppMO(context: context)
app.id = id
app.clientID = clientID
app.clientSecret = clientSecret
app.url = url
do {
try context.save()
return app
} catch {
fatalError("Couldn't save app")
}
}
func startOAuth() {
func authorize(app: AppMO) {
let oauthswift = OAuth2Swift(
consumerKey: app.clientID!,
consumerSecret: app.clientSecret!,
authorizeUrl: "https://\(app.url!)/oauth/authorize",
responseType: "token"
)
oauthswift.authorizeURLHandler = SafariURLHandler(viewController: self, oauthSwift: oauthswift)
let handle = oauthswift.authorize(
withCallbackURL: URL(string: "elpha://oauth")!,
scope: "read write follow",
state: "elpha",
success: { credential, _, _ in
let client = Client(
baseURL: "https://\(app.url!)",
accessToken: credential.oauthToken
)
let request = Accounts.currentUser()
client.run(request) { result in
switch result {
case .success(let _):
print("")
case .failure(let _):
print("")
}
}
},
failure: { error in
print("\(error)")
}
)
}
@IBAction func signIn(_ sender: Any) {
@ -69,21 +105,31 @@ class AuthenticateViewController: UIViewController {
switch response.count {
case 0:
APIRequest.registerApp(instance: URL(string: url)!) { data, error in
guard error == nil else {
print("Couldn't register app")
return
}
if let data = data,
let id = data["id"] as? String,
let clientID = data["client_id"] as? String,
let clientSecret = data["client_secret"] as? String {
self.saveApp(id: id, clientID: clientID, clientSecret: clientSecret, url: url)
let client = Client(baseURL: "https://\(url)")
let request = Clients.register(
clientName: Config.clientDisplayName,
scopes: [.read, .write, .follow],
website: Config.clientWebsite
)
client.run(request) { result in
switch result {
case .success(let value):
let app = value.0
let appMO = self.saveApp(
id: app.id,
clientID: app.clientID,
clientSecret: app.clientSecret,
url: url
)
self.authorize(app: appMO)
case .failure(let error):
print("\(error)")
}
}
case 1:
print("")
self.authorize(app: response.first!)
return
default:
fatalError("Duplicate App entities")

6
elpha-ios/AuthenticationManager.swift

@ -46,4 +46,10 @@ class AuthenticationManager {
}
private init() {}
func saveSession(app: AppMO, token: String) {
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
let session = SessionMO(context: context)
}
}

3
elpha-ios/Elpha.xcdatamodeld/Elpha.xcdatamodel/contents

@ -24,6 +24,7 @@
</entity>
<entity name="App" representedClassName="AppMO" syncable="YES" codeGenerationType="class">
<attribute name="clientID" attributeType="String" syncable="YES"/>
<attribute name="clientSecret" attributeType="String" syncable="YES"/>
<attribute name="id" attributeType="String" syncable="YES"/>
<attribute name="url" attributeType="String" syncable="YES"/>
<relationship name="sessions" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="Session" inverseName="app" inverseEntity="Session" syncable="YES"/>
@ -84,7 +85,7 @@
</entity>
<elements>
<element name="Account" positionX="-669.49609375" positionY="52.046875" width="128" height="345"/>
<element name="App" positionX="-244.4140625" positionY="307.203125" width="128" height="105"/>
<element name="App" positionX="-244.4140625" positionY="307.203125" width="128" height="120"/>
<element name="ISCategory" positionX="196.8984375" positionY="498.03515625" width="128" height="75"/>
<element name="ISInstance" positionX="-18" positionY="153" width="128" height="435"/>
<element name="ISLanguage" positionX="-286.21875" positionY="512.6171875" width="128" height="75"/>

Loading…
Cancel
Save