113 Commits

Author SHA1 Message Date
Matt Coneybeare
ffb40f4d14 Merge pull request #80 from OliverZiegler/swift3
Update check for iOS Simulator
2016-10-17 10:09:23 -04:00
Oliver Ziegler
bdcacffcb4 Update check for iOS Simulator 2016-10-15 13:15:40 +02:00
Matt Coneybeare
d8bc619f3c Merge pull request #76 from phimage/swift3
Fix swift 3 compile issue for mac os
2016-09-25 16:35:40 -04:00
phimage
b5270a4892 fix swift 3 compile issue for mac os 2016-09-22 15:18:24 +02:00
Matt Coneybeare
9104458f49 Merge pull request #75 from kapellanos/master
Migration to Swift 3
2016-09-13 15:40:39 -04:00
Miguel Olmedo
0a73212e72 Working Migration to Swift 3 2016-09-12 15:46:25 +02:00
Miguel Olmedo
556b57cabe Changed scopes and deprecated elements to compile in Swift 3 2016-09-12 15:35:37 +02:00
Matt Coneybeare
586ef9e215 Merge pull request #72 from dawiddr/tint-color-setting
Add tintColor configuration setting
2016-08-11 21:27:19 -04:00
Dawid Drechny
2a1d87665b Add tintColor configuration setting 2016-08-10 20:33:28 +02:00
Matt Coneybeare
dd81a54a77 Merge pull request #69 from tarikozket/patch-1
Patch 1
2016-07-25 17:52:27 -04:00
Tarik
3f78915843 Latest version fix for CocoaPods
It wasn't installing the latest version which is 0.1.2.

Source: https://guides.cocoapods.org/using/the-podfile.html
2016-07-23 11:41:02 -07:00
Tarik
e1d6e23ef7 Latest version fix for CocoaPods
It wasn't installing the latest version which is 0.1.2.

Source: https://guides.cocoapods.org/using/the-podfile.html
2016-07-23 11:37:38 -07:00
Matt Coneybeare
43d2b0d4ef Merge pull request #58 from fotiDim/fallback-to-localizable.strings
Fallback to localizable.strings
2016-06-02 16:46:40 -04:00
Fotis Dimanidis
0ea672f4d5 Updated README to include localization changes 2016-05-30 11:41:08 +02:00
Fotis Dimanidis
cc3706ca07 Falling back to Localizable.strings 2016-05-30 11:36:48 +02:00
Matt Coneybeare
e7a93e08e7 Merge pull request #54 from CeceXX/patch-1
Very small grammar fix
2016-05-24 15:44:50 -04:00
Cesare de Cal
674f044a43 Very small grammar fix 2016-05-20 21:26:25 +02:00
Matt Coneybeare
9f00619483 Merge pull request #52 from inket/master
Added some colors to README 🎉
2016-05-07 12:58:34 -04:00
Mahdi Bchetnia
fd361253d8 Fixed README typos 2016-05-06 12:03:21 +09:00
Mahdi Bchetnia
051e0d2f10 Added syntax highlighting to README 2016-05-06 12:00:17 +09:00
Matt Coneybeare
202c1701c5 Merge pull request #51 from Navideck-fotis/reset-counters
Created public method to reset counters
2016-05-04 09:19:47 -04:00
Fotis Dimanidis
4e03a1d725 Updated Readme to include resetCounters() & resetUsageCounters() 2016-05-04 14:46:32 +02:00
Fotis Dimanidis
93ae5bf93a Renamed reset methods 2016-05-04 14:42:25 +02:00
Fotis Dimanidis
813de6e889 Added resetAll function 2016-05-04 14:37:30 +02:00
Fotis Dimanidis
e1de2361bf Updated Readme to include resetCounters() 2016-05-04 11:12:32 +02:00
Fotis Dimanidis
7feeafba9d Created public method to reset counters 2016-05-04 10:19:37 +02:00
Matt Coneybeare
a0fe19a2fd Merge pull request #47 from JagCesar/master
Fixes bug related to remind button
2016-04-22 05:31:14 -04:00
César Pinto Castillo
6b8e8915ea Fixes bug related to remind button
The remind button was appearing even though "days before reminding" was
set to 0 if the review button title was set.
2016-04-22 11:02:16 +02:00
Matt Coneybeare
8d5ae9e3d5 Merge pull request #39 from dbolella/uialertview-ios9-depracated
Set the default value of useAlertController based off ios version
2016-03-08 13:43:13 -05:00
Daniel Bolella
7e8b62a07e Set the default value of useAlertController based off ios version and only use alert controllers if ios version is >= 9 2016-02-29 21:03:45 -05:00
Matt Coneybeare
be83189c67 Update README.md 2015-12-22 08:22:32 -05:00
Matt Coneybeare
73b50357d9 Merge pull request #37 from bjaskj/master
Made ratingConditionsHaveBeenMet() public.
2015-12-22 08:20:48 -05:00
Bjarte Skjørestad
8e747575a5 Updated readme for ratingConditionsHaveBeenMet. 2015-12-22 08:34:28 +01:00
Bjarte Skjørestad
6ef0ad4811 Made ratingConditionsHaveBeenMet() public. 2015-12-21 11:13:39 +01:00
Matt Coneybeare
a806177a1b Merge pull request #35 from phimage/feature-capturelog
Allow to capture log using closure
2015-12-15 10:13:11 -05:00
phimage
304380a9ac Add global method to set logger closure
Add information into README.md
2015-12-15 16:05:24 +01:00
Matt Coneybeare
2f7b70cb0d Update README.md 2015-12-15 09:20:55 -05:00
Matt Coneybeare
5a4d1da0b5 Merge pull request #36 from phimage/fix-readme
Readme incorrectly documented showPrompt methods
2015-12-15 09:19:18 -05:00
phimage
7b5477469a Replace showPrompt(ifNecessary: Bool) by showPromptIfNecessary() in README.md
Remove Extra/Unwanted Spaces
2015-12-15 06:19:21 +01:00
phimage
7a76f714c4 Allow to capture log using closure 2015-12-15 05:49:41 +01:00
Matt Coneybeare
ef3f7e6f63 Merge pull request #33 from phimage/patch-1
Get the framework bundle as fallback instead of mainBundle
2015-12-14 09:31:52 -05:00
You shall not pass
ce4d4a42ff Fix localization by getting the framework bundle 2015-12-11 12:11:21 +01:00
Matt Coneybeare
c137d761e4 Added Carthage support 2015-12-10 11:08:05 -05:00
Matt Coneybeare
082697fa93 Merge pull request #32 from johnnye/master
Setting up for Carthage support
2015-12-10 11:04:51 -05:00
John Nye
e23f3b7fee ignoring the carthage folder too 2015-12-10 10:45:09 +01:00
John Nye
084a5a8a60 adding the archived framework to the ignore list. 2015-12-10 10:39:26 +01:00
Matt Coneybeare
1e13a7bf32 Update readme and podspec 2015-12-01 15:54:53 -05:00
Matt Coneybeare
3504757c82 Fix endSheet deprecation warning on OS X 2015-12-01 15:51:27 -05:00
Matt Coneybeare
829e2bf686 Added cocoapods support 2015-12-01 15:43:57 -05:00
Matt Coneybeare
2502c3f63d Merge branch 'master' of github.com:UrbanApps/Armchair 2015-12-01 15:41:11 -05:00
Matt Coneybeare
2082b3fcad Added cocoapods support 2015-12-01 15:40:42 -05:00
Matt Coneybeare
c1c9158b98 Merge pull request #25 from benzguo/master
Share schemes for Carthage support
2015-11-04 10:34:49 -05:00
Ben Guo
413996175e share schemes for Carthage support 2015-11-02 14:53:09 -05:00
Matt Coneybeare
32e508d30b Merge pull request #22 from kcsdad/patch-1
changed println() to print()
2015-09-29 12:29:56 -04:00
Kurt Ernstsen
d14a80f748 changed println() to print()
Xcode7.0.1/Swift2.0 release build complains about the println() lines.
2015-09-28 23:30:44 -05:00
Matt Coneybeare
ce4432f0e2 Updates for Swift 2 2015-09-24 07:48:12 -04:00
Matt Coneybeare
ad5a344d1c Merge pull request #20 from gershwin88/master
Fixing errors and warning when using Swift 2
2015-09-18 11:23:32 -04:00
gershwin88
b932118b1c Removing warnings caused by Swift 2 2015-09-11 13:12:20 -06:00
gershwin88
b5c132ba67 Removing errors when converting to Swift 2 2015-09-11 12:59:40 -06:00
Matt Coneybeare
9f88400adc Merge pull request #12 from nickoneill/master
Swift 1.2 support
2015-04-11 09:17:34 -04:00
Nick O'Neill
f4d18b4a80 Updated examples. 2015-04-10 15:44:37 -07:00
Nick O'Neill
2c884c40f1 Updated for swift 1.2 2015-04-10 15:25:01 -07:00
Matt Coneybeare
5948dcfbc2 Merge pull request #6 from plivesey/master
Changing iOS deployment target to 8.0. The library works with iOS 7, but...
2014-11-30 18:51:53 -05:00
Peter Livesey
351e43645d Changing iOS deployment target to 8.0. The library works with iOS 7, but modules aren't supported.
Should be changed back to 7.0 when we have some different way of deploying the library.
2014-11-29 16:13:58 -08:00
Matt Coneybeare
420cf1b6b7 Merge pull request #5 from plivesey/master
Fixing a bug where finding the right window wouldn't work.
2014-11-25 16:15:42 -05:00
Peter Livesey
4e92562547 Fixing a bug where finding the right window wouldn't work.
Now, even if you call rateApp() from a UIActionSheet, it will actually present the modal.
2014-11-23 12:32:18 -08:00
Matt Coneybeare
4e077db6d2 Update README.md 2014-10-20 16:02:51 -04:00
Matt Coneybeare
7ff1576d37 Update for Xcode 6.1 and Swift 1.1 2014-10-20 16:00:53 -04:00
Matt Coneybeare
f9a1750dba Update README.md 2014-10-13 16:48:29 -04:00
Matt Coneybeare
cee80d37d9 Merge branch 'master' of github.com:UrbanApps/Armchair 2014-09-30 15:16:33 -04:00
Matt Coneybeare
af5e5af4da Workaround for Apple bug where firstOtherButtonIndex is not being set 2014-09-30 15:16:16 -04:00
Matt Coneybeare
3b1f7ae408 Update README.md 2014-09-27 09:51:57 -04:00
Matt Coneybeare
0d5e03e72b update gitignore 2014-09-22 19:05:46 -04:00
Matt Coneybeare
d313d259ca Added LaunchScreen.storyboard to iOS proj 2014-09-22 18:54:05 -04:00
Matt Coneybeare
3c6d07294a Update README.md 2014-09-18 23:55:20 -04:00
Matt Coneybeare
e0449a5520 Update README.md 2014-09-18 18:36:51 -04:00
Matt Coneybeare
342bbb4ab4 Update README.md 2014-09-18 18:36:21 -04:00
Matt Coneybeare
1bea08a69e Update README.md 2014-09-18 18:34:16 -04:00
Matt Coneybeare
15a60acb09 Switched iPhoto app for Pages app 2014-09-18 12:58:22 -04:00
Matt Coneybeare
30b8a6bcbb Update README.md 2014-09-18 10:18:44 -04:00
Matt Coneybeare
0a6fd6a16e Update README.md 2014-09-18 10:18:34 -04:00
Matt Coneybeare
760dc480bd Update README.md 2014-09-18 10:16:43 -04:00
Matt Coneybeare
980154a6f3 Update README.md 2014-09-18 10:11:10 -04:00
Matt Coneybeare
ccce10bc8a Update README.md 2014-09-18 10:10:40 -04:00
Matt Coneybeare
c27c661363 Update README.md 2014-09-18 10:09:57 -04:00
Matt Coneybeare
474075cc21 Update README.md 2014-09-18 10:05:26 -04:00
Matt Coneybeare
895d4b6534 Update README.md 2014-09-18 09:44:07 -04:00
Matt Coneybeare
0cbd41245f Update README.md 2014-09-18 09:41:28 -04:00
Matt Coneybeare
4f8c3efc0e added swift image 2014-09-18 09:32:48 -04:00
Matt Coneybeare
6b2b5dab80 Update README.md 2014-09-18 09:21:23 -04:00
Matt Coneybeare
89cdd823a6 Update README.md 2014-09-17 17:28:49 -04:00
Matt Coneybeare
43a13a707b Update README.md 2014-09-17 16:23:30 -04:00
Matt Coneybeare
0aade6ff08 Update README.md 2014-09-17 15:44:16 -04:00
Matt Coneybeare
7adfc9c244 Update README.md 2014-09-17 15:42:59 -04:00
Matt Coneybeare
115352b823 Update README.md 2014-09-17 15:42:21 -04:00
Matt Coneybeare
52188a1ffd Added target for localization bundle 2014-09-17 14:20:41 -04:00
Matt Coneybeare
c65800b889 Added localization files 2014-09-17 14:19:06 -04:00
Matt Coneybeare
b6dde48fa1 Updated Readme 2014-09-17 01:07:13 -04:00
Matt Coneybeare
e439617a23 Updated Readme 2014-09-17 01:06:17 -04:00
Matt Coneybeare
a4c44627f7 Updated Readme 2014-09-17 01:05:21 -04:00
Matt Coneybeare
04f0ae42a3 Updated Readme 2014-09-17 01:04:40 -04:00
Matt Coneybeare
f6962f4b57 Merge branch 'master' of github.com:UrbanApps/Armchair 2014-09-17 01:03:16 -04:00
Matt Coneybeare
07582d055a Updated Readme 2014-09-17 01:03:09 -04:00
Matt Coneybeare
ec98ed0dcd Update README.md 2014-09-17 00:59:26 -04:00
Matt Coneybeare
b93b7dff67 _ 2014-09-17 00:55:20 -04:00
Matt Coneybeare
e482db1f9b Update README.md 2014-09-17 00:38:07 -04:00
Matt Coneybeare
758e4ec240 Update README.md 2014-09-17 00:37:35 -04:00
Matt Coneybeare
856564ce7d Update README.md 2014-09-17 00:37:14 -04:00
Matt Coneybeare
ecfbdcab36 Update README.md 2014-09-17 00:36:49 -04:00
Matt Coneybeare
b37df401be Add golden rule 2014-09-17 00:34:00 -04:00
Matt Coneybeare
6efe30d7e3 Major readme update 2014-09-17 00:25:13 -04:00
Matt Coneybeare
390833c639 Major readme update 2014-09-17 00:16:02 -04:00
Matt Coneybeare
ab116247d0 Update readme 2014-09-16 22:50:35 -04:00
73 changed files with 6311 additions and 0 deletions

BIN
.DS_Store vendored

Binary file not shown.

26
.gitignore vendored Normal file
View File

@@ -0,0 +1,26 @@
build/
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
xcuserdata
*.xccheckout
*.moved-aside
DerivedData
*.xcuserstate
.DS_Store
.AppleDouble
.LSOverride
Artwork
# Files that might appear on external disk
.Spotlight-V100
.Trashes
Armchair.framework.zip
Carthage

1
.swift-version Normal file
View File

@@ -0,0 +1 @@
3.0

32
Armchair.podspec Normal file
View File

@@ -0,0 +1,32 @@
Pod::Spec.new do |s|
s.name = "Armchair"
s.version = "0.1.1"
s.summary = "A simple yet powerful App Review Manager for iOS and OSX in Swift"
s.description = <<-DESC
A simple yet powerful App Review Manager for iOS and OSX in Swift.
* 100% Swift
* Both iOS and OS X Support
* Fully Configurable at Runtime
* Default Localizations for Dozens of Languages
* Prevent Rating Prompts on Different Devices
* Uses UIApplication/NSApplication Lifecycle Notifications
* Easy to Setup
* iTunes Affiliate Codes
* Ready For Primetime
DESC
s.homepage = "https://github.com/UrbanApps/Armchair"
s.screenshots = "https://raw.githubusercontent.com/UrbanApps/Armchair/assets/armchair-iOS.png", "https://raw.githubusercontent.com/UrbanApps/Armchair/assets/armchair-OSX.png"
s.social_media_url = 'https://twitter.com/coneybeare'
s.authors = { 'Matt Coneybeare' => 'coneybeare@urbanapps.com' }
s.source = { :git => 'https://github.com/UrbanApps/Armchair.git', :tag => s.version }
s.license = { :type => "MIT", :file => "LICENSE" }
s.source_files = "Source/*.{h,swift}"
s.resources = "Localization/*.lproj"
s.ios.deployment_target = '8.0'
s.osx.deployment_target = '10.10'
s.requires_arc = true
end

View File

@@ -0,0 +1,799 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 46;
objects = {
/* Begin PBXBuildFile section */
E6A0AF8F19C9D1E800C3A7DC /* ar.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E6A0AF6F19C9D1E800C3A7DC /* ar.lproj */; };
E6A0AF9019C9D1E800C3A7DC /* arm.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E6A0AF7019C9D1E800C3A7DC /* arm.lproj */; };
E6A0AF9119C9D1E800C3A7DC /* ca.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E6A0AF7119C9D1E800C3A7DC /* ca.lproj */; };
E6A0AF9219C9D1E800C3A7DC /* cs.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E6A0AF7219C9D1E800C3A7DC /* cs.lproj */; };
E6A0AF9319C9D1E800C3A7DC /* da.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E6A0AF7319C9D1E800C3A7DC /* da.lproj */; };
E6A0AF9419C9D1E800C3A7DC /* de.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E6A0AF7419C9D1E800C3A7DC /* de.lproj */; };
E6A0AF9519C9D1E800C3A7DC /* el.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E6A0AF7519C9D1E800C3A7DC /* el.lproj */; };
E6A0AF9619C9D1E800C3A7DC /* en.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E6A0AF7619C9D1E800C3A7DC /* en.lproj */; };
E6A0AF9719C9D1E800C3A7DC /* es.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E6A0AF7719C9D1E800C3A7DC /* es.lproj */; };
E6A0AF9819C9D1E800C3A7DC /* fi.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E6A0AF7819C9D1E800C3A7DC /* fi.lproj */; };
E6A0AF9919C9D1E800C3A7DC /* fr.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E6A0AF7919C9D1E800C3A7DC /* fr.lproj */; };
E6A0AF9A19C9D1E800C3A7DC /* he.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E6A0AF7A19C9D1E800C3A7DC /* he.lproj */; };
E6A0AF9B19C9D1E800C3A7DC /* hu.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E6A0AF7B19C9D1E800C3A7DC /* hu.lproj */; };
E6A0AF9C19C9D1E800C3A7DC /* id.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E6A0AF7C19C9D1E800C3A7DC /* id.lproj */; };
E6A0AF9D19C9D1E800C3A7DC /* it.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E6A0AF7D19C9D1E800C3A7DC /* it.lproj */; };
E6A0AF9E19C9D1E800C3A7DC /* ja.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E6A0AF7E19C9D1E800C3A7DC /* ja.lproj */; };
E6A0AF9F19C9D1E800C3A7DC /* ko.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E6A0AF7F19C9D1E800C3A7DC /* ko.lproj */; };
E6A0AFA019C9D1E800C3A7DC /* ms.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E6A0AF8019C9D1E800C3A7DC /* ms.lproj */; };
E6A0AFA119C9D1E800C3A7DC /* nb.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E6A0AF8119C9D1E800C3A7DC /* nb.lproj */; };
E6A0AFA219C9D1E800C3A7DC /* nl.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E6A0AF8219C9D1E800C3A7DC /* nl.lproj */; };
E6A0AFA319C9D1E800C3A7DC /* pl.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E6A0AF8319C9D1E800C3A7DC /* pl.lproj */; };
E6A0AFA419C9D1E800C3A7DC /* pt-BR.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E6A0AF8419C9D1E800C3A7DC /* pt-BR.lproj */; };
E6A0AFA519C9D1E800C3A7DC /* pt.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E6A0AF8519C9D1E800C3A7DC /* pt.lproj */; };
E6A0AFA619C9D1E800C3A7DC /* ro.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E6A0AF8619C9D1E800C3A7DC /* ro.lproj */; };
E6A0AFA719C9D1E800C3A7DC /* ru.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E6A0AF8719C9D1E800C3A7DC /* ru.lproj */; };
E6A0AFA819C9D1E800C3A7DC /* sk.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E6A0AF8819C9D1E800C3A7DC /* sk.lproj */; };
E6A0AFA919C9D1E800C3A7DC /* sv.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E6A0AF8919C9D1E800C3A7DC /* sv.lproj */; };
E6A0AFAA19C9D1E800C3A7DC /* th.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E6A0AF8A19C9D1E800C3A7DC /* th.lproj */; };
E6A0AFAB19C9D1E800C3A7DC /* tr.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E6A0AF8B19C9D1E800C3A7DC /* tr.lproj */; };
E6A0AFAC19C9D1E800C3A7DC /* vi.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E6A0AF8C19C9D1E800C3A7DC /* vi.lproj */; };
E6A0AFAD19C9D1E800C3A7DC /* zh-Hans.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E6A0AF8D19C9D1E800C3A7DC /* zh-Hans.lproj */; };
E6A0AFAE19C9D1E800C3A7DC /* zh-Hant.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E6A0AF8E19C9D1E800C3A7DC /* zh-Hant.lproj */; };
E6D8B8F119C756A4001AD043 /* Armchair.swift in Sources */ = {isa = PBXBuildFile; fileRef = F897FF4019AA800700AB5182 /* Armchair.swift */; };
E6F6157119C9FFDA00C0B51C /* hu.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E6A0AF7B19C9D1E800C3A7DC /* hu.lproj */; };
E6F6157219C9FFDA00C0B51C /* pl.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E6A0AF8319C9D1E800C3A7DC /* pl.lproj */; };
E6F6157319C9FFDA00C0B51C /* pt.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E6A0AF8519C9D1E800C3A7DC /* pt.lproj */; };
E6F6157419C9FFDA00C0B51C /* en.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E6A0AF7619C9D1E800C3A7DC /* en.lproj */; };
E6F6157519C9FFDA00C0B51C /* pt-BR.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E6A0AF8419C9D1E800C3A7DC /* pt-BR.lproj */; };
E6F6157619C9FFDA00C0B51C /* th.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E6A0AF8A19C9D1E800C3A7DC /* th.lproj */; };
E6F6157719C9FFDA00C0B51C /* arm.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E6A0AF7019C9D1E800C3A7DC /* arm.lproj */; };
E6F6157819C9FFDA00C0B51C /* nl.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E6A0AF8219C9D1E800C3A7DC /* nl.lproj */; };
E6F6157919C9FFDA00C0B51C /* ca.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E6A0AF7119C9D1E800C3A7DC /* ca.lproj */; };
E6F6157A19C9FFDA00C0B51C /* ar.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E6A0AF6F19C9D1E800C3A7DC /* ar.lproj */; };
E6F6157B19C9FFDA00C0B51C /* el.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E6A0AF7519C9D1E800C3A7DC /* el.lproj */; };
E6F6157C19C9FFDA00C0B51C /* zh-Hans.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E6A0AF8D19C9D1E800C3A7DC /* zh-Hans.lproj */; };
E6F6157D19C9FFDA00C0B51C /* ko.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E6A0AF7F19C9D1E800C3A7DC /* ko.lproj */; };
E6F6157E19C9FFDA00C0B51C /* ms.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E6A0AF8019C9D1E800C3A7DC /* ms.lproj */; };
E6F6157F19C9FFDA00C0B51C /* id.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E6A0AF7C19C9D1E800C3A7DC /* id.lproj */; };
E6F6158019C9FFDA00C0B51C /* ru.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E6A0AF8719C9D1E800C3A7DC /* ru.lproj */; };
E6F6158119C9FFDA00C0B51C /* da.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E6A0AF7319C9D1E800C3A7DC /* da.lproj */; };
E6F6158219C9FFDA00C0B51C /* sk.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E6A0AF8819C9D1E800C3A7DC /* sk.lproj */; };
E6F6158319C9FFDA00C0B51C /* ja.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E6A0AF7E19C9D1E800C3A7DC /* ja.lproj */; };
E6F6158419C9FFDA00C0B51C /* tr.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E6A0AF8B19C9D1E800C3A7DC /* tr.lproj */; };
E6F6158519C9FFDA00C0B51C /* nb.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E6A0AF8119C9D1E800C3A7DC /* nb.lproj */; };
E6F6158619C9FFDA00C0B51C /* fr.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E6A0AF7919C9D1E800C3A7DC /* fr.lproj */; };
E6F6158719C9FFDA00C0B51C /* de.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E6A0AF7419C9D1E800C3A7DC /* de.lproj */; };
E6F6158819C9FFDA00C0B51C /* es.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E6A0AF7719C9D1E800C3A7DC /* es.lproj */; };
E6F6158919C9FFDA00C0B51C /* fi.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E6A0AF7819C9D1E800C3A7DC /* fi.lproj */; };
E6F6158A19C9FFDA00C0B51C /* he.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E6A0AF7A19C9D1E800C3A7DC /* he.lproj */; };
E6F6158B19C9FFDA00C0B51C /* it.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E6A0AF7D19C9D1E800C3A7DC /* it.lproj */; };
E6F6158C19C9FFDA00C0B51C /* ro.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E6A0AF8619C9D1E800C3A7DC /* ro.lproj */; };
E6F6158D19C9FFDA00C0B51C /* zh-Hant.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E6A0AF8E19C9D1E800C3A7DC /* zh-Hant.lproj */; };
E6F6158E19C9FFDA00C0B51C /* sv.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E6A0AF8919C9D1E800C3A7DC /* sv.lproj */; };
E6F6158F19C9FFDA00C0B51C /* vi.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E6A0AF8C19C9D1E800C3A7DC /* vi.lproj */; };
E6F6159019C9FFDA00C0B51C /* cs.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E6A0AF7219C9D1E800C3A7DC /* cs.lproj */; };
F897FF4119AA800700AB5182 /* Armchair.swift in Sources */ = {isa = PBXBuildFile; fileRef = F897FF4019AA800700AB5182 /* Armchair.swift */; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
E6A0AF6519C9CFF400C3A7DC /* Armchair.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Armchair.bundle; sourceTree = BUILT_PRODUCTS_DIR; };
E6A0AF6819C9CFF500C3A7DC /* Info-Localizable.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Info-Localizable.plist"; sourceTree = "<group>"; };
E6A0AF6F19C9D1E800C3A7DC /* ar.lproj */ = {isa = PBXFileReference; lastKnownFileType = folder; name = ar.lproj; path = Localization/ar.lproj; sourceTree = "<group>"; };
E6A0AF7019C9D1E800C3A7DC /* arm.lproj */ = {isa = PBXFileReference; lastKnownFileType = folder; name = arm.lproj; path = Localization/arm.lproj; sourceTree = "<group>"; };
E6A0AF7119C9D1E800C3A7DC /* ca.lproj */ = {isa = PBXFileReference; lastKnownFileType = folder; name = ca.lproj; path = Localization/ca.lproj; sourceTree = "<group>"; };
E6A0AF7219C9D1E800C3A7DC /* cs.lproj */ = {isa = PBXFileReference; lastKnownFileType = folder; name = cs.lproj; path = Localization/cs.lproj; sourceTree = "<group>"; };
E6A0AF7319C9D1E800C3A7DC /* da.lproj */ = {isa = PBXFileReference; lastKnownFileType = folder; name = da.lproj; path = Localization/da.lproj; sourceTree = "<group>"; };
E6A0AF7419C9D1E800C3A7DC /* de.lproj */ = {isa = PBXFileReference; lastKnownFileType = folder; name = de.lproj; path = Localization/de.lproj; sourceTree = "<group>"; };
E6A0AF7519C9D1E800C3A7DC /* el.lproj */ = {isa = PBXFileReference; lastKnownFileType = folder; name = el.lproj; path = Localization/el.lproj; sourceTree = "<group>"; };
E6A0AF7619C9D1E800C3A7DC /* en.lproj */ = {isa = PBXFileReference; lastKnownFileType = folder; name = en.lproj; path = Localization/en.lproj; sourceTree = "<group>"; };
E6A0AF7719C9D1E800C3A7DC /* es.lproj */ = {isa = PBXFileReference; lastKnownFileType = folder; name = es.lproj; path = Localization/es.lproj; sourceTree = "<group>"; };
E6A0AF7819C9D1E800C3A7DC /* fi.lproj */ = {isa = PBXFileReference; lastKnownFileType = folder; name = fi.lproj; path = Localization/fi.lproj; sourceTree = "<group>"; };
E6A0AF7919C9D1E800C3A7DC /* fr.lproj */ = {isa = PBXFileReference; lastKnownFileType = folder; name = fr.lproj; path = Localization/fr.lproj; sourceTree = "<group>"; };
E6A0AF7A19C9D1E800C3A7DC /* he.lproj */ = {isa = PBXFileReference; lastKnownFileType = folder; name = he.lproj; path = Localization/he.lproj; sourceTree = "<group>"; };
E6A0AF7B19C9D1E800C3A7DC /* hu.lproj */ = {isa = PBXFileReference; lastKnownFileType = folder; name = hu.lproj; path = Localization/hu.lproj; sourceTree = "<group>"; };
E6A0AF7C19C9D1E800C3A7DC /* id.lproj */ = {isa = PBXFileReference; lastKnownFileType = folder; name = id.lproj; path = Localization/id.lproj; sourceTree = "<group>"; };
E6A0AF7D19C9D1E800C3A7DC /* it.lproj */ = {isa = PBXFileReference; lastKnownFileType = folder; name = it.lproj; path = Localization/it.lproj; sourceTree = "<group>"; };
E6A0AF7E19C9D1E800C3A7DC /* ja.lproj */ = {isa = PBXFileReference; lastKnownFileType = folder; name = ja.lproj; path = Localization/ja.lproj; sourceTree = "<group>"; };
E6A0AF7F19C9D1E800C3A7DC /* ko.lproj */ = {isa = PBXFileReference; lastKnownFileType = folder; name = ko.lproj; path = Localization/ko.lproj; sourceTree = "<group>"; };
E6A0AF8019C9D1E800C3A7DC /* ms.lproj */ = {isa = PBXFileReference; lastKnownFileType = folder; name = ms.lproj; path = Localization/ms.lproj; sourceTree = "<group>"; };
E6A0AF8119C9D1E800C3A7DC /* nb.lproj */ = {isa = PBXFileReference; lastKnownFileType = folder; name = nb.lproj; path = Localization/nb.lproj; sourceTree = "<group>"; };
E6A0AF8219C9D1E800C3A7DC /* nl.lproj */ = {isa = PBXFileReference; lastKnownFileType = folder; name = nl.lproj; path = Localization/nl.lproj; sourceTree = "<group>"; };
E6A0AF8319C9D1E800C3A7DC /* pl.lproj */ = {isa = PBXFileReference; lastKnownFileType = folder; name = pl.lproj; path = Localization/pl.lproj; sourceTree = "<group>"; };
E6A0AF8419C9D1E800C3A7DC /* pt-BR.lproj */ = {isa = PBXFileReference; lastKnownFileType = folder; name = "pt-BR.lproj"; path = "Localization/pt-BR.lproj"; sourceTree = "<group>"; };
E6A0AF8519C9D1E800C3A7DC /* pt.lproj */ = {isa = PBXFileReference; lastKnownFileType = folder; name = pt.lproj; path = Localization/pt.lproj; sourceTree = "<group>"; };
E6A0AF8619C9D1E800C3A7DC /* ro.lproj */ = {isa = PBXFileReference; lastKnownFileType = folder; name = ro.lproj; path = Localization/ro.lproj; sourceTree = "<group>"; };
E6A0AF8719C9D1E800C3A7DC /* ru.lproj */ = {isa = PBXFileReference; lastKnownFileType = folder; name = ru.lproj; path = Localization/ru.lproj; sourceTree = "<group>"; };
E6A0AF8819C9D1E800C3A7DC /* sk.lproj */ = {isa = PBXFileReference; lastKnownFileType = folder; name = sk.lproj; path = Localization/sk.lproj; sourceTree = "<group>"; };
E6A0AF8919C9D1E800C3A7DC /* sv.lproj */ = {isa = PBXFileReference; lastKnownFileType = folder; name = sv.lproj; path = Localization/sv.lproj; sourceTree = "<group>"; };
E6A0AF8A19C9D1E800C3A7DC /* th.lproj */ = {isa = PBXFileReference; lastKnownFileType = folder; name = th.lproj; path = Localization/th.lproj; sourceTree = "<group>"; };
E6A0AF8B19C9D1E800C3A7DC /* tr.lproj */ = {isa = PBXFileReference; lastKnownFileType = folder; name = tr.lproj; path = Localization/tr.lproj; sourceTree = "<group>"; };
E6A0AF8C19C9D1E800C3A7DC /* vi.lproj */ = {isa = PBXFileReference; lastKnownFileType = folder; name = vi.lproj; path = Localization/vi.lproj; sourceTree = "<group>"; };
E6A0AF8D19C9D1E800C3A7DC /* zh-Hans.lproj */ = {isa = PBXFileReference; lastKnownFileType = folder; name = "zh-Hans.lproj"; path = "Localization/zh-Hans.lproj"; sourceTree = "<group>"; };
E6A0AF8E19C9D1E800C3A7DC /* zh-Hant.lproj */ = {isa = PBXFileReference; lastKnownFileType = folder; name = "zh-Hant.lproj"; path = "Localization/zh-Hant.lproj"; sourceTree = "<group>"; };
E6D8B8B519C7274F001AD043 /* Armchair.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Armchair.framework; sourceTree = BUILT_PRODUCTS_DIR; };
E6D8B8F919C756A4001AD043 /* Armchair.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Armchair.framework; sourceTree = BUILT_PRODUCTS_DIR; };
E6D8B92B19C880A9001AD043 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
E6D8B92C19C880A9001AD043 /* ArmchairTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ArmchairTests.swift; sourceTree = "<group>"; };
E6F6159419C9FFDA00C0B51C /* Armchair.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Armchair.bundle; sourceTree = BUILT_PRODUCTS_DIR; };
F8111E3719A95C8B0040E7D1 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
F8111E3819A95C8B0040E7D1 /* Armchair.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Armchair.h; sourceTree = "<group>"; };
F897FF4019AA800700AB5182 /* Armchair.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Armchair.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
E6A0AF6219C9CFF400C3A7DC /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
E6D8B8F219C756A4001AD043 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
E6F6156F19C9FFDA00C0B51C /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
F8111E2F19A95C8B0040E7D1 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
E6A0AF6E19C9D1D300C3A7DC /* Localization */ = {
isa = PBXGroup;
children = (
E6A0AF6F19C9D1E800C3A7DC /* ar.lproj */,
E6A0AF7019C9D1E800C3A7DC /* arm.lproj */,
E6A0AF7119C9D1E800C3A7DC /* ca.lproj */,
E6A0AF7219C9D1E800C3A7DC /* cs.lproj */,
E6A0AF7319C9D1E800C3A7DC /* da.lproj */,
E6A0AF7419C9D1E800C3A7DC /* de.lproj */,
E6A0AF7519C9D1E800C3A7DC /* el.lproj */,
E6A0AF7619C9D1E800C3A7DC /* en.lproj */,
E6A0AF7719C9D1E800C3A7DC /* es.lproj */,
E6A0AF7819C9D1E800C3A7DC /* fi.lproj */,
E6A0AF7919C9D1E800C3A7DC /* fr.lproj */,
E6A0AF7A19C9D1E800C3A7DC /* he.lproj */,
E6A0AF7B19C9D1E800C3A7DC /* hu.lproj */,
E6A0AF7C19C9D1E800C3A7DC /* id.lproj */,
E6A0AF7D19C9D1E800C3A7DC /* it.lproj */,
E6A0AF7E19C9D1E800C3A7DC /* ja.lproj */,
E6A0AF7F19C9D1E800C3A7DC /* ko.lproj */,
E6A0AF8019C9D1E800C3A7DC /* ms.lproj */,
E6A0AF8119C9D1E800C3A7DC /* nb.lproj */,
E6A0AF8219C9D1E800C3A7DC /* nl.lproj */,
E6A0AF8319C9D1E800C3A7DC /* pl.lproj */,
E6A0AF8419C9D1E800C3A7DC /* pt-BR.lproj */,
E6A0AF8519C9D1E800C3A7DC /* pt.lproj */,
E6A0AF8619C9D1E800C3A7DC /* ro.lproj */,
E6A0AF8719C9D1E800C3A7DC /* ru.lproj */,
E6A0AF8819C9D1E800C3A7DC /* sk.lproj */,
E6A0AF8919C9D1E800C3A7DC /* sv.lproj */,
E6A0AF8A19C9D1E800C3A7DC /* th.lproj */,
E6A0AF8B19C9D1E800C3A7DC /* tr.lproj */,
E6A0AF8C19C9D1E800C3A7DC /* vi.lproj */,
E6A0AF8D19C9D1E800C3A7DC /* zh-Hans.lproj */,
E6A0AF8E19C9D1E800C3A7DC /* zh-Hant.lproj */,
);
name = Localization;
sourceTree = "<group>";
};
E6D8B92919C880A9001AD043 /* Tests */ = {
isa = PBXGroup;
children = (
E6D8B92C19C880A9001AD043 /* ArmchairTests.swift */,
E6D8B92A19C880A9001AD043 /* Supporting Files */,
);
path = Tests;
sourceTree = "<group>";
};
E6D8B92A19C880A9001AD043 /* Supporting Files */ = {
isa = PBXGroup;
children = (
E6D8B92B19C880A9001AD043 /* Info.plist */,
);
name = "Supporting Files";
sourceTree = "<group>";
};
F8111E2919A95C8B0040E7D1 = {
isa = PBXGroup;
children = (
E6A0AF6E19C9D1D300C3A7DC /* Localization */,
F8111E3519A95C8B0040E7D1 /* Source */,
E6D8B92919C880A9001AD043 /* Tests */,
E6D8B8B519C7274F001AD043 /* Armchair.framework */,
E6D8B8F919C756A4001AD043 /* Armchair.framework */,
E6A0AF6519C9CFF400C3A7DC /* Armchair.bundle */,
E6F6159419C9FFDA00C0B51C /* Armchair.bundle */,
);
sourceTree = "<group>";
};
F8111E3519A95C8B0040E7D1 /* Source */ = {
isa = PBXGroup;
children = (
F8111E3819A95C8B0040E7D1 /* Armchair.h */,
F897FF4019AA800700AB5182 /* Armchair.swift */,
F8111E3619A95C8B0040E7D1 /* Supporting Files */,
);
path = Source;
sourceTree = "<group>";
};
F8111E3619A95C8B0040E7D1 /* Supporting Files */ = {
isa = PBXGroup;
children = (
F8111E3719A95C8B0040E7D1 /* Info.plist */,
E6A0AF6819C9CFF500C3A7DC /* Info-Localizable.plist */,
);
name = "Supporting Files";
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
E6A0AF6419C9CFF400C3A7DC /* ArmchairLocalizable */ = {
isa = PBXNativeTarget;
buildConfigurationList = E6A0AF6919C9CFF500C3A7DC /* Build configuration list for PBXNativeTarget "ArmchairLocalizable" */;
buildPhases = (
E6A0AF6119C9CFF400C3A7DC /* Sources */,
E6A0AF6219C9CFF400C3A7DC /* Frameworks */,
E6A0AF6319C9CFF400C3A7DC /* Resources */,
);
buildRules = (
);
dependencies = (
);
name = ArmchairLocalizable;
productName = ArmchairLocalizable;
productReference = E6A0AF6519C9CFF400C3A7DC /* Armchair.bundle */;
productType = "com.apple.product-type.bundle";
};
E6D8B8EF19C756A4001AD043 /* ArmchairMac */ = {
isa = PBXNativeTarget;
buildConfigurationList = E6D8B8F619C756A4001AD043 /* Build configuration list for PBXNativeTarget "ArmchairMac" */;
buildPhases = (
E6D8B8F019C756A4001AD043 /* Sources */,
E6D8B8F219C756A4001AD043 /* Frameworks */,
E6D8B8F519C756A4001AD043 /* Resources */,
);
buildRules = (
);
dependencies = (
);
name = ArmchairMac;
productName = Armchair;
productReference = E6D8B8F919C756A4001AD043 /* Armchair.framework */;
productType = "com.apple.product-type.framework";
};
E6F6156D19C9FFDA00C0B51C /* ArmchairLocalizableMac */ = {
isa = PBXNativeTarget;
buildConfigurationList = E6F6159119C9FFDA00C0B51C /* Build configuration list for PBXNativeTarget "ArmchairLocalizableMac" */;
buildPhases = (
E6F6156E19C9FFDA00C0B51C /* Sources */,
E6F6156F19C9FFDA00C0B51C /* Frameworks */,
E6F6157019C9FFDA00C0B51C /* Resources */,
);
buildRules = (
);
dependencies = (
);
name = ArmchairLocalizableMac;
productName = ArmchairLocalizable;
productReference = E6F6159419C9FFDA00C0B51C /* Armchair.bundle */;
productType = "com.apple.product-type.bundle";
};
F8111E3219A95C8B0040E7D1 /* Armchair */ = {
isa = PBXNativeTarget;
buildConfigurationList = F8111E4619A95C8B0040E7D1 /* Build configuration list for PBXNativeTarget "Armchair" */;
buildPhases = (
F8111E2E19A95C8B0040E7D1 /* Sources */,
F8111E2F19A95C8B0040E7D1 /* Frameworks */,
F8111E3119A95C8B0040E7D1 /* Resources */,
);
buildRules = (
);
dependencies = (
);
name = Armchair;
productName = Armchair;
productReference = E6D8B8B519C7274F001AD043 /* Armchair.framework */;
productType = "com.apple.product-type.framework";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
F8111E2A19A95C8B0040E7D1 /* Project object */ = {
isa = PBXProject;
attributes = {
LastSwiftUpdateCheck = 0700;
LastUpgradeCheck = 0800;
ORGANIZATIONNAME = Armchair;
TargetAttributes = {
E6A0AF6419C9CFF400C3A7DC = {
CreatedOnToolsVersion = 6.0;
};
F8111E3219A95C8B0040E7D1 = {
CreatedOnToolsVersion = 6.0;
LastSwiftMigration = 0800;
};
};
};
buildConfigurationList = F8111E2D19A95C8B0040E7D1 /* Build configuration list for PBXProject "Armchair" */;
compatibilityVersion = "Xcode 3.2";
developmentRegion = English;
hasScannedForEncodings = 0;
knownRegions = (
en,
);
mainGroup = F8111E2919A95C8B0040E7D1;
productRefGroup = F8111E2919A95C8B0040E7D1;
projectDirPath = "";
projectRoot = "";
targets = (
F8111E3219A95C8B0040E7D1 /* Armchair */,
E6D8B8EF19C756A4001AD043 /* ArmchairMac */,
E6A0AF6419C9CFF400C3A7DC /* ArmchairLocalizable */,
E6F6156D19C9FFDA00C0B51C /* ArmchairLocalizableMac */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
E6A0AF6319C9CFF400C3A7DC /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
E6A0AF9B19C9D1E800C3A7DC /* hu.lproj in Resources */,
E6A0AFA319C9D1E800C3A7DC /* pl.lproj in Resources */,
E6A0AFA519C9D1E800C3A7DC /* pt.lproj in Resources */,
E6A0AF9619C9D1E800C3A7DC /* en.lproj in Resources */,
E6A0AFA419C9D1E800C3A7DC /* pt-BR.lproj in Resources */,
E6A0AFAA19C9D1E800C3A7DC /* th.lproj in Resources */,
E6A0AF9019C9D1E800C3A7DC /* arm.lproj in Resources */,
E6A0AFA219C9D1E800C3A7DC /* nl.lproj in Resources */,
E6A0AF9119C9D1E800C3A7DC /* ca.lproj in Resources */,
E6A0AF8F19C9D1E800C3A7DC /* ar.lproj in Resources */,
E6A0AF9519C9D1E800C3A7DC /* el.lproj in Resources */,
E6A0AFAD19C9D1E800C3A7DC /* zh-Hans.lproj in Resources */,
E6A0AF9F19C9D1E800C3A7DC /* ko.lproj in Resources */,
E6A0AFA019C9D1E800C3A7DC /* ms.lproj in Resources */,
E6A0AF9C19C9D1E800C3A7DC /* id.lproj in Resources */,
E6A0AFA719C9D1E800C3A7DC /* ru.lproj in Resources */,
E6A0AF9319C9D1E800C3A7DC /* da.lproj in Resources */,
E6A0AFA819C9D1E800C3A7DC /* sk.lproj in Resources */,
E6A0AF9E19C9D1E800C3A7DC /* ja.lproj in Resources */,
E6A0AFAB19C9D1E800C3A7DC /* tr.lproj in Resources */,
E6A0AFA119C9D1E800C3A7DC /* nb.lproj in Resources */,
E6A0AF9919C9D1E800C3A7DC /* fr.lproj in Resources */,
E6A0AF9419C9D1E800C3A7DC /* de.lproj in Resources */,
E6A0AF9719C9D1E800C3A7DC /* es.lproj in Resources */,
E6A0AF9819C9D1E800C3A7DC /* fi.lproj in Resources */,
E6A0AF9A19C9D1E800C3A7DC /* he.lproj in Resources */,
E6A0AF9D19C9D1E800C3A7DC /* it.lproj in Resources */,
E6A0AFA619C9D1E800C3A7DC /* ro.lproj in Resources */,
E6A0AFAE19C9D1E800C3A7DC /* zh-Hant.lproj in Resources */,
E6A0AFA919C9D1E800C3A7DC /* sv.lproj in Resources */,
E6A0AFAC19C9D1E800C3A7DC /* vi.lproj in Resources */,
E6A0AF9219C9D1E800C3A7DC /* cs.lproj in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
E6D8B8F519C756A4001AD043 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
E6F6157019C9FFDA00C0B51C /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
E6F6157119C9FFDA00C0B51C /* hu.lproj in Resources */,
E6F6157219C9FFDA00C0B51C /* pl.lproj in Resources */,
E6F6157319C9FFDA00C0B51C /* pt.lproj in Resources */,
E6F6157419C9FFDA00C0B51C /* en.lproj in Resources */,
E6F6157519C9FFDA00C0B51C /* pt-BR.lproj in Resources */,
E6F6157619C9FFDA00C0B51C /* th.lproj in Resources */,
E6F6157719C9FFDA00C0B51C /* arm.lproj in Resources */,
E6F6157819C9FFDA00C0B51C /* nl.lproj in Resources */,
E6F6157919C9FFDA00C0B51C /* ca.lproj in Resources */,
E6F6157A19C9FFDA00C0B51C /* ar.lproj in Resources */,
E6F6157B19C9FFDA00C0B51C /* el.lproj in Resources */,
E6F6157C19C9FFDA00C0B51C /* zh-Hans.lproj in Resources */,
E6F6157D19C9FFDA00C0B51C /* ko.lproj in Resources */,
E6F6157E19C9FFDA00C0B51C /* ms.lproj in Resources */,
E6F6157F19C9FFDA00C0B51C /* id.lproj in Resources */,
E6F6158019C9FFDA00C0B51C /* ru.lproj in Resources */,
E6F6158119C9FFDA00C0B51C /* da.lproj in Resources */,
E6F6158219C9FFDA00C0B51C /* sk.lproj in Resources */,
E6F6158319C9FFDA00C0B51C /* ja.lproj in Resources */,
E6F6158419C9FFDA00C0B51C /* tr.lproj in Resources */,
E6F6158519C9FFDA00C0B51C /* nb.lproj in Resources */,
E6F6158619C9FFDA00C0B51C /* fr.lproj in Resources */,
E6F6158719C9FFDA00C0B51C /* de.lproj in Resources */,
E6F6158819C9FFDA00C0B51C /* es.lproj in Resources */,
E6F6158919C9FFDA00C0B51C /* fi.lproj in Resources */,
E6F6158A19C9FFDA00C0B51C /* he.lproj in Resources */,
E6F6158B19C9FFDA00C0B51C /* it.lproj in Resources */,
E6F6158C19C9FFDA00C0B51C /* ro.lproj in Resources */,
E6F6158D19C9FFDA00C0B51C /* zh-Hant.lproj in Resources */,
E6F6158E19C9FFDA00C0B51C /* sv.lproj in Resources */,
E6F6158F19C9FFDA00C0B51C /* vi.lproj in Resources */,
E6F6159019C9FFDA00C0B51C /* cs.lproj in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
F8111E3119A95C8B0040E7D1 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
E6A0AF6119C9CFF400C3A7DC /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
E6D8B8F019C756A4001AD043 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
E6D8B8F119C756A4001AD043 /* Armchair.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
E6F6156E19C9FFDA00C0B51C /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
F8111E2E19A95C8B0040E7D1 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
F897FF4119AA800700AB5182 /* Armchair.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin XCBuildConfiguration section */
E6A0AF6A19C9CFF500C3A7DC /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
COMBINE_HIDPI_IMAGES = YES;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
INFOPLIST_FILE = "Source/Info-Localizable.plist";
INSTALL_PATH = "";
MACOSX_DEPLOYMENT_TARGET = 10.10;
ONLY_ACTIVE_ARCH = NO;
PRODUCT_BUNDLE_IDENTIFIER = "com.armchair.$(PRODUCT_NAME:rfc1034identifier)";
PRODUCT_NAME = Armchair;
SKIP_INSTALL = YES;
SUPPORTED_PLATFORMS = "iphonesimulator iphoneos";
WRAPPER_EXTENSION = bundle;
};
name = Debug;
};
E6A0AF6B19C9CFF500C3A7DC /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
COMBINE_HIDPI_IMAGES = YES;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
INFOPLIST_FILE = "Source/Info-Localizable.plist";
INSTALL_PATH = "";
MACOSX_DEPLOYMENT_TARGET = 10.10;
ONLY_ACTIVE_ARCH = NO;
PRODUCT_BUNDLE_IDENTIFIER = "com.armchair.$(PRODUCT_NAME:rfc1034identifier)";
PRODUCT_NAME = Armchair;
SKIP_INSTALL = YES;
SUPPORTED_PLATFORMS = "iphonesimulator iphoneos";
WRAPPER_EXTENSION = bundle;
};
name = Release;
};
E6D8B8F719C756A4001AD043 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_ENABLE_MODULES = YES;
COMBINE_HIDPI_IMAGES = YES;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEFINES_MODULE = YES;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
INFOPLIST_FILE = "$(SRCROOT)/Source/Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
MACOSX_DEPLOYMENT_TARGET = 10.10;
PRODUCT_BUNDLE_IDENTIFIER = "com.armchair.$(PRODUCT_NAME:rfc1034identifier)";
PRODUCT_MODULE_NAME = "$(PRODUCT_NAME:c99extidentifier)";
PRODUCT_NAME = Armchair;
SDKROOT = macosx;
SKIP_INSTALL = YES;
SWIFT_OBJC_BRIDGING_HEADER = "";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 3.0;
};
name = Debug;
};
E6D8B8F819C756A4001AD043 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_ENABLE_MODULES = YES;
COMBINE_HIDPI_IMAGES = YES;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEFINES_MODULE = YES;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
INFOPLIST_FILE = "$(SRCROOT)/Source/Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
MACOSX_DEPLOYMENT_TARGET = 10.10;
PRODUCT_BUNDLE_IDENTIFIER = "com.armchair.$(PRODUCT_NAME:rfc1034identifier)";
PRODUCT_MODULE_NAME = "$(PRODUCT_NAME:c99extidentifier)";
PRODUCT_NAME = Armchair;
SDKROOT = macosx;
SKIP_INSTALL = YES;
SWIFT_OBJC_BRIDGING_HEADER = "";
SWIFT_VERSION = 3.0;
};
name = Release;
};
E6F6159219C9FFDA00C0B51C /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
COMBINE_HIDPI_IMAGES = YES;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
INFOPLIST_FILE = "Source/Info-Localizable.plist";
INSTALL_PATH = "";
MACOSX_DEPLOYMENT_TARGET = 10.10;
ONLY_ACTIVE_ARCH = NO;
PRODUCT_BUNDLE_IDENTIFIER = "com.armchair.$(PRODUCT_NAME:rfc1034identifier)";
PRODUCT_NAME = Armchair;
SDKROOT = macosx;
SKIP_INSTALL = YES;
SUPPORTED_PLATFORMS = macosx;
WRAPPER_EXTENSION = bundle;
};
name = Debug;
};
E6F6159319C9FFDA00C0B51C /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
COMBINE_HIDPI_IMAGES = YES;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
INFOPLIST_FILE = "Source/Info-Localizable.plist";
INSTALL_PATH = "";
MACOSX_DEPLOYMENT_TARGET = 10.10;
ONLY_ACTIVE_ARCH = NO;
PRODUCT_BUNDLE_IDENTIFIER = "com.armchair.$(PRODUCT_NAME:rfc1034identifier)";
PRODUCT_NAME = Armchair;
SDKROOT = macosx;
SKIP_INSTALL = YES;
SUPPORTED_PLATFORMS = macosx;
WRAPPER_EXTENSION = bundle;
};
name = Release;
};
F8111E4419A95C8B0040E7D1 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 1;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_SYMBOLS_PRIVATE_EXTERN = NO;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
MACOSX_DEPLOYMENT_TARGET = 10.9;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
OTHER_SWIFT_FLAGS = "-DDebug";
SDKROOT = iphoneos;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
TARGETED_DEVICE_FAMILY = "1,2";
VERSIONING_SYSTEM = "apple-generic";
VERSION_INFO_PREFIX = "";
};
name = Debug;
};
F8111E4519A95C8B0040E7D1 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = YES;
CURRENT_PROJECT_VERSION = 1;
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
MACOSX_DEPLOYMENT_TARGET = 10.9;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
VERSIONING_SYSTEM = "apple-generic";
VERSION_INFO_PREFIX = "";
};
name = Release;
};
F8111E4719A95C8B0040E7D1 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_ENABLE_MODULES = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
DEFINES_MODULE = YES;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
INFOPLIST_FILE = "$(SRCROOT)/Source/Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = "com.armchair.$(PRODUCT_NAME:rfc1034identifier)";
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
SWIFT_OBJC_BRIDGING_HEADER = "";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 3.0;
};
name = Debug;
};
F8111E4819A95C8B0040E7D1 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_ENABLE_MODULES = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
DEFINES_MODULE = YES;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
INFOPLIST_FILE = "$(SRCROOT)/Source/Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = "com.armchair.$(PRODUCT_NAME:rfc1034identifier)";
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
SWIFT_OBJC_BRIDGING_HEADER = "";
SWIFT_VERSION = 3.0;
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
E6A0AF6919C9CFF500C3A7DC /* Build configuration list for PBXNativeTarget "ArmchairLocalizable" */ = {
isa = XCConfigurationList;
buildConfigurations = (
E6A0AF6A19C9CFF500C3A7DC /* Debug */,
E6A0AF6B19C9CFF500C3A7DC /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
E6D8B8F619C756A4001AD043 /* Build configuration list for PBXNativeTarget "ArmchairMac" */ = {
isa = XCConfigurationList;
buildConfigurations = (
E6D8B8F719C756A4001AD043 /* Debug */,
E6D8B8F819C756A4001AD043 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
E6F6159119C9FFDA00C0B51C /* Build configuration list for PBXNativeTarget "ArmchairLocalizableMac" */ = {
isa = XCConfigurationList;
buildConfigurations = (
E6F6159219C9FFDA00C0B51C /* Debug */,
E6F6159319C9FFDA00C0B51C /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
F8111E2D19A95C8B0040E7D1 /* Build configuration list for PBXProject "Armchair" */ = {
isa = XCConfigurationList;
buildConfigurations = (
F8111E4419A95C8B0040E7D1 /* Debug */,
F8111E4519A95C8B0040E7D1 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
F8111E4619A95C8B0040E7D1 /* Build configuration list for PBXNativeTarget "Armchair" */ = {
isa = XCConfigurationList;
buildConfigurations = (
F8111E4719A95C8B0040E7D1 /* Debug */,
F8111E4819A95C8B0040E7D1 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = F8111E2A19A95C8B0040E7D1 /* Project object */;
}

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:Armchair.xcodeproj">
</FileRef>
</Workspace>

View File

@@ -0,0 +1,99 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0800"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "F8111E3219A95C8B0040E7D1"
BuildableName = "Armchair.framework"
BlueprintName = "Armchair"
ReferencedContainer = "container:Armchair.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
<TestableReference
skipped = "NO">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "E6D8B92719C880A9001AD043"
BuildableName = "ArmchairTests.xctest"
BlueprintName = "ArmchairTests"
ReferencedContainer = "container:Armchair.xcodeproj">
</BuildableReference>
</TestableReference>
</Testables>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "F8111E3219A95C8B0040E7D1"
BuildableName = "Armchair.framework"
BlueprintName = "Armchair"
ReferencedContainer = "container:Armchair.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "F8111E3219A95C8B0040E7D1"
BuildableName = "Armchair.framework"
BlueprintName = "Armchair"
ReferencedContainer = "container:Armchair.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "F8111E3219A95C8B0040E7D1"
BuildableName = "Armchair.framework"
BlueprintName = "Armchair"
ReferencedContainer = "container:Armchair.xcodeproj">
</BuildableReference>
</MacroExpansion>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

View File

@@ -0,0 +1,80 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0800"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "E6D8B8EF19C756A4001AD043"
BuildableName = "Armchair.framework"
BlueprintName = "ArmchairMac"
ReferencedContainer = "container:Armchair.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "E6D8B8EF19C756A4001AD043"
BuildableName = "Armchair.framework"
BlueprintName = "ArmchairMac"
ReferencedContainer = "container:Armchair.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "E6D8B8EF19C756A4001AD043"
BuildableName = "Armchair.framework"
BlueprintName = "ArmchairMac"
ReferencedContainer = "container:Armchair.xcodeproj">
</BuildableReference>
</MacroExpansion>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "group:Armchair.xcodeproj">
</FileRef>
<FileRef
location = "group:iOS Example.xcodeproj">
</FileRef>
<FileRef
location = "group:Mac Example.xcodeproj">
</FileRef>
</Workspace>

76
Example/AppDelegate.swift Normal file
View File

@@ -0,0 +1,76 @@
// AppDelegate.swift
//
// Copyright (c) 2014 Armchair (http://github.com/UrbanApps/Armchair)
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
#if os(iOS)
import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
return true
}
}
let Pages = "361309726" // Pages iOS
#elseif os(OSX)
import Cocoa
@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
@IBOutlet weak var window: NSWindow!
}
let Pages = "409201541" // Pages Mac
#else
#endif
import Armchair
extension AppDelegate {
override class func initialize() {
AppDelegate.setupArmchair()
}
class func setupArmchair() {
// Normally, all the setup would be here.
// But, because we are presenting a few different setups in the example,
// The config will be in the view controllers
// Armchair.appID("408981381") // Pages
//
// It is always best to load Armchair as early as possible
// because it needs to receive application life-cycle notifications
//
// NOTE: The appID call always has to go before any other Armchair calls
Armchair.appID(Pages)
Armchair.debugEnabled(true)
}
}

View File

@@ -0,0 +1,816 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="9060" systemVersion="15B42" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="9060"/>
<capability name="box content view" minToolsVersion="7.0"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="NSApplication">
<connections>
<outlet property="delegate" destination="Voe-Tx-rLC" id="GzC-gU-4Uq"/>
</connections>
</customObject>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
<customObject id="Voe-Tx-rLC" customClass="AppDelegate" customModule="Mac_Example" customModuleProvider="target">
<connections>
<outlet property="window" destination="QvC-M9-y7g" id="gIp-Ho-8D9"/>
</connections>
</customObject>
<viewController id="g9K-Nf-HDk" customClass="ViewController" customModule="Mac_Example" customModuleProvider="target">
<connections>
<outlet property="languageLabel" destination="TMr-De-pos" id="Pts-ch-UQq"/>
<outlet property="view" destination="EiT-Mj-1SZ" id="fYh-cJ-L5u"/>
</connections>
</viewController>
<customObject id="YLy-65-1bz" customClass="NSFontManager"/>
<menu title="Main Menu" systemMenu="main" id="AYu-sK-qS6">
<items>
<menuItem title="Mac Example" id="1Xt-HY-uBw">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Mac Example" systemMenu="apple" id="uQy-DD-JDr">
<items>
<menuItem title="About Mac Example" id="5kV-Vb-QxS">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="orderFrontStandardAboutPanel:" target="-1" id="Exp-CZ-Vem"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="VOq-y0-SEH"/>
<menuItem title="Preferences…" keyEquivalent="," id="BOF-NM-1cW"/>
<menuItem isSeparatorItem="YES" id="wFC-TO-SCJ"/>
<menuItem title="Services" id="NMo-om-nkz">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Services" systemMenu="services" id="hz9-B4-Xy5"/>
</menuItem>
<menuItem isSeparatorItem="YES" id="4je-JR-u6R"/>
<menuItem title="Hide Mac Example" keyEquivalent="h" id="Olw-nP-bQN">
<connections>
<action selector="hide:" target="-1" id="PnN-Uc-m68"/>
</connections>
</menuItem>
<menuItem title="Hide Others" keyEquivalent="h" id="Vdr-fp-XzO">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="hideOtherApplications:" target="-1" id="VT4-aY-XCT"/>
</connections>
</menuItem>
<menuItem title="Show All" id="Kd2-mp-pUS">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="unhideAllApplications:" target="-1" id="Dhg-Le-xox"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="kCx-OE-vgT"/>
<menuItem title="Quit Mac Example" keyEquivalent="q" id="4sb-4s-VLi">
<connections>
<action selector="terminate:" target="-1" id="Te7-pn-YzF"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="File" id="dMs-cI-mzQ">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="File" id="bib-Uj-vzu">
<items>
<menuItem title="New" keyEquivalent="n" id="Was-JA-tGl">
<connections>
<action selector="newDocument:" target="-1" id="4Si-XN-c54"/>
</connections>
</menuItem>
<menuItem title="Open…" keyEquivalent="o" id="IAo-SY-fd9">
<connections>
<action selector="openDocument:" target="-1" id="bVn-NM-KNZ"/>
</connections>
</menuItem>
<menuItem title="Open Recent" id="tXI-mr-wws">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Open Recent" systemMenu="recentDocuments" id="oas-Oc-fiZ">
<items>
<menuItem title="Clear Menu" id="vNY-rz-j42">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="clearRecentDocuments:" target="-1" id="Daa-9d-B3U"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem isSeparatorItem="YES" id="m54-Is-iLE"/>
<menuItem title="Close" keyEquivalent="w" id="DVo-aG-piG">
<connections>
<action selector="performClose:" target="-1" id="HmO-Ls-i7Q"/>
</connections>
</menuItem>
<menuItem title="Save…" keyEquivalent="s" id="pxx-59-PXV">
<connections>
<action selector="saveDocument:" target="-1" id="teZ-XB-qJY"/>
</connections>
</menuItem>
<menuItem title="Save As…" keyEquivalent="S" id="Bw7-FT-i3A">
<connections>
<action selector="saveDocumentAs:" target="-1" id="mDf-zr-I0C"/>
</connections>
</menuItem>
<menuItem title="Revert to Saved" id="KaW-ft-85H">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="revertDocumentToSaved:" target="-1" id="iJ3-Pv-kwq"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="aJh-i4-bef"/>
<menuItem title="Page Setup…" keyEquivalent="P" id="qIS-W8-SiK">
<modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/>
<connections>
<action selector="runPageLayout:" target="-1" id="Din-rz-gC5"/>
</connections>
</menuItem>
<menuItem title="Print…" keyEquivalent="p" id="aTl-1u-JFS">
<connections>
<action selector="print:" target="-1" id="qaZ-4w-aoO"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Edit" id="5QF-Oa-p0T">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Edit" id="W48-6f-4Dl">
<items>
<menuItem title="Undo" keyEquivalent="z" id="dRJ-4n-Yzg">
<connections>
<action selector="undo:" target="-1" id="M6e-cu-g7V"/>
</connections>
</menuItem>
<menuItem title="Redo" keyEquivalent="Z" id="6dh-zS-Vam">
<connections>
<action selector="redo:" target="-1" id="oIA-Rs-6OD"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="WRV-NI-Exz"/>
<menuItem title="Cut" keyEquivalent="x" id="uRl-iY-unG">
<connections>
<action selector="cut:" target="-1" id="YJe-68-I9s"/>
</connections>
</menuItem>
<menuItem title="Copy" keyEquivalent="c" id="x3v-GG-iWU">
<connections>
<action selector="copy:" target="-1" id="G1f-GL-Joy"/>
</connections>
</menuItem>
<menuItem title="Paste" keyEquivalent="v" id="gVA-U4-sdL">
<connections>
<action selector="paste:" target="-1" id="UvS-8e-Qdg"/>
</connections>
</menuItem>
<menuItem title="Paste and Match Style" keyEquivalent="V" id="WeT-3V-zwk">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="pasteAsPlainText:" target="-1" id="cEh-KX-wJQ"/>
</connections>
</menuItem>
<menuItem title="Delete" id="pa3-QI-u2k">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="delete:" target="-1" id="0Mk-Ml-PaM"/>
</connections>
</menuItem>
<menuItem title="Select All" keyEquivalent="a" id="Ruw-6m-B2m">
<connections>
<action selector="selectAll:" target="-1" id="VNm-Mi-diN"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="uyl-h8-XO2"/>
<menuItem title="Find" id="4EN-yA-p0u">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Find" id="1b7-l0-nxx">
<items>
<menuItem title="Find…" tag="1" keyEquivalent="f" id="Xz5-n4-O0W">
<connections>
<action selector="performFindPanelAction:" target="-1" id="cD7-Qs-BN4"/>
</connections>
</menuItem>
<menuItem title="Find and Replace…" tag="12" keyEquivalent="f" id="YEy-JH-Tfz">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="performFindPanelAction:" target="-1" id="WD3-Gg-5AJ"/>
</connections>
</menuItem>
<menuItem title="Find Next" tag="2" keyEquivalent="g" id="q09-fT-Sye">
<connections>
<action selector="performFindPanelAction:" target="-1" id="NDo-RZ-v9R"/>
</connections>
</menuItem>
<menuItem title="Find Previous" tag="3" keyEquivalent="G" id="OwM-mh-QMV">
<connections>
<action selector="performFindPanelAction:" target="-1" id="HOh-sY-3ay"/>
</connections>
</menuItem>
<menuItem title="Use Selection for Find" tag="7" keyEquivalent="e" id="buJ-ug-pKt">
<connections>
<action selector="performFindPanelAction:" target="-1" id="U76-nv-p5D"/>
</connections>
</menuItem>
<menuItem title="Jump to Selection" keyEquivalent="j" id="S0p-oC-mLd">
<connections>
<action selector="centerSelectionInVisibleArea:" target="-1" id="IOG-6D-g5B"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Spelling and Grammar" id="Dv1-io-Yv7">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Spelling" id="3IN-sU-3Bg">
<items>
<menuItem title="Show Spelling and Grammar" keyEquivalent=":" id="HFo-cy-zxI">
<connections>
<action selector="showGuessPanel:" target="-1" id="vFj-Ks-hy3"/>
</connections>
</menuItem>
<menuItem title="Check Document Now" keyEquivalent=";" id="hz2-CU-CR7">
<connections>
<action selector="checkSpelling:" target="-1" id="fz7-VC-reM"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="bNw-od-mp5"/>
<menuItem title="Check Spelling While Typing" id="rbD-Rh-wIN">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleContinuousSpellChecking:" target="-1" id="7w6-Qz-0kB"/>
</connections>
</menuItem>
<menuItem title="Check Grammar With Spelling" id="mK6-2p-4JG">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleGrammarChecking:" target="-1" id="muD-Qn-j4w"/>
</connections>
</menuItem>
<menuItem title="Correct Spelling Automatically" id="78Y-hA-62v">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticSpellingCorrection:" target="-1" id="2lM-Qi-WAP"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Substitutions" id="9ic-FL-obx">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Substitutions" id="FeM-D8-WVr">
<items>
<menuItem title="Show Substitutions" id="z6F-FW-3nz">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="orderFrontSubstitutionsPanel:" target="-1" id="oku-mr-iSq"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="gPx-C9-uUO"/>
<menuItem title="Smart Copy/Paste" id="9yt-4B-nSM">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleSmartInsertDelete:" target="-1" id="3IJ-Se-DZD"/>
</connections>
</menuItem>
<menuItem title="Smart Quotes" id="hQb-2v-fYv">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticQuoteSubstitution:" target="-1" id="ptq-xd-QOA"/>
</connections>
</menuItem>
<menuItem title="Smart Dashes" id="rgM-f4-ycn">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticDashSubstitution:" target="-1" id="oCt-pO-9gS"/>
</connections>
</menuItem>
<menuItem title="Smart Links" id="cwL-P1-jid">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticLinkDetection:" target="-1" id="Gip-E3-Fov"/>
</connections>
</menuItem>
<menuItem title="Data Detectors" id="tRr-pd-1PS">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticDataDetection:" target="-1" id="R1I-Nq-Kbl"/>
</connections>
</menuItem>
<menuItem title="Text Replacement" id="HFQ-gK-NFA">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticTextReplacement:" target="-1" id="DvP-Fe-Py6"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Transformations" id="2oI-Rn-ZJC">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Transformations" id="c8a-y6-VQd">
<items>
<menuItem title="Make Upper Case" id="vmV-6d-7jI">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="uppercaseWord:" target="-1" id="sPh-Tk-edu"/>
</connections>
</menuItem>
<menuItem title="Make Lower Case" id="d9M-CD-aMd">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="lowercaseWord:" target="-1" id="iUZ-b5-hil"/>
</connections>
</menuItem>
<menuItem title="Capitalize" id="UEZ-Bs-lqG">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="capitalizeWord:" target="-1" id="26H-TL-nsh"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Speech" id="xrE-MZ-jX0">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Speech" id="3rS-ZA-NoH">
<items>
<menuItem title="Start Speaking" id="Ynk-f8-cLZ">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="startSpeaking:" target="-1" id="654-Ng-kyl"/>
</connections>
</menuItem>
<menuItem title="Stop Speaking" id="Oyz-dy-DGm">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="stopSpeaking:" target="-1" id="dX8-6p-jy9"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Format" id="jxT-CU-nIS">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Format" id="GEO-Iw-cKr">
<items>
<menuItem title="Font" id="Gi5-1S-RQB">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Font" systemMenu="font" id="aXa-aM-Jaq">
<items>
<menuItem title="Show Fonts" keyEquivalent="t" id="Q5e-8K-NDq">
<connections>
<action selector="orderFrontFontPanel:" target="YLy-65-1bz" id="WHr-nq-2xA"/>
</connections>
</menuItem>
<menuItem title="Bold" tag="2" keyEquivalent="b" id="GB9-OM-e27">
<connections>
<action selector="addFontTrait:" target="YLy-65-1bz" id="hqk-hr-sYV"/>
</connections>
</menuItem>
<menuItem title="Italic" tag="1" keyEquivalent="i" id="Vjx-xi-njq">
<connections>
<action selector="addFontTrait:" target="YLy-65-1bz" id="IHV-OB-c03"/>
</connections>
</menuItem>
<menuItem title="Underline" keyEquivalent="u" id="WRG-CD-K1S">
<connections>
<action selector="underline:" target="-1" id="FYS-2b-JAY"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="5gT-KC-WSO"/>
<menuItem title="Bigger" tag="3" keyEquivalent="+" id="Ptp-SP-VEL">
<connections>
<action selector="modifyFont:" target="YLy-65-1bz" id="Uc7-di-UnL"/>
</connections>
</menuItem>
<menuItem title="Smaller" tag="4" keyEquivalent="-" id="i1d-Er-qST">
<connections>
<action selector="modifyFont:" target="YLy-65-1bz" id="HcX-Lf-eNd"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="kx3-Dk-x3B"/>
<menuItem title="Kern" id="jBQ-r6-VK2">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Kern" id="tlD-Oa-oAM">
<items>
<menuItem title="Use Default" id="GUa-eO-cwY">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="useStandardKerning:" target="-1" id="6dk-9l-Ckg"/>
</connections>
</menuItem>
<menuItem title="Use None" id="cDB-IK-hbR">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="turnOffKerning:" target="-1" id="U8a-gz-Maa"/>
</connections>
</menuItem>
<menuItem title="Tighten" id="46P-cB-AYj">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="tightenKerning:" target="-1" id="hr7-Nz-8ro"/>
</connections>
</menuItem>
<menuItem title="Loosen" id="ogc-rX-tC1">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="loosenKerning:" target="-1" id="8i4-f9-FKE"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Ligatures" id="o6e-r0-MWq">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Ligatures" id="w0m-vy-SC9">
<items>
<menuItem title="Use Default" id="agt-UL-0e3">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="useStandardLigatures:" target="-1" id="7uR-wd-Dx6"/>
</connections>
</menuItem>
<menuItem title="Use None" id="J7y-lM-qPV">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="turnOffLigatures:" target="-1" id="iX2-gA-Ilz"/>
</connections>
</menuItem>
<menuItem title="Use All" id="xQD-1f-W4t">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="useAllLigatures:" target="-1" id="KcB-kA-TuK"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Baseline" id="OaQ-X3-Vso">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Baseline" id="ijk-EB-dga">
<items>
<menuItem title="Use Default" id="3Om-Ey-2VK">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="unscript:" target="-1" id="0vZ-95-Ywn"/>
</connections>
</menuItem>
<menuItem title="Superscript" id="Rqc-34-cIF">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="superscript:" target="-1" id="3qV-fo-wpU"/>
</connections>
</menuItem>
<menuItem title="Subscript" id="I0S-gh-46l">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="subscript:" target="-1" id="Q6W-4W-IGz"/>
</connections>
</menuItem>
<menuItem title="Raise" id="2h7-ER-AoG">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="raiseBaseline:" target="-1" id="4sk-31-7Q9"/>
</connections>
</menuItem>
<menuItem title="Lower" id="1tx-W0-xDw">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="lowerBaseline:" target="-1" id="OF1-bc-KW4"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem isSeparatorItem="YES" id="Ndw-q3-faq"/>
<menuItem title="Show Colors" keyEquivalent="C" id="bgn-CT-cEk">
<connections>
<action selector="orderFrontColorPanel:" target="-1" id="mSX-Xz-DV3"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="iMs-zA-UFJ"/>
<menuItem title="Copy Style" keyEquivalent="c" id="5Vv-lz-BsD">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="copyFont:" target="-1" id="GJO-xA-L4q"/>
</connections>
</menuItem>
<menuItem title="Paste Style" keyEquivalent="v" id="vKC-jM-MkH">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="pasteFont:" target="-1" id="JfD-CL-leO"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Text" id="Fal-I4-PZk">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Text" id="d9c-me-L2H">
<items>
<menuItem title="Align Left" keyEquivalent="{" id="ZM1-6Q-yy1">
<connections>
<action selector="alignLeft:" target="-1" id="zUv-R1-uAa"/>
</connections>
</menuItem>
<menuItem title="Center" keyEquivalent="|" id="VIY-Ag-zcb">
<connections>
<action selector="alignCenter:" target="-1" id="spX-mk-kcS"/>
</connections>
</menuItem>
<menuItem title="Justify" id="J5U-5w-g23">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="alignJustified:" target="-1" id="ljL-7U-jND"/>
</connections>
</menuItem>
<menuItem title="Align Right" keyEquivalent="}" id="wb2-vD-lq4">
<connections>
<action selector="alignRight:" target="-1" id="r48-bG-YeY"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="4s2-GY-VfK"/>
<menuItem title="Writing Direction" id="H1b-Si-o9J">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Writing Direction" id="8mr-sm-Yjd">
<items>
<menuItem title="Paragraph" enabled="NO" id="ZvO-Gk-QUH">
<modifierMask key="keyEquivalentModifierMask"/>
</menuItem>
<menuItem id="YGs-j5-SAR">
<string key="title"> Default</string>
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeBaseWritingDirectionNatural:" target="-1" id="qtV-5e-UBP"/>
</connections>
</menuItem>
<menuItem id="Lbh-J2-qVU">
<string key="title"> Left to Right</string>
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeBaseWritingDirectionLeftToRight:" target="-1" id="S0X-9S-QSf"/>
</connections>
</menuItem>
<menuItem id="jFq-tB-4Kx">
<string key="title"> Right to Left</string>
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeBaseWritingDirectionRightToLeft:" target="-1" id="5fk-qB-AqJ"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="swp-gr-a21"/>
<menuItem title="Selection" enabled="NO" id="cqv-fj-IhA">
<modifierMask key="keyEquivalentModifierMask"/>
</menuItem>
<menuItem id="Nop-cj-93Q">
<string key="title"> Default</string>
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeTextWritingDirectionNatural:" target="-1" id="lPI-Se-ZHp"/>
</connections>
</menuItem>
<menuItem id="BgM-ve-c93">
<string key="title"> Left to Right</string>
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeTextWritingDirectionLeftToRight:" target="-1" id="caW-Bv-w94"/>
</connections>
</menuItem>
<menuItem id="RB4-Sm-HuC">
<string key="title"> Right to Left</string>
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeTextWritingDirectionRightToLeft:" target="-1" id="EXD-6r-ZUu"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem isSeparatorItem="YES" id="fKy-g9-1gm"/>
<menuItem title="Show Ruler" id="vLm-3I-IUL">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleRuler:" target="-1" id="FOx-HJ-KwY"/>
</connections>
</menuItem>
<menuItem title="Copy Ruler" keyEquivalent="c" id="MkV-Pr-PK5">
<modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
<connections>
<action selector="copyRuler:" target="-1" id="71i-fW-3W2"/>
</connections>
</menuItem>
<menuItem title="Paste Ruler" keyEquivalent="v" id="LVM-kO-fVI">
<modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
<connections>
<action selector="pasteRuler:" target="-1" id="cSh-wd-qM2"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="View" id="H8h-7b-M4v">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="View" id="HyV-fh-RgO">
<items>
<menuItem title="Show Toolbar" keyEquivalent="t" id="snW-S8-Cw5">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="toggleToolbarShown:" target="-1" id="BXY-wc-z0C"/>
</connections>
</menuItem>
<menuItem title="Customize Toolbar…" id="1UK-8n-QPP">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="runToolbarCustomizationPalette:" target="-1" id="pQI-g3-MTW"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Window" id="aUF-d1-5bR">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Window" systemMenu="window" id="Td7-aD-5lo">
<items>
<menuItem title="Minimize" keyEquivalent="m" id="OY7-WF-poV">
<connections>
<action selector="performMiniaturize:" target="-1" id="VwT-WD-YPe"/>
</connections>
</menuItem>
<menuItem title="Zoom" id="R4o-n2-Eq4">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="performZoom:" target="-1" id="DIl-cC-cCs"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="eu3-7i-yIM"/>
<menuItem title="Bring All to Front" id="LE2-aR-0XJ">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="arrangeInFront:" target="-1" id="DRN-fu-gQh"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Help" id="wpr-3q-Mcd">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Help" systemMenu="help" id="F2S-fz-NVQ">
<items>
<menuItem title="Mac Example Help" keyEquivalent="?" id="FKE-Sm-Kum">
<connections>
<action selector="showHelp:" target="-1" id="y7X-2Q-9no"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
</items>
</menu>
<window title="Mac Example" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" showsToolbarButton="NO" animationBehavior="default" id="QvC-M9-y7g">
<windowStyleMask key="styleMask" titled="YES"/>
<rect key="contentRect" x="335" y="390" width="400" height="368"/>
<rect key="screenRect" x="0.0" y="0.0" width="1440" height="2537"/>
<view key="contentView" id="EiT-Mj-1SZ">
<rect key="frame" x="0.0" y="0.0" width="400" height="368"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="JWk-MV-osx">
<rect key="frame" x="0.0" y="0.0" width="400" height="368"/>
<constraints>
<constraint firstAttribute="height" constant="368" id="7CF-lb-e7D"/>
<constraint firstAttribute="height" relation="greaterThanOrEqual" constant="368" id="YP8-WO-IWe"/>
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="400" id="Z1K-eP-EFI"/>
<constraint firstAttribute="width" constant="400" id="srN-Ty-yYG"/>
</constraints>
<animations/>
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="armchair" id="cpa-BH-nca"/>
</imageView>
<box autoresizesSubviews="NO" borderType="line" titlePosition="noTitle" translatesAutoresizingMaskIntoConstraints="NO" id="0Gb-KD-yfU">
<rect key="frame" x="17" y="250" width="366" height="100"/>
<view key="contentView" id="bbk-jP-boF">
<rect key="frame" x="1" y="1" width="364" height="98"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="YED-uj-VLq">
<rect key="frame" x="16" y="29" width="332" height="81"/>
<constraints>
<constraint firstAttribute="width" constant="328" id="DsT-g1-qyE"/>
</constraints>
<animations/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="center" title="ARMCHAIR" id="44X-yy-TzG">
<font key="font" size="58" name="AmericanTypewriter-Light"/>
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<button wantsLayer="YES" translatesAutoresizingMaskIntoConstraints="NO" id="jkm-ga-2sM">
<rect key="frame" x="63" y="8" width="85" height="32"/>
<contentFilters>
<ciFilter name="CIColorControls">
<configuration>
<real key="inputBrightness" value="1"/>
<real key="inputContrast" value="1"/>
<null key="inputImage"/>
<real key="inputSaturation" value="1"/>
</configuration>
</ciFilter>
</contentFilters>
<animations/>
<buttonCell key="cell" type="bevel" title="Standard" bezelStyle="rounded" alignment="left" imageScaling="proportionallyDown" inset="2" id="V69-cn-Kgl">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" size="18" name="AmericanTypewriter"/>
</buttonCell>
<connections>
<action selector="presentStandardPrompt:" target="g9K-Nf-HDk" id="9aA-tR-lH1"/>
</connections>
</button>
<button wantsLayer="YES" translatesAutoresizingMaskIntoConstraints="NO" id="yGG-Wr-1xP">
<rect key="frame" x="211" y="8" width="105" height="32"/>
<contentFilters>
<ciFilter name="CIColorControls">
<configuration>
<real key="inputBrightness" value="1"/>
<real key="inputContrast" value="1"/>
<null key="inputImage"/>
<real key="inputSaturation" value="1"/>
</configuration>
</ciFilter>
</contentFilters>
<animations/>
<buttonCell key="cell" type="bevel" title="Customized" bezelStyle="rounded" alignment="center" imageScaling="proportionallyDown" inset="2" id="cV4-59-VPY">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" size="18" name="AmericanTypewriter"/>
</buttonCell>
<connections>
<action selector="presentCustomizedPrompt:" target="g9K-Nf-HDk" id="4g2-ob-RcM"/>
</connections>
</button>
</subviews>
<animations/>
</view>
<constraints>
<constraint firstAttribute="centerX" secondItem="YED-uj-VLq" secondAttribute="centerX" id="D1u-uE-BYQ"/>
<constraint firstItem="yGG-Wr-1xP" firstAttribute="top" secondItem="YED-uj-VLq" secondAttribute="bottom" constant="-11" id="HED-pQ-Syb"/>
<constraint firstItem="YED-uj-VLq" firstAttribute="leading" secondItem="jkm-ga-2sM" secondAttribute="leading" constant="-45" id="Krx-CK-vgG"/>
<constraint firstItem="YED-uj-VLq" firstAttribute="top" secondItem="0Gb-KD-yfU" secondAttribute="top" constant="-13" id="Yxh-EJ-Gft"/>
<constraint firstAttribute="height" constant="94" id="aN9-Sz-28k"/>
<constraint firstItem="yGG-Wr-1xP" firstAttribute="trailing" secondItem="YED-uj-VLq" secondAttribute="trailing" constant="-30" id="kVF-vs-OfD"/>
<constraint firstItem="jkm-ga-2sM" firstAttribute="bottom" secondItem="yGG-Wr-1xP" secondAttribute="bottom" id="sDl-pK-HF9"/>
</constraints>
<animations/>
<color key="borderColor" name="textColor" catalog="System" colorSpace="catalog"/>
<color key="fillColor" name="textColor" catalog="System" colorSpace="catalog"/>
</box>
<button translatesAutoresizingMaskIntoConstraints="NO" id="OSk-p7-dUM">
<rect key="frame" x="312" y="8" width="80" height="16"/>
<constraints>
<constraint firstAttribute="height" constant="16" id="GCp-UZ-7Tt"/>
<constraint firstAttribute="width" constant="80" id="GXx-vv-2Cx"/>
</constraints>
<animations/>
<buttonCell key="cell" type="bevel" bezelStyle="rounded" image="logo" imagePosition="only" alignment="center" alternateImage="logo" imageScaling="proportionallyDown" inset="2" id="vhG-ei-xnV">
<behavior key="behavior" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="openUrbanApps:" target="g9K-Nf-HDk" id="p5P-Rh-N1T"/>
</connections>
</button>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="TMr-De-pos">
<rect key="frame" x="147" y="229" width="106" height="17"/>
<animations/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="center" title="Languange Label" id="k5m-JC-DUG">
<font key="font" size="12" name="AmericanTypewriter"/>
<color key="textColor" red="1" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</subviews>
<constraints>
<constraint firstAttribute="centerY" secondItem="JWk-MV-osx" secondAttribute="centerY" id="1QU-qd-5HF"/>
<constraint firstAttribute="centerX" secondItem="JWk-MV-osx" secondAttribute="centerX" id="4MA-hd-vMN"/>
<constraint firstItem="0Gb-KD-yfU" firstAttribute="top" secondItem="EiT-Mj-1SZ" secondAttribute="top" constant="20" id="BgQ-mm-2V4"/>
<constraint firstAttribute="bottom" secondItem="OSk-p7-dUM" secondAttribute="bottom" constant="8" id="Eg9-AS-cIz"/>
<constraint firstAttribute="centerX" secondItem="TMr-De-pos" secondAttribute="centerX" id="H7z-0n-mbL"/>
<constraint firstAttribute="trailing" secondItem="0Gb-KD-yfU" secondAttribute="trailing" constant="20" id="Jd9-NU-hNd"/>
<constraint firstAttribute="centerX" secondItem="0Gb-KD-yfU" secondAttribute="centerX" id="JvA-go-nfg"/>
<constraint firstItem="OSk-p7-dUM" firstAttribute="centerX" secondItem="0Gb-KD-yfU" secondAttribute="centerX" constant="152" id="NDh-HU-3OR"/>
<constraint firstItem="0Gb-KD-yfU" firstAttribute="leading" secondItem="EiT-Mj-1SZ" secondAttribute="leading" constant="20" id="SUA-nW-p1P"/>
<constraint firstItem="TMr-De-pos" firstAttribute="top" secondItem="0Gb-KD-yfU" secondAttribute="bottom" constant="8" id="b8y-Oh-srw"/>
</constraints>
<animations/>
</view>
</window>
</objects>
<resources>
<image name="armchair" width="800" height="736"/>
<image name="logo" width="1480" height="306"/>
</resources>
</document>

View File

@@ -0,0 +1,68 @@
{
"images" : [
{
"idiom" : "iphone",
"size" : "29x29",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "29x29",
"scale" : "3x"
},
{
"idiom" : "iphone",
"size" : "40x40",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "40x40",
"scale" : "3x"
},
{
"idiom" : "iphone",
"size" : "60x60",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "60x60",
"scale" : "3x"
},
{
"idiom" : "ipad",
"size" : "29x29",
"scale" : "1x"
},
{
"idiom" : "ipad",
"size" : "29x29",
"scale" : "2x"
},
{
"idiom" : "ipad",
"size" : "40x40",
"scale" : "1x"
},
{
"idiom" : "ipad",
"size" : "40x40",
"scale" : "2x"
},
{
"idiom" : "ipad",
"size" : "76x76",
"scale" : "1x"
},
{
"idiom" : "ipad",
"size" : "76x76",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

View File

@@ -0,0 +1,36 @@
{
"images" : [
{
"orientation" : "portrait",
"idiom" : "ipad",
"extent" : "full-screen",
"minimum-system-version" : "7.0",
"scale" : "1x"
},
{
"orientation" : "landscape",
"idiom" : "ipad",
"extent" : "full-screen",
"minimum-system-version" : "7.0",
"scale" : "1x"
},
{
"orientation" : "portrait",
"idiom" : "ipad",
"extent" : "full-screen",
"minimum-system-version" : "7.0",
"scale" : "2x"
},
{
"orientation" : "landscape",
"idiom" : "ipad",
"extent" : "full-screen",
"minimum-system-version" : "7.0",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

71
Example/Info-Mac.plist Normal file
View File

@@ -0,0 +1,71 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIconFile</key>
<string></string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleLocalizations</key>
<array>
<string>ar</string>
<string>arm</string>
<string>ca</string>
<string>cs</string>
<string>da</string>
<string>de</string>
<string>el</string>
<string>en</string>
<string>es</string>
<string>fi</string>
<string>fr</string>
<string>he</string>
<string>hu</string>
<string>id</string>
<string>it</string>
<string>ja</string>
<string>ko</string>
<string>ms</string>
<string>nb</string>
<string>nl</string>
<string>pl</string>
<string>pt-BR</string>
<string>pt</string>
<string>ro</string>
<string>ru</string>
<string>sk</string>
<string>sv</string>
<string>th</string>
<string>tr</string>
<string>vi</string>
<string>zh-Hans</string>
<string>zh-Hant</string>
</array>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>99</string>
<key>LSApplicationCategoryType</key>
<string>public.app-category.developer-tools</string>
<key>LSMinimumSystemVersion</key>
<string>$(MACOSX_DEPLOYMENT_TARGET)</string>
<key>NSHumanReadableCopyright</key>
<string>Copyright © 2014 Armchair. All rights reserved.</string>
<key>NSMainNibFile</key>
<string>MainMenu</string>
<key>NSPrincipalClass</key>
<string>NSApplication</string>
</dict>
</plist>

96
Example/Info-iOS.plist Normal file
View File

@@ -0,0 +1,96 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIcons</key>
<dict/>
<key>CFBundleIcons~ipad</key>
<dict/>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleLocalizations</key>
<array>
<string>ar</string>
<string>arm</string>
<string>ca</string>
<string>cs</string>
<string>da</string>
<string>de</string>
<string>el</string>
<string>en</string>
<string>es</string>
<string>fi</string>
<string>fr</string>
<string>he</string>
<string>hu</string>
<string>id</string>
<string>it</string>
<string>ja</string>
<string>ko</string>
<string>ms</string>
<string>nb</string>
<string>nl</string>
<string>pl</string>
<string>pt-BR</string>
<string>pt</string>
<string>ro</string>
<string>ru</string>
<string>sk</string>
<string>sv</string>
<string>th</string>
<string>tr</string>
<string>vi</string>
<string>zh-Hans</string>
<string>zh-Hant</string>
</array>
<key>CFBundleName</key>
<string>Armchair</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>99</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIMainStoryboardFile</key>
<string>Main</string>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
</array>
<key>UIStatusBarTintParameters</key>
<dict>
<key>UINavigationBar</key>
<dict>
<key>Style</key>
<string>UIBarStyleDefault</string>
<key>Translucent</key>
<false/>
</dict>
</dict>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
</dict>
</plist>

View File

@@ -0,0 +1,228 @@
// MasterViewController.swift
//
// Copyright (c) 2014 Armchair (http://github.com/UrbanApps/Armchair)
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
#if os(iOS)
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var languageLabel: UILabel!
}
#elseif os(OSX)
import Cocoa
class ViewController: NSViewController {
@IBOutlet weak var languageLabel: NSTextField!
}
#else
#endif
import Armchair
extension ViewController {
#if os(iOS)
override func viewDidLoad() {
setLanguageLabel()
}
#elseif os(OSX)
override func awakeFromNib() {
setLanguageLabel()
}
#else
#endif
func setLanguageLabel() {
var languageLabelText = ""
// Only set it if we are using Armchair localizations
if !Armchair.useMainAppBundleForLocalizations() {
let currentLocalization: NSString = NSBundle.mainBundle().preferredLocalizations[0] as NSString
// Only set it if we are using a different language than this apps development language
if let developmentLocalization = NSBundle.mainBundle().developmentLocalization {
if currentLocalization != developmentLocalization {
languageLabelText = currentLocalization as String
if let displayName = NSLocale(localeIdentifier: currentLocalization as String).displayNameForKey(NSLocaleIdentifier, value:currentLocalization) {
languageLabelText = "\(displayName): \(currentLocalization)"
}
}
}
}
#if os(iOS)
languageLabel.text = languageLabelText
#elseif os(OSX)
languageLabel.stringValue = languageLabelText
#else
#endif
}
@IBAction func presentStandardPrompt(_: AnyObject) {
resetAppReviewManager()
// The AppID is the only required setup
Armchair.appID(Pages)
// Debug means that it will popup on the next available change
Armchair.debugEnabled(true)
#if os(iOS)
// Explicitly disable the storeKit as the default may be true if on iOS 8
Armchair.opensInStoreKit(false)
#endif
// true here means it is ok to show, but it doesn't matter because we have debug on.
Armchair.userDidSignificantEvent(true)
}
@IBAction func presentCustomizedPrompt(_: AnyObject) {
resetAppReviewManager()
// The AppID is the only required setup
Armchair.appID(Pages)
// Debug means that it will popup on the next available change
Armchair.debugEnabled(true)
// This overrides the default value, read from your localized bundle plist
Armchair.appName("Pong")
// This overrides the default value, read from the UAAppReviewManager bundle plist
Armchair.reviewTitle("Rate This Shiz")
// This overrides the default value, read from the UAAppReviewManager bundle plist
Armchair.reviewMessage("Yo! I werked rly hard on this shiz yo, hit me up wit some good ratings yo!")
// This overrides the default value, read from the UAAppReviewManager bundle plist
Armchair.cancelButtonTitle("Nah, fool")
// This overrides the default value, read from the UAAppReviewManager bundle plist
Armchair.rateButtonTitle("Hell yeah!")
// This overrides the default value, read from the UAAppReviewManager bundle plist
Armchair.remindButtonTitle("Hit me up later...")
// This overrides the default value of 30, but it doesn't matter here because of Debug mode enabled
Armchair.daysUntilPrompt(420)
// This overrides the default value of 1, but it doesn't matter here because of Debug mode enabled
Armchair.daysBeforeReminding(187)
// This means that the popup won't show if you have already rated any version of the app, but it doesn't matter here because of Debug mode enabled
Armchair.shouldPromptIfRated(false)
// This overrides the default value of 20, but it doesn't matter here because of Debug mode enabled
Armchair.significantEventsUntilPrompt(99)
// This means that UAAppReviewManager won't track this version if it hasn't already, but it doesn't matter here because of Debug mode enabled
Armchair.tracksNewVersions(false)
// UAAppReviewManager comes with standard translations for dozens of Languages. If you want to provide your own translations instead,
// or you change the default title, message or button titles, set this to YES.
Armchair.useMainAppBundleForLocalizations(true)
#if os(iOS)
// Explicitly disable the storeKit as the default may be true if on iOS 8
Armchair.opensInStoreKit(false)
// This sets a custom tint color (applies only to UIAlertController).
Armchair.tintColor(UIColor.brownColor())
#endif
// This sets the Affiliate code you want to use, but is not required.
Armchair.affiliateCode("11l7j9")
// This sets the Affiliate campaign code for tracking, but is not required.
Armchair.affiliateCampaignCode("Armchair-ExampleApp")
// Armchair is block based, so setup some blocks on events
Armchair.onDidDeclineToRate() { print("[Example App] The user just declined to rate") }
Armchair.onDidDisplayAlert() { print("[Example App] We just displayed the rating prompt") }
Armchair.onDidOptToRate() { print("[Example App] The user just opted to rate") }
Armchair.onDidOptToRemindLater({ print("[Example App] The user just opted to remind later") })
#if os(iOS)
Armchair.onWillPresentModalView({ print("[Example App] About to present the modal view. Animated: \($0)") })
Armchair.onDidDismissModalView({ print("[Example App] Just dismissed the modal view. Animated: \($0)") })
#endif
// Armchair has sensible defaults for the NSUserDefault keys it uses, but you can customize that here
Armchair.setKey("kSettingsSignificantEventTally", armchairKeyType: ArmchairKey.SignificantEventCount)
// You can also call it with a block to circumvent any of Armchair should rate logic.
Armchair.userDidSignificantEvent({
(trackingInfo: ArmchairTrackingInfo) -> (Bool) in
// the trackingInfo.info dictionary has all the keys/value Armchair uses to determine whether or not to show a prompt
print("[Example App] \(trackingInfo)")
return true
})
// Or you can set a global one to get one last chance to stop the prompt, or do your own logic
Armchair.shouldPromptClosure({
(trackingInfo: ArmchairTrackingInfo) -> (Bool) in
// the trackingInfo.info dictionary has all the keys/value Armchair uses to determine whether or not to show a prompt
// This will be called once all other rating conditions have been met, but before the prompt.
// If a local ArmchairShouldPromptClosure is called using the local methods, (like immediately above)
// this will not be called.
//
// Return true to allow the prompt, false to stop the presentation.
return true
})
}
#if os(iOS)
@IBAction func presentStoreKitPrompt(_: AnyObject) {
resetAppReviewManager()
// The AppID is the only required setup
Armchair.appID(Pages)
// Debug means that it will popup on the next available change
Armchair.debugEnabled(true)
// This overrides the default of NO in iOS 7. Instead of going to the review page in the App Store App,
// the user goes to the main page of the app, in side of this app. Downsides are that it doesn't go directly to
// reviews and doesn't take affiliate codes
Armchair.opensInStoreKit(true)
// If you are opening in StoreKit, you can change whether or not to animated the push of the View Controller
Armchair.usesAnimation(true)
// true here means it is ok to show, but it doesn't matter because we have debug on.
Armchair.userDidSignificantEvent(true)
}
#endif
func resetAppReviewManager() {
Armchair.resetDefaults()
}
@IBAction func openUrbanApps(_: AnyObject) {
if let url = NSURL(string: "http://urbanapps.com") {
#if os(iOS)
UIApplication.sharedApplication().openURL(url)
#elseif os(OSX)
NSWorkspace.sharedWorkspace().openURL(url)
#else
#endif
}
}
}

BIN
Example/armchair.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 257 KiB

View File

@@ -0,0 +1,73 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="6246" systemVersion="13E28" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="ekE-KZ-IOg">
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="6239"/>
</dependencies>
<scenes>
<!--View Controller-->
<scene sceneID="GLt-TA-m7w">
<objects>
<viewController id="ekE-KZ-IOg" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="gfL-jH-trc"/>
<viewControllerLayoutGuide type="bottom" id="mJm-h3-k3T"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="Gaw-FT-LdY">
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<imageView userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="armchair.jpg" translatesAutoresizingMaskIntoConstraints="NO" id="PMt-XF-iHa">
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
</imageView>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="d2Y-oX-pAK">
<rect key="frame" x="20" y="40" width="560" height="100"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="ARMCHAIR" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="geY-Mg-MpD">
<rect key="frame" x="156" y="10" width="248" height="51"/>
<fontDescription key="fontDescription" name="AmericanTypewriter-Light" family="American Typewriter" pointSize="44"/>
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<color key="backgroundColor" white="1" alpha="0.20000000000000001" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstAttribute="centerX" secondItem="geY-Mg-MpD" secondAttribute="centerX" id="6O4-RW-9TZ"/>
<constraint firstAttribute="width" constant="568" id="6pU-vO-kvt"/>
<constraint firstAttribute="height" constant="100" id="ao3-y6-czE"/>
<constraint firstAttribute="height" relation="greaterThanOrEqual" constant="100" id="f6k-1p-SZY"/>
<constraint firstItem="geY-Mg-MpD" firstAttribute="top" secondItem="d2Y-oX-pAK" secondAttribute="top" constant="10" id="g4t-hY-e27"/>
</constraints>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
<integer key="value" value="8"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
<variation key="default">
<mask key="constraints">
<exclude reference="6pU-vO-kvt"/>
</mask>
</variation>
</view>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstItem="d2Y-oX-pAK" firstAttribute="width" secondItem="Gaw-FT-LdY" secondAttribute="width" constant="-40" id="5Dw-1T-0EN"/>
<constraint firstItem="PMt-XF-iHa" firstAttribute="width" secondItem="Gaw-FT-LdY" secondAttribute="width" id="FOV-sF-E7h"/>
<constraint firstAttribute="centerX" secondItem="d2Y-oX-pAK" secondAttribute="centerX" id="XSm-PT-Kic"/>
<constraint firstItem="PMt-XF-iHa" firstAttribute="height" secondItem="Gaw-FT-LdY" secondAttribute="height" id="g5v-Su-tKv"/>
<constraint firstAttribute="centerY" secondItem="PMt-XF-iHa" secondAttribute="centerY" id="tq4-Lo-g9v"/>
<constraint firstAttribute="centerX" secondItem="PMt-XF-iHa" secondAttribute="centerX" id="vKV-nj-bCA"/>
<constraint firstItem="d2Y-oX-pAK" firstAttribute="top" secondItem="gfL-jH-trc" secondAttribute="bottom" constant="20" id="ywk-Yl-ecv"/>
</constraints>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="vtb-BQ-XAg" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="806" y="152"/>
</scene>
</scenes>
<resources>
<image name="armchair.jpg" width="800" height="736"/>
</resources>
</document>

View File

@@ -0,0 +1,162 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="6245" systemVersion="13E28" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="d2j-86-NpT">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="6238"/>
<capability name="Constraints to layout margins" minToolsVersion="6.0"/>
</dependencies>
<scenes>
<!--View Controller-->
<scene sceneID="j5w-HN-cOS">
<objects>
<viewController id="d2j-86-NpT" customClass="ViewController" customModule="iOS_Example" customModuleProvider="target" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="jBK-Sp-EmM"/>
<viewControllerLayoutGuide type="bottom" id="MVO-Fx-XzJ"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="mCe-MJ-dGn">
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<imageView userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="armchair.jpg" translatesAutoresizingMaskIntoConstraints="NO" id="pjK-Zp-UbQ">
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
</imageView>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="p7K-BU-wrj">
<rect key="frame" x="20" y="40" width="560" height="100"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="ARMCHAIR" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="XVe-fD-yl8">
<rect key="frame" x="156" y="10" width="248" height="51"/>
<fontDescription key="fontDescription" name="AmericanTypewriter-Light" family="American Typewriter" pointSize="44"/>
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<nil key="highlightedColor"/>
</label>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="5ex-RA-hKB">
<rect key="frame" x="343" y="64" width="61" height="28"/>
<fontDescription key="fontDescription" name="AmericanTypewriter-Light" family="American Typewriter" pointSize="14"/>
<state key="normal" title="Store-Kit">
<color key="titleShadowColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</state>
<connections>
<action selector="presentStoreKitPrompt:" destination="d2j-86-NpT" eventType="touchUpInside" id="Jl4-Qp-pVB"/>
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="94v-di-Sgl">
<rect key="frame" x="156" y="64" width="62" height="28"/>
<fontDescription key="fontDescription" name="AmericanTypewriter-Light" family="American Typewriter" pointSize="14"/>
<state key="normal" title="Standard">
<color key="titleShadowColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</state>
<connections>
<action selector="presentStandardPrompt:" destination="d2j-86-NpT" eventType="touchUpInside" id="reN-Av-qJg"/>
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="1cx-Uc-icC">
<rect key="frame" x="240" y="64" width="79" height="28"/>
<fontDescription key="fontDescription" name="AmericanTypewriter-Light" family="American Typewriter" pointSize="14"/>
<state key="normal" title="Customized">
<color key="titleShadowColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</state>
<connections>
<action selector="presentCustomizedPrompt:" destination="d2j-86-NpT" eventType="touchUpInside" id="ktB-ju-xvH"/>
</connections>
</button>
</subviews>
<color key="backgroundColor" white="1" alpha="0.20000000000000001" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstItem="94v-di-Sgl" firstAttribute="leading" secondItem="XVe-fD-yl8" secondAttribute="leading" id="6dM-Hy-V73"/>
<constraint firstItem="94v-di-Sgl" firstAttribute="bottom" secondItem="p7K-BU-wrj" secondAttribute="bottom" constant="-8" id="8fR-Kg-3vc"/>
<constraint firstAttribute="centerX" secondItem="1cx-Uc-icC" secondAttribute="centerX" constant="0.5" id="9bJ-qD-QXL"/>
<constraint firstAttribute="height" constant="100" id="JBv-8P-khM"/>
<constraint firstItem="XVe-fD-yl8" firstAttribute="trailing" secondItem="5ex-RA-hKB" secondAttribute="trailing" id="S0J-cg-KYM"/>
<constraint firstAttribute="centerX" secondItem="XVe-fD-yl8" secondAttribute="centerX" id="Wfm-fh-DS2"/>
<constraint firstAttribute="width" constant="568" id="YGh-wE-w7J"/>
<constraint firstAttribute="trailing" secondItem="5ex-RA-hKB" secondAttribute="trailing" constant="8" id="Yca-YH-Ux2"/>
<constraint firstItem="XVe-fD-yl8" firstAttribute="top" secondItem="p7K-BU-wrj" secondAttribute="top" constant="10" id="hUJ-7i-QXl"/>
<constraint firstItem="5ex-RA-hKB" firstAttribute="bottom" secondItem="p7K-BU-wrj" secondAttribute="bottom" constant="-8" id="lTG-a9-uaN"/>
<constraint firstItem="94v-di-Sgl" firstAttribute="leading" secondItem="p7K-BU-wrj" secondAttribute="leading" constant="8" id="ulR-E3-LFb"/>
<constraint firstAttribute="bottom" secondItem="1cx-Uc-icC" secondAttribute="bottom" constant="8" id="xK7-bN-m4S"/>
</constraints>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
<integer key="value" value="8"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
<variation key="default">
<mask key="constraints">
<exclude reference="YGh-wE-w7J"/>
<exclude reference="ulR-E3-LFb"/>
<exclude reference="Yca-YH-Ux2"/>
</mask>
</variation>
</view>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="aGK-R4-nip">
<rect key="frame" x="260" y="576" width="80" height="16"/>
<constraints>
<constraint firstAttribute="height" constant="16" id="4bP-kT-OTg"/>
<constraint firstAttribute="width" constant="80" id="68m-Sb-pvw"/>
</constraints>
<state key="normal" image="logo.png" backgroundImage="logo.png">
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
</state>
<connections>
<action selector="openUrbanApps:" destination="d2j-86-NpT" eventType="touchUpInside" id="gm5-65-hdf"/>
</connections>
</button>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Language Label" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="cRH-yo-5R5">
<rect key="frame" x="255" y="148" width="90" height="14"/>
<fontDescription key="fontDescription" name="AmericanTypewriter" family="American Typewriter" pointSize="12"/>
<color key="textColor" red="1" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<constraints>
<constraint firstItem="aGK-R4-nip" firstAttribute="centerX" secondItem="p7K-BU-wrj" secondAttribute="centerX" id="0zC-Sb-exW"/>
<constraint firstItem="pjK-Zp-UbQ" firstAttribute="leading" secondItem="mCe-MJ-dGn" secondAttribute="leadingMargin" constant="-16" id="1PY-yN-plZ"/>
<constraint firstItem="MVO-Fx-XzJ" firstAttribute="top" secondItem="aGK-R4-nip" secondAttribute="bottom" constant="8" symbolic="YES" id="7FD-1f-35C"/>
<constraint firstAttribute="centerX" secondItem="p7K-BU-wrj" secondAttribute="centerX" id="94T-zn-nPn"/>
<constraint firstAttribute="centerY" secondItem="pjK-Zp-UbQ" secondAttribute="centerY" id="9s8-qH-i1P"/>
<constraint firstItem="pjK-Zp-UbQ" firstAttribute="height" secondItem="mCe-MJ-dGn" secondAttribute="height" id="JIc-fT-UjL"/>
<constraint firstAttribute="centerY" secondItem="p7K-BU-wrj" secondAttribute="centerY" constant="244" id="JwD-6n-gDl"/>
<constraint firstItem="cRH-yo-5R5" firstAttribute="top" secondItem="p7K-BU-wrj" secondAttribute="bottom" constant="8" id="QNw-JV-8Hj"/>
<constraint firstAttribute="centerX" secondItem="pjK-Zp-UbQ" secondAttribute="centerX" id="SKh-dx-lMw"/>
<constraint firstAttribute="trailingMargin" secondItem="pjK-Zp-UbQ" secondAttribute="trailing" constant="-16" id="Wco-iZ-WK3"/>
<constraint firstItem="pjK-Zp-UbQ" firstAttribute="width" secondItem="mCe-MJ-dGn" secondAttribute="width" id="X4I-1D-UFn"/>
<constraint firstAttribute="height" secondItem="pjK-Zp-UbQ" secondAttribute="height" id="Xex-NE-7OZ"/>
<constraint firstAttribute="centerX" secondItem="cRH-yo-5R5" secondAttribute="centerX" id="dcA-rF-XxK"/>
<constraint firstItem="pjK-Zp-UbQ" firstAttribute="top" secondItem="jBK-Sp-EmM" secondAttribute="bottom" constant="-20" id="edj-sT-3H0"/>
<constraint firstItem="MVO-Fx-XzJ" firstAttribute="top" secondItem="pjK-Zp-UbQ" secondAttribute="bottom" id="fbb-mU-rbb"/>
<constraint firstItem="p7K-BU-wrj" firstAttribute="trailing" secondItem="mCe-MJ-dGn" secondAttribute="trailingMargin" id="jfw-jd-DBJ"/>
<constraint firstItem="p7K-BU-wrj" firstAttribute="leading" secondItem="mCe-MJ-dGn" secondAttribute="leadingMargin" id="jku-or-cjG"/>
<constraint firstItem="p7K-BU-wrj" firstAttribute="top" secondItem="jBK-Sp-EmM" secondAttribute="bottom" constant="20" id="pyj-Pq-F78"/>
<constraint firstItem="p7K-BU-wrj" firstAttribute="top" secondItem="jBK-Sp-EmM" secondAttribute="bottom" constant="20" id="t4x-qR-OlB"/>
<constraint firstAttribute="width" secondItem="p7K-BU-wrj" secondAttribute="width" constant="40" id="u3a-GZ-en3"/>
</constraints>
<variation key="default">
<mask key="constraints">
<exclude reference="1PY-yN-plZ"/>
<exclude reference="Wco-iZ-WK3"/>
<exclude reference="Xex-NE-7OZ"/>
<exclude reference="edj-sT-3H0"/>
<exclude reference="JwD-6n-gDl"/>
<exclude reference="jfw-jd-DBJ"/>
<exclude reference="jku-or-cjG"/>
<exclude reference="t4x-qR-OlB"/>
<exclude reference="fbb-mU-rbb"/>
</mask>
</variation>
</view>
<navigationItem key="navigationItem" id="lJo-8x-S3p"/>
<connections>
<outlet property="languageLabel" destination="cRH-yo-5R5" id="adV-Qt-4rt"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="hXP-CJ-uQp" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="647" y="-932"/>
</scene>
</scenes>
<resources>
<image name="armchair.jpg" width="800" height="736"/>
<image name="logo.png" width="1480" height="306"/>
</resources>
<color key="tintColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</document>

BIN
Example/icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 256 KiB

BIN
Example/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

13
Example/main.m Normal file
View File

@@ -0,0 +1,13 @@
//
// main.m
// Mac Example
//
// Created by Matt Coneybeare on 9/15/14.
// Copyright (c) 2014 Armchair. All rights reserved.
//
#import <Cocoa/Cocoa.h>
int main(int argc, const char * argv[]) {
return NSApplicationMain(argc, argv);
}

19
LICENSE Normal file
View File

@@ -0,0 +1,19 @@
Copyright (c) 2014 Armchair (http://github.com/UrbanApps/Armchair)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

View File

@@ -0,0 +1,4 @@
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "إذا كنت تتمتع بإستخدام %@ . اذا هل تمانع بأخذ لحظة لتقيمة؟ فإن ذلك لن يستغرق أكثر من دقيقة واحدة, شكرا لدعمك";
"Rate %@" = "%@ قيم";
"No, Thanks" = "لا, شكرا";
"Remind me later" = "ذكرنى فيما بعد";

View File

@@ -0,0 +1,4 @@
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Եթե Դուք հաճույքով եք օգտագործում %@-ը, դեմ չե՞ք լինի տրամադրել մեկ րոպե այն գնահատելու համար: Այն չի պահանջի ձեզանից ավելի քան մեկ րոպե: Շնորհակալություն աջակցության համար:";
"Rate %@" = "Գնահատել %@-ը";
"No, Thanks" = "Ոչ, շնորհակալություն";
"Remind me later" = "Հիշեցնել ավելի ուշ";

View File

@@ -0,0 +1,4 @@
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Si li agrada utilitzar %@, li importaria prendres un moment per a valorar-lo? No trigarà més dun minut. Gràcies por la seva col·laboració!";
"Rate %@" = "Valorar %@";
"No, Thanks" = "No, gràcies";
"Remind me later" = "Recordar-mho més tard";

View File

@@ -0,0 +1,4 @@
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Pokud se Vám aplikace %@ líbí, mohli byste ji prosím ohodnotit v App Store? Zabere to jen chvilku. Díky za Vaši podporu!";
"Rate %@" = "Ohodnotit %@";
"No, Thanks" = "Ne, díky";
"Remind me later" = "Možná později";

View File

@@ -0,0 +1,4 @@
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Hvis du synes om at bruge %@, vil vi gerne bede dig om at give en kort bedømmelse af app'en. Det tager kun et enkelt minut. Tak for din hjælp!";
"Rate %@" = "Bedøm %@";
"No, Thanks" = "Nej tak";
"Remind me later" = "Spørg mig senere";

View File

@@ -0,0 +1,4 @@
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Sie nutzen %@ gerne? Dann nehmen Sie sich bitte für eine Bewertung einen Moment Zeit! Es dauert nicht länger als eine Minute. Vielen Dank!";
"Rate %@" = "Bewerte %@";
"No, Thanks" = "Nein, danke";
"Remind me later" = "Später erinnern";

View File

@@ -0,0 +1,4 @@
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Αν σου αρέσει το %@, θα μπορούσες να αφιερώσεις μια στιγμή για να το βαθμολογήσεις; Η διαδικασία είναι πολύ σύντομη. Ευχαριστούμε για τη στήριξη!";
"Rate %@" = "Βαθμολόγηση του %@";
"No, Thanks" = "Όχι, ευχαριστώ";
"Remind me later" = "Υπενθύμιση αργότερα";

View File

@@ -0,0 +1,4 @@
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!";
"Rate %@" = "Rate %@";
"No, Thanks" = "No, thanks";
"Remind me later" = "Remind me later";

View File

@@ -0,0 +1,4 @@
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Si le gusta utilizar %@, ¿le importaría valorarlo? No le llevará más de un minuto. ¡Gracias por su colaboración!";
"Rate %@" = "Valorar %@";
"No, Thanks" = "No, gracias";
"Remind me later" = "Recordar más tarde";

View File

@@ -0,0 +1,4 @@
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Jos käytät mielelläsi %@, voisitko käyttää hetken ja arvostella sen? Se ei kestä minuuttia kauempaa. Kiitos tuestasi!";
"Rate %@" = "Arvioi %@";
"No, Thanks" = "Ei kiitos";
"Remind me later" = "Muistuta minua myöhemmin";

View File

@@ -0,0 +1,4 @@
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Si vous aimez %@, voulez-vous prendre un moment pour l'évaluer ? Cela ne vous prendra pas plus d'une minute. Merci de votre soutien !";
"Rate %@" = "Évaluer %@";
"No, Thanks" = "Non, merci";
"Remind me later" = "Me rappeler plus tard";

View File

@@ -0,0 +1,4 @@
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "אם נהנת להשתמש ב %@, האם תסכים לדרג אותה? זה לא יקח יותר מדקה. תודה על התמיכה!";
"Rate %@" = "דרג את %@";
"No, Thanks" = "לא תודה";
"Remind me later" = "מאוחר יותר";

View File

@@ -0,0 +1,4 @@
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Ha tetszik a %@, ne felejtsd el értékelni az App Store-ban! Csak egy perc az egész. Köszönet a támogatásért!";
"Rate %@" = "%@ értékelése";
"No, Thanks" = "Most inkább nem";
"Remind me later" = "Emlékeztess később";

View File

@@ -0,0 +1,4 @@
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Jika anda menyukai %@, maukah anda memberikan rating kepada aplikasi ini? Rating hanya memakan waktu kurang dari 1 menit. Terimakasih untuk dukungan anda!";
"Rate %@" = "Rating %@";
"No, Thanks" = "Tidak, terimakasih";
"Remind me later" = "Silakan ingatkan saya lagi";

View File

@@ -0,0 +1,4 @@
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Se ti piace %@, perché non dedichi qualche istante a darne una valutazione sull'App Store? Non richiederà più di un minuto. Grazie per il supporto!";
"Rate %@" = "Valuta %@";
"No, Thanks" = "No, grazie";
"Remind me later" = "Ricordamelo più tardi";

View File

@@ -0,0 +1,4 @@
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "楽しんでいただけたならば簡単なご意見をお願いします。%@を評価しますか?";
"Rate %@" = "%@の評価";
"No, Thanks" ="いいえ";
"Remind me later" = "後で見る";

View File

@@ -0,0 +1,4 @@
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "%@ 사용이 맘에 드셨나요? 잠시만 시간을 내서 평가를 부탁드리겠습니다. 감사합니다!";
"Rate %@" = "%@ 평가하기";
"No, Thanks" = "평가하지 않겠습니다";
"Remind me later" = "다음에 평가하겠습니다";

View File

@@ -0,0 +1,4 @@
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Jika anda suka %@, bolehkah luangkan sedikit masa untuk beri penarafan? Tak sampai seminit pun. Terima kasih atas sokongan anda!";
"Rate %@" = "Tarafkan %@";
"No, Thanks" = "Terima kasih saja";
"Remind me later" = "Ingatkan saya lain kali";

View File

@@ -0,0 +1,4 @@
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Hvis du liker å bruke %@, kan du ta deg et øyeblikk for å vurdere den? Det vil ikke ta mer enn ett minutt. Takk for din støtte!";
"Rate %@" = "Vurder %@";
"No, Thanks" = "Nei, takk";
"Remind me later" = "Påminn meg senere";

View File

@@ -0,0 +1,4 @@
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Als het gebruik van %@ je bevalt, zou je dan een momentje de tijd willen nemen om het te beoordelen? Het duurt nog geen minuut. Bedankt voor je steun!";
"Rate %@" = "%@ beoordelen";
"No, Thanks" = "Nee, bedankt";
"Remind me later" = "Herinner me er later aan";

View File

@@ -0,0 +1,4 @@
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Jeżeli podoba Ci się korzystanie z %@, może zechciałbyś poświęcić chwilę czasu, aby ocenić aplikację? Nie zajmie Ci to więcej niż minutę. Dziękujemy za pomoc!";
"Rate %@" = "Oceń %@";
"No, Thanks" = "Nie, dziękuję";
"Remind me later" = "Przypomnij później";

View File

@@ -0,0 +1,4 @@
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Se você gosta de usar o %@, que tal avaliá-lo? Não levará mais de um minuto. Agradecemos o seu apoio!";
"Rate %@" = "Avaliar o %@";
"No, Thanks" = "Não, obrigado";
"Remind me later" = "Mais tarde";

View File

@@ -0,0 +1,4 @@
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Se você gosta de usar o %@, que tal avaliá-lo? Não levará mais de um minuto. Agradecemos o seu apoio!";
"Rate %@" = "Avaliar o %@";
"No, Thanks" = "Não, obrigado";
"Remind me later" = "Mais tarde";

View File

@@ -0,0 +1,4 @@
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Dacă îți place %@, acordă-i o notă te rog, nu durează mult. Mulțumim pentru susținere!";
"Rate %@" = "Acordă notă pentru %@";
"No, Thanks" = "Nu, mulțumesc";
"Remind me later" = "Adu-mi aminte mai târziu";

View File

@@ -0,0 +1,4 @@
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Если Вам нравится %@, пожалуйста, поставьте свою оценку. Это займет у Вас не больше одной минуты.\n Спасибо за поддержку!";
"Rate %@" = "Оценить %@";
"No, Thanks" = "Нет, спасибо";
"Remind me later" = "Напомнить позже";

View File

@@ -0,0 +1,4 @@
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Pokiaľ sa Vám páči aplikácia %@, mohli by ste ju prosím ohodnotiť v App Store? Zaberie to len chvíľu. Vďaka za Vašu podporu!";
"Rate %@" = "Ohodnotiť %@";
"No, Thanks" = "Nie, ďakujem";
"Remind me later" = "Pripomenúť neskôr";

View File

@@ -0,0 +1,4 @@
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Om du gillar att använda %@, kan du tänka dig att betygsätta det åt oss? Det tar bara en minut. Tack för hjälpen!";
"Rate %@" = "Betygsätt %@";
"No, Thanks" = "Nej tack";
"Remind me later" = "Påminn mig senare";

View File

@@ -0,0 +1,4 @@
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "ถ้าคุณกำลังใช้ %@ โปรดสละเวลาสักครู่ในการให้อันดับแก่เรา คุณจะเสียเวลาไม่เกินหนึ่งนาที ขอบคุณสำหรับการสนับสนุน!";
"Rate %@" = "ให้อันดับ %@";
"No, Thanks" = "ไม่ ขอบคุณ";
"Remind me later" = "เตือนฉันภายหลัง";

View File

@@ -0,0 +1,4 @@
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Eğer %@ uygulamasını kullanmaktan keyif alıyorsanız, onu değerlendirmek için zaman ayırabilir misiniz? Desteğiniz için teşekkür ederiz!";
"Rate %@" = "%@ uygulamasını değerlendir";
"No, Thanks" = "Hayır, teşekkürler";
"Remind me later" = "Daha sonra hatırlat";

View File

@@ -0,0 +1,4 @@
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Cảm ơn bạn đã sử dụng ứng dụng %@ trong thời gian qua, bạn có thể dành chút thời gian để đánh giá ứng dụng trong AppStore không? Sẽ không mất quá 1 phút nhưng chúng tôi rất trân trọng điều đó!"
"Rate %@" = "Đánh giá %@";
"No, Thanks" = "Không, xin cảm ơn";
"Remind me later" = "Hãy nhắc nhở tôi sau";

View File

@@ -0,0 +1,4 @@
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "如果你喜欢使用%@,你介意花一点时间给它评分吗?不会超过一分钟。感谢您的支持!";
"Rate %@" = "给%@评分";
"No, Thanks" = "不,谢谢";
"Remind me later" = "稍后提醒我";

View File

@@ -0,0 +1,4 @@
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "如果你喜歡使用%@,你介意花一點時間給它評分嗎?不會超過一分鐘。感謝您的支持!";
"Rate %@" = "給%@評分";
"No, Thanks" = "不,謝謝";
"Remind me later" = "稍後提醒我";

View File

@@ -0,0 +1,421 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 46;
objects = {
/* Begin PBXBuildFile section */
E60FA7C019C908FE00179D70 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = E60FA7BF19C908FE00179D70 /* AppDelegate.swift */; };
E60FA7F119C90C7D00179D70 /* armchair.jpg in Resources */ = {isa = PBXBuildFile; fileRef = E60FA7E819C90C7D00179D70 /* armchair.jpg */; };
E60FA7F419C90C7D00179D70 /* Icon.png in Resources */ = {isa = PBXBuildFile; fileRef = E60FA7EE19C90C7D00179D70 /* Icon.png */; };
E60FA7F519C90C7D00179D70 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = E60FA7EF19C90C7D00179D70 /* Images.xcassets */; };
E60FA80519C90D8F00179D70 /* Armchair.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E60FA80019C90D3500179D70 /* Armchair.framework */; };
E60FA80A19C9123800179D70 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E60FA80919C9123800179D70 /* ViewController.swift */; };
E60FA81319C9172A00179D70 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = E60FA81119C9172A00179D70 /* MainMenu.xib */; };
E60FA81619C91FA300179D70 /* logo.png in Resources */ = {isa = PBXBuildFile; fileRef = E60FA81519C91FA300179D70 /* logo.png */; };
E6F6159E19CA008E00C0B51C /* Armchair.bundle in Resources */ = {isa = PBXBuildFile; fileRef = E6F6159819CA003600C0B51C /* Armchair.bundle */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
E60FA7FD19C90D3500179D70 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = E60FA7F719C90D3500179D70 /* Armchair.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = E6D8B8B519C7274F001AD043;
remoteInfo = Armchair;
};
E60FA7FF19C90D3500179D70 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = E60FA7F719C90D3500179D70 /* Armchair.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = E6D8B8F919C756A4001AD043;
remoteInfo = ArmchairMac;
};
E60FA80119C90D3500179D70 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = E60FA7F719C90D3500179D70 /* Armchair.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = E6D8B92819C880A9001AD043;
remoteInfo = ArmchairTests;
};
E60FA80319C90D7100179D70 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = E60FA7F719C90D3500179D70 /* Armchair.xcodeproj */;
proxyType = 1;
remoteGlobalIDString = E6D8B8EF19C756A4001AD043;
remoteInfo = ArmchairMac;
};
E6F6156819C9FE8900C0B51C /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = E60FA7F719C90D3500179D70 /* Armchair.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = E6A0AF6519C9CFF400C3A7DC;
remoteInfo = ArmchairLocalizable;
};
E6F6159719CA003600C0B51C /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = E60FA7F719C90D3500179D70 /* Armchair.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = E6F6159419C9FFDA00C0B51C;
remoteInfo = ArmchairLocalizableMac;
};
E6F6159919CA003A00C0B51C /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = E60FA7F719C90D3500179D70 /* Armchair.xcodeproj */;
proxyType = 1;
remoteGlobalIDString = E6F6156D19C9FFDA00C0B51C;
remoteInfo = ArmchairLocalizableMac;
};
/* End PBXContainerItemProxy section */
/* Begin PBXFileReference section */
E60FA7BA19C908FE00179D70 /* Mac Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Mac Example.app"; sourceTree = BUILT_PRODUCTS_DIR; };
E60FA7BF19C908FE00179D70 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = AppDelegate.swift; path = Example/AppDelegate.swift; sourceTree = "<group>"; };
E60FA7E819C90C7D00179D70 /* armchair.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; name = armchair.jpg; path = Example/armchair.jpg; sourceTree = SOURCE_ROOT; };
E60FA7EE19C90C7D00179D70 /* Icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon.png; path = Example/Icon.png; sourceTree = SOURCE_ROOT; };
E60FA7EF19C90C7D00179D70 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = Example/Images.xcassets; sourceTree = SOURCE_ROOT; };
E60FA7F019C90C7D00179D70 /* Info-Mac.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = "Info-Mac.plist"; path = "Example/Info-Mac.plist"; sourceTree = SOURCE_ROOT; };
E60FA7F719C90D3500179D70 /* Armchair.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = Armchair.xcodeproj; sourceTree = "<group>"; };
E60FA80919C9123800179D70 /* ViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ViewController.swift; path = Example/ViewController.swift; sourceTree = "<group>"; };
E60FA81219C9172A00179D70 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Example/Base.lproj/MainMenu.xib; sourceTree = SOURCE_ROOT; };
E60FA81519C91FA300179D70 /* logo.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = logo.png; path = Example/logo.png; sourceTree = SOURCE_ROOT; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
E60FA7B719C908FE00179D70 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
E60FA80519C90D8F00179D70 /* Armchair.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
E60FA7B119C908FE00179D70 = {
isa = PBXGroup;
children = (
E60FA7E319C909D100179D70 /* Source */,
E60FA7F719C90D3500179D70 /* Armchair.xcodeproj */,
E60FA7BA19C908FE00179D70 /* Mac Example.app */,
);
sourceTree = "<group>";
};
E60FA7BC19C908FE00179D70 /* Supporting Files */ = {
isa = PBXGroup;
children = (
E60FA81119C9172A00179D70 /* MainMenu.xib */,
E60FA7E819C90C7D00179D70 /* armchair.jpg */,
E60FA7EE19C90C7D00179D70 /* Icon.png */,
E60FA81519C91FA300179D70 /* logo.png */,
E60FA7EF19C90C7D00179D70 /* Images.xcassets */,
E60FA7F019C90C7D00179D70 /* Info-Mac.plist */,
);
name = "Supporting Files";
path = "Mac Example";
sourceTree = "<group>";
};
E60FA7E319C909D100179D70 /* Source */ = {
isa = PBXGroup;
children = (
E60FA7BF19C908FE00179D70 /* AppDelegate.swift */,
E60FA80919C9123800179D70 /* ViewController.swift */,
E60FA7BC19C908FE00179D70 /* Supporting Files */,
);
name = Source;
sourceTree = "<group>";
};
E60FA7F819C90D3500179D70 /* Products */ = {
isa = PBXGroup;
children = (
E60FA7FE19C90D3500179D70 /* Armchair.framework */,
E60FA80019C90D3500179D70 /* Armchair.framework */,
E6F6156919C9FE8900C0B51C /* Armchair.bundle */,
E6F6159819CA003600C0B51C /* Armchair.bundle */,
E60FA80219C90D3500179D70 /* ArmchairTests.xctest */,
);
name = Products;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
E60FA7B919C908FE00179D70 /* Mac Example */ = {
isa = PBXNativeTarget;
buildConfigurationList = E60FA7D419C908FE00179D70 /* Build configuration list for PBXNativeTarget "Mac Example" */;
buildPhases = (
E60FA7B619C908FE00179D70 /* Sources */,
E60FA7B719C908FE00179D70 /* Frameworks */,
E60FA7B819C908FE00179D70 /* Resources */,
);
buildRules = (
);
dependencies = (
E60FA80419C90D7100179D70 /* PBXTargetDependency */,
E6F6159A19CA003A00C0B51C /* PBXTargetDependency */,
);
name = "Mac Example";
productName = "Mac Example";
productReference = E60FA7BA19C908FE00179D70 /* Mac Example.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
E60FA7B219C908FE00179D70 /* Project object */ = {
isa = PBXProject;
attributes = {
LastSwiftUpdateCheck = 0700;
LastUpgradeCheck = 0700;
ORGANIZATIONNAME = Armchair;
TargetAttributes = {
E60FA7B919C908FE00179D70 = {
CreatedOnToolsVersion = 6.1;
};
};
};
buildConfigurationList = E60FA7B519C908FE00179D70 /* Build configuration list for PBXProject "Mac Example" */;
compatibilityVersion = "Xcode 3.2";
developmentRegion = English;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
mainGroup = E60FA7B119C908FE00179D70;
productRefGroup = E60FA7B119C908FE00179D70;
projectDirPath = "";
projectReferences = (
{
ProductGroup = E60FA7F819C90D3500179D70 /* Products */;
ProjectRef = E60FA7F719C90D3500179D70 /* Armchair.xcodeproj */;
},
);
projectRoot = "";
targets = (
E60FA7B919C908FE00179D70 /* Mac Example */,
);
};
/* End PBXProject section */
/* Begin PBXReferenceProxy section */
E60FA7FE19C90D3500179D70 /* Armchair.framework */ = {
isa = PBXReferenceProxy;
fileType = wrapper.framework;
path = Armchair.framework;
remoteRef = E60FA7FD19C90D3500179D70 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
E60FA80019C90D3500179D70 /* Armchair.framework */ = {
isa = PBXReferenceProxy;
fileType = wrapper.framework;
path = Armchair.framework;
remoteRef = E60FA7FF19C90D3500179D70 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
E60FA80219C90D3500179D70 /* ArmchairTests.xctest */ = {
isa = PBXReferenceProxy;
fileType = wrapper.cfbundle;
path = ArmchairTests.xctest;
remoteRef = E60FA80119C90D3500179D70 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
E6F6156919C9FE8900C0B51C /* Armchair.bundle */ = {
isa = PBXReferenceProxy;
fileType = wrapper.cfbundle;
path = Armchair.bundle;
remoteRef = E6F6156819C9FE8900C0B51C /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
E6F6159819CA003600C0B51C /* Armchair.bundle */ = {
isa = PBXReferenceProxy;
fileType = wrapper.cfbundle;
path = Armchair.bundle;
remoteRef = E6F6159719CA003600C0B51C /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
/* End PBXReferenceProxy section */
/* Begin PBXResourcesBuildPhase section */
E60FA7B819C908FE00179D70 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
E6F6159E19CA008E00C0B51C /* Armchair.bundle in Resources */,
E60FA7F419C90C7D00179D70 /* Icon.png in Resources */,
E60FA81619C91FA300179D70 /* logo.png in Resources */,
E60FA81319C9172A00179D70 /* MainMenu.xib in Resources */,
E60FA7F519C90C7D00179D70 /* Images.xcassets in Resources */,
E60FA7F119C90C7D00179D70 /* armchair.jpg in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
E60FA7B619C908FE00179D70 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
E60FA80A19C9123800179D70 /* ViewController.swift in Sources */,
E60FA7C019C908FE00179D70 /* AppDelegate.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
E60FA80419C90D7100179D70 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
name = ArmchairMac;
targetProxy = E60FA80319C90D7100179D70 /* PBXContainerItemProxy */;
};
E6F6159A19CA003A00C0B51C /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
name = ArmchairLocalizableMac;
targetProxy = E6F6159919CA003A00C0B51C /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
/* Begin PBXVariantGroup section */
E60FA81119C9172A00179D70 /* MainMenu.xib */ = {
isa = PBXVariantGroup;
children = (
E60FA81219C9172A00179D70 /* Base */,
);
name = MainMenu.xib;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
E60FA7D219C908FE00179D70 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_IDENTITY = "-";
COPY_PHASE_STRIP = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_SYMBOLS_PRIVATE_EXTERN = NO;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 10.10;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = macosx;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
};
name = Debug;
};
E60FA7D319C908FE00179D70 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_IDENTITY = "-";
COPY_PHASE_STRIP = YES;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 10.10;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = macosx;
};
name = Release;
};
E60FA7D519C908FE00179D70 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
COMBINE_HIDPI_IMAGES = YES;
INFOPLIST_FILE = "Example/Info-Mac.plist";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = "com.armchair.$(PRODUCT_NAME:rfc1034identifier)";
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Debug;
};
E60FA7D619C908FE00179D70 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
COMBINE_HIDPI_IMAGES = YES;
INFOPLIST_FILE = "Example/Info-Mac.plist";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = "com.armchair.$(PRODUCT_NAME:rfc1034identifier)";
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
E60FA7B519C908FE00179D70 /* Build configuration list for PBXProject "Mac Example" */ = {
isa = XCConfigurationList;
buildConfigurations = (
E60FA7D219C908FE00179D70 /* Debug */,
E60FA7D319C908FE00179D70 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
E60FA7D419C908FE00179D70 /* Build configuration list for PBXNativeTarget "Mac Example" */ = {
isa = XCConfigurationList;
buildConfigurations = (
E60FA7D519C908FE00179D70 /* Debug */,
E60FA7D619C908FE00179D70 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = E60FA7B219C908FE00179D70 /* Project object */;
}

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:Mac Example.xcodeproj">
</FileRef>
</Workspace>

608
README.md Normal file
View File

@@ -0,0 +1,608 @@
![Armchair: A simple yet powerful App Review Manager for iOS and OSX in Swift](https://raw.githubusercontent.com/UrbanApps/Armchair/assets/armchair.png)
Armchair is a simple yet powerful App Review Manager for iOS and OSX written in Swift. It is based on [UAAppReviewManager](https://github.com/UrbanApps/UAAppReviewManager) and [Appirater](https://github.com/arashpayan/appirater) but completely rewritten for apps that want to benefit from the power of this new language.
## Why Armchair?
The average end-user will only write a review if something is wrong with your App. This leads to an unfairly negative skew in the ratings, when the majority of satisfied customers dont leave reviews and only the dissatisfied ones do. In order to counter-balance the negatives, Armchair prompts the user to write a review, but only after the developer knows they are satisfied. For example, you may only show the popup if the user has been using it for more than a week, and has done at least 5 significant events (the core functionality of your App). The rules are fully customizable for your App and easy to setup.
Here are just a few of the things that make Armchair better than the other rating frameworks and repos:
<img align="center" src="https://raw.githubusercontent.com/UrbanApps/Armchair/assets/swift.png">
While the tests to prove it seem to be missing, Apple claims that Swift is a lot faster than Objective-C. Enjoy the benefits of using a framework built entirely in Swift, and work with a familiar syntax without having to deal with bridging headers or other Objective-C shenanigans.
##### Both iOS and OS X Support
Many developers publish apps for both iOS and OS X. Out of the box, Armchair supports iOS and OS X apps that are sold through the respective App Stores. The API is the same for both with the exception of a handful of iOS specific functions, described in [Usage](#usage).
##### Fully Configurable at Runtime
Armchair is fully configurable, even at runtime. This means that the prompt you display can be dynamic, based on the end-user's score or status. The rules that govern how and when it should be shown can all be set the same way, allowing you to have the most control over the presentation and timing of your review prompt.
##### Default Localizations for Dozens of Languages
If you choose to use the default Armchair strings for your app, you will get the added benefit of localization in over 32 languages. Otherwise, customization is easy, and overriding the localization strings is a piece of cake, simply by including your own strings files and letting Armchair know.
##### Prevent Rating Prompts on Different Devices
If your users have the same app, same version installed on two different devices, you really shouldn't pop up the same rating prompt on each one. Armchair allows you to optionally keep your user's usage stats in the `NSUbiquitousKeyValueStore`, or any other store you want to keep track of syncing yourself to prevent dual prompts.
##### Uses UIApplication/NSApplication Lifecycle Notifications
Armchair listens for ApplicationDidLaunch and ApplicationWillEnterForeground notifications. This allows you to worry about your app, and not about tracking in your application delegate functions, so there are fewer lines of code for you to write.
##### Easy to Setup
It takes only 1 line of code to get started. Armchair is very powerful when digging under the hood, but also very simple to setup for standard configurations.
##### iTunes Affiliate Codes
If you are an iTunes Affiliate, you can easily setup Armchair to use your code and campaign. Full disclosure: If you aren't an iTunes Affiliate, the default code used in the app is the author's. It is better to have somebody's code rather than nobody's, so please leave it at the default setting if you aren't going to set one yourself. Think of it as a small token of appreciation for creating and open-sourcing Armchair.
##### Ready For Primetime
Armchair is clean code, well documented and well organized. It is easy to understand the logic flow and the purpose of each function. It doesn't mix logic up randomly between Class functions and Instance functions. Its API is clean and predictable.
---
<a name="the-golden-rule">![The Golden Rule](https://raw.githubusercontent.com/UrbanApps/Armchair/assets/golden-rule.png)</a>
1. Don't be a dick.
Seriously. It is easy to piss off your customers by not really considering how the prompting popup interrupts their flow. This was widely discussed in early 2014 by many well-known tech bloggers and caused a big hooplah in the community.
We think that having an app review prompt is fine, but only when presented at the right time, and only when you don't ask too frequently. The criteria for the smart display of a prompt varies for each app, but consider adding one at the end of a positive user workflow, rather than the beginning.
Tweak the variables so that you don't annoy your customers, and you will enjoy the maximum benefit from your app review prompting.
---
## Screenshots
![iOS Example Shots](https://raw.githubusercontent.com/UrbanApps/Armchair/assets/armchair-iOS.png)
![Mac Example Shots](https://raw.githubusercontent.com/UrbanApps/Armchair/assets/armchair-OSX.png)
## Requirements
- Xcode 6.1+
- iOS 8.0+, Mac OS X 10.10+
## Installation
> **Embedded frameworks require a minimum deployment target of iOS 8 or OS X Mavericks (10.9).**
>
> Armchair is no longer supported on iOS 7 due to the lack of support for frameworks. Without frameworks, running Travis-CI against iOS 7 would require a second duplicated test target. The separate test suite would need to import all the Swift files and the tests would need to be duplicated and re-written. This split would be too difficult to maintain to ensure the highest possible quality of the Armchair ecosystem.
### CocoaPods
[CocoaPods](http://cocoapods.org) is a dependency manager for Cocoa projects. You can install it with the following command:
```bash
$ gem install cocoapods
```
> CocoaPods 0.39.0+ is required to build Armchair.
To integrate Armchair into your Xcode project using CocoaPods, specify it in your `Podfile`:
```ruby
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0'
platform :osx, '10.10'
use_frameworks!
pod 'Armchair', '>= 0.1'
```
Then, run the following command:
```bash
$ pod install
```
### Carthage
[Carthage](https://github.com/Carthage/Carthage) is a decentralized dependency manager that builds your dependencies and provides you with binary frameworks.
Once you [install](https://github.com/Carthage/Carthage#installing-carthage) Carthage, you can integrate Armchair into your Xcode project by specifying it in your `Cartfile`:
```ogdl
github "UrbanApps/Armchair"
```
Run `carthage update` to build the framework and drag the built `Armchair.framework` into your Xcode project.
## Usage
### Simple 1-line Setup
Armchair includes sensible defaults as well as reads data from your localized, or unlocalized `info.plist` to set itself up. While everything is configurable, the only **required** item to configure is your App Store ID. This call is the same for iOS and Mac apps, and should be made as part of your App Delegate's `initialize()` function
```swift
Armchair.appID("12345678")
```
That's it to get started. Setting Armchair up with this line uses some sensible default criterion (detailed below) and will present a rating prompt whenever they are met.
### Custom Configuration
Optionally, if you are using significant events in your app to track when the user does something of significance, add this line to any place where this event happens, such as a `levelDidFinish` function, or `userDidUploadPhoto` function.
```swift
Armchair.userDidSignificantEvent(true)
```
In order for this to mean anything to Armchair, you also have to set the threshold for significant events. Typically, this, and all other logic configuration settings, should be made as part of your App Delegate's `initialize()` function so it can get the notifications on app launch.
```swift
Armchair.significantEventsUntilPrompt(5)
```
As mentioned above, the `appID` is the only required item to configure. It is used to generate the URL that will link to the page. Most often, this is configured to the App that is currently running, but there may be an instance where you want to set it to another app, such as in an App that reviews other Apps.
```swift
// GETTER
Armchair.appID() -> String
// SETTER
Armchair.appID(appID: String)
```
##### Display Strings
The `appName` is used in several places on the review prompt popup. It can be configured here to customize your message without losing any of the default localizations. By default, Armchair will read the value from your localized, or unlocalized `info.plist`, but you can set it specifically if you want.
```swift
// GETTER
Armchair.appName() -> String
// SETTER
Armchair.appName(appName: String)
```
The `reviewTitle` is the title to use on the review prompt popup. It's default value is a localized "Rate \<appName\>", but you can set it to anything you want.
```swift
// GETTER
Armchair.reviewTitle() -> String
// SETTER
Armchair.reviewTitle(reviewTitle: String)
```
The `reviewMessage` is the message to use on the review prompt popup. It's default value is a localized "If you enjoy using \<appName\>, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!", but you can change it specifically if you want. However, if you do change it, you will need to provide your own localization strings as shown farther down below.
```swift
// GETTER
Armchair.reviewMessage() -> String
// SETTER
Armchair.reviewMessage(reviewMessage: String)
```
The `cancelButtonTitle` is the button title to use on the review prompt popup for the "Cancel" action. Its default value is a localized "No, Thanks"
```swift
// GETTER
Armchair.cancelButtonTitle() -> String
// SETTER
Armchair.cancelButtonTitle(cancelButtonTitle: String)
```
The `rateButtonTitle` is the button title to use on the review prompt popup for the "Rate" action. Its default value is a localized "Rate \<appName\>"
```swift
// GETTER
Armchair.rateButtonTitle() -> String
// SETTER
Armchair.rateButtonTitle(rateButtonTitle: String)
```
The `remindButtonTitle` is the button title to use on the review prompt popup for the "Remind" action. Its default value is a localized "Remind me later"
```swift
// GETTER
Armchair.remindButtonTitle() -> String
// SETTER
Armchair.remindButtonTitle(remindButtonTitle: String)
```
##### Logic
The `daysUntilPrompt` configuration determines how many days the users will need to have the same version of your App installed before they will be prompted to rate it. It's default is 30 days.
```swift
// GETTER
Armchair.daysUntilPrompt() -> UInt
// SETTER
Armchair.daysUntilPrompt(daysUntilPrompt: UInt)
```
The `usesUntilPrompt` configuration determines how many times the user will need to have 'used' the same version of you App before they will be prompted to rate it. Its default is 20 uses.
```swift
// GETTER
Armchair.usesUntilPrompt() -> UInt
// SETTER
Armchair.usesUntilPrompt(usesUntilPrompt: UInt)
```
An example of a 'use' would be if the user launched the app, or brings it to the foreground. Armchair keeps track of these internally by listening to UIApplication/NSApplication lifecycle notifications.
As discussed briefly above, the `significantEventsUntilPrompt` configuration determines how many "significant events" the user will need to have before they will be prompted to rate the App. It defaults to 0 significant events.
```swift
// GETTER
Armchair.significantEventsUntilPrompt() -> UInt
// SETTER
Armchair.significantEventsUntilPrompt(significantEventsUntilPrompt: UInt)
```
A significant event can be anything you want to be in your app. In a telephone app, a significant event might be placing or receiving a call. In a game, it might be beating a level or a boss. This is just another layer of filtering that can be used to make sure that only the most loyal of your users are being prompted to rate you on the app store. If you leave this at a value of 0 (default), then this won't be a criterion used for rating. To tell Armchair that the user has performed a significant event, call the function:
```swift
Armchair.userDidSignificantEvent(canPromptForRating: Bool)
```
The `daysBeforeReminding` configuration determines how many days Armchair will wait before reminding the user to rate again, should they select the "Remind Me Later" option on the first alert. It defaults to 1 day. A value of 0 will remove the "Remind Me Later" button and disable this feature.
```swift
// GETTER
Armchair.daysBeforeReminding() -> UInt
// SETTER
Armchair.daysBeforeReminding(daysBeforeReminding: UInt)
```
The `tracksNewVersions` configuration determines whether or not Armchair should track a new app version if detected. By default, Armchair tracks **all** new bundle versions. When it detects a new version, it resets the values saved for usage, significant events, popup shown, user action etc... By setting this to `NO` Armchair will **only** track the version it was initialized with, or the one it last knew about. If this setting is set to `true`, Armchair will reset itself after each new version detection. Its default value is `true`.
```swift
// GETTER
Armchair.tracksNewVersions() -> Bool
// SETTER
Armchair.tracksNewVersions(tracksNewVersions: Bool)
```
The `shouldPromptIfRated` configuration determines whether or not to show the review prompt to users who have rated the app once before. This setting is a little like the `tracksNewVersions` setting, but a little less nuclear. Setting this to `false` will cause new users of the app to get the popup, but won't ask users who have already been asked for a popup in the past. This is useful if you release small bug-fix versions and don't want to pester your existing users with popups for every minor version, but want to ensure new users get prompted for a review. For example, you might set this to false for every minor build, then when you push a major version upgrade, leave it as true to ask for a rating again. Its default value is `true`.
```swift
// GETTER
Armchair.shouldPromptIfRated() -> Bool
// SETTER
Armchair.shouldPromptIfRated(shouldPromptIfRated: Bool)
```
The `useMainAppBundleForLocalizations` configuration is a way to tell Armchair that you are providing your own translations for the review prompt popup strings. This may be because you are just customizing them, or that you have set your own text for the popup. If set to `true`, the main bundle will always be used to load localized strings. You have to include the translations either in a file called `ArmchairLocalizable.strings` or the standard `Localizable.strings`. If set to `false` Armchair will look in its own translation bundle for the translating strings. It's default value is `false`.
```swift
// GETTER
Armchair.useMainAppBundleForLocalizations() -> Bool
// SETTER
Armchair.useMainAppBundleForLocalizations(useMainAppBundleForLocalizations: Bool)
```
##### Affiliate Codes
The `affiliateCode` configuration is optional and is used to configure with the review URL. If you are an Apple Affiliate, enter your code here. If none is set, the author's code will be used as it is better to be set as something rather than nothing. If you want to thank me for making Armchair, feel free to leave this value at it's default.
```swift
// GETTER
Armchair.affiliateCode() -> String
// SETTER
Armchair.affiliateCode(affiliateCode: String)
```
The `affiliateCampaignCode` configuration is optional and is used to configure the review URL. It provides context to the affiliate code and defaults to "Armchair-\<appID\>".
```swift
// GETTER
Armchair.affiliateCampaignCode() -> String
// SETTER
Armchair.affiliateCampaignCode(affiliateCampaignCode: String)
```
##### Debug Mode
The `debugEnabled` configuration is useful for testing how your review prompt popup looks and for testing. Setting it to `true` will show the Armchair alert every time by tricking the app into thinking the conditions for a prompt have been met. Calling this function in a production build (determined when `Debug` swift compiler flag is *not* defined) has no effect. In App Store builds, you don't have to worry about accidentally leaving debug on. The default value of `debugEnabled` is `false`.
```swift
// GETTER
Armchair.debugEnabled() -> Bool
// SETTER
Armchair.debugEnabled(debugEnabled: Bool)
```
##### Logging
Armchair allows you to set a closure to capture debug log and to plug in the desired logging framework.
```swift
Armchair.logger(logger: ArmchairLogger)
```
##### iOS Only Configuration
These configuration functions only make sense for iOS builds due to their dependency on iOS-only frameworks and functions.
The `usesAnimation` configuration determines whether or not Armchair uses animation when presenting a modal `SKStoreProductViewController`. Its default value is `true`.
```swift
// GETTER
Armchair.usesAnimation() -> Bool
// SETTER
Armchair.usesAnimation(usesAnimation: Bool)
```
The `tintColor` configuration specifies a tint color that is applied to UIAlertController when `usesAlertController` is true. Its default value is `nil`, which means that tint color is not customized.
```swift
// GETTER
Armchair.tintColor() -> UIColor?
// SETTER
Armchair.tintColor(tintColor: UIColor?)
```
The `usesAlertController` configuration determines whether or not Armchair uses a UIAlertController when presenting an alert on iOS 8. By default, we do not use it because the reordering of buttons is not possible in the alert controller as of iOS 8.0. It's default value is `false`. Changing this value does not affect iOS 7 at all.
```swift
// GETTER
Armchair.usesAlertController() -> Bool
// SETTER
Armchair.usesAlertController(usesAnimation: Bool)
```
The `opensInStoreKit` configuration determines if Armchair will open the App Store link inside the App using a `SKStoreProductViewController`. By default, this is `false` on iOS 7, and `true` on iOS 8.
```swift
// GETTER
Armchair.opensInStoreKit() -> Bool
// SETTER
Armchair.opensInStoreKit(opensInStoreKit: Bool)
```
There are 2 reasons why the default is `false` on iOS 7.
- The SKStoreProductViewController __does not allow the user to write a review__ (as of iOS 7)!
- iTunes affiliate codes do not work (as of iOS 7) inside SKStoreProductViewController.
### Armchair Functions
`userDidSignificantEvent(canPromptForRating: Bool)` tells Armchair that the user performed a significant event. A significant event is whatever you want it to be. If your app is used to make VoIP calls, then you might want to call this function whenever the user places a call. If it's a game, you might want to call this whenever the user beats a level boss. If the user has performed enough significant events and used the app enough, you can suppress the rating alert by passing `NO` for `canPromptForRating`. The rating alert will simply be postponed until it is called again with `true` for `canPromptForRating`. The rating alert can also be triggered by `appLaunched:` and `appEnteredForeground:` notifications.
```swift
Armchair.userDidSignificantEvent(canPromptForRating: Bool)
```
In addition to the above functions that can trigger the presentation of the prompt, there is a closure based variant that allows you to customize whether or not this is an appropriate time to display the prompt.
```swift
Armchair.userDidSignificantEvent(shouldPrompt: ArmchairShouldPromptClosure)
```
Read more about these functions below in the [Should-Prompt Closure](#should-prompt-closure) section.
`showPrompt()` tells Armchair to show the review prompt alert. The prompt will be showed if there is an internet connection available, the user hasn't already declined to rate, hasn't rated the current version and you are tracking new versions. You could call to show the prompt regardless of Armchair settings, for instance, in the case of some special event in your app like positive feedback given.
```swift
Armchair.showPrompt()
```
`showPromptIfNecessary()` tells Armchair to show the review prompt alert if all restrictions have been met. The prompt will be shown if all restrictions are met, there is an internet connection available, the user hasn't declined to rate, hasn't rated current version, and you are tracking new versions. You could call to show the prompt, for instance, in the case of some special event in your app like a user login.
```swift
Armchair.showPromptIfNecessary()
```
The `reviewURLString()` function is the review URL string, generated by substituting the `appID`, `affiliateCode` and `affiliateCampaignCode` into the template URL for the current platform.
```swift
Armchair.reviewURLString() -> String
```
`rateApp()` tells Armchair to open the App Store page where the user can specify a rating for the app. It also records the fact that this has happened, so the user won't be prompted again to rate the app for this version. The only case where you should call this directly is if your app has an explicit "Rate this app" command somewhere. In all other cases, don't worry about calling this — instead, just call the other functions listed above, and let Armchair handle the bookkeeping of deciding when to ask the user whether to rate the app.
```swift
Armchair.rateApp()
```
`ratingConditionsHaveBeenMet()` returns true when all of the setup conditions to display a prompt have been met.
```swift
Armchair.ratingConditionsHaveBeenMet() -> Bool
```
`resetUsageCounters()` resets app usage counters. Calling this method resets UseCount, SignificantEventCount and FirstUseDate (daysUntilPrompt).
```swift
Armchair.resetUsageCounters()
```
`resetAllCounters()` resets all counters. Calling this method resets every value tracked by Armchair.
```swift
Armchair.resetAllCounters()
```
##### iOS Only Functions
`closeModalPanel()` tells Armchair to immediately close any open rating modal panels for instance, a `SKStoreProductViewController`.
```swift
Armchair.closeModalPanel()
```
### Closures
Armchair uses optional closures instead of delegate functions for callbacks. Default is nil for all of them.
```swift
Armchair.onDidDisplayAlert(didDisplayAlertClosure: ArmchairClosure?)
Armchair.onDidDeclineToRate(didDeclineToRateClosure: ArmchairClosure?)
Armchair.onDidOptToRate(didOptToRateClosure: ArmchairClosure?)
Armchair.onDidOptToRemindLater(didOptToRemindLaterClosure: ArmchairClosure?)
```
##### iOS Only Closures
```swift
Armchair.onWillPresentModalView(willPresentModalViewClosure: ArmchairAnimateClosure?)
Armchair.onDidDismissModalView(didDismissModalViewClosure: ArmchairAnimateClosure?)
```
##### Should-Increment Closure
```swift
Armchair.shouldIncrementUseCountClosure(shouldIncrementUseCountClosure: ArmchairShouldIncrementClosure?)
```
By default Armchair increments the use count every time the app enters the foreground. If you want to suppress this behavior (i.e. not counting a foreground event caused by switching apps during a Facebook login) you can do so with a ArmchairShouldIncrementClosure that returns `false` to ignore a foreground event or `true` to count it as normal.
##### Should-Prompt Closure
Armchair allows you to set a closure that is called immediately preceding the display of the popup.
```swift
public typealias ArmchairShouldPromptClosure = (ArmchairTrackingInfo) -> Bool
```
The `ArmchairShouldPromptClosure` passes you the keys and values Armchair used to determine that the prompt should be called (found in the ArmchairTrackingInfo's `info` dictionary), and expects a `Bool` return value on whether or not the prompt should still be displayed. This allows you to have one last chance to do any of your own custom logic to determine whether or not this is an appropriate time to display the prompt.
```swift
Armchair.shouldPromptClosure(shouldPromptClosure: ArmchairShouldPromptClosure?)
```
In addition to the global `shouldPromptClosure`, the Armchair functions that trigger the presentation of the prompt (`showPromptIfNecessary` and `userDidSignificantEvent()`) have their own closure based variant that allows you to customize whether or not this is an appropriate time to display the prompt.
```swift
Armchair.showPrompt(shouldPrompt: ArmchairShouldPromptClosure)
Armchair.userDidSignificantEvent(shouldPrompt: ArmchairShouldPromptClosure)
```
When using these functions instead of their `Bool` sister-functions, none of the internal Armchair logic is used to determine whether or not to display the prompt. **Only** your closure is used to decide whether or not it should be presented, based solely on the return value you pass back in the closure. This also means that even the global `shouldPromptClosure()` (if set) will not be called when using these functions.
**Note:** The `shouldPromptClosure()` is run synchronous and on the main queue, so be sure to handle it appropriately.
### NSUserDefaults and Keys
Armchair has sensible defaults for the `NSUserDefaults` keys it uses, but you can customize that here if you want. Get/Set the `NSUserDefaults` keys that store the usage data for Armchair. Default values are all in the form of "\<appID\>_Armchair\<Setting\>"
```swift
// GETTER
Armchair.keyForArmchairKeyType(keyType: ArmchairKey) -> String
// SETTER
Armchair.setKey(key: NSString, armchairKeyType: ArmchairKey)
```
You don't have to use NSUserDefaults as your Key/Value store, though Armchair defaults to using it. If you want to sync your ratings and usage stats across all of your User's devices, you may want to use the `NSUbiquitousKeyValueStore` instead. This will ensure that the user won't be prompted to rate the same version of the same app on separate devices.
```swift
// GETTER
Armchair.userDefaultsObject() -> ArmchairDefaultsObject?
// SETTER
Armchair.userDefaultsObject(userDefaultsObject: ArmchairDefaultsObject?)
```
The `userDefaultsObject` can be any object that responds to the `ArmchairDefaultsObject` protocol — essentially a stripped-down version of the NSUserDefaults api:
```swift
@objc public protocol ArmchairDefaultsObject {
func objectForKey(defaultName: String) -> AnyObject?
func setObject(value: AnyObject?, forKey defaultName: String)
func removeObjectForKey(defaultName: String)
func stringForKey(defaultName: String) -> String?
func integerForKey(defaultName: String) -> Int
func doubleForKey(defaultName: String) -> Double
func boolForKey(defaultName: String) -> Bool
func setInteger(value: Int, forKey defaultName: String)
func setDouble(value: Double, forKey defaultName: String)
func setBool(value: Bool, forKey defaultName: String)
func synchronize() -> Bool
}
```
So, to use it with iCloud and the `NSUbiquitousKeyValueStore`, set up like so:
```swift
Armchair.userDefaultsObject(NSUbiquitousKeyValueStoreSubclass.defaultStore())
```
...where you have a subclass that conforms to the protocol.
You can get/set the `keyPrefix` to the keys above that store the usage data for Armchair. The default value is the `appID`, and it is prepended to the keys for key type. Setting a `keyPrefix` prevents different apps using a shared Key/Value store from overwriting each other.
```swift
// GETTER
Armchair.keyPrefix() -> String
// SETTER
Armchair.keyPrefix(keyPrefix: String)
```
### Configuration/Usage Examples
For more information on how to use and setup Armchair, please see the Example Project for both iOS and OS X Apps.
## Armchair vs. Appirater
[Appirater](https://github.com/arashpayan/appirater) is great and has been used by many, many developers since its introduction in 2009. It has been updated throughout the years and suits the need of many people, yet leaves a ton left to be desired for the experienced developer. Appirater is:
- [ ] Not available in Swift
- [ ] Only available for iOS
- [ ] Mixes a bunch of class methods and instance methods unnecessarily
- [ ] Relies on a confusing mixture of MACROS and runtime configs for setup when either way would be better on its own
- [ ] Utilizes the ancient Delegate pattern for callbacks in the age of Blocks and Closures
- [ ] Is not able to be disabled on minor patch updates
- [ ] No iTunes affiliate support
- [ ] No way to prevent dual prompts for the same app and version on two separate devices
- [ ] Makes the implementer write more code for lifecycle events
I started addressing these issues in a fork of Appirater, but quickly realized that the entire project could be re-written in a better way to address the above points. Armchair is:
- [x] Using a full Swift implemention
- [x] Available for iOS and Mac
- [x] Runs as a Singleton, with Class level, pass-through convenience methods.
- [x] Every aspect is configurable at runtime through an established API.
- [x] Uses Closures for all event callbacks and notifications.
- [x] Allows developers to disable the prompt easily on minor updates
- [x] Allows iTunes affiliate codes to be used.
- [x] Allows you to prevent prompts for the same app and version on two separate devices
- [x] Makes the implementer write less code by listening to notifications of lifecycle events
Once all these additions, alteration and features were added, it was too much to push back up to Appirater, so Armchair was born. That being said, some of the existing code logic, methods, and language translations (over 32 of them!) are used from [Appirater](https://github.com/arashpayan/appirater) and due credit needs to be given. Armchair could not have existed without it. Thank you!
## Armchair vs. UAAppReviewManager
[UAAppReviewManager](https://github.com/UrbanApps/UAAppreviewManager) is like the ugly twin sister of Armchair. They are written by the same person, and have a very similar API, logic and feel. The main difference is that Armchair is rewritten from scratch in Swift and is meant for newer projects that are also using Swift.
## Upgrading From Appirater or UAAppReviewManager
Armchair will automatically convert the NSUserDefault keys stored under Appirater/UAAppReviewManager apps into the default keys used by Armchair. The values will transfer over, and the old, unused Appirater/UAAppReviewManager keys will be deleted from the settings automatically.
## What's Planned?
There are some ideas we have for future versions of Armchair. Feel free to fork/implement if you would like to expedite the process.
- Get 100% Unit Test coverage
- Add the ability to present the prompt using a custom class other than a `UIAlertView`, `UIAlertController` or `NSAlert`
- Add additional localizations: ongoing
- [Your idea](https://github.com/UrbanApps/Armchair/issues)
## Bugs / Pull Requests
Let us know if you see ways to improve Armchair or see something wrong with it. We are happy to pull in pull requests that have clean code, and have features that are useful for most people. While the Swift community is still deciding on proper code structure and style, please refrain from simple style complaints (space > tabs, etc...)
## What Does Armchair stand for?
The "Arm" is for App Review Manager. The chair is so we could have a cool picture on the page.
## Who makes Armchair?
[Matt Coneybeare](http://matt.coneybeare.me) of [Urban Apps](http://urbanapps.com). We make neat stuff. Check us out.
## Other Open-Source Urban Apps Projects
- [UAAppReviewManager](https://github.com/UrbanApps/UAAppReviewManager) - A review prompting tool for iOS and Mac App Store apps (Obj-C)
- [UAModalPanel](https://github.com/UrbanApps/UAModalPanel) - An animated modal panel alternative for iOS
- [UALogger](https://github.com/UrbanApps/UALogger) - A logging utility for Mac/iOS apps
- [UAObfuscatedString](https://github.com/UrbanApps/UAObfuscatedString) - A simple NSString category to hide sensitive strings
- [UAProgressView](https://github.com/UrbanApps/UAProgressView) - A simple and lightweight, yet powerful animated circular progress view
- [Urban](https://github.com/UrbanApps/Urban) - An Xcode color scheme that uses a soft dark background, with subtle blue, orange and yellow colors
## License
Armchair is released under an MIT license. See [LICENSE](https://github.com/UrbanApps/Armchair/blob/master/LICENSE) for more information.

26
Source/Armchair.h Normal file
View File

@@ -0,0 +1,26 @@
// Armchair.h
//
// Copyright (c) 2014 Armchair (http://github.com/UrbanApps/Armchair)
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
#import <Foundation/Foundation.h>
FOUNDATION_EXPORT double ArmchairVersionNumber;
FOUNDATION_EXPORT const unsigned char ArmchairVersionString[];

1805
Source/Armchair.swift Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>BNDL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>NSHumanReadableCopyright</key>
<string>Copyright © 2014 Armchair. All rights reserved.</string>
<key>NSPrincipalClass</key>
<string></string>
</dict>
</plist>

26
Source/Info.plist Normal file
View File

@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>$(CURRENT_PROJECT_VERSION)</string>
<key>NSPrincipalClass</key>
<string></string>
</dict>
</plist>

38
Tests/ArmchairTests.swift Normal file
View File

@@ -0,0 +1,38 @@
//
// ArmchairTests.swift
// ArmchairTests
//
// Created by Matt Coneybeare on 9/16/14.
// Copyright (c) 2014 Armchair. All rights reserved.
//
import UIKit
import XCTest
import Armchair
class ArmchairTests: XCTestCase {
var appID: String! = "987654321"
override func setUp() {
super.setUp()
Armchair.appID(appID)
}
// MARK: -
func testAppIDSetProperly() {
XCTAssertEqual(Armchair.appID, appID, "appID should be as set")
}
// Need to figure out a way to get the test suite to load the correct info.plist bundle for the test app
// func testAppNameReadFromBundleCorrectly() {
// XCTAssertEqual(Armchair.appName(), "Armchair Tests")
// }
func testAppNameNotNil() {
XCTAssertNotNil(Armchair.appName(), "appName should never be nil")
}
}

26
Tests/Info.plist Normal file
View File

@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleDisplayName</key>
<string>Armchair Tests</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>BNDL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1</string>
</dict>
</plist>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 624 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 166 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 563 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.5 KiB

View File

@@ -0,0 +1,476 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 46;
objects = {
/* Begin PBXBuildFile section */
E60FA81819C9219600179D70 /* logo.png in Resources */ = {isa = PBXBuildFile; fileRef = E60FA81719C9219600179D70 /* logo.png */; };
E66F854A19D0A7C600AD80EC /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = E66F854819D0A7C600AD80EC /* LaunchScreen.storyboard */; };
E6A0AFB419C9D30900C3A7DC /* Armchair.bundle in Resources */ = {isa = PBXBuildFile; fileRef = E6A0AFB319C9D24000C3A7DC /* Armchair.bundle */; };
E6D06B5B19CB413600DE5D11 /* Armchair.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E6D8B8BB19C7382B001AD043 /* Armchair.framework */; };
E6D06B5C19CB413600DE5D11 /* Armchair.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = E6D8B8BB19C7382B001AD043 /* Armchair.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
E6E5F4C319C8E18E008A6C1B /* armchair.jpg in Resources */ = {isa = PBXBuildFile; fileRef = E6E5F4C219C8E18E008A6C1B /* armchair.jpg */; };
E6E5F4CD19C8E388008A6C1B /* Icon.png in Resources */ = {isa = PBXBuildFile; fileRef = E6E5F4CC19C8E388008A6C1B /* Icon.png */; };
E6E5F4CF19C8E3C6008A6C1B /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = E6E5F4CE19C8E3C6008A6C1B /* Images.xcassets */; };
F8111E0B19A951050040E7D1 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8111E0A19A951050040E7D1 /* AppDelegate.swift */; };
F8111E0D19A951050040E7D1 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8111E0C19A951050040E7D1 /* ViewController.swift */; };
F8111E1219A951050040E7D1 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F8111E1019A951050040E7D1 /* Main.storyboard */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
E6A0AFAF19C9D24000C3A7DC /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = F8111E4E19A95D7C0040E7D1 /* Armchair.xcodeproj */;
proxyType = 1;
remoteGlobalIDString = E6A0AF6419C9CFF400C3A7DC;
remoteInfo = ArmchairLocalizable;
};
E6A0AFB219C9D24000C3A7DC /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = F8111E4E19A95D7C0040E7D1 /* Armchair.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = E6A0AF6519C9CFF400C3A7DC;
remoteInfo = ArmchairLocalizable;
};
E6D06B5519CB412500DE5D11 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = F8111E4E19A95D7C0040E7D1 /* Armchair.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = E6F6159419C9FFDA00C0B51C;
remoteInfo = ArmchairLocalizableMac;
};
E6D06B5919CB412500DE5D11 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = F8111E4E19A95D7C0040E7D1 /* Armchair.xcodeproj */;
proxyType = 1;
remoteGlobalIDString = F8111E3219A95C8B0040E7D1;
remoteInfo = Armchair;
};
E6D06B5D19CB413600DE5D11 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = F8111E4E19A95D7C0040E7D1 /* Armchair.xcodeproj */;
proxyType = 1;
remoteGlobalIDString = F8111E3219A95C8B0040E7D1;
remoteInfo = Armchair;
};
E6D8B8BA19C7382B001AD043 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = F8111E4E19A95D7C0040E7D1 /* Armchair.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = E6D8B8B519C7274F001AD043;
remoteInfo = Armchair;
};
E6D8B8BC19C7382B001AD043 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = F8111E4E19A95D7C0040E7D1 /* Armchair.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = E6D8B8B619C7274F001AD043;
remoteInfo = ArmchairTests;
};
E6E5F4C019C8E156008A6C1B /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = F8111E4E19A95D7C0040E7D1 /* Armchair.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = E6D8B8F919C756A4001AD043;
remoteInfo = ArmchairMac;
};
/* End PBXContainerItemProxy section */
/* Begin PBXCopyFilesBuildPhase section */
E6D06B5F19CB413600DE5D11 /* Embed Frameworks */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 10;
files = (
E6D06B5C19CB413600DE5D11 /* Armchair.framework in Embed Frameworks */,
);
name = "Embed Frameworks";
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
E60FA81719C9219600179D70 /* logo.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = logo.png; sourceTree = "<group>"; };
E66F854919D0A7C600AD80EC /* en */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = en; path = en.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
E6A0AF5D19C9C89E00C3A7DC /* en */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = en; path = en.lproj/Main.storyboard; sourceTree = "<group>"; };
E6C49DC519C23C91006A4544 /* iOS Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "iOS Example.app"; sourceTree = BUILT_PRODUCTS_DIR; };
E6E5F4C219C8E18E008A6C1B /* armchair.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = armchair.jpg; sourceTree = "<group>"; };
E6E5F4CC19C8E388008A6C1B /* Icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Icon.png; sourceTree = "<group>"; };
E6E5F4CE19C8E3C6008A6C1B /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = "<group>"; };
F8111E0919A951050040E7D1 /* Info-iOS.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Info-iOS.plist"; sourceTree = "<group>"; };
F8111E0A19A951050040E7D1 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
F8111E0C19A951050040E7D1 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = "<group>"; };
F8111E4E19A95D7C0040E7D1 /* Armchair.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = Armchair.xcodeproj; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
F8111E0219A951050040E7D1 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
E6D06B5B19CB413600DE5D11 /* Armchair.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
E6C9055519C6432200F41311 /* Products */ = {
isa = PBXGroup;
children = (
E6D8B8BB19C7382B001AD043 /* Armchair.framework */,
E6E5F4C119C8E156008A6C1B /* Armchair.framework */,
E6A0AFB319C9D24000C3A7DC /* Armchair.bundle */,
E6D06B5619CB412500DE5D11 /* Armchair.bundle */,
E6D8B8BD19C7382B001AD043 /* ArmchairTests.xctest */,
);
name = Products;
sourceTree = "<group>";
};
F8111DFC19A951050040E7D1 = {
isa = PBXGroup;
children = (
F8111E0719A951050040E7D1 /* Source */,
F8111E4E19A95D7C0040E7D1 /* Armchair.xcodeproj */,
E6C49DC519C23C91006A4544 /* iOS Example.app */,
);
sourceTree = "<group>";
};
F8111E0719A951050040E7D1 /* Source */ = {
isa = PBXGroup;
children = (
F8111E0A19A951050040E7D1 /* AppDelegate.swift */,
F8111E0C19A951050040E7D1 /* ViewController.swift */,
F8111E1019A951050040E7D1 /* Main.storyboard */,
E66F854819D0A7C600AD80EC /* LaunchScreen.storyboard */,
F8111E0819A951050040E7D1 /* Supporting Files */,
);
name = Source;
path = Example;
sourceTree = "<group>";
};
F8111E0819A951050040E7D1 /* Supporting Files */ = {
isa = PBXGroup;
children = (
E6E5F4CE19C8E3C6008A6C1B /* Images.xcassets */,
E6E5F4CC19C8E388008A6C1B /* Icon.png */,
E6E5F4C219C8E18E008A6C1B /* armchair.jpg */,
E60FA81719C9219600179D70 /* logo.png */,
F8111E0919A951050040E7D1 /* Info-iOS.plist */,
);
name = "Supporting Files";
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
F8111E0419A951050040E7D1 /* iOS Example */ = {
isa = PBXNativeTarget;
buildConfigurationList = F8111E2319A951050040E7D1 /* Build configuration list for PBXNativeTarget "iOS Example" */;
buildPhases = (
F8111E0119A951050040E7D1 /* Sources */,
F8111E0219A951050040E7D1 /* Frameworks */,
F8111E0319A951050040E7D1 /* Resources */,
E6D06B5F19CB413600DE5D11 /* Embed Frameworks */,
);
buildRules = (
);
dependencies = (
E6A0AFB019C9D24000C3A7DC /* PBXTargetDependency */,
E6D06B5A19CB412500DE5D11 /* PBXTargetDependency */,
E6D06B5E19CB413600DE5D11 /* PBXTargetDependency */,
);
name = "iOS Example";
productName = Armchair;
productReference = E6C49DC519C23C91006A4544 /* iOS Example.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
F8111DFD19A951050040E7D1 /* Project object */ = {
isa = PBXProject;
attributes = {
LastSwiftUpdateCheck = 0700;
LastUpgradeCheck = 0700;
ORGANIZATIONNAME = Armchair;
TargetAttributes = {
F8111E0419A951050040E7D1 = {
CreatedOnToolsVersion = 6.0;
DevelopmentTeam = 9H3S97RP4K;
};
};
};
buildConfigurationList = F8111E0019A951050040E7D1 /* Build configuration list for PBXProject "iOS Example" */;
compatibilityVersion = "Xcode 3.2";
developmentRegion = English;
hasScannedForEncodings = 0;
knownRegions = (
en,
);
mainGroup = F8111DFC19A951050040E7D1;
productRefGroup = F8111DFC19A951050040E7D1;
projectDirPath = "";
projectReferences = (
{
ProductGroup = E6C9055519C6432200F41311 /* Products */;
ProjectRef = F8111E4E19A95D7C0040E7D1 /* Armchair.xcodeproj */;
},
);
projectRoot = "";
targets = (
F8111E0419A951050040E7D1 /* iOS Example */,
);
};
/* End PBXProject section */
/* Begin PBXReferenceProxy section */
E6A0AFB319C9D24000C3A7DC /* Armchair.bundle */ = {
isa = PBXReferenceProxy;
fileType = wrapper.cfbundle;
path = Armchair.bundle;
remoteRef = E6A0AFB219C9D24000C3A7DC /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
E6D06B5619CB412500DE5D11 /* Armchair.bundle */ = {
isa = PBXReferenceProxy;
fileType = wrapper.cfbundle;
path = Armchair.bundle;
remoteRef = E6D06B5519CB412500DE5D11 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
E6D8B8BB19C7382B001AD043 /* Armchair.framework */ = {
isa = PBXReferenceProxy;
fileType = wrapper.framework;
path = Armchair.framework;
remoteRef = E6D8B8BA19C7382B001AD043 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
E6D8B8BD19C7382B001AD043 /* ArmchairTests.xctest */ = {
isa = PBXReferenceProxy;
fileType = wrapper.cfbundle;
path = ArmchairTests.xctest;
remoteRef = E6D8B8BC19C7382B001AD043 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
E6E5F4C119C8E156008A6C1B /* Armchair.framework */ = {
isa = PBXReferenceProxy;
fileType = wrapper.framework;
path = Armchair.framework;
remoteRef = E6E5F4C019C8E156008A6C1B /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
/* End PBXReferenceProxy section */
/* Begin PBXResourcesBuildPhase section */
F8111E0319A951050040E7D1 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
E6A0AFB419C9D30900C3A7DC /* Armchair.bundle in Resources */,
E6E5F4C319C8E18E008A6C1B /* armchair.jpg in Resources */,
E60FA81819C9219600179D70 /* logo.png in Resources */,
E6E5F4CF19C8E3C6008A6C1B /* Images.xcassets in Resources */,
E66F854A19D0A7C600AD80EC /* LaunchScreen.storyboard in Resources */,
F8111E1219A951050040E7D1 /* Main.storyboard in Resources */,
E6E5F4CD19C8E388008A6C1B /* Icon.png in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
F8111E0119A951050040E7D1 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
F8111E0D19A951050040E7D1 /* ViewController.swift in Sources */,
F8111E0B19A951050040E7D1 /* AppDelegate.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
E6A0AFB019C9D24000C3A7DC /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
name = ArmchairLocalizable;
targetProxy = E6A0AFAF19C9D24000C3A7DC /* PBXContainerItemProxy */;
};
E6D06B5A19CB412500DE5D11 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
name = Armchair;
targetProxy = E6D06B5919CB412500DE5D11 /* PBXContainerItemProxy */;
};
E6D06B5E19CB413600DE5D11 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
name = Armchair;
targetProxy = E6D06B5D19CB413600DE5D11 /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
/* Begin PBXVariantGroup section */
E66F854819D0A7C600AD80EC /* LaunchScreen.storyboard */ = {
isa = PBXVariantGroup;
children = (
E66F854919D0A7C600AD80EC /* en */,
);
name = LaunchScreen.storyboard;
sourceTree = "<group>";
};
F8111E1019A951050040E7D1 /* Main.storyboard */ = {
isa = PBXVariantGroup;
children = (
E6A0AF5D19C9C89E00C3A7DC /* en */,
);
name = Main.storyboard;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
F8111E2119A951050040E7D1 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_SYMBOLS_PRIVATE_EXTERN = NO;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 7.0;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
F8111E2219A951050040E7D1 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = YES;
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 7.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
};
name = Release;
};
F8111E2419A951050040E7D1 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
CODE_SIGN_IDENTITY = "iPhone Developer";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
EMBEDDED_CONTENT_CONTAINS_SWIFT = YES;
GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)";
INFOPLIST_FILE = "$(SRCROOT)/Example/Info-iOS.plist";
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
OTHER_SWIFT_FLAGS = "";
PRODUCT_BUNDLE_IDENTIFIER = "com.armchair.$(PRODUCT_NAME:rfc1034identifier)";
PRODUCT_NAME = "iOS Example";
PROVISIONING_PROFILE = "";
};
name = Debug;
};
F8111E2519A951050040E7D1 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
CODE_SIGN_IDENTITY = "iPhone Developer";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
EMBEDDED_CONTENT_CONTAINS_SWIFT = YES;
INFOPLIST_FILE = "$(SRCROOT)/Example/Info-iOS.plist";
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = "com.armchair.$(PRODUCT_NAME:rfc1034identifier)";
PRODUCT_NAME = "iOS Example";
PROVISIONING_PROFILE = "";
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
F8111E0019A951050040E7D1 /* Build configuration list for PBXProject "iOS Example" */ = {
isa = XCConfigurationList;
buildConfigurations = (
F8111E2119A951050040E7D1 /* Debug */,
F8111E2219A951050040E7D1 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
F8111E2319A951050040E7D1 /* Build configuration list for PBXNativeTarget "iOS Example" */ = {
isa = XCConfigurationList;
buildConfigurations = (
F8111E2419A951050040E7D1 /* Debug */,
F8111E2519A951050040E7D1 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = F8111DFD19A951050040E7D1 /* Project object */;
}

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:iOS Example.xcodeproj">
</FileRef>
</Workspace>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 374 KiB

BIN
swift.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.2 KiB