Chủ Nhật, 15 tháng 3, 2015

iOS 8.2 Jailbreak Update: TaiG Jailbreak Convention March 27th

Mobile-Security-Summit-2015

Popular Chinese hacker Group TaiG is organizing a Jailbreak convention in Beijing, China to address the future of jailbreaking. The event is scheduled for March 27th and famous hackers Comex, P0sixninja, Pimskeks and Chronic will be speaking along with members of TiaG. Everything has been planed on short notice so hopefully everything will go as planned

The event will most likely resemble JailbreakCon, the yearly convention that has taken place in the US over the last few years. While a lot of lower level information will be discussed there will also hopefully be some emphasis on iOS 8.2 and 8.3.  Currently, there is no jailbreak for 8.2 the most recent public release by Apple on Monday. While it has only been one week the Chinese hacker groups have been on their game and able to provide new jailbreaks faster than ever. Don’t get your hopes up but we should get an update on the status of the new jailbreak by the time of the event.

Interested in jailbreaking but you upgraded to iOS 8.2? Follow us on Twitter and Facebook for updates when a jailbreak is released.

Mobile Security Summit Information 

Source : jailbreaknation[dot]com
post from sitemap

Thứ Sáu, 13 tháng 3, 2015

Announcing Intermediate iOS 8 Programming with Swift

0 Flares 0 Flares ×

At the time of this writing, the Swift programming language and iOS 8 have been around for more than 6 months. The new programming language has gained a lot of traction and continues to evolve. It is definitely the future programming language of iOS. If you are planning to learn a programming language this year, Swift should be on the top of your list.

I love to read cookbooks. Most of them are visually appealing with pretty and delicious photos involved. That’s what gets me hook and makes me want to try out the recipes. When I started off writing this book, the very first thing that came into my mind was why most programming books were not well designed. iOS and its apps are all beautifully crafted. But why do a majority of technical books just look like an ordinary textbook?

Intermediate Swift Programming

I believe a visually stunning book will make learning programming much more effective and easy. With that in mind, I set out to make one that looks really great and is joyful to read. That being said, it doesn’t mean I just focus on the visual elements. With over 300 pages and 30 Xcode projects, the book is written for developer with some programming experience on the Swift programming language and with an interest in developing iOS apps. The tips and solutions covered in this book will help you learn more about iOS 8 programming and empower you to build fully functional apps more quickly.

The book uses a problem-solution approach to discuss the APIs and frameworks of iOS SDK that each chapter walks you through a feature (or two) with in-depth code samples. You will learn how to build a universal app with adaptive UI, use Touch ID to authenticate your users, create a widget in notification center and implement view controller animations, just to name a few.

This Intermediate book has been only available through the starter/complete package of our Swift book bundle. We have been asked to make it available separately. So here it is. You can now purchase the book here. And to celebrate the launch, we are now running a launch sale until 15 March, 2015 11:59PM EST. You can get the book at $29 only (40% off of the regular price). If you want to learn more about Swift and iOS 8 development, now is the best time to get the book.

Source : appcoda[dot]com
post from sitemap

Building Action Extensions in iOS 8

0 Flares 0 Flares ×

Action extensions allow users to transform content originating in a host app without leaving the app. You can, for example edit images, change the text format, change the text itself, e.t.c. At WWDC 2014, Apple showed us a demo of an Action extension that translated the text of a web page to another language without leaving Safari.

Unlike the other extensions whose usage and purpose is clear, Action extensions do not have this clear-cut usage policy. For example, you can create an Action extension that shares content to social networks or one that can perform photo edits. In the Extensibility Programming Guide, Apple caution on picking the wrong extension point. In the case of Action extension, you should make sure that it’s appropriate for what you are trying to achieve and that another extension point won’t be more suitable for your purposes. In the previous given example, it would probably be more appropriate to use the share extension and the photo editing extension respectively instead of Action extensions.

ios8-action-extensions-featured

Action extensions are made available to users only when the extension specifies that it can work with the type of content the user is currently using. For example, if the extension specifies that it only works with text, it isn’t made available when the user is viewing images.

When you create a new Action extension, Xcode creates a template which when used without changing its configurations, will appear in every single action sheet by default. It won’t perform any checking of the content types to determine whether or not it’s appropriate for the host app. If you attempt to submit it like this to the App Store review, it will be rejected – you need to specify under what circumstances your extension should appear.

You can create two types of Action extensions – one with a user interface and one without. If you chose the latter, it will be limited to Safari, but if you provide a user interface, then the extension can be made available to other apps given that the extension supports the type of content to be transformed. We’ll look at both types of Action extensions.

We’ll look at how to create both of these. For the one with a UI, we’ll create an extension that enables you to save URLs that you are viewing for later use, kind of like a watered-down Pocket. The container app will show you a list of saved URLs and you will be able to open them in a webview. The second example will be a quick example that showcases how to modify the content shown in Safari. This will be a UI-less extension. We’ll use the same container app for both extensions. Download the starter project to get started.

First you need to configure the App Group in the starter project. To use App Groups, you have to have a paid-for developer account. The container app and the extension will be sharing data, so we have to use App Groups. An App Group is used to define access to a shared container that both the container app and its extensions can access. I also use a framework so that I can share code between the container app and its extension. To read more on this, you can refer back to this Today Extension article where I go deeper into creating and using embedded frameworks to enable code reuse between container app and extension.

Select the Bookmark project in the Project Navigator and then select the Bookmark target. First change the app’s Bundle Identifier on the General tab so that it’s unique to you. Reverse DNS is usually commonly used, so just swap out ‘appcoda’ with your own domain or any other identifier.

img01

Then switch to the Capabilities tab and turn on the App Groups switch. Press the + button to add a new group and give it a unique name. App group identifiers should start with group. and usually use reverse DNS style naming. I’ll use group.com.appcoda.bookmark here. Substitute your own domain here as well.

img02

Next update the reference to this App Group in your code. In the Project Navigator, expand the BookmarkKit group and open BookmarkService.swift. Find the getFileUrl() method and replace the group identifier string with your own. The function is shown below.

1
2
3
4
5
6
7
func getFileUrl() -> NSURL {
    if let containerUrl = NSFileManager.defaultManager().containerURLForSecurityApplicationGroupIdentifier("group.com.appcoda.Bookmark") {
        return containerUrl.URLByAppendingPathComponent("AppcodaBookmarkService.dat")
    } else {
        fatalError("Error obtaining shared container URL. Check your App Group configuration.")
    }
}

Run the application. You will be presented with an empty table view. This will hold our saved bookmarks. You can add your own URLs to the app with the + button on the navigation bar. You enter a URL and the title you want to give that bookmark. This is what will be shown on the tableview. For a real app, it might be better to use tags which can be used to group bookmarks, but we keep it simple here. There is also no delete or edit functionality.

When you select an item on the table view, the URL will be opened in a webview. Only valid URLs (you have to include http:// or https://) will be opened. To keep it simple, I haven’t done any error checking on the app, invalid URLs will be saved but they will not load on the webview, and won’t give any error messages.

added_image

You can type out a URL yourself or open Safari, browse to a page you want to save for later, copy the URL and open the app to save the URL. This seems to be a long process though, and that is where our extension will come in handy. With the extension, you will not need to leave Safari to save a URL.

Select the Bookmark project in the Project Navigator. Then select Editor > Add Target > iOS > Application Extension > Action Extension and click on Next. Set the Product Name to Bookmarker. Leave the other fields at their default.

img03

When prompted to activate the new scheme, click Activate.

Select the Bookmarker target and then on the Capabilities tab, add it to an App Group. Click App Groups switch and use the same App Group you added earlier by checking the box next to it. Don’t add a new App Group.

img04

Switch to the General tab and under Linked Frameworks and Libraries, click the + button. Select BookmarkKit and click Add.

img05

Looking at the Bookmarker group in the Project Navigator, you should see the following files.

img06

The entitlements file was generated by Xcode when you set up the App Group. It defines the entitlements required by the target. There is a storyboard file for the interface with a view controller set up. We use Info.plist to configure the extension.

As mentioned before, you need to specify the type of content your Action extension supports and the number of instances of that content it can handle, for example if it supported images, you could set it to work with only one image at a time, or you could allow the user to select several images to be processed by the extension at once. Bookmarker will only support one URL. Open the plist file for the Bookmarker extension and then expand the NSExtension > NSExtensionAttributes. The NSExtensionActivationRule key by default is set to TRUEPREDICATE. With this, your action extension will always appear in the action sheet. We’ll change the value of this key to specify the content our extension works with.

First, change its Type to Dictionary, then click on the + button next to the key name to add a key-value pair to it. Set the key’s name to NSExtensionActivationSupportsWebURLWithMaxCount, its Type to Number and Value to 1. You should have the following.

img07

NSExtensionActivationSupportsWebURLWithMaxCount with a value of 1 tells the OS to offer your extension when an app that a user is using tries to share a single URL.

Since the extension will be dealing with webpages, we need a JavaScript file which will act as a bridge between the webpage and the extension. The JavaScript is run before the extension is invoked and if there is any data to be sent back to the webpage, the JavaScript file is called again to do this. If your extension doesn’t need to extract or modify webpage content, then there is no need for a JavaScript file. You would just use the view controller for data processing.

The JavaScript you write must meet the following requirements:

  • There must be a global object called ExtensionPreprocessingJS.
  • The object must have a run method, that takes a single argument.

Select the Bookmarker group in the Project Navigator and add a new file to it by going to File > New > File > iOS > Other > Empty. Name the file GetURL.js. Make sure the file’s target in the File Inspector is set to Bookmarker.

img08

Add the following to the GetURL.js file.

1
2
3
4
5
6
7
8
9
10
11
var GetURL = function() {};

GetURL.prototype = {
   
run: function(arguments) {
    arguments.completionFunction({ "currentUrl" : document.URL });
}
   
};

var ExtensionPreprocessingJS = new GetURL;

When the extension is invoked, the run method found in the specified JavaScript preprocessor is executed against the current web page. It returns a JSON object to a completion handler. This is how you pass data from the web page to your Swift or Objective-C code.

You need to add this in Info.plist so that the extension knows you provided a JavaScript preprocessor file. Open the plist file and add a new key to the NSExtensionAttributes dictionary. Name it NSExtensionJavaScriptPreprocessingFile set its Type to String and Value to GetURL.

img09

Now to set up the extension’s interface. Open MainInterface.storyboard. The view controller has been set up with an Image View and a Done button on the navigation bar. Select the Image View. Go to the Connections Inspector and remove the outlet connection by clicking on the x control. Then delete the image view.

img10

Drag a Text Field to the View and place it below the navigation bar. In the Attributes Inspector, set ‘Enter Title’ as its placeholder text. Set constraints for the text field. I set the ones shown.

img11

It should look something like the image below.

img12

Use the Assistant editor to bring up the ActionViewController class file. Control-drag from the Text Field to the class and set an outlet named bookmarkTitle. You should have the following in code.

1
@IBOutlet weak var bookmarkTitle: UITextField!

Delete the following statement.

1
@IBOutlet weak var imageView: UIImageView!

Add the following to the class.

1
var bookmarkURL: NSURL!

Modify the viewDidLoad() method as shown.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
override func viewDidLoad() {
        super.viewDidLoad()
       
        let extensionItem = extensionContext?.inputItems.first as NSExtensionItem
        let itemProvider = extensionItem.attachments?.first as NSItemProvider
       
        let propertyList = String(kUTTypePropertyList)
        if itemProvider.hasItemConformingToTypeIdentifier(propertyList) {
            itemProvider.loadItemForTypeIdentifier(propertyList, options: nil, completionHandler: { (item, error) -> Void in
                let dictionary = item as NSDictionary
                NSOperationQueue.mainQueue().addOperationWithBlock {
                    let results = dictionary[NSExtensionJavaScriptPreprocessingResultsKey] as NSDictionary
                    let urlString = results["currentUrl"] as? String
                    self.bookmarkURL = NSURL(string: urlString!)
                }
            })
        } else {
            println("error")
        }
    }

The host app provides instances of NSExtensionContext and its input item, NSExtensionItem. NSExtensionContext provides details of the context in which the extension was invoked. It may contain input items and these can contain multiple attachments that can be a number of things – URLs, videos, images e.t.c. We use hasItemConformingToTypeIdentifier() to determine whether the attachment contains a specific resource. In our case, we check whether the item provider has an item that conforms to kUTTypePropertyList. If so, we call loadItemForTypeIdentifier whose completion handler receives an instance of NSDictionary that represents the JSON passed in by the JavaScript preprocessor. We then get the url string from this.

Add the following import to the file.

1
import BookmarkKit

Then modify the done() function as shown.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@IBAction func done() {
    var statusMessage: NSString
       
    if (bookmarkTitle.text.isEmpty) {
        statusMessage = "Cannot save bookmark without a title"
    } else {
        let bookmark = Bookmark(url: bookmarkURL, title: bookmarkTitle.text)
        let bookmarkService = BookmarkService.sharedService
        bookmarkService.addBookmark(bookmark)
        bookmarkService.saveBookmarks()
        statusMessage = "Saved successfully"
    }
       
    let extensionItem = NSExtensionItem()
    let statusDictionary = [ NSExtensionJavaScriptFinalizeArgumentKey : [ "statusMessage" : statusMessage ]]
    extensionItem.attachments = [ NSItemProvider(item: statusDictionary, typeIdentifier: kUTTypePropertyList as NSString)]
       
    self.extensionContext!.completeRequestReturningItems([extensionItem], completionHandler: nil)
}

The above method is called when the user taps on the Done button on the extension’s interface. If the user entered a title, we get the string and page url and create a Bookmark object and then we save it. We then create a message string to send back to the host app. An NSExtensionItem item is used to send data to the host app as well as from the host app. You can send data that can be used by the JavaScript preprocessor to modify the host app’s content. Here we only send a message that we’ll use in an alert box. You need to have a finalize() function in the JavaScript preprocessor that will receive data passed from the Swift or Objective-C code. The completeRequestReturningItems() method is called to pass data back to the host app.

Add the finalize() function to GetURL.js. The code should be as shown.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var GetURL = function() {};

GetURL.prototype = {
   
run: function(arguments) {
    arguments.completionFunction({ "currentUrl" : document.URL });
},
   
finalize: function(arguments) {
    var message = arguments["statusMessage"];
   
    if (message) {
        alert(message);
    }
}
   
};

var ExtensionPreprocessingJS = new GetURL;

The finalize() function simply takes the arguments passed in and displays an alert with the passed in string.

We can now run the app. Make sure that the active scheme is set to Bookmarker. You can see the active scheme next to the Stop button on the top left of the screen or you can go to Product > Scheme > Bookmarker. Run the app and you will be presented with a window for you to choose an app to run. Select Safari and click Run. This tells iOS to launch Safari, which will be your host app. It also causes Xcode to attach its debugger to the extension’s process.

Navigate to a website with Safari. To save a bookmark, tap on the Share button at the bottom of the screen to bring up the share activity sheet. Action extensions appear in the lower section of the sheet.

img13

Scroll to the right of the action controls and tap on More. Activate the Bookmarker extension in the window that appears.

img14

Now the Bookmarker extension will be visible.

img15

Tap on Bookmarker and the extension window should come up. Enter a title for the bookmark and hit Done. You will get back an alert on whether the save was successful.

img16

Run the app and save some bookmarks. Launch the Bookmark app and you should see the bookmarks you added.

Note: There is an error message in the debugger “Failed to inherit CoreMedia permissions from xxxx”. This seems to be a common error, and I have encountered it when working with Today, Share and action extensions. The extension still works fine despite the error. Searching around, it seems to be common and in this Stackoverflow post, someone says that their extension works fine and was approved by Apple despite getting the error. So, it might be an Xcode bug. I’m not sure. You can leave your thoughts in the comment, if you know about it.

No UI Extension

Next we’ll look at a quick example of creating an Action extension with no UI. We’ll also see how we can modify a webpage’s content with an extension.

Next we’ll look at a quick example of creating an Action extension with no UI. We’ll also see how we can modify a webpage’s content with an extension.

Create another Action Extension by going to Editor > Add Target > iOS > Application Extension > Action Extension and click on Next. Set the Product Name to Capitalize and Action Type to No User Interface. Activate the scheme when prompted to.

img17

Open the plist file in the Capitalize group and change the NSExtensionActivationSupportsWebURLWithMaxCount extension activation rule to NSExtensionActivationSupportsWebPageWithMaxCount. This configures the extension to work with a web page. Leave Type and Value as they are.

img18

The UI-less Action extension comes with a JavaScript preprocessor set up. Open Action.js and modify its contents as shown.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var Action = function() {};

Action.prototype = {
   
    run: function(arguments) {
       
        arguments.completionFunction({"content": document.body.innerHTML});
    },
   
    finalize: function(arguments) {
        document.body.innerHTML = arguments["content"];
    }
   
};
   
var ExtensionPreprocessingJS = new Action

The above sends the documents content to the extension and then in the finalize() method, it sets the page’s content with the data received.

Open ActionRequestHandler.swift and replace its contents as shown. This class is called when the action extension is invoked.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import UIKit
import MobileCoreServices

class ActionRequestHandler: NSObject, NSExtensionRequestHandling {

    var extensionContext: NSExtensionContext?
   
    func beginRequestWithExtensionContext(context: NSExtensionContext) {
        self.extensionContext = context
       
        for item: AnyObject in context.inputItems {
           
            let inputItem = item as NSExtensionItem
           
            for provider: AnyObject in inputItem.attachments! {
               
                let itemProvider = provider as NSItemProvider
               
                if itemProvider.hasItemConformingToTypeIdentifier(kUTTypePropertyList as NSString) {
                   
                    itemProvider.loadItemForTypeIdentifier(kUTTypePropertyList as NSString, options: nil, completionHandler: { [unowned self] (result: NSSecureCoding!, error: NSError!) -> Void in
                       
                        if let dictionary = result as? NSDictionary {
                            self.itemLoadCompletedWithPreprocessingResults(dictionary[NSExtensionJavaScriptPreprocessingResultsKey] as [NSObject: AnyObject])
                        }
                       
                    });
                   
                }
            }
        }
    }
   
    func itemLoadCompletedWithPreprocessingResults(javaScriptPreprocessingResults: [NSObject: AnyObject]) {
        let pageContent = javaScriptPreprocessingResults["content"] as NSString
        let capitalizedContent = pageContent.uppercaseString
        self.doneWithResults(["content": capitalizedContent])
    }
   
    func doneWithResults(resultsForJavaScriptFinalizeArg: [NSObject: AnyObject]?) {
        if let resultsForJavaScriptFinalize = resultsForJavaScriptFinalizeArg {
           
            var resultsDictionary = [NSExtensionJavaScriptFinalizeArgumentKey: resultsForJavaScriptFinalize]
           
            var resultsProvider = NSItemProvider(item: resultsDictionary, typeIdentifier: String(kUTTypePropertyList))
           
            var resultsItem = NSExtensionItem()
            resultsItem.attachments = [resultsProvider]
           
            self.extensionContext!.completeRequestReturningItems([resultsItem], completionHandler: nil)
        } else {
            self.extensionContext!.completeRequestReturningItems([], completionHandler: nil)
        }
       
        self.extensionContext = nil
    }

}

The above code looks familiar. We get the content passed in, capitalize it in itemLoadCompletedWithPreprocessingResults() and call doneWithResults() which sends the capitalized content back to the JavaScript preprocessor.

Run the app and test it out. You will get a very ugly webpage, which is to be expected because we got the page’s content – text, images, scripts, css – and sent it to be capitalized. The result of this is broken css styles, scripts that don’t work, broken image links e.t.c. A better approach would have been to use the JavaScript code to get text that is in paragraph and heading tags and only send that to be processed.

img19

The extension we’ve made here isn’t very useful, but it demonstrates use of the UI-less Action extension and it also shows how you can manipulate a webpage’s content. Apple used it to translate a webpage into another language, 1Password uses it to autofill login forms with user credentials; so the Action extension is quite powerful.

Action Extension Icon

We haven’t added icons for our extensions and we won’t cover that in this tutorial. Though it is worth mentioning Apple’s guidelines on Action extension icons as given in the Extensibility Guide.

For the Action Extension icon, you should create a template image that represents the extension i.e. your icon image should be composed of a single color and it should be transparent. A template image is an image that iOS uses as a mask to create the final icon that users see in the activity view controller. Apple have specified some guidelines for creating a template image that looks good in the final UI:

  • Use black or white with appropriate alpha transparency
  • Don’t include a drop shadow
  • Use antialiasing

If your app contains multiple Action extensions, you should provide unique icons for each of them.

That concludes this Action Extension guide. You can download the completed project here. Note that you’ll need to change the Bundle ID and App ID to your own unique IDs in order to make it work.

Source : appcoda[dot]com
post from sitemap

iOS Beta Testing Program Available to Many iPhone & iPad Users

iOS Public Beta program

Apple has launched a new iOS Beta Testing Program for iPhone, iPad, and iPod touch users. Much like the beta test program for OS X Yosemite, this allows users who opt to participate in the software testing program to receive beta versions of iOS system software before they are released to the wider public.


Currently, iOS public beta users will receive iOS 8.3 beta 3 but updates will be made available to those devices as new beta releases become available. Updates arrive as OTA downloads through the Software Update mechanism on the opted-in iPhone or iPad.

Do note that beta software is often buggy and less reliable compared to final iOS versions, thus it is not recommended to run iOS betas on your primary iPhone or iPad.

How to Sign Up for the iOS Public Beta Testing Program

Users who wish to participate in the iOS Public Beta program must have a device compatible with the current version of iOS, and then need to do the following:

  1. Visit the Apple Beta Program website here and sign up to participate*
  2. Choose to “Enroll your iOS device to receive beta updates”
  3. iOS beta program enrolling

  4. Connect the iPhone / iPad to a computer and back up with iTunes, then archive that backup within iTunes to preserve a copy
  5. Download the requisite iOS Beta Configuration Profile from the eligible iOS device at this website from the iOS device
  6. Finally, open the Settings app, go to General, then under Software Update look for the iOS beta to download and install
  7. iOS 8.3 beta install

* Apparently not all users are able to enroll in the iOS Beta Program at this time. This may change in the future, but at the moment it seems like you must be actively enrolled in the OS X Beta program before being able to sign up for the iOS Beta Program. Either way you can attempt to enroll, let us know in the comments what works for you.

Though many users are eligible to participate in the iOS Beta Software program, this really is best reserved either for advanced users, or for users who have a spare iPhone or iPad they don’t mind running beta software on. It’s not recommended to run beta system software on a primary device.

The current version available is iOS 8.3 beta 3, which Apple describes as follows:

The iOS 8.3 Beta includes improved performance, increased stability, bug fixes, and a redesigned Emoji keyboard. This release also supports additional language and country support for Siri: English (India, New Zealand), Danish (Denmark), Dutch (Netherlands), Portuguese (Brazil), Russian (Russia), Swedish (Sweden), Thai (Thailand), Turkish (Turkey).

Before you install the iOS Beta, please be sure to back up your device with the instructions provided. This is beta software that is still in development, which means some applications and services may not work as expected.

Users who sign up for participating in the iOS public beta program can always opt out or reinstall a prior version of iOS and restore from a backup if necessary. This is similar to opting out of the beta software in OS X, and you can remove the provisioning profile to stop getting iOS beta updates pushed to your iPhone or iPad if necessary.

While beta testing system software can be fun and interesting, we do not recommend running iOS or OS X beta software on your primary hardware. Regardless, always perform a thorough back up before installing developer releases of software.

Source : osxdaily[dot]com
post from sitemap

Thứ Tư, 11 tháng 3, 2015

Having Safari Problems with iOS 8.2? Try This

Safari Some users who have updated to iOS 8.2 have discovered the Safari web browser no longer works as it should on their iPhone or iPad. There seems to be a few variations of Safari issues with iOS 8.2, but typically the problems manifest as an inability for Safari to launch or stay open, Safari becoming unresponsive to touch input, Safari loading blank pages, and the Safari search / URL bar becoming unworkable. If you’ve experienced one of these problems with iOS 8.2, you may be able to remedy it with one of solutions outlined below.

First, Try Clearing All Web Data

The first thing to try is to reset Safari in iOS by clearing website data, cache, history, and cookies.

  1. Open the “Settings” app and go to “Safari”
  2. Choose “Clear History and Website Data” and confirm that you wish to clear Safari data when asked

Once you’ve cleared the Safari cache, manually quit the app by using the multitasking screen and swiping up on Safari so that it flies off screen, then relaunch Safari again. You may want to reboot the device too.

At this point Safari should be working as intended, opening as usual and being responsive to touch and input again. If you’re still experiencing trouble, you can go a step further and restore the device.

Safari Still Broke? Reset & Restore the Device

Resetting a device is not fun, but there are reports this can work to resolve broken Safari issues. You can either reset to factory settings and then restore backups from an iCloud or iTunes, or restore directly with iTunes and a computer.

Be sure to back up your iPhone or iPad before restoring or resetting, otherwise you may lose important data.

Alternatively, Use Chrome as a Web Browser

If there is indeed a bug with Safari in iOS 8.2 then a fix is sure to arrive in the form of a point release. Thus, rather than reinstalling iOS, you may opt to use an alternate web browser like Chrome in the interim period. Chrome for iOS is quite good anyway, though you will miss out on useful features like Handoff and iCloud Tabs.

The restore approach was pointed out by iPhoneHacks who noticed a conversation on Twitter discussing the Safari problems post iOS 8.2 update. For me, simply clearing out caches was enough to get Safari working again on the iPhone and to stop loading blank pages (much like a similar experience in OS X), but let us know in the comments if you experience any problem and what worked for you to resolve it.

Source : osxdaily[dot]com
post from sitemap

Thứ Ba, 10 tháng 3, 2015

App Showcase #2: Runr by Sam Spencer

0 Flares 0 Flares ×

Here comes to the second app showcase. Previously, we showed you an app created by a 17 year old developer. Since we published that story, we received emails from several young developers who also wanted to share their programming experience and app development stories. The world needs more programmers. It’s truly wonderful to see more young people learn to code and create something amazing.

In this app showcase, we talked to Sam Spencer, a 16 year old iOS developer who has released an app called Runr. The app allows you not just to track your runs, jogs and walks but save calories and distance of your runs to the Health app. Runr app is beautifully designed and has been featured by Apple in Health & Fitness “Apps For Your Run”.

runr-featured

Read on and check out Sam’s app development story.

1. Tell us more about your background and your app. Was it your first app?

I started exploring computers early-on. In fact, my fascination with technology began when Mr. Plechaty, my fourth grade teacher, asked the class to draw what we thought technology would look like in ten years (2017). The contraption I dreamed up was a mix between the palm-pilots and cellphones I had seen adults using back then. I definitely missed the mark, but it got me thinking about technology.

From there I moved to simple VB Script popups. Sometimes my friends and I would amuse one another with funny Visual Basic Script popups. Rather than stop there, I continued making things. Cypher Bot was my first real program, a Windows app that encrypted and decrypted text. Shortly thereafter I set my sights higher: I wanted to put Cypher Bot on the App Store. iOS 4.0 had just come out and I was amazed at what one could do with technology. So began my foray into iOS development. After getting adjusted to Objective-C and Xcode (which was quite difficult after coming from Visual Basic and Visual Studio) I published Cypher Bot for iPhone and iPad in July 2012.

I am a 16 year old iOS (and OS X-ish) Developer who recently completed my second iOS App Store app, Runr. The app, Runr, is a run-tracking app available for free on the App Store. The concept here is to provide a great run tracking experience for runners, walkers, and joggers alike. Unlike other running apps, Runr is clean and easy to use. Runners can start their runs in seconds. Beautiful graphs, statistics, routes, maps, and Game Center achievements make it easy to track progress and see improvement.

Runr app

2. How did you come up with the idea? How long did it take to develop the app?

A few years ago, I took up running in my free time. Naturally, I wanted an easy way to track my progress and get run updates during my run. The App Store really didn’t have anything that fit my needs. All the run tracking apps were either way to cluttered or didn’t provide the experience I was looking for.

So I began the app development process. The real process started with a big pile of blank index cards, a pencil, and a big eraser. This is the prototyping stage. I drew out as many designs as possible. Designs ranged from far-out whacky to very rudimentary. I picked the design that I thought looked best at the time. Then I began writing in Objective-C and laying out the design in Xcode.

Creating Runr required learning great deal of new information. In fact, when I started I didn’t even know the Core Location Framework existed. YouTube, StackOverflow, GitHub, the Apple Developer Documentation, and AppCoda among other blogs helped me through the process. Books on Objective-C and iOS that I had purchased earlier proved to be extremely useful during the process.

From conception to publishing, version 1.0 of the app took about nine months to develop. Version 2.0 took approximately six months to design, plan, create, and test.

3. Do you have any programming experience before developing the app? How did you learn iOS programming?

As I explained before, I had some programming experience before developing Runr. Yet, I was finding that Visual Basic encouraged bad habits and made it difficult to understand some basic concepts in Objective-C.

It definitely was not easy learning to develop for iOS. The first place one might think to go to is Apple’s documentation. Unfortunately, the documentation Apple provided (at least at the time) was oriented for experienced developers — it was riddled with, what appeared to be, jargon and confusing concepts for a novice developer. Next I turned to books that explained how iOS works and how to write in Objective-C. I didn’t go all the way through the books, instead I stopped after completing the basics and then used them as a reference for smaller projects.

YouTube, StackOverflow, GitHub, and sites like AppCoda really helped along the way. Without the good people on all of these sites, there’s no way I could have created Runr 1.0, and absolutely no way version 2.0 would have been possible.

4. Do you use Swift or Objective-C to develop your app? If you use Objective-C, do you have any plan to use Swift for your next release?

Runr is written entirely in Objective-C, as I started coding Runr in 2013 before Swift was announced. When Apple announced Swift, I was initially skeptical: it looked like a gimmick to attract people who had never written code before. To the contrary, after using it in some smaller projects I found it to be quite useful.

Unfortunately, Runr has tens of thousands of lines of code. Rewriting everything is Swift at this point is not practical. For the next few months I will be focusing on building new services and features for Runr rather than rewriting the app. Should Apple adopt Swift as the only standard language for iOS and OS X in the future (and it is possible), then I would, of course, rewrite. Indeed, there’s been some stirrup recently with the discovery of UXKit on OS X — maybe we’ll start to see entire system frameworks written in Swift. Until then, though, Swift will be reserved for new projects and apps.

5. What are you going to do to promote your app?

App promotion is tough. I’m trying to do as much as possible while spending as little as possible. The first thing that I have done to promote Runr 2.0 is by evaluating its description, keywords, screenshots, and app preview. These tools are crucial and can either make-or-break the sale. One of the major changes I’ve made with Runr 2.0 is the pricing. Version 1.0 was a Paid Pricing model. However, after a long period of low sales due to competition with Freemium Pricing, Runr will also be switching over to a Freemium model. Making Runr free to download is really a self-promoting tactic (somehow, app downloads skyrocket when the app is free).

Making a beautiful App Store page isn’t enough though. The next step is to let friends and family know about the app. As soon as it goes live, I plan on letting them know and asking them to download and leave a good review (it’s nice to have good ratings showing up on the App Store early on). Some websites recommend giving your prized promo codes to friends and family, but this is not who they should be used on. Downloading an app with a promo code prevents that person from reviewing the app. Instead, I plan on distributing promo codes to blogs and online publications. Websites like 148Apps, MacWorld, 9to5Mac, Mashable, and TNW all do app reviews. With some of those sites, it might be a long shot to get in, but its definitely worth a try.

In addition to promoting on blogs and social media, I plan to contact Apple directly. At the end of their WWDC videos, they always give out email addresses where developers can “show Apple what they’ve created”. Sending emails to some of these addresses may give the app extra attention from Apple and even a spot on the App Store home page.

6. What were the most valuable lessons you learnt from AppCoda and its books?

Runr is full of features and concepts from AppCoda. In fact the two core features in the app, route tracking (Core Location) and route saving (Core Data), are based off of information from AppCoda tutorials. Core Location was very simple after going through the AppCoda tutorial. And at first, in version 1.0, I stayed away from Core Data because of how daunting it seemed. In a subsequent update, I used information on AppCoda to integrate Core Data. And, in all honesty, replacing PLIST file saving with Core Data was probably the best backend decision I’ve made through the entire process. Core Data alone fixed numerous bugs, improved performance tenfold, and laid the groundwork for future updates.

In fact I’ll be using some of AppCoda’s more recent tutorials in some upcoming planned updates for Runr.

7. Any advice for those who just started learning iOS programming?

Don’t let yourself become overwhelmed with books and documentation and tutorials and lessons. Learn the basics: get familiar with Xcode, basic Objective-C concepts, how iOS works, and the technologies available to you. And once you’ve got that, start creating. The best way to learn is by doing. Think of a simple project you’re interested in and learn how to build it. As you build more and more projects your knowledge will expand. It’s like learning any other language: you wouldn’t sit down and memorize the dictionary, you would use the language and speak with others fluent in it. Slowly but surely you will become more familiar with it.

My next big piece of advice: Open source. Get involved in the open-source community. Create a free account on GitHub and poke around through some of the projects. Get involved with the projects, contribute valuable additions and changes. Most importantly, get in touch with other developers through these open source projects. In my experience with Runr, it was these developers who gave the best feedback (especially in beta testing), advice, and guidance during the process. When you’re knowledgable enough, make sure to return the favor.

Most of all, don’t give up. Sometimes it can be frustrating when that SIG_ABRT appears for seemingly no reason at all. But that’s part of the challenge! There’s nearly always a solution, and always someone out there willing to help.

8. What’s your next plan?

Runr 2.0 is just the start of a long list of updates I’ve got planned. Indeed, Apple Watch is a big one (http://runr-app.com/watch). I’ll also be trying new types of promotion and advertising for Runr. Plus, I’ve got a few app ideas in the works and expect to release at least one new app this year.

Source : appcoda[dot]com
post from sitemap

iOS 8.2 Released for iPhone, iPad [IPSW Direct Download Links]

iOS 8.2

iOS 8.2 has been released for all compatible iPhone, iPad, and iPod touch devices. The new release includes bug fixes and feature improvements, and is required for iPhone users who wish to use an Apple Watch when it is released on April 24, as the new iOS version ships with the Watch companion application.

Download & Update iOS 8.2

The simplest way to download and install iOS 8.2 is through the Over The Air mechanism on the iPhone or iPad:

  • Go to the Settings app and choose “General” followed by “Software Update”

Always back up your iOS device before installing an iOS update.

iOS 8.2 Download

Optionally, iTunes users can update to iOS 8.2 by connecting their iPhone or iPad to a Mac or PC, launching iTunes, and updating from there.

iOS 8.2 IPSW Download Links

For advanced users who prefer to install iOS updates through IPSW firmware files, you can download the latest versions of appropriate firmware for iPhone, iPad, and iPod touch from the links below. These are hosted directly on Apple Servers, for best results right-click and choose “Save As”, be sure the file has a .ipsw extension.

iPhone

iPad

iPod Touch

Installing and updating iOS through IPSW requires the usage of iTunes.

iOS 8.2 Release Notes

Here are the release notes for iOS 8.2, verbatim from the notes that accompany the download in the Settings app:

This release introduces support for Apple Watch, and also includes improvements to the Health app, increased stability and bug fixes.

Apple Watch support
• New Apple Watch app to pair and sync with iPhone, and to customize watch settings
• New Activity app for viewing fitness data and achievements from Apple Watch; appears when Apple Watch is paired
• Available on iPhone 5 and later

Health app improvements
• Adds the ability to select the unit of measurement for distance, body temperature, height, weight and blood glucose
• Improves stability when dealing with large amounts of data
• Includes the ability to add and visualize workout sessions from 3rd-party apps
• Addresses an issue that may have prevented users from adding a photo in Medical ID
• Fixes units for vitamins and minerals
• Fixes an issue where Health data wouldn’t refresh after changing data source order
• Fixes an issue where some graphs showed no data values
• Adds a privacy setting that enables turning off tracking of steps, distance and flights climbed

Stability enhancements
• Increases stability of Mail
• Improves stability of Flyover in Maps
• Improves stability of Music
• Improves VoiceOver reliability
• Improves connectivity with Made for iPhone Hearing Aids

Bug fixes
• Fixes an issue in Maps that prevented navigating to some favorite locations
• Addresses an issue where the last word in a quick reply message wasn’t autocorrected
• Fixes an issue where duplicate iTunes purchased content could prevent iCloud restore from completing
• Resolves an issue where some music or playlists didn’t sync from iTunes to the Music app
• Fixes an issue where deleted audiobooks sometimes remained on device
• Resolves an issue that could prevent call audio from routing to car speakers while using Siri Eyes Free
• Fixes a Bluetooth calling issue where no audio is heard until the call is answered
• Fixes a timezone issue where Calendar events appear in GMT
• Addresses an issue that caused certain events in a custom recurring meeting to drop from an Exchange calendar
• Fixes a certificate error that prevented configuring an Exchange account behind a third-party gateway
• Fixes an issue that could cause an organizer’s Exchange meeting notes to be overwritten
• Resolves an issue that prevented some Calendar events from automatically showing as ‘Busy’ after accepting an invite

For information on the security content of this update, please visit this website:

http://support.apple.com/kb/HT1222

Source : osxdaily[dot]com
post from sitemap