Quantcast
Channel: www.iphonelife.com
Viewing all 13234 articles
Browse latest View live

Top 4 iOS Game Controllers Introduced at E3 2014

$
0
0

Entertainment Software Association (ESA). Copyright © 2014 - ESA Entertainment Software Association

Mobile games usually come in second behind console and PC titles at E3. Fortunately, iOS gamers weren't completely forgotten. And while the focus of this year's expo still didn't rely heavily on the iOS platform, there were a few gaming accessories on display that may be of interest to iOS gamers, including several MFi controllers. Companies like Mad Catz and Razer had styles that fit the iPhone, while others had controllers large enough for the iPad. Here's a look at a few of them:

Mad Catz C.T.R.L.i/Micro

The C.T.R.L.i controller connects to any iOS device via Bluetooth, but it also comes with a clip specifically for iPhone use. You'll find face and shoulder buttons, analog sticks, and a D-pad like typical console-style controllers. The C.T.R.L.i Micro is virtually identical, albeit slightly smaller. This is the company's first foray into iOS gaming, and both are expected to arrive in the spring. 

Razer Junglecat Controller

Razer's Junglecat game controller attaches directly to your iPhone and boasts a slim profile. The D-pad, ABXY action buttons, and bumpers are still there, but the controls may seem cramped when compared to full-sized controllers. An accompanying app lets you remap buttons, adjust sensitivity levels, and set up personalized profiles for booting up games.

SteelSeries Stratus XL

The Stratus XL from SteelSeries functions with the iPod Touch, iPhone, and iPad. The XL is comparable in size to an Xbox controller and is essentially a large-scale model of the original Stratus. So far, over 300 iOS games are supported. If you were a fan of the first generation Stratus then the XL may be an option worth looking into.

Signal RP One

Another full-scale controller, Signal's RP One works with iPod touch, iPhone, and iPad. Aesthetically, Signal's MFi controller appears to take on a more basic look. It comes with a Lithium Ion battery that reportedly holds a charge for 10 hours, and a stand to support your Apple devices. The RP One isn't flashy, but it includes many of the bells and whistles that most gamers would utilize. Although, the $99.99 price tag may deter early buyers. 

 

Top image copyright © 2014 - ESA Entertainment Software Association


Apple News: Amazon Fire Phone Brings the Heat for Apple

$
0
0

Competition is a good thing, and Amazon just raised the bar. Amazon's Jeff Bezos wasn't satisfied with just revolutionizing shopping for books, music, movies, or anything. Today he announced the Kindle Fire Phone, a 4.7-inch Android device that is more than just a phone. Like everything Amazon does, the Fire Phone is designed to make it easier to shop, for music, movies, TV shows, and physical products. Their integrated Firefly app recognizes over 100 million items, by image or audio. There's a dedicated button for Firefly. Amazon also has an SDK to allow third-party developers to integrate with this feature. [Full disclosure, I have developed an app called AllAccess.US that recognizes logos and launches that brand's info.]

Firefly

Amazon recently acquired Comixology, a comics newsstand service, in addition to their Audible audiobook service. They also added Amazon Prime Music with over one million songs, for Amazon Prime customers. This is beyond the free video streaming for Amazon Prime users. All of this makes the Kindle Fire a great consumption device.

Mayday

Amazon's Mayday service is included, offering live help within the device. You can see the operator but don't worry, they can't see you. Amazon fans on comment sites are already digging at Apple because, unlike Apple's Genius Bar, you don't need to make an appointment, leave your house, or even  change out of your underwear!

Dynamic Perspective

The Fire Phone offers Dynamic Perspective, which is similar to the parallax effect that Apple introduced with iOS 7 but more functional. As you tilt the phone, content is adjusted accordingly. Web pages or e-books can scroll slowly or faster as you tilt, similar to what Samsung calls Smart Scroll on their phones.

The 32GB 4G LTE Amazon Fire Phone is $199 when purchased with a two-year contract, but it comes with a one year Amazon Prime membership, worth $100. If there's one fly in the ointment, it's that only AT&T will carry the Amazon Fire Phone in the U.S.  

Your move, Apple!

Unleash Your Inner App Developer Part 10: Social Media and Collections

$
0
0

Do you have an idea for an app but lack the programming knowledge to begin building it? In this weekly blog series, How to Unleash Your Inner App Developer, I will take you, the non-programmer, step by step through the process of creating apps for the iPhone, iPod touch, and iPad. Join me each week on this adventure and you will experience how fun turning your ideas into reality can be! This is Part 10 of the series. If you're just getting started now, check out the beginning of the series here (this post has been updated to iOS 7.1.)

In my previous post, you learned the basic mechanics of sending messages. There's very little you can do in Objective-C, the language of iOS development, without sending messages. In this post, we're going to put into practice what you have learned about messages and integrate social media into the iAppsReview app we've been working on in this blog. I'm also going to introduce a new Cocoa Touch Framework concept known as collections. You can get the latest version of iAppsReview from this link.

Social Media and iOS

Starting in iOS 6, Apple beefed up the abilities of iOS devices to share text, images, web pages, and so on with others by means of social media. iOS 5 already included sharing via Twitter, but iOS 6 introduced integration with Facebook as well as sharing to Chinese social networks such as Sina Weibo (indicating how important the Chinese market has become to Apple). For example, if you are in the Safari mobile browser, you can tap the Share button at the bottom center of the Safari window as shown on the left side of Figure 1. This displays a panel, shown on the right side of Figure 1 that contains a variety of sharing options including Twitter and Facebook.

iOS Sharing panel
Figure 1 - The iOS Share options panel lets you share web links with others via Twitter & Facebook.

Depending on the item you want to share, different options appear in the Share Options panel. For example, if you want to share a picture from your photo library, when you tap the Share button, the Share Options panel includes other options such as Slideshow, Assign to Contact, and Use as Wallpaper (Figure 2) in addition to the Twitter and Facebook options.

Photo Sharing panel
Figure 2 - The Camera Roll Share Options panel

Cocoa Touch Framework and Social Media

With the release of iOS 6, Apple made it much easier for developers to integrate social media with its apps by releasing the Social Framework. As you will see, it is amazingly simple to integrate with social media using the Social Media framework. When you're finished with the steps in this blog, you can compare your project to the completed (so far) version of iAppsReview, which you can get from this link.

To begin, you must first add the Social Framework to your project as outlined in the following steps:

  1. Open the iAppsReview project in Xcode;
  1. In the Project Navigator on the left side of the Xcode window, select the very top iAppsReview node. This displays the Project Editor as shown in Figure 3. On the left side of the Project Editor, under Targets, select iAppsReview. Afterwards, scroll down to the section labeled Linked Frameworks and Libraries and click the plus (+) button (Figure 3);
Add the social framework
Figure 3 - Adding the Social Framework to the iAppsReview project
  1. Clicking the plus button displays the Add Framework dialog as shown in Figure 4. In the text field at the top of the dialog, enter the letters So to search for the Social Framework. When it appears in the list, click on Social.framework, and then click the Add button.
Select the social.framework
Figure 4 - Filtering the list in the Add Framework dialog

After you click Add, the Social.framework is added below the Frameworks group in the Project Navigator as shown in Figure 5;

social.framework in the Project Navigator
Figure 5 - The newly added Social.framework

Wiring Up the iAppsReview Share Button
Now that you have the Social Framework added to the project, you're ready to create an action method for the iAppsReview Share button and write some code to display the iOS Share Options panel.

  1. In the Project Navigator, select the Mainstoryboard.storyboard file to display the storyboard in the design surface;
  1. Click the status bar at the top of the Write Review scene's view controller;
  1. With the Write Review scene selected, go to the Editor button group at the top of the Xcode window and click the center button to display the Assistant Editor. The WriteReviewController.m file should be displayed in the Assistant Editor. If it isn't, click the button that says Manual in the Assistant Editor toolbar, and then select Automatic > WriteReviewViewController.m from the popup menu;
  1. In the Write Review scene, select the Share button at the top-right corner of the scene. With the Share button selected, go to the Connections Inspector (the button on the far right in the Inspector toolbar), click the selector connection well and drag down into the WriteReviewViewController.m file between the @interface and @end statements as shown in Figure 6;
Drag to create an action method
Figure 6 - Drag from the selector connection well to create an action method.
  1. When you see the Insert Action popup (Figure 7), let go of the mouse button to display the Connection popup shown in Figure 7. In the action method Name text field, enter shareReview;
Create the action method
Figure 7 - The Connection popup
  1. Click the Connect button in the Connection popup. This adds a new shareReview: action method declaration in the WriteReviewViewController.m file as shown in Figure 8;
shareReview action method
Figure 8 - The new shareReview: action method
  1. We no longer need the Assistant Editor, so you can hide it by clicking the left button in the Editor button group at the top of the Xcode window;
  1. In the Project Navigator, click the WriteReviewViewController.m implementation file to display it in the Code Editor. Scroll to the bottom of the code file and you can see the implementation of the shareReview: method shown in Figure 9 has been added.
 empty implementation
Figure 9 - The empty shareReview: method implementation

Understanding Variables

Before we get down to the business of writing code, I need to introduce a new concept that you will use when integrating social media into your app. We'll begin with the concept of variables.

variable is a place in memory where you can store and retrieve information. It's called a variable because you can change the information that you store in it. You can store one piece of information in a variable, and then store another piece of information in the same variable. Variables declared within a method are called local variables because they can only be accessed locally from within the method in which they are declared.

You can name variables anything you want, although something meaningful is best. Also, variable names must be unique within the same scope. This means that you can't have two variables in a method with the same name. However, you can have variables with the same name if they are in different methods.

Although you can change the information stored in a variable, there is a limit on the type of information you can store. Take for example the NSString variable declaration shown in Figure 10.

NSString variable
Figure 10 - An NSString variable declaration

The first word in this statement, NSString, indicates the variable can only store information of the type NSString. As you have already learned, the NSString class is part of the Cocoa Touch Framework and represents a set of characters, so you can store any set of characters in the firstName variable, but you can't store other types of information such as an integer, true or false values, and so on. When you declare a variable in Objective-C, you always declare the type of information that it can hold.

The asterisk following the NSString declaration indicates that the variable being created holds a pointer, or reference to an object (we will learn more about pointers later in this blog series). In this case, the object is an NSString object. If you create a variable that does not hold a reference to an object, but points to a single, scalar value such as an integer or Boolean (true or false) value, you don't use an asterisk as shown in the BOOL variable declaration in Figure 11.

BOOL variable
Figure 11 - A BOOL variable declaration

So, if you see a variable declaration that includes an asterisk, the variable contains a pointer to an object. If it doesn't contain an asterisk, the variable contains a single, scalar value.

Understanding Arrays and Other Collections

Now that you have a basic understanding of variables, it's time to learn about arrays and other collections.

When you hear the word "collection," you might think of stamp or coin collections. This is a good metaphor for collections in Objective-C because they provide a way to group one or more related objects together.

All the variables and properties you have worked with so far have held a single value (such as a Boolean (BOOL), or a single object). In contrast, Cocoa Touch Framework collection classes allow you to group multiple items together into a single collection. The primary collection classes are:

  • NSArray
  • NSMutableArray
  • NSDictionary
  • NSMutableDictionary
  • NSSet
  • NSMutableSet

Often, collections are used in iOS apps to create lists. For example, you can have a collection of strings used as a list of songs, or an array of images used to display album covers. Note that items in a collection are usually of the same type, but this isn't a restriction. In fact, the list we are going to use to integrate with social media will eventually contain different types of items.

We'll be talking more about the different collections available in iOS apps, but in this post, I'm going to concentrate on NSArray. The NSArray class is one of the most basic kinds of Objective-C collections. You declare an NSArray variable just as you would any other variable. Notice that you use an asterisk when declaring an NSArray variable indicating that it's a pointer as shown by the declaration in Figure 12

NSArray variable
Figure 12 - An NSArray variable

To initialize an array with a set of values, you can use the initWithObjects: method. For example, check out the code shown in Figure 13. We'll be learning a lot more about alloc and init methods in a future post, but for now, you just need to know that this code creates an array with five strings and stores the array in the names variable.

initialize array
Figure 13 - Initializing an array with a set of values

Notice the last item in the list is nil, indicating the end of the list. If you forget to put a nil at the end of the list, you will get the compiler warning, "Missing sentinel in method dispatch", although I think "Missing nil" would be a bit clearer!

When using Xcode 4.5 or later with the Apple LLVM Compiler 4.0 or later, you can create an NSArray more easily using the syntax shown in Figure 14.

Initialize array, new
Figure 14 - The new array initialization syntax

The '@ sign' and square brackets are part of the new syntax. Notice you don't have to end the list of objects with a nil (in fact, you'll get a compiler error if you do).

To find out how many items are in an array, you can access its count property as shown in Figure 15.

Array count
Figure 15 - You can get the number of items in an array from its count property.

There are a few things to notice about this code. First of all, the itemCount variable doesn't have an asterisk, so this indicates it holds a single, scalar value rather than a reference to an object. Secondly, when referencing a property on an object, you specify the name of the object (names in this case), type a period, and then type the name of the property (count in this case). You'll learn much more about properties later in this series.

Creating an Outlet

Now that you have a basic understanding of variables and arrays, it's time to move on and write some code. The code that we write will take the text that the user entered in the Write Review scene's text view and share it in a variety of ways including Facebook and Twitter.

However, in order to get the text the user enters in the text view, we need a way to reference the text view from the WriteReviewViewController code file. It often surprises new iOS developers that, by default, there is no way to reference a user-interface control on a scene from the associated view controller. Fortunately, it's very easy to make this happen using Xcode. Ultimately, you need to create an outlet, which is a special type of property through which code in the view controller can reference a user-interface control. Let's do that now.

  1. First, select the Mainstoryboard.storyboard file in the Project Navigator and then click on the navigation bar at the top of the Write Review scene to select the scene's view controller. Afterwards, display the Assistant Editor by clicking the middle button in the Editor button group at the top of the Xcode window. If the WriteReviewViewController.m file is not automatically displayed in the Assistant Editor, select the file using the instructions I provided earlier in this post;
  1. Next, hold down the Control key, click the text view in the Write Review scene and drag your mouse pointer down into the WriteReviewViewController.m file directly above the shareReview: method declaration as shown in Figure 16;
Create an outlet
Figure 16 - Control+Drag down from the text view into the WriteReviewViewController.m file.
  1. When you see the Insert Outlet or Outlet Collection popup appear, let go of your mouse button and the Control key. This displays the Insert Outlet popup shown in Figure 17;
Create Outlet popup
Figure 17 - The Insert Outlet popup
  1. In the outlet Name text field enter tvwReview and then click the Connect button. This adds the outlet property declaration shown in Figure 18 to the file.
The new outlet property
Figure 18 - The new tvwReview outlet property

In Objective-C, properties are similar to variables. They provide a place in memory where you can store and retrieve information. Let's take a closer look at the property declaration that Xcode generated for us. Here are some important things to note:

  • The property declaration begins with the keyword @property;
  • The weak and nonatomic keywords are advanced concepts that we will discuss in a future post;
  • The IBOutlet keyword indicates that this property is intended to be connected to a user interface control on the associated scene;
  • UITextView * specifies the type of information the property can hold—in this case a reference to a UITextView object. Just as with variables, the asterisk indicates the property contains a reference to an object;
  • The name of the property is tvwReview. I like to name my outlet properties with a three-character prefix that indicates the type of object the property is associated with. I use tvw for text views, txt for text fields, img for image views, and so on.

There is one other important concept to note about properties. Properties can be accessed from within methods declared in the same class as well as from methods in other classes. In object-oriented terminology, this means that properties are public;

  1. There is one other very important point to note about this outlet property. As shown in Figure 19, if you hover your mouse pointer over the connection well to the left of the outlet property, the associated user-interface control is highlighted in the design surface. Very nice! By the same token, if the connection well has light gray center rather than a dark gray center, it indicates that the outlet is not connected to any user-interface control. When you see a disconnected outlet property, this is usually a problem because an outlet that's not connected to a user-interface control is useless!
Hover over the connection well
Figure 19 - Hover over the outlet's connection well to see the associated user-interface control.
  1. Let's close the Assistant Editor since we don't need it right now. To do this, click the left button in the Editor button group at the top of the Xcode window.

Implementing the shareReview: Method

Now that you have an outlet connection to the Write Review scene's text view, you're ready to write the code that shares the review via social media.

  1. In the Project Navigator, select the WriteReviewViewController.m implementation file;
  1. Click in the code window directly to the right of the left curly brace at the end of the first line of the shareReview: method. Press the return key twice to add two empty, blank lines within the method's curly braces;
  1. Now we are going to declare an NSString variable that can hold the text the user has entered in the Write Review scene's text view. To begin, type the code NSString *reviewText as shown in Figure 20;
reviewText variable
Figure 20 - Create a reviewText variable
  1. Now we need to retrieve the text from the text view and store it in the reviewText variable. To do this, type a space and then type the code = self.tvwReview.text; as shown in Figure 21. In Objective-C, a single equal sign is the assignment operator. It assigns the value on the right side of the equal sign to the variable or property on the left side of the equal sign. 
self.txtReview.text
Figure 21 - Retrieve text from the text view.

On the right side of the equal sign, the code in Figure 21 references the tvwReview outlet property you created in the previous section. Notice when referencing a property that's declared in the same class as your method code, you first type self, which refers to the class (in this case the WriteReviewViewController class). Next, you type a period, and then the name of the outlet. After that, you type the name of the property on the text view object that you want to access (in this case, text), and then you finish the line of code with a semicolon;

  1. Now we are going to add another line of code that declares an array that will contain the items that we want to post on social media networks. To do this, press return and then type the code NSArray *activityItems as shown in Figure 22.
    activityItems array
    Figure 22 - Declare the activityItems array.

    Based on what you have already learned, you can determine that this code declares a variable named activityItems that holds a reference to an NSArray object. Now let's write some code that creates an array and stores it in the activityItems variable. As shown in Figure 23, type the code = [NSArray arrayWithObjects (make sure you type an "s" at the end). This displays the Code Completion popup.

    arrayWithObjects
    Figure 23 - Create the activityItems array.

Make sure the highlight bar is on the first arrayWithObjects: method in the list, and then press the return key. This inserts the template shown in Figure 24 into the code file.

arrayWithObjects template
Figure 24 - The arrayWithObjects: code template

Based on the information you learned in my previous post, you should be able to determine that the code you have entered so far sends an arrayWithObjects: message to the NSArray class. This method creates an array containing the arguments you pass—one array item for each argument. For now, we're just going to pass one piece of information (the review text), and we'll come back and enhance the code later;

  1. In the code template placeholder (shown in Figure 25), type reviewText, then press the tab key to move past the closing square bracket and type a semicolon (;) to complete the line of code. When you're finished, your code should look like Figure 25;
array completed
Figure 25 - The completed code for the array
  1. Now you're ready to write the actual code that displays the iOS Share panel. With your cursor still at the end of the previous line of code, press return to create a new, empty line. Now enter the code UIActivityViewController *avc as shown in Figure 26.
UIActivityViewController
Figure 26 - Declare a variable named avc of the type UIActivityViewController.

UIActivityViewController is a class that is part of Social.framework that makes it extremely easy to display the Share Options panel in your iOS apps;

  1. Next, you're going to write some code that creates an object from the UIActivityViewController class. Again, we'll dive in more deeply on creating objects in a future post. For now, just enter the code [[UIActivityViewController alloc] and press return as shown in Figure 27. We are writing a single command, but Objective-C allows you to wrap a single command onto multiple lines. When this technique is used properly, it can make your code easier to read;
UIActivityViewController alloc
Figure 27 - Continue writing the code that creates a UIActivityViewController object.
  1. Now enter the code initWithA and the Code Completion popup will appear as shown in Figure 28;
InitWithA
Figure 28 - The initWithActivityItems: method appears in the Code Completion popup.
  1. Press return to insert the code template for this method. The first placedholder contains text that indicates it wants you to pass an array. Type activityItems to pass this array as an argument and then press return to break the command into yet another line (Figure 29);
activityItems
Figure 29 - Pass the activityItems array as an argument.
  1. Press tab to go to the final placeholder in this code template, and type nil as the argument. This argument specifies custom services that your app supports. Since the app doesn't have any custom services, we entered nil. Next, press the right arrow (located at the bottom-right corner of your keyboard) to move past the closing square bracket, and then type a semicolon (;) to complete the statement. When you're finished, your code should look like Figure 30;
UIActivityViewController completed
Figure 30 - The completed code statement that creates a UIActivityViewController object.
  1. Now that you have created an object from the UIActivityViewController class, you need to display the view controller. Now that I've guided you through using Code Completion and entering arguments into the code template, you're ready to try this one on your own. Go ahead and enter the new line of code shown at the bottom of the method in Figure 31
Show the activity view controller
Figure 31 - Show the Activity View Controller.

Take a moment to see if you can figure out what this line of code does (I'll wait for you).

This code sends a presentViewController:animated:completion: message to self, which is the WriteReviewViewController. In the big picture, you are asking the WriteReviewViewController to display, or present, the activity view controller. When you pass YES for the animated argument, the screen appears with a nice animation—sliding upward from the bottom of the screen. We don't need any code to execute after the view controller appears, so we pass nil for the second argument.

Now let's run the app in the Simulator and see how it works!

Testing the App in the Simulator

All right, now it's time to kick the tires and see how the code you have just written works.

  1. Click Xcode's Run button to run the app in the Simulator; 
  1. Before you try out the new social media feature of the app, you must first set up Twitter and Facebook accounts on the Simulator. To do this, click the iPhone Simulator's Home button (the large circular button at the bottom of the iPhone). This displays the iPhone Home screen. Click the Settings app's icon on the Home page and scroll to the bottom of the screen until you see the Twitter and Facebook options shown on the left side of Figure 32. Select the Twitter option and add your Twitter account (the center image in Figure 32), then select the Facebook option to set up your Facebook account (the image on the right in Figure 32);
Settings App
Figure 32 - The Simulator's Settings app allows you to set up Twitter and Facebook accounts.
  1. After setting up your accounts, click the Simulator's Home button to display the Home screen, and then click the iAppsReview app icon to launch the application again. When the app appears in the Simulator, click the Write a Review option. Click in the text view control, and when the keyboard appears, type in any text you want. For example, you could write a shameless plug for iPhone Life magazine and tout your new-found app-writing skills at the same time:

I posted this message from an iPhone app I created myself from tutorials in an iPhone Life blog. Awesome!

  1. Whatever you decide to write, when you click the Share button at the top right of the scene, the Share Options panel appears as shown in the image on the left in Figure 33. If you click the Twitter button, your review text appears in the Tweet window shown in the center image in Figure 35. If you click the Facebook button, your review text appears in the Facebook window shown in the image on the right in Figure 35. If you click the Send button in the Tweet window or the Post button in the Facebook window, it will really post these messages for you. Give it a try!
Sharing Panel
Figure 33 - The Share options panel allows you to tweet or post your review text to Facebook.

Conclusion—Your Homework Assignment

Now that you have learned the basics of variables, arrays, properties, outlets, as well as working with the iOS Social Framework, I've got an assignment for you. I find that trying something on your own really helps test what you know and provides an invaluable learning experience.

As it stands right now, the name of the app you are reviewing (as specified in the text field of the Write Review scene), doesn't get posted—only the review text is shared. For your homework, I'd like you to enhance the app so the name of the app as entered in the text field in the Write Review scene is also posted on Facebook and included in your Tweet. Here are the basic steps you need to follow to make this happen:

  1. Create an outlet for the text field;
  1. Change the shareReview: method to append the name of the app to the text of the review (hint: check out the NSStringstringByAppendingString: method);

In my text post, I'll provide the solution to this assignment and you can see how well you did!

<<Previous         Next>>

Tip of the Day: How to Set Speakerphone as the Default for Hands-Free Calling

$
0
0

If you spend most of your free time elbow deep in garden soil, if you have a long commute, or if you otherwise need to take calls on your iPhone hands free, you will probably be pleased to know that it is possible to set your iPhone to automatically answer calls in Headset or Speakerphone mode.

Go to Settings>General>Accessibility and scroll down to tap on Incoming Calls.

 

Select Headset or Speakerphone, whichever mode you prefer. Now all calls will automatically be answered in the mode you chose.

 

You will need to repeat the same steps to turn this mode off. 

Like the Invert Colors setting that makes using your iPhone in the dark easier on your eyes, the ability to answer calls with the headset or speakerphone has so much functionality potential for the average iPhone user, it is a shame they are both buried so deep in the settings menu instead of featured in Control Center.

 

Top image credit: Syda Productions/Shutterstock.com

Game Centered Special Edition: Introducing GodFire: Rise of Prometheus.

$
0
0

Game Centered features roundups and in-depth reviews of the best in iOS games and related gaming news. Among the App Store’s myriad games, it’s all too easy to overlook some of the greats. Each installment of Game Centered will take a close look at a select few worthy of special recognition. Typically Game Centered features several different games, but this week we've got a summer blockbuster on our hands, so this edition is devoted entirely to the highly anticipated GodFire: Rise of Prometheus.

 

 

If you can't see the above trailer, just click HERE.

At long last, after over a year of waiting, the groundbreaking new dungeon-crawler hybrid GodFire: Rise of Prometheus($6.99) has debuted exclusively on iOS. Think Diablo meets Infinity Blade meets Prince of Persia.

I am really impressed with this game. Its graphics are what one might expect from a console game, and its controls are extremely well optimized for the iOS touchscreen with its industry leading responsiveness.

Taking the labyrinth layout and dramatically swinging camera perspectives from Prince of Persia, the brawling, life-metered, dungeon-crawling action of a game like Diablo or Dungeon Hunter, combined with advanced 3D rendering that's on par with some of the App Store's most stellar titles like Infintiy Blade or Modern Combat, GodFire blazes its own unique and exciting trail in this reimagining of a classic video game genre.

 Rise of Prometheus.

This game is a must have for any fans of the top-down, dungeon-crawler, action RPG, even though it's not like any other game of that genre in the App Store. This is the closest thing to a port of the acclaimed God of War console title that I've ever seen on iOS. Specifically, GodFire is a third-person, fixed-perspective game that features single player, combo-based combat. You also gain magical power enhancements and aArmory upgrades as you progress. It's not an easy game and the grind feels great. It's so nice not to be bombarded with requests to make in-app purchases, though of course, like most games, the option to advance faster using real world dinero still exists, just not in any annoying or obnoxious fashion.

GodFire's epic story line has strong elements of Greek mythos, intertwined with futuristic elements that reminded me of the clever way in which Infinity Blade took the hack'n'slash genre and turned it on its head with cutting edge graphics and a post-modernistic dystopian society. Your character, Prometheus, is attempting to retrieve humanity's hope, the spark of GodFire, however his task won't be an easy one, fraught as it is with monsters and beasts out to bring about the hero's untimely end. It's a bloody tale, though not to the extreme like some of the explicitly bloody console titles available. More along the lines of Infinity Blade III's levels of graphic violence. That said, there are some extreme, gratuitous, and graphic finishing moves that you'll use to finish your opponents off if you are victorious.

 Rise of Prometheus.

I've played many interesting and unique games that are hybrids of a few genres. I love these kinds of games, as they tend to push the envelope and subsequently inspire other developers to push themselves more. Down the line, the ripple effect of the creativity and talent the developers at Vivid Games display in GodFire, results in better iOS games in general, as it raises the bar in terms of what people (developers included) think is possible.

 Rise of Prometheus.

T-Mobile Wants You to Test Drive an iPhone 5s

$
0
0

The always aggressive T-Mobile is adding more marketing programs to entice users to switch to their network. The latest campaign is a cheekily-named "7 Night Stand" that lets potential customers test drive a new iPhone 5s for a week. This should give wary users a decent chance to test the phone and the coverage where they live and work. I know Verizon and AT&T customers that regret their decision, based on coverage in their house or office. It's a neat idea that T-Mobile hopes will turn those one-week stands into at least starter marriages if not something longer!

There are some caveats. The phone has to be ordered online, so you can't just walk into a T-Mobile store and start calling. So make sure you're not going to be out of town during the time it could arrive. If there's any damage to the phone, like a cracked screen or water damage, you're on the hook for $100 (which is actually reasonable for such damage.) But if you don't become a customer, you have to return the phone, or face a $699 replacement fee.

T-Mobile

T-Mobile intends to keep the program going with the next generation iPhone as well. This could be a good way to determine if you like the larger screen of the rumored iPhone 6 before committing. One test drive per year is allowed, per customer. This is a creative way to get iPhones into the hands of more users, and to let people determine if the T-Mobile network works where they need it to.

Kanye West Weighs in on Apple Beats Acquisition

$
0
0

Rapper Kanye West Weighs in on Apple/Beats Merger

In a surprise appearance at the Cannes Lions International Creativity Festival, rap superstar, walking ego, and reality television celebrity Kanye West shared some of his thoughts on the recent acquisition of Beats Music by Apple. West compared Apple's buy-out of the company co-founded by Dr. Dre to Samsung's tapping the popularity and cultural influence of Jay-Z when they partnered with him last year to give away a million free copies of his latest album to Galaxy phone buyers. In fact, West suggests that the Apple Beats deal wouldn't have happened if not for the success Samsung saw from leveraging Jay-Z's popularity for promotion.

Rapper Kanye West Weighs in on Apple/Beats Merger
Rapper Jay-Z, promoting Samsung with an exclusive album giveaway.

The Grammy-winning rapper, who has repeatedly compared himself to Steve Jobs, was quoted as saying, "There would have been no Beats deal without the Samsung deal. It showed the number one company, the importance of connecting with culture."

Though a friend and business partner of Jay-Z's, West didn't hold back on expressing his distaste for the Korean smartphone and tablet manufacturer. "The reason [I've] said I didn't like Samsung particularly," the outspoken, and perhaps somewhat delusional rapper went on to say, "is because throughout my entire life, because of how my parents raised me, I have to work with the number one. Samsung is not quite Apple, but it showed that Jimmy and Dre would be able to connect with the number one influencers."

"Jimmy" (Iovine) and "Dre", as they will be called around the Apple campus, not only scored big financially with the Apple/Beats merger, they've also been appointed as executive staff members at Apple as part of the deal.

Rapper Kanye West Weighs in on Apple/Beats Merger
Rap Superstar Kanye West speaking at Cannes Lions

In the past West has made no secret of his admiration for Apple's late leader; even if his comparisons to Jobs are a little, shall we say, grandiose. At Cannes he expounded further on his great respect for the Jobs, saying, "Steve Jobs, as everyone knows, was my biggest influence. Just seeing the way he fought to make things easier for people. After he passed, I made it my life's mission to do what he did inside of that company."

West's assessment of the Apple Beats deal is not without merit, as studies show that not only has Apple's "cool" factor spiked significantly since the deal with Dr. Dre, but the company stands to tap into the lucrative buying power of black Americans who currently, are still predominantly Android smartphone users.

Meanwhile, Dr. Dre hasn't been shy about celebrating his status as hip-hop's first billionaire. The rap pioneer recently sold his former home for a cool sum of 35 million and purchased a new Los Angeles super-mansion (formerly the dwelling of supermodel Gisele Bundchen and NFL quarterback Tom Brady) for 40 million, and just this past weekend, he dropped a $5,000 tip on his waitress after a night of tequila and merriment at the Skybar in West Hollywood's Mondrian Hotel. It certainly seems like Apple is treating their newest employee quite nicely, and that he's relishing paying it forward.

Rutledge BookBook iPad Case Review

$
0
0

As a lover of books, I have always admired the Rutledge BookBook ($89.99) from Twelve South. Early versions were lovely but a little too retro with long leather strings that tied down to a leather button. But Twelve South keeps working it and they have created, with the new Rutledge line, an improved case that looks great, offers all around protection and doesn’t cost an arm and a leg.

The basics are this: Fine, imported leather, with an aged and rustic look inspired by great wooden electric guitars, nylon zippers with leather pulls, and a soft interior. The iPad Air version now holds the iPad within a leather frame with all ports accessible. The frame snaps to the back of the case, and can be unsnapped to position the iPad for typing. The edges of the case are extruded to protect the iPad from bumps and drops. Gold stamping on the raised spine completes the appearance of an antique book.

The case is supple enough to fold back into a well-balanced tablet only mode. This is one of those issues where many cases fail: there is just too much extra case for tablet mode after accounting for a portrait-oriented “media consumption” mode.

The only drawback, unlike slightly snugger cases (like those from Moshi and Apple that hug the Air’s frame very closely) is that when wearing the Rutledge BookBook it might not fit in some bags designed for a more “naked” iPad Air.

One area where I might differ with the Rutledge designers is the snaps. Given the retro look of the case, I understand the design aesthetic of snaps, but with so many cases now turning to magnets, I would choose magnets to further simplify the design.

At this point, my iPad Air is living very happily inside its Rutledge case. It has traveled to London and Amsterdam, and up-and-down the West Coast. After nine months and many options, my iPad Air may have finally found a permanent home—but the iPad case market is vast and the iPad Air can be a fickle fashion horse.

iPhone Life Rating: 5 out of 5 stars

Specifications

11-inch MacBook Air (Late 2010-Current)

Height: 12.3 inches (312 mm)

Width: 8.3 inches (211 mm)

Depth: 1.25 inches (32 mm)

Weight: 14.1 ounces (400 g)

 

Unleash Your Inner App Developer Part 11: The Photo Library

$
0
0

Do you have an idea for an app but lack the programming knowledge to begin building it? In this weekly blog series, How to Unleash Your Inner App Developer, I will take you, the non-programmer, step by step through the process of creating apps for the iPhone, iPod touch, and iPad. Join me each week on this adventure, and you will experience how fun turning your ideas into reality can be! This is Part 11 of the series. If you're just getting started now, check out the beginning of the series here(This post has been updated to iOS 7.1)

Now that you have some of the basics of Objective-C programming under your belt, it's time to dive into some deeper coding territory. However, first let's talk about the homework assignment I gave you last week. I asked you to enhance iAppsReview so that it pulled the name of the app from the Write Review scene's text field. 

This required creating an outlet for the text field and using the NSString class to append two strings together. For a video demonstrating how to do this, check out this link

To get the latest version of iAppsReview, including my previous post's homework assignment, select this link

The iOS Photo Library

Apple allows the custom apps you create to access the Photo Library on an iOS device. This allows you to add some great functionality to your apps. Apple makes it easy to do so by providing a pre-built user interface allowing users to navigate their photos and select an image. Our goal in this post is to display an image picker when the user taps the image view with the Add Image placeholder (Figure 1), let them select an image from the photo album, and display a thumbnail of the image in the image view control to the right of the button.

Write Review scene
Figure 1 - The Photo Album button in the bottom-left corner of the Write Review scene

Adding Photos to the Simulator

By default, the iOS Simulator doesn't have any photos in its Photo Library, which we need for this demo. Fortunately, it's easy to add images as outlined in these steps:

  1. In the Xcode menu, select Xcode > Open Developer Tool > iOS Simulator;
  1. Download the Doodle Jump app images I have created for you from this link. This automatically decompresses the DoodleJump folder into your Mac's Downloads folder;
  1. Open Finder and Navigate to your Downloads folder. Expand the DoodleJump folder and you will see the DoodleJump1.PNG and DoodleJump2.PNG files;
  1. Drag the DoodleJump1.PNG file from the Finder window to the Simulator as shown in Figure 2, and then release your mouse button.
Add an image to the Simulator
Figure 2 - Dragging an image to the Simulator adds it to the Simulator's Photo Library.

When you do this, Safari is launched in the Simulator, and the image is displayed in the browser window as shown in Figure 3;

Image in Simulator
Figure 3 - The image is displayed in Safari.
  1. Next, click on the image and hold your mouse button down until a panel slides up from the bottom and then click the Save Image button.
  1. Now drag and drop the DoodleJump2.PNG from Finder onto the Simulator and repeat the same actions in the previous step to save the image.

That's it! Now you have two images in the iPhone Simulator you can access from the iAppsReview app. If you'd like, you can click the Simulator Home button, launch the Photos app, and check out the two newly added images.

Creating an Action Method and Outlet

In order to display the image picker view that allows the user to select an image from the Photo Album and store it in the image view, you need to do the following:

  • Make the image view control interactive
  • Add a Tap Gesture Recognizer control to the image view
  • Create an accessPhotoLibrary: action method for the Tap Gesture Recognizer;
  • Create an outlet named imgThumbNail for the image view.

Here are the detailed steps:

  1. Open the iAppsReview project in Xcode.
  1. Click on the image view (with the Add Image placeholder) in the Write Review scene to select it, and then go to the Attributes Inspector and select the User Interaction Enabled check box (Figure 4). 
User Interaction Enabled
Figure 4 - Select the User Interaction Enabled check box.
  1. Unfortunately, image views don't have an event that gets fired when you tap on them. Here is where gesture recognizers come to the rescue. Drag a Tap Gesture Recognizer from the Object Library and drop it on the image view as shown in Figure 5.
Add a Tap Gesture Recognizer
Figure 5 - Drag and drop a Tap Gesture Recognizer on the image view.

This adds a second gesture recognizer to the dock below the Write Review Scene.

  1. Since we need to add a new action method to the scene's view controller, let's display the Assistant Editor. To do this, click the center button in the Editor button group at the top right of the Xcode window. This should automatically display the WriteReviewController.m file in the Assistant Editor window. If it doesn't, select Automatic > WriteReviewViewController.m from the navigation bar at the top of the Assistant Editor.
  1. Click on the gesture recognizer on the right to select it, and then go to the Connections Inspector (the first button on the right in the Inspectors toolbar.) In the Sent Actions section, click the connection well to the right of the selector action and drag down to the WriteReviewViewController.m file just below the sender: action method as shown in Figure 6.
Create gesture recognizer action method
Figure 6 - Create a connection from the gesture recognizer.

Release the mouse button and you will see a create connection popup (Figure 7). In the Name text field, enter accessPhotoLibrary and then click Connect.

Create connection popup
Figure 7 - Create a new action method named accessPhotoLibrary.

This creates a new accessPhotoLibrary: action method declaration at the top of the code file. We'll come back and implement this method in just a bit, but first, let's create an outlet for the image view.

Creating an Outlet for the Image View

  1. In the Write Review scene, click on the image view. Next, go to the Connections Inspector, click the connection well to the right of New Referencing Outlet and drag down into the WriteReviewViewController.m file just above the tvwReview property as shown in Figure 8.
Create an outlet
Figure 8 - Create an outlet for the image view.
  1. In the Create Outlete popup, enter imgThumbNail and click Connect. This creates a new outlet property as shown in Figure 9.
The new outlet property
Figure 9 - The new imgThumbnail outlet property

 

Implementing the accessPhotoLibrary: Method

Now you're ready to add implementation code to the accessPhotoLibrary: method:

  1. Close the Assistant Editor by clicking the button on the left button in the Editor button group at the top right of the Xcode window;
  1. In the Project Navigator, click the WriteReviewViewController.m implementation file and scroll down to the bottom of the code file to see the accessPhotoLibrary: method;
  1. Add the code shown in Figure 10, and then we'll discuss what the code does (based on my previous posts, I'm assuming you know the basics of how to type code into a method. Make sure you allow Xcode's Code Completion to automatically complete your code rather than typing in every character yourself.)
accessPhotoLibrary code
Figure 10 - accessPhotoLibrary: implementation code

The first line of code creates an image picker controller object from the UIImagePickerController class. In the second line of code, the image picker controller object's sourceType property is set. The third line of code displays the image picker controller.

Let's take a closer look at the second line of code. Whenever you set the value of a property you're not familiar with, it's a good idea to read Apple's documentation to see how the property is used. Figure 11 contains the documentation for the sourceType property.

sourceType documentation
Figure 11 - Apple's documentation for the sourceType property of the UIImagePickerController

The documentation specifies that the sourceType property holds a value of the type UIImagePickerControllerSourceType, and it refers to the type as an enumeration. We'll find out what that is in just a moment.

If you click on the UIImagePickerControllerSourceType link, it takes you to the documentation shown in Figure 12.

UIImagePickerControllerSourceType
Figure 12 - The UIImagePickerControllerSourceType enumeration

An enumeration is a group of related constant values. In this case, the UIImagePickerControllerSourceType enumeration defines the valid values that can be stored in the sourceType property. Enumerations come in handy in cases like this when there are a finite number of valid values that can be stored in a property. Unlike string variables where you can store any string of characters, or integer variables where you can store any valid integer, enumerations limit the valid values to a finite set.

Reading through the documentation, we can determine that the value we want is UIImagePickerControllerSourceTypePhotoLibrary because it specifies that the device's photo library is the source for the image picker. This is exactly what we want.

Before moving on, take a look at Figure 13, which contains a sequence diagram that shows the interaction between the WriteReviewViewController and UIImagePickerController objects. 

Sequence Diagram 1
Figure 13 - The message interaction between the writeReviewController and imagePicker objects

The objects at the top of the sequence diagram represent the objects that are created from the WriteReviewViewController and UIImagePickerController classes at run time. The dotted lines below the objects are called "lifelines" and indicate the life of an object. The arrows pointing between the objects and between the lifelines are each a single message passed between the objects. Here's the order in which the messages occur:

  1. The writeReviewViewController object creates an imagePicker object from the UIImagePickerController class;
  1. The writeReviewViewController object passes a setSourceType: message to the imagePicker object, passing a UIImagePickerControllerSourceTypePhotoLibrary argument. When you set a property value, behind the scenes, a method is actually executed as indicated here;
  1. The writeReviewViewController object sends a presentViewController: message to itself, passing the imagePicker object as an argument (I've left out the other arguments for the sake of brevity). When the presentViewController: method is executed at run time, the imagePicker object is displayed in the user interface.

I find it's important to visual object interaction so you truly understand how your code works. As you work on your own apps, I recommend creating sequence diagrams for your app's more complicated message sequences.

Testing the Photo Library Integration

Let's take the code we wrote for a spin to see how it works.

  1. In Xcode, click the Run button;
  1. When the app appears in the Simulator, click the Write a Review option, and then on the Write Review screen, click on the image view with the Add Image placeholder. Since this is the first time the iAppsReview app has tried to access the photo library, a dialog appears asking if you would like iAppsReview to access your photos. Click on OK to allow it. This displays the Photos screen shown on the left side of Figure 14, which indicates that we have two saved photos. Exactly what we expected. This is the same interface that users are comfortable using in the built-in Photos app;
Photo Library screens
Figure 14 - The Photo Library screens of the Image Picker Controller
  1. Tap the Saved Photos row and you will be taken to the Saved Photos screen shown in the right side of Figure 14. If you select one of the photos, the image picker controller disappears down through the bottom of the screen. Nothing happens with the image is selected because we haven't written any code to respond to the selection yet.

Retrieving the Selected Image Using a Delegate

If you take another look at the sequence diagram in Figure 13, there doesn't seem to be a way for the WriteReviewViewController object to get the image that is selected in the imagePicker object. 

 

If you read further down in the Apple's documentation for the UIImagePickerController class, you will see the section Providing a Delegate Object as shown in Figure 15.

 

Provide a Delegate Object
Figure 15 - You must provide a delegate object for an image picker controller.

This documentation states: "To use an image picker controller you must provide a delegate that conforms to the UIImagePickerControllerDelegate protocol." What does this mean? 

In this context, delegation refers to one object relying on another object (the delegate) to provide a specified set of functionality. In Objective-C, you can define a specific set of required functionality using a protocol. The fact that the protocol mentioned in the documentation is named UIImagePickerControllerDelegate indicates it's the image picker controller that specifies the functionality it needs to pass back information about the image selected by the user.

If you click on the UIImagePickerControllerDelegate Protocol Reference link in the help topic shown in Figure 9, you are taken to that help topic that defines the methods shown in Figure 16.

UIImagePickercontrollerDelegate protocol
Figure 16 - The UIImagePickerControllerDelegate Protocol methods

We can ignore the third method in the list, because the documentation tells us it is "deprecated". This is a status that is applied to methods in the Cocoa Touch Framework that should be avoided because they have been superseded by other methods.

Here's a synopsis of the first two methods:

  1. imagePickerController:didFinishPickingMediaWithInfo: The image picker controller calls this method on the delegate object when the user has finished selecting an image. It passes back information to the delegate describing the media that has been selected;
  1. imagePickerControllerDidCancel: The image picker controller calls this method on the delegate object when the user clicks Cancel rather than selecting an image.

Ultimately, any object that is the delegate of the image picker controller must have these two methods. Unfortunately, Apple's documentation is somewhat misleading. While it's true that a delegate object must implement the UIImagePickerControllerDelegate, it must also implement the UINavigationControllerDelegate. How do I know this? The UIImagePickerController class has a delegate property that is described in the Apple documentation shown in Figure 17.

delegate documentation
Figure 17 - The delegate property of the UIImagePickerControllerDelegate class

So bottom line, we need to implement both of these protocols on our delegate object.

Although you can make any object the delegate for the image picker controller, it's typical to make the view controller the delegate object. Let's do that now as outlined in the following steps.

  1. In the Project Navigator, select the WriteReviewViewController.h header file. We are selecting the header file because this is where you publicly declare (for other classes to see) that the class implements a particular protocol;
  1. Near the top of the header file, click to the right of the line that begins with @interface;
  1. We could put the code that implements the protocol on this same line, but it's easier to read if we add it on a second line. To do this, press return and then tab to indent the code a bit;
  1. Next, type the code shown in Figure 18. This code between angled brackets tells the world (because it's in the public header file) that the WriteReviewViewController class implements the UIImagePickerControllerDelegate and UINavigationControllerDelegate protocols;
Implement protocols
Figure 18 - Implementing the protocols
  1. Before we implement the methods that are in the UIImagePickerControllerDelegate protocol, we need to add some variables to the class to hold some of the information that we get back from the image picker controller. Rather than creating local variables within a method, we are going to create variables at the class level. This type of variable is known as an instance variable. This type of variable is very useful, because, unlike local variables, they can be accessed by any method in the class.

To create these instance variables, go to the Project Navigator and select the WriteReviewViewController.m implementation file. Afterwards, scroll to the top of the code file and locate the line of code that begins with the key word @implementation. Click to the right of this line of code, press the space bar, and add the code between curly braces shown in Figure 19.

instance variables
Figure 19 - Declaring instance variables

This code declares an instance variable named image of the type UIImage and another instance variable named imageURL that holds an object of type NSURL;

  1. So, now we need to implement the methods that are in the UIImagePickerControllerDelegate protocol. To do this, add the methods shown in Figure 20 below the accessPhotoLibrary: method.
Implement the methods

Figure 20 - The implementation of the UIImagePickerControllerDelegate methods

The code in the first method sends a dismissViewControllerAnimated:completion: message to itself, which hides the image picker controller after the user selects an image. Afterwards it grabs the image from the info parameter passed back from the image picker controller and stores it in the image instance variable for future use. Next, the code gets the URL of the image (the location of the image on the iOS device) and stores it in the imageURL instance variable, also for future use.

The imagePickerControllerDidCancel: method also dismisses the image picker controller, but doesn't need to do anything afterwards;

  1. Now there's just one other thing you need to do—set WriteReviewViewController as the delegate for the image picker controller. To do this, add the code shown in Figure 21 to the accessPhotoLibrary: method.
Set the delegate property
Figure 21 - Store a reference to the WriteReviewViewController object in the delegate property of the image picker controller.

To get a clearer picture of how these new messages between the objects work, check out Figure 22.

Figure 22 - The complete message flow between objects

In this updated sequence diagram, notice there is a new setDelegate message where the writeReviewViewController object stores a reference to itself in the imagePicker object's delegate property. At the bottom of the diagram, a new message has been added. This message is sent from the imagePicker object to the writeReviewViewController object after the user selects an image. A media argument is sent in this message that contains a collection of objects containing information about the selected image.

Testing the Delegate Code

Now you're ready to test the code and see how it works.

  1. Click Xcode's Run button;
  1. When the app appears in the Simulator, click the Write a Review row;
  1. Click the Photo Album button;
  1. In the Photos screen, select the Saved Photos row;
  1. Select either of the two images;
  1. The image picker controller should disappear and you should see the image displayed as a thumbnail in the image view as shown in Figure 23.
Image view thumbnail
Figure 23 - The selected photo appears in the image view.

If you would like a copy of the project as we have completed it so far, just click on this link.

Conclusion

Personally, I find it interesting and fun to add the type of functionality we have added to iAppsReview in this post. Along the way, you have learned a number of new concepts including delegates, protocols, and instance variables. As time goes by and we use these concepts in future posts, they will become far more familiar and an important part of your iOS tool kit.

<<Previous          Next>>

Tip of the Day: How to Dial Extensions on Your iPhone

$
0
0

Adding a contact's phone number to your iPhone is simple. But what about adding phone numbers with extensions? You could manually dial the extension after calling, but fortunately that's not necessary. Here's how to set up a contact's phone number so that your iPhone dials an extension automatically:

In your Phone app, click on Contacts and tap + to create a new contact.

After entering the first 10 digits of the phone number, tap the +*# button.

You will see a screen that looks like this:

Some phone systems let you dial the extension anytime after the call has been answered, while others require a longer wait. You should take this in to account when adding your contact's extension.

Tapping the Pause button and then typing the extension will add a comma before the extension and set your phone up to pause briefly after the call is answered before automatically dialing the extension.

Tapping the Wait button and then typing the extension will add a semi-colon before the extension and set your phone up to wait after the call is answered until you tap Dial [extension number]. 

   

 

Top image credit: Adam Radosavljevic/Shutterstock.com

June 30th Biweekly Giveaway!

$
0
0

This is the official announcement of the iPhone life Biweekly Giveaway! Be sure to enter the giveaway at iphoneLife.com/giveaways to win prizes, which we'll announce June 30th! We are raffling off tons of great accessories for FREE.

Here's how it works: Every other Friday we will announce the prizes we're giving away through iphonelife.com, Facebook, Twitter, and Google+. To enter the giveaway, go to iphoneLife.com/giveaways and tell your friends to enter too! On the following Monday morning, we will randomly select the winners. If you win an app, we will email you the promo code to redeem the app for free. If you win an accessory, send us your address and we will mail it to you.

This weeks featured items are:

1. Bandshell iP5 iPhone 5/5s Case: Retail Price $29.99

 

The Bandshell case is ultra-slim and durable, and improves your iPhone listening and viewing experience. This dual-purpose case amplifies the volume and sound quality of your music, videos, podcasts, movies, and programs without the need for extra speakers or cords. The Bandshell kickstand allows the phone to stand up on its side, making it easier to watch movies and videos without having to hold the phone or lean it against something. Enjoy using your smart phone to listen to music, watch videos, host a conference call, or make a live recording. 

 

2. LifeCharge iPhone 5/5s Battery Case: Retail Price $79.99

LifeCHARGE Battery Case's sleek, streamlined design naturally fits to the form of your phone, allowing portability of your original iPhone 5/5s. Never run out of power again with the built-in 2300mAh lithium-Polymer battery. It offers up to eight hours of added time on a 3G network, 10 hours of Internet use on Wi-Fi, 40 hours of Audio playback time or 10 hours of video playback time. Eye-catching LED indicators inform you what energy level you're currently operating under.

 

3. Naztech PB10400 Universal Power Bank: Retail Price $79.99

The Naztech PB10400 Universal Power Bank is an unrivaled combination of power and design that allows you to keep all your mobile devices charged while on the go. With five USB ports and multiple included connector tips, the PB10400 is a perfect solution to accommodate all the needs of your mobile devices while on a road trip, hike, or long flight. The unit's tremendous 10400mAh power capacity charges up to five devices (or even two iPads or similar tablets) simultaneously effortlessly and efficiently with up to 3.1 amps. Never run out of power again!

 

 

Questions or comments? Email Brian@iphonelife.com. Good luck and remember to visit iphonelife.com/giveaways to enter! Also check out our other contests at iphonelife.com/contests. The next contest drawing is June 30th

Apple Quietly Makes Some Macs More Affordable

$
0
0

Apple didn't really make any hardware news during their Worldwide Developers Conference. Two weeks later they haven't released entirely new machines, but they have made some pricing moves. The iMac is now even more affordable, with the lower cost of entry starting at $1099 (and $50 less for Education customers.) Apple TV and the venerable Mac mini have also seen their price drop, overseas at least. Power users might scoff at the specs on these entry level systems, but for surfing the web, checking email, using iTunes, Netflix, etc., they could be ideal.

Typically, such price drops occur when a new, superior product is announced or on its way. Apple may not have had those products ready for WWDC two weeks ago, but these price changes could signal new products before Christmas or possibly before Back-To-School season in August or September.

Keep in mind that Mac OS Yosemite will reportedly ship in the fall along with iOS 8, and Apple's Eddy Cue is on record as saying that this year, Apple has the best new product lineup in the 25 years he has been with the company. All of this points to an exciting fall for Apple watchers!

Top 3 App Deals of the Week

$
0
0

As new iOS apps flood the App Store every day — recently topping 1,000,000 — we know it’s tough to tell which ones are worth their salt. But thanks to our Weekly Scoop, you can have the best for free! Here you’ll find a weekly roundup of the coolest apps free or at a discount for a limited-time only. Each week features the best and brightest from websites like Free App ReportAppsGoneFreeAppieDay, AppShopper and more.

Hurry! Get 'em while they’re hot!

1.Fruit Ninja( Free from $0.99)

Hiiii-YA! Aw nuts. Now I've got watermelon all over my new suit! I hate that! But with this awesome new app, my dry cleaning bill is gonna go down! This is a juicy action game with lots of splashy, smooshy sweet destructive carnage. If you've ever been the type to get a kick out of some good (if a little messy and yucky) fun, you're gonna love this! AND you can do it in a suit and not even care.

2.Fodors City Guides(Free from $1.99)

This app contains 22 super handy travel guides for your iPhone or iPad, plus discounted tickets for tours and attractions. This app won the 2013 Travel App of the Year by the Society of American Travel Writers, and was featured in WIRED magazine and in "New & Noteworthy" by Apple. Next time you go traipsing about the globe, be smart. Get this app and stop embarrassing yourself trying to fold that silly old map you brought! It's 2014, dude!

3. Traffic Racer(Free from $0.99) 

This is the #1 paid app in over 40 countries!  Not all of those people can possibly have bad taste, right?  This app is awesome.  You can enjoy endless arcade style racing as you drive your car through highway traffic, earn money, get cool mods on your existing car or upgrade to fancier ones.  Try to be one of the fastest drivers on the leaderboard!  Zoom Zoom! 

Swift 101 - Swift Meets the Cocoa Touch Framework

$
0
0

Even though Apple has provided the new Swift programming language for building iOS apps, one thing remains the same—we still use the Cocoa Touch Framework libraries to build iOS functionality into our apps. However, since the Cocoa Touch Framework is written in Objective-C, how is this accomplished? In this article I'll show you the mechanics behind how Swift accesses Objective-C code, and how the Cocoa Touch APIs (application programming interfaces) change when you access them from Swift.

Swift and Objective-C Interoperability

Apple has done a great job of making it easy for you to access Objective-C code from Swift, and to access Swift code from Objective-C. In fact, a single Xcode project can contain both Objective-C and Swift code files. This is great news for those of us who have many apps and code libraries written in Objective-C.

This interoperability allows you to slowly migrate your apps to Swift without rewriting the entire app or waiting for Swift versions of third-party libraries you are using. It also allows you to access the power of the Cocoa Touch Framework. This is important when working in a new language such as Swift, which will take some time to fully mature.

Importing Cocoa Touch Frameworks

In a Swift project, you no longer need to add Cocoa Touch frameworks to your project by means of the Project Editor. Instead, all you have to do is add an import statement at the top of your Swift code file followed by the name of the Cocoa Touch framework you want to import. For example, the following code imports the Cocoa Touch Foundation and Media Player frameworks:

Importing a framework

It's as easy as that!

When you import an Objective-C framework into a project (Figure 1) the framework's header files are compiled into Objective-C modules, which are then imported as Swift APIs.

Importing Objective-C frameworks to Swift

This import process makes changes to the classes, methods, and functions so they look like Swift classes. For example, the types of method argument and return values are changed to Swift types.

So, for example, a Cocoa Touch Framework method that returns NSString in Objective-C returns the Swift String type instead. As another example, enumerations change from the Objective-C style shown here:

MPMovieSourceTypeUnknownMPMovieSourceTypeFileMPMovieSourceTypeStreaming

To the new Swift enumeration style:

MPMovieSourceType.UnknownMPMovieSourceType.FileMPMovieSourceType.Streaming

Once you have imported an Objective-C framework into your project, you can instantiate classes from the framework and access their functionality using native Swift syntax.

Creating Objects from Objective-C Classes in Swift

When you create objects from Cocoa Touch Framework classes in Swift, you can see that changes were made to the class initializer methods when they were imported to Swift.

By way of comparison, here is how you instantiate a UIImageView in Objective-C using the initWithImage: initializer:

UIImageView *imageView = [[UIImageView alloc] initWithImage:myImage];

The equivalent code in Swift looks like this:

var myImageView:UIImageView = UIImageView(image: myImage)

Here are the important differences to note:

  • You don't call alloc in Swift because Swift handles this for you.
  • The initWith prefix gets removed from the initWithImage name (init or initWith is removed based on the initializer name.)
  • The remainder of the initializer name (Image) is placed between parentheses, its first character is lowercased and is used as the name of the first argument.
  • Any additional Objective-C arguments are also converted to argument names and are included between the parentheses.

When creating an instance of a class in Swift, you don't need to specify the type of the variable because Swift is able to figure out, or infer, the type for you:

var myImageView = UIImageView(image: myImage)

Creating Objects from Objective-C Factory Methods in Swift

Many Objective-C classes have factory methods that combine alloc and init in one step and return a new object (they are called factory methods because they manufacture, or create objects.) For example, the following Objective-C code shows a factory method that returns a UIImage object:

UIImage *myImage = [UIImage imageNamed:@"pause.png"];

When factory methods are imported into Swift, they are converted to initializer methods like this:

var myImage = UIImage(named: "pause.png")

Notice that the imageNamed parameter is changed to named in Swift.

Accessing Objective-C Properties in Swift

When accessing properties in Objective-C, you can choose from two different syntaxes. You can either send a message using square brackets or use dot syntax (.) to access the property

In Swift, you always access properties using dot syntax. For example:

controller.fullscreen = false

When an Objective-C class is imported into Swift, only its properties that have been declared using the @property declaration are converted to properties in Swift. Any method declared as an implicit getter (a method that accepts no parameters and returns a value) are imported as methods.

Calling Methods in Swift

In Swift, you also call methods using dot syntax. For example, the following code calls the pause method on a controller object.

controller.pause()

When calling a method that has just one parameter, it's typical that you simply pass an argument like this:

var suffixFound = myString.hasPrefix("txt")

If a method has multiple parameters, the rest of the parameters are named and you use syntax similar to Objective-C when passing the arguments. For example, in the following method call, the first argument has no name, but for the second argument you specify the name followed by a colon (animated:) followed by the argument (true):

tableView.deselectRowAtIndexPath(indexPath animated: true)

Calling Objective-C Methods in Swift

When an Objective-C class is imported into Swift, the method name and arguments are changed to adapt to Swift method syntax.

For example, the following Objective-C message call:

[self performSegueWithIdentifier:@"MySegue" sender:self];

Looks like this in Swift:

self.performSegueWithIdentifier("MySegue", sender: self)

Here are the main points to note:

  • You use dot syntax (.) to call the method.
  • The first part of the Objective-C selector (performSegueWithIdentifier) becomes the method name.
  • The first argument ("MySegue") appears insides the parentheses and doesn't have a name.
  • All other parts of the selector (for example, sender:) become argument names and are included in the parentheses.

Conclusion

The interoperability that Apple has provided for Swift makes it much easier for Objective-C developers to step over into this new language. Even though the syntax has changed a bit it's still recognizable, and Xcode's Code Completion helps considerably as you shift your brain over to Swift!

 

Adobe Releases Ink & Slide for iPad

$
0
0

Adobe made the jump into hardware on Wednesday, and for iPad users that means a few more tools to hone your design skills. TheAdobe Ink & Slide ($199.99) works in tandem as a stylus and ruler for creating digital works of art.

Adobe has been hinting at the stylus and ruler concepts for a little over a year. Dubbed Project Mighty in the early planning stages, the final product hopes to give design professionals "greater creative control." 

Adobe Ink utilizes Adonit Pixelpoint technology, a shrunken stylus tip that offers more precise drawing capabilities like that of a ballpoint pen. It also connects to Creative Cloud for accessing your photos and creating color palettes on Adobe Kuler.

The stylus syncs to your iPad via Bluetooth and charges in a carrying case that can be plugged into a Micro USB. The top button of the stylus opens up your colors sets and Creative Cloud clipboard.

As a drafting tool, Slide can create straight lines and geometric shapes with ease. Using magnets, the iPad can detect when the ruler is placed on the screen without requiring batteries.

Two new mobile apps,Line (free) and Sketch(free), work with both the digital pen and the ruler to bring some added features and a forum for sharing ideas with the Creative Cloud community. Line can be used primarily for straight-line perspective drawings, while Sketch is a more straightforward drawing app.

Ink & Slide are sold together as a package for $199.99, and the Line and Sketch apps can be found on iTunes for free. To learn more about Ink & Slide, visit Adobe's website to find a series of tutorial videos.


Apple News: Watching for an iWatch

$
0
0

All signs point to an Apple iWatch being released around October. Apple's boosting their Sapphire manufacturing, which could make iPhone screens more durable, but more importantly, it could make an iWatch that handles the bumps and grinds common to watches. Indeed Sapphire is commonly used already for traditional watch screens, and unlike iPhones, most people don't put their watch in a protective case!  

iPod nano 6th gen

Now the Wall Street Journal is reporting the iWatch might come in different sizes, presumably for men and women, who might prefer something less bulky. As an owner of both the Pebble smart watch and a Martian Watch, I'm excited to see what Apple could do. I like the waterproof Pebble, and the fact that it charge by a magnetically attached cable. The Martian Watch acts as a Bluetooth speaker and has a "Siri button" that lets the wearer interact with Siri directly from the watch. If Apple can merge these capabilities, and add a touchscreen app-based interface, they could do quite well.

Based on Apple's MagSafe connector, and other Apple patents, there's speculation that an iWatch will have wireless charging, similar to PowerMat. The iWatch could sync data wirelessly by Low Energy Bluetooth. This could eliminate all ports, making the iWatch sleek and ideally, waterproof. October would be a great time to release the iWatch. The iWatch could pair with the new larger iPhone 6, anticipated in September. A larger phone is likely to stay in people's pockets, backpacks, or purses, and the watch could act as a speakerphone. Plus, it would be just in time for holiday shopping!

Tip of the Day: Siri Can Flip a Coin, Roll Dice, and Make Hard Parenting Choices for You

$
0
0

Siri can flip a coin, roll dice, or pick random numbers for you.

These may seem like amusing but ultimately useless tricks, unless you are a parent. In which case they can help you navigate all the tricky situations you deal with on a daily basis. 

Need to decide which of your offspring is going to wash and which one is going to dry? Just ask Siri to flip a coin. Heads? Start scrubbing those dishes. Tails? Grab that dish towel.

Need to break up a fight between two squabbling children? Have each one pick a number between 1 and 100 and then ask Siri for a number between 1 and 100. Whoever picks a number closest to Siri's answer gets the last orange popsicle. Pick the wrong number and you'll have to make do with grape. Sorry, kid.

Need to decide who gets the first turn on a single-player game? Have each child ask Siri to roll the dice. Whoever rolls the highest number gets to go first.

 

Stylus Update: The Lynktec Apex & Nomad Mini 2

$
0
0

When a company creates an input accessory for a device that isn't designed for one, they need to decide what the accessory is going to do that the device's normal input method doesn't. The iPad was designed to use a finger as an input device, and although it supports multi-touch, the iPad's sensors see the finger as a rather blunt instrument. So the stylus market developed with two main branches: The first aimed to be a different or better kind of finger and the second added a feature, usually pressure sensitivity, that the iPad was not designed to accept.

" src="/sites/all/modules/wysiwyg/plugins/break/images/spacer.gif" style="font-size: 10pt;" title="<--break-->">This review looks at two styluses, each in the better kind of finger camp. The Lynktec offers a new twist, however, with its fine-line active technology, while the Nomad Mini 2 provides its users with a basic rubber-tipped stylus along with a brush. 

Lynktec Apex ($49.99) 

iPhone Life 4 out of 5 stars 

Most active stylus products that connect to the iPad with Bluetooth do so in order to pass along output from their pressure sensitive sensors to the app in use, usually a drawing app or note app that would benefit from more than constant and singular pressure. But then again, sometimes a fine line is a good thing, when taking handwritten notes. Words written by hand don't really benefit from pressure sensitivity, but they do benefit from precision.  

With its 2.3mm tip, the Apex provides a fine line that can't be mimicked with non-active styluses. Unlike regular rubber-tipped styli, the Apex doesn't work without power. The capacitance requires power, but not Bluetooth. And because of the fine tip, it only reacts to the iPad where the tip touches, which is the key to its precision. This is not a good pen for artwork outside of basic sketching; but because it doesn’t require Bluetooth or apps specifically designed for it, the Apex works throughout iOS.  

Slow drawing can lead to some squiggly lines, but according to Lynktec, that is because the iPad's screen sensors are less precise than the pen. Innovation often leaps and needs other innovations to keep up. Draw faster and the software smoothes out the input from the sensor grid. 

Pros: 

Permits fine-line note taking on the iPad. Rechargeable battery. Pocket clip. Works everywhere in iOS

Cons: 

Requires charging. Recharging requires removal of a cap that doesn't have anyplace to go (and thus can be lost) during a charging cycle. Could use a softer grip. Not really made for iPhone. 

Final Verdict:  

A very well executed first gen product. The tech is solid, but it could use a little bit of style refinement and sculpting for better hand feel.   

Nomad Mini 2 ($35) 

iPhone Life Rating: 3 out of 5 stars 

The Nomad Mini 2 has a soft, retractable brush tip on one end and a rubber tip on the other. At 5 inches long, it is a very portable paintbrush stylus. The Nomad Mini 2 weighs 0.6oz. It curvy shape feels well balanced. The rubber tip can easily be unscrewed and replaced. 

Pros: 

Small, light. Dual tipped. Retraction keeps brush from fraying. 

Cons:

The brush is a cool idea, but it's more about the feel for the artist than it is about the way it reacts with the iPad. For real "paint-like" effects, the artist will need an active, pressure-sensitive stylus and a painting or drawing program that recognizes it. 

Final Verdict:  

Good for what it is. As with all iPad brushes, it is cooler and more useful as an idea the in actual practice. It really depends on the experience you are used to or like. 

Adventure-Proof Your iPhone with Catalyst's New Touch ID Compatible, Waterproof Case

$
0
0

I've consistently been impressed with Catalyst iPhone cases, ever since their first iteration of waterproof protective cases for the iPhone 4. Each version of the Catalyst protective case has gotten better, with marked improvements over the previous model. The Catalyst + Survivor case saw the company team up with Griffin to provide not only some of the best extreme-duty iPhone protection on the market, but also one of the most affordable, premium rugged cases available. Now with the new Catalyst case for the iPhone 5/5S with Touch ID($64.99), the company has upped the ante and introduced their latest model of iPhone cases. How does this case compare to its predecessors, and to the other high-level protective cases that are also available? Read on after the break to find out!

The new catalyst iPhone case is, as they say, the complete package. It comes in a variety if colors to suit anyone's tastes, with numerous accessories that enable you to attach your Catalyst encased iPhone to everything from bike handlebars to car dashboards to your own wrist.

In terms of protection, the new Catlayst case surpasses the rigorous military standards, with shock protection against drops of up to 6 feet and waterproof protection down to a remarkable 16 feet. Compared to the Otterbox Preserver or the Lifeproof nüüd or frē models, which only offer waterproof protection down to 6 feet, the Catalyst would be my top pick of full-time use cases in any situation where dependable waterproofness is called for.

Design:

I've written reviews of each version of the Catalyst iPhone cases, and no company has taken my suggestions to heart more than Catalyst. Their newest iPhone case not only incorporates Touch ID compatibility, it also introduces a grippier texture into its shell, preventing any tendency to slip out of your hand that was a problem for the Survivor + Catalyst model. The newest model also features improved port cover mechanics. In the previous versions of the Catalyst case, they either had no access to the charging port, or they provided access to the port, but featured a latch closure that was prone to developing cracks with extended use. In this latest version of the Catalyst iPhone case, they have done away with the latch cover and introduced a silicone flap that when closed, seals the headphone and charging ports in an extremely secure fashion that allows the Catalyst to travel to over twice the depth of its closest competition. If you've got any snorkeling or water sports planned for your summer adventures, this would be the case I'd recommend, for both its versatility and durability.

Functionality:

Some of the things I look at when reviewing a case include how well it caters to the needs of its targeted demographic. This case gets an exceptional rating when it comes to meeting the needs of the adventurous, outdoorsy type. It's also worth noting however, that the Catalyst case is extremely low profile and streamlined, making it an excellent option for just about anyone who has a tendency to drop their iPhone or anyone who is around water a lot, like parents of babies and toddlers, or even just folks who love to luxuriate in the bath tub while browsing their iPhone.

Pros:

  • One of the best alternatives when it comes to rugged iphone 5/5s protection with a svelte, form-fitting design.

  • New, textured exterior sides of this case give extremely reliable grip when wet.

  • Low-profile and relatively discreet design doesn't take away from the elegant beauty of the iPhone.

  • Phone calls sound great. typically when using a waterproof case, it's not uncommon for me to observe some level of sound quality degradation. This new Catalyst case allows for some of the best audio quality of any case in this category.

  • Great price! For a high-quality case which compares favorably with some of other the top rugged case options currently on the market, the Catalyst is a great deal at only $64.99.

  • Offers a wide variety of mounting accessories (including bike mounts, car mounts, and a floating wrist strap) so that you truly can take your Catalyst encased iPhone with you wherever you roam.

 

Cons:

  • The Catalyst case does not include a headphone jack adaptor or a wrist strap lanyard. The previous versions of the Catalyst case included a wrist strap, so I'm not sure why this latest iteration includes a wrist strap attachment point but no wrist strap, as a wrist strap certainly comes in handy. And since the case's headphone access port is rather small and only able to accommodate jacks approximately the size of Apple's Ear Pods, an included headphone jack adaptor would also be extremely useful for anyone wishing to use headphones for music of phone calls.

  • While the silicone flap that folds down to seal the headphone and a lightning adapter ports seems durable enough (I preferred it to the previous version Catalyst waterproof case that had a hard and easy-to-crack plastic latch), if Catalyst had utilized a slightly denser and thicker rubber material (instead of its somewhat flimsy flap) to cover these important ports, I'd expect this case would have greater longevity as a result.

Verdict:

The newest waterproof iPhone 5/5s case from Catalyst is an awesome protective case, one that provides a higher level of waterproof protection than most of its closest competition. Add in its impressive shock protection and great acoustics, and this becomes one of my favorite extreme-duty protective cases that money can buy. 

iPhone Life Rating: 4.5 out of 5 stars.

Stand Tall: 5 Tips for Purchasing an iPhone Case for Video Viewing

$
0
0

“Can I watch a video?” my three-year-old son asks.

Ever since my mom turned him on to YouTube cartoons on her smartphone, this has become a frequent request, albeit one my wife and I decline more times than not. We aren’t opposed to watching television, but we view it as more of a special event than an everyday diversion. Despite our perspective on this, he still asks, and asks.

When we do allow him to take over the iPhone to watch videos we have filmed of him or favorites he has seen on YouTube—mostly at restaurants when his patience has gone out the window or when nap time looms large—we are concerned he will drop the device and break it, despite the case and screen protector that we both have on our phones.

But viewing videos on an iPhone isn’t limited to children, and there are plenty of adults who can be careless when handling their device. We have recently discovered iPhone cases that, like their iPad counterparts, allow your device to stand on a flat surface for easier viewing. But if you or your young child enjoys watching videos on the go, here are five key considerations you need to take into account before purchasing a case with a stand.

  1. Make sure that the stand supports your iPhone at an appropriate angle:

It seems silly, but it is difficult to watch a video on a mobile screen if it stands too close to a right angle or seems ready to lie on the table. There is a middle ground that is critical, so make sure that you keep this in mind. You will want it to sit naturally so that you or your child can look at the screen without having to lean down if it is sitting on a table that is standard height.

  1. Ensure that the stand is durable:

My most recent case includes a stand that, although it supports the phone at an appropriate angle, comes completely out of the back of the phone any time I use it. If you are in the market for a case with a stand, and you have an opportunity to handle the case outside of the packaging, do so. It will allow you to determine just how sturdy the stand is. If you aren’t able to handle the case outside of the packaging, do your research and read reviews.

  1. Opt for a water-resistant version of the case:

If you intend for your child to use the phone, and you anticipate they will use it anywhere that water or other liquids might come in contact with it, invest in the case that is water resistant. Three-year-olds are masters of destruction; if it can be broken, they are completely willing and able to make it happen. I have to admit, though, that I am just as guilty as my son. Liquids are the number one reason my devices have been ruined, even before I was a father. You simply never know when a spill may happen, so it is better to be prepared.

  1. Consider horizontal versus vertical viewing:

Most cases on the market include stands allowing you to view your screen both horizontally and vertically. There are others that will only allow you to view the phone at one angle, like the Scosche IT4KBK Hybrid Case with Kickstand. Generally speaking, horizontal viewing allows for a larger picture, and this is likely your best bet. There will be less strain on your eyes and, in my experience, less risk of your phone toppling over if the table is tapped or small hands tip it over. I always recommend a versatile case that allows for vertical and horizontal viewing.

  1. Remember that size matters:

If you are shopping for a case with a stand that is also water resistant, you will likely find yourself looking at bulkier options. Water-resistant cases tend to come tend to be bigger than others, and most stands require a thicker back to the case. If the first thing that comes to mind when thinking about a waterproof case with a stand tis a bulky Otterbox, rest assured that there are others out there that will serve the purpose, like Ballistic cases. If you opt for a case that isn’t water resistant, size decreases, but so does your protection.

Even if your child will be the primary viewer of the videos on your phone, keep in mind that it is your phone. Purchase a case that you like the look of and that feels good in your hand and that fits comfortably in your pocket.

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Viewing all 13234 articles
Browse latest View live