\n\n","xml",[187,761,762,767,772,777,782,787,792,797,802],{"__ignoreMap":11},[190,763,764],{"class":192,"line":193},[190,765,766],{"emptyLinePlaceholder":23},"\n",[190,768,769],{"class":192,"line":12},[190,770,771],{},"\u003Ckey>Type\u003C/key>\n",[190,773,774],{"class":192,"line":223},[190,775,776],{},"\u003Cstring>PSToggleSwitchSpecifier\u003C/string>\n",[190,778,779],{"class":192,"line":247},[190,780,781],{},"\u003Ckey>Title\u003C/key>\n",[190,783,784],{"class":192,"line":260},[190,785,786],{},"\u003Cstring>Sound\u003C/string>\n",[190,788,789],{"class":192,"line":266},[190,790,791],{},"\u003Ckey>Key\u003C/key>\n",[190,793,794],{"class":192,"line":283},[190,795,796],{},"\u003Cstring>sound_enabled\u003C/string>\n",[190,798,799],{"class":192,"line":295},[190,800,801],{},"\u003Ckey>DefaultValue\u003C/key>\n",[190,803,804],{"class":192,"line":312},[190,805,806],{},"\u003Ctrue/>\n",[41,808,809,810,815,816,819],{},"Unfortuntately, the default value is only applied the first time you access the Settings Application. That means your\ncode cannot rely on the default values and rather has to check manually, if the value has been set in the Settings\nApplication. In case of “I think I spider”, that meant no sound until you accessed the Settings Application. After\npoking around for a couple of minutes,\nwe ",[45,811,814],{"href":812,"rel":813},"http://stackoverflow.com/questions/510216/can-you-make-the-settings-in-settings-bundle-default-even-if-you-dont-open-the-s/510329#510329",[49],"found a workaround",",\nwhich we implemented in our AppDelegate’s ",[404,817,818],{},"didFinishLaunchingWithOptions"," method:",[181,821,823],{"className":672,"code":822,"language":674,"meta":11,"style":11},"\nid test = [[NSUserDefaults standardUserDefaults] objectForKey:@\"sound_enabled\"];\nif (test == NULL) {\n [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@\"sound_enabled\"];\n}\nreturn YES;\n",[187,824,825,829,834,839,844,848],{"__ignoreMap":11},[190,826,827],{"class":192,"line":193},[190,828,766],{"emptyLinePlaceholder":23},[190,830,831],{"class":192,"line":12},[190,832,833],{},"id test = [[NSUserDefaults standardUserDefaults] objectForKey:@\"sound_enabled\"];\n",[190,835,836],{"class":192,"line":223},[190,837,838],{},"if (test == NULL) {\n",[190,840,841],{"class":192,"line":247},[190,842,843],{}," [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@\"sound_enabled\"];\n",[190,845,846],{"class":192,"line":260},[190,847,399],{},[190,849,850],{"class":192,"line":266},[190,851,852],{},"return YES;\n",[41,854,855,856,859,860,863],{},"This checks if no value was set, which means the returned value is ",[404,857,858],{},"NULL",", and in that case sets our default value. Note\nthat we are duplicating the default value definition here. You could also access the ",[404,861,862],{},"Settings Bundle"," programmatically\nand read the default value from there.",[41,865,866],{},"This gives us an easy workaround, so that you can enjoy the awesome sound effects in “I think I spider”.",[438,868,727],{},{"title":11,"searchDepth":12,"depth":12,"links":870},[],[121,122,444],"2010-08-16T06:38:08","https://synyx.de/blog/settings-bundle-and-default-values/",{},"/blog/settings-bundle-and-default-values",{"title":744,"description":11},"blog/settings-bundle-and-default-values",[131,132],"We improved our “I think I spider” App quite a bit since Beta 1. Among other stuff we added some nice sound effects. If you want to check it out,…","2u74Bt9iJYUS2yCQZEziD6_UMO-mCCEs4rBEu1KVQJQ",{"id":882,"title":883,"author":884,"body":885,"category":896,"date":897,"description":11,"extension":16,"link":898,"meta":899,"navigation":23,"path":900,"seo":901,"slug":889,"stem":902,"tags":903,"teaser":904,"__hash__":905},"blog/blog/human-maier-we-are-in-beta.md","Human Maier! We are in Beta!",[26],{"type":8,"value":886,"toc":894},[887,890],[37,888,883],{"id":889},"human-maier-we-are-in-beta",[41,891,892],{},[114,893],{"alt":116,"src":499},{"title":11,"searchDepth":12,"depth":12,"links":895},[],[121,122],"2010-07-30T14:30:44","https://synyx.de/blog/human-maier-we-are-in-beta/",{},"/blog/human-maier-we-are-in-beta",{"title":883,"description":11},"blog/human-maier-we-are-in-beta",[538,131,132],"Our little pet project “I think I spider” is almost ready to be thrown out into the wild! That means we are running a closed beta for iOS devices for…","Tv3D01DCynO0dlp6K4oLCcEF6qiHcJkQCehI25ZSfc0",{"id":907,"title":74,"author":908,"body":909,"category":920,"date":921,"description":11,"extension":16,"link":922,"meta":923,"navigation":23,"path":924,"seo":925,"slug":913,"stem":926,"tags":927,"teaser":928,"__hash__":929},"blog/blog/i-think-i-spider.md",[26],{"type":8,"value":910,"toc":918},[911,914],[37,912,74],{"id":913},"i-think-i-spider",[41,915,916],{},[114,917],{"alt":116,"src":499},{"title":11,"searchDepth":12,"depth":12,"links":919},[],[121,122],"2010-07-26T06:56:04","https://synyx.de/blog/i-think-i-spider/",{},"/blog/i-think-i-spider",{"title":74,"description":11},"blog/i-think-i-spider",[538,132],"We are working on a fair number of Apps here at our mobile team and today we are proud to announce one of them: I think I spider! The “I…","Q4uy3XPVMpWwUGobhts0mEDqawiYKLMPBPP9qYTF_us",{"id":931,"title":545,"author":932,"body":933,"category":1014,"date":1015,"description":1016,"extension":16,"link":1017,"meta":1018,"navigation":23,"path":1019,"seo":1020,"slug":1022,"stem":1023,"tags":1024,"teaser":1025,"__hash__":1026},"blog/blog/mobile-solutions-summary-4.md",[26],{"type":8,"value":934,"toc":1012},[935,937,950,970,978,993,998],[37,936,545],{"id":551},[41,938,939,940,943,944,949],{},"There’s a lot going on over at the ",[45,941,565],{"href":66,"rel":942},[49],", so in case you are not subscribed to\nour feed, which I hope you are, you can grab it ",[45,945,948],{"href":946,"rel":947},"http://mobile.synyx.de/feed/",[49],"here",". In order to convince you to hook\nyour favorite reader up to our mobile blog, I’ll highlight a couple of blog posts for you.",[41,951,952,957,958,963,964,969],{},[45,953,956],{"href":954,"rel":955},"http://mobile.synyx.de/authors/?uid=3",[49],"Tobias’","\npost ",[45,959,962],{"href":960,"rel":961},"http://mobile.synyx.de/2010/06/android-and-self-signed-ssl-certificates/",[49],"“Android and self-signed ssl certificates”","\ngained a lot of attraction over the past couple of weeks. He basically brings you up to speed on how to tweak Android’s\nversion of ",[45,965,968],{"href":966,"rel":967},"http://hc.apache.org/httpcomponents-client/httpclient/",[49],"Apache Commons Http"," to work with your own\ncertificate:",[576,971,972,975],{},[41,973,974],{},"Dealing with self-signed ssl certificates is a real pain, because it’s not that simple to add them in your app and\nlet android accept them.",[41,976,977],{},"But fortunately, there’s a workaround that uses an own SSLSocketFactory and an own TrustManager. With this, only your\nadded site is beeing able to be called, so theres no security issue.",[41,979,980,981,986,987,992],{},"Another blog post I’d like to point out is by yours truly,\non ",[45,982,985],{"href":983,"rel":984},"http://mobile.synyx.de/2010/06/ui-prototyping-iphone-apps/",[49],"“UI Prototyping iPhone Apps”",". It covers a very simple\nconcept and provides you with a ",[45,988,991],{"href":989,"rel":990},"http://github.com/dlinsin/district9/tree/master/UIPrototyping/",[49],"framework"," to employ it\nin your App development:",[576,994,995],{},[41,996,997],{},"I watched a whole bunch of sessions from 2009. Among others a session on “Prototyping iPhone User Interfaces” by Bret\nVictor… In his session, Bret shows how to prototype an interface only by using with screenshots! … It inspired me to use\nhis framework and the whole process for our own development… Unfortunately, the code for the session isn’t available …\nAfter some digging, I found Michael Fey’s blog, who was able to successfully reverse engineer the missing parts, which\nwere not shown in the presentation.",[41,999,1000,1001,1005,1006,1011],{},"I hope by this time you have already subscribed to our ",[45,1002,1004],{"href":66,"rel":1003},[49],"mobile blog"," and discovered a couple\nof ",[45,1007,1010],{"href":1008,"rel":1009},"http://mobile.synyx.de/2010/07/split-nsstring-by-characters/",[49],"interesting posts",", that our team put together over\npast couple of months.",{"title":11,"searchDepth":12,"depth":12,"links":1013},[],[620],"2010-07-16T07:28:03","There’s a lot going on over at the mobile solutions blog, so in case you are not subscribed to\\nour feed, which I hope you are, you can grab it here. In order to convince you to hook\\nyour favorite reader up to our mobile blog, I’ll highlight a couple of blog posts for you.","https://synyx.de/blog/mobile-solutions-summary-4/",{},"/blog/mobile-solutions-summary-4",{"title":545,"description":1021},"There’s a lot going on over at the mobile solutions blog, so in case you are not subscribed to\nour feed, which I hope you are, you can grab it here. In order to convince you to hook\nyour favorite reader up to our mobile blog, I’ll highlight a couple of blog posts for you.","mobile-solutions-summary-4","blog/mobile-solutions-summary-4",[538,131,132,98],"There’s a lot going on over at the mobile solutions blog, so in case you are not subscribed to our feed, which I hope you are, you can grab it…","6e3hlP9lM0lmBm1BXb-OBwSJM2DFtSNp5TIpHdJ1OXE",{"id":1028,"title":1029,"author":1030,"body":1031,"category":1113,"date":1114,"description":1115,"extension":16,"link":1116,"meta":1117,"navigation":23,"path":1118,"seo":1119,"slug":1035,"stem":1121,"tags":1122,"teaser":1123,"__hash__":1124},"blog/blog/split-nsstring-by-characters.md","Split NSString by characters",[26],{"type":8,"value":1032,"toc":1111},[1033,1036,1058,1067,1106,1109],[37,1034,1029],{"id":1035},"split-nsstring-by-characters",[41,1037,1038,1039,1046,1047,1049,1050,1057],{},"Have you ever pondered on the ",[45,1040,1043],{"href":1041,"rel":1042},"http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/Reference/NSString.html",[49],[404,1044,1045],{},"NSString","\nclass reference and you were overwhelmed by the sheer amount of methods? I certainly have and due to the endless\npossibilities those methods give you, I just couldn’t figure out how to split an ",[404,1048,1045],{}," by characters and create a ",[45,1051,1054],{"href":1052,"rel":1053},"http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/NSArray.html",[49],[404,1055,1056],{},"NSArray","\nof those characters.",[41,1059,1060,1061,1066],{},"Blame it on my lack of creativity or on the fact that I’m not a C buff. However, thanks to my creative Googling, I came\nacross ",[45,1062,1065],{"href":1063,"rel":1064},"http://www.idev101.com/code/Objective-C/Strings/split.html",[49],"this site",", which shows you how to do it:",[181,1068,1070],{"className":672,"code":1069,"language":674,"meta":11,"style":11},"NSMutableArray *characters =\n[[NSMutableArray alloc] initWithCapacity:[myString length]];\nfor (int i=0; i \u003C [myString length]; i++) {\n NSString *ichar =\n[NSString stringWithFormat:@\"%c\", [myString characterAtIndex:i]];\n [characters addObject:ichar];\n}\n",[187,1071,1072,1077,1082,1087,1092,1097,1102],{"__ignoreMap":11},[190,1073,1074],{"class":192,"line":193},[190,1075,1076],{},"NSMutableArray *characters =\n",[190,1078,1079],{"class":192,"line":12},[190,1080,1081],{},"[[NSMutableArray alloc] initWithCapacity:[myString length]];\n",[190,1083,1084],{"class":192,"line":223},[190,1085,1086],{},"for (int i=0; i \u003C [myString length]; i++) {\n",[190,1088,1089],{"class":192,"line":247},[190,1090,1091],{}," NSString *ichar =\n",[190,1093,1094],{"class":192,"line":260},[190,1095,1096],{},"[NSString stringWithFormat:@\"%c\", [myString characterAtIndex:i]];\n",[190,1098,1099],{"class":192,"line":266},[190,1100,1101],{}," [characters addObject:ichar];\n",[190,1103,1104],{"class":192,"line":283},[190,1105,399],{},[41,1107,1108],{},"Although Apple’s documentation is extensive, you sometimes need a little hint or guidance to achieve your goal.",[438,1110,727],{},{"title":11,"searchDepth":12,"depth":12,"links":1112},[],[121,444],"2010-07-11T11:33:48","Have you ever pondered on the NSString\\nclass reference and you were overwhelmed by the sheer amount of methods? I certainly have and due to the endless\\npossibilities those methods give you, I just couldn’t figure out how to split an NSString by characters and create a NSArray\\nof those characters.","https://synyx.de/blog/split-nsstring-by-characters/",{},"/blog/split-nsstring-by-characters",{"title":1029,"description":1120},"Have you ever pondered on the NSString\nclass reference and you were overwhelmed by the sheer amount of methods? I certainly have and due to the endless\npossibilities those methods give you, I just couldn’t figure out how to split an NSString by characters and create a NSArray\nof those characters.","blog/split-nsstring-by-characters",[483],"Have you ever pondered on the NSString class reference and you were overwhelmed by the sheer amount of methods? I certainly have and due to the endless possibilities those methods…","ilLoGswdB2P1Kne210H_GnKvBa-ixSkTUAhBMe3b3TY",{"id":1126,"title":1127,"author":1128,"body":1129,"category":1379,"date":1380,"description":1381,"extension":16,"link":1382,"meta":1383,"navigation":23,"path":1384,"seo":1385,"slug":1133,"stem":1387,"tags":1388,"teaser":1391,"__hash__":1392},"blog/blog/ui-prototyping-iphone-apps.md","UI Prototyping iPhone Apps",[26],{"type":8,"value":1130,"toc":1377},[1131,1134,1142,1145,1154,1165,1218,1228,1362,1365,1368,1375],[37,1132,1127],{"id":1133},"ui-prototyping-iphone-apps",[41,1135,1136,1137,1141],{},"Before ",[45,1138,1140],{"href":150,"rel":1139},[49],"flying off to WWDC"," last month, I watched a whole bunch of sessions\nfrom 2009. Among others a session on “Prototyping iPhone User Interfaces” by Bret Victor. If you haven’t watched it and\nyou’ve got access to the WWDC videos – stop right here and watch the video!",[41,1143,1144],{},"In his session, Bret shows how to prototype an interface only by using with screenshots! It’s amazing that a simple\nscreenshot on the device can show you so much more than by just looking at it in a document or print out. It inspired me\nto use his framework and the whole process for our own development.",[41,1146,1147,1148,1153],{},"Unfortunately, the code for the session isn’t available and neither Bret nor the frameworks evangelist mentioned in the\npresentation got back to me about the code. After some digging, I\nfound ",[45,1149,1152],{"href":1150,"rel":1151},"https://web.archive.org/web/20130723100234/http://www.fruitstandsoftware.com:80/blog/2009/07/uiview-manipulation-made-easier-with-a-category/",[49],"Michael Fey’s blog",",\nwho was able to successfully reverse engineer the missing parts, which were not shown in the presentation.",[41,1155,1156,1157,1160,1161,1164],{},"Michael’s ",[404,1158,1159],{},"UIViewAdditions"," basically allow easy access to frame properties and give you a neat init method, which adds\nthe passed ",[404,1162,1163],{},"UIView"," as a parent:",[181,1166,1168],{"className":672,"code":1167,"language":674,"meta":11,"style":11},"- (id)initWithParent:(UIView *)parent {\n self = [self initWithFrame:CGRectZero];\n if (!self)\n return nil;\n [parent addSubview:self];\n return self;\n}\n+ (id) viewWithParent:(UIView *)parent {\n return [[[self alloc] initWithParent:parent] autorelease];\n}\n",[187,1169,1170,1175,1180,1185,1190,1195,1200,1204,1209,1214],{"__ignoreMap":11},[190,1171,1172],{"class":192,"line":193},[190,1173,1174],{},"- (id)initWithParent:(UIView *)parent {\n",[190,1176,1177],{"class":192,"line":12},[190,1178,1179],{}," self = [self initWithFrame:CGRectZero];\n",[190,1181,1182],{"class":192,"line":223},[190,1183,1184],{}," if (!self)\n",[190,1186,1187],{"class":192,"line":247},[190,1188,1189],{}," return nil;\n",[190,1191,1192],{"class":192,"line":260},[190,1193,1194],{}," [parent addSubview:self];\n",[190,1196,1197],{"class":192,"line":266},[190,1198,1199],{}," return self;\n",[190,1201,1202],{"class":192,"line":283},[190,1203,399],{},[190,1205,1206],{"class":192,"line":295},[190,1207,1208],{},"+ (id) viewWithParent:(UIView *)parent {\n",[190,1210,1211],{"class":192,"line":312},[190,1212,1213],{}," return [[[self alloc] initWithParent:parent] autorelease];\n",[190,1215,1216],{"class":192,"line":339},[190,1217,399],{},[41,1219,1220,1221,1224,1225,1227],{},"There wasn’t much left to do for me. I only coded the class ",[404,1222,1223],{},"Root",", which is the parent of all ",[404,1226,406],{}," instances\nused in the prototype. It provides a couple of methods to slide images back and forth:",[181,1229,1231],{"className":672,"code":1230,"language":674,"meta":11,"style":11},"@synthesize pageIndex = _pageIndex;\n- (id) initWithParent:(UIView *)parent {\n self = [super initWithParent:parent];\n if (self == nil) {\n return nil;\n }\n self.userInteractionEnabled = YES;\n self.size = self.window.size;\n [[UIImageView viewWithParent:self] setImageWithName:@\"dailies\"];\n self.pageIndex = 0;\n return self;\n}\n- (void)setPageIndex:(int)index {\n if (index \u003C 0 || index >= [self.subviews count]) {\n return;\n }\n _pageIndex = index;\n for (int i = 0; i \u003C [self.subviews count]; i++) {\n UIImageView *page = [self.subviews objectAtIndex:i];\n page.x = (i \u003C _pageIndex) ? -self.width : (i > _pageIndex) ? self.width : 0;\n }\n}\n- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {\n self.pageIndex++;\n}\n",[187,1232,1233,1238,1243,1248,1253,1257,1262,1267,1272,1277,1282,1286,1290,1295,1300,1306,1311,1317,1323,1329,1335,1340,1345,1351,1357],{"__ignoreMap":11},[190,1234,1235],{"class":192,"line":193},[190,1236,1237],{},"@synthesize pageIndex = _pageIndex;\n",[190,1239,1240],{"class":192,"line":12},[190,1241,1242],{},"- (id) initWithParent:(UIView *)parent {\n",[190,1244,1245],{"class":192,"line":223},[190,1246,1247],{}," self = [super initWithParent:parent];\n",[190,1249,1250],{"class":192,"line":247},[190,1251,1252],{}," if (self == nil) {\n",[190,1254,1255],{"class":192,"line":260},[190,1256,1189],{},[190,1258,1259],{"class":192,"line":266},[190,1260,1261],{}," }\n",[190,1263,1264],{"class":192,"line":283},[190,1265,1266],{}," self.userInteractionEnabled = YES;\n",[190,1268,1269],{"class":192,"line":295},[190,1270,1271],{}," self.size = self.window.size;\n",[190,1273,1274],{"class":192,"line":312},[190,1275,1276],{}," [[UIImageView viewWithParent:self] setImageWithName:@\"dailies\"];\n",[190,1278,1279],{"class":192,"line":339},[190,1280,1281],{}," self.pageIndex = 0;\n",[190,1283,1284],{"class":192,"line":363},[190,1285,1199],{},[190,1287,1288],{"class":192,"line":374},[190,1289,399],{},[190,1291,1292],{"class":192,"line":386},[190,1293,1294],{},"- (void)setPageIndex:(int)index {\n",[190,1296,1297],{"class":192,"line":396},[190,1298,1299],{}," if (index \u003C 0 || index >= [self.subviews count]) {\n",[190,1301,1303],{"class":192,"line":1302},15,[190,1304,1305],{}," return;\n",[190,1307,1309],{"class":192,"line":1308},16,[190,1310,1261],{},[190,1312,1314],{"class":192,"line":1313},17,[190,1315,1316],{}," _pageIndex = index;\n",[190,1318,1320],{"class":192,"line":1319},18,[190,1321,1322],{}," for (int i = 0; i \u003C [self.subviews count]; i++) {\n",[190,1324,1326],{"class":192,"line":1325},19,[190,1327,1328],{}," UIImageView *page = [self.subviews objectAtIndex:i];\n",[190,1330,1332],{"class":192,"line":1331},20,[190,1333,1334],{}," page.x = (i \u003C _pageIndex) ? -self.width : (i > _pageIndex) ? self.width : 0;\n",[190,1336,1338],{"class":192,"line":1337},21,[190,1339,1261],{},[190,1341,1343],{"class":192,"line":1342},22,[190,1344,399],{},[190,1346,1348],{"class":192,"line":1347},23,[190,1349,1350],{},"- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {\n",[190,1352,1354],{"class":192,"line":1353},24,[190,1355,1356],{}," self.pageIndex++;\n",[190,1358,1360],{"class":192,"line":1359},25,[190,1361,399],{},[41,1363,1364],{},"With those two classes and a couple of screenshots, it is fairly easy to create an App that looks and feels almost real.\nI created a short demo video, which shows how easy it is to get a good feeling if your App is going to work or not:",[41,1366,1367],{},"Now don’t forget those are only screenshots and the App might need to load stuff over the network or do some animation,\nhence it might not feel exactly the same. However, this process of prototyping an UI is powerful enough to give you an\nidea, whether the workflow or the UI in general is going to “work” or needs some tweaking.",[41,1369,1370,1371,158],{},"You can download the source code for the two classes, along with a sample project\nfrom ",[45,1372,1374],{"href":989,"rel":1373},[49],"github",[438,1376,727],{},{"title":11,"searchDepth":12,"depth":12,"links":1378},[],[121,444],"2010-06-29T06:46:00","Before flying off to WWDC last month, I watched a whole bunch of sessions\\nfrom 2009. Among others a session on “Prototyping iPhone User Interfaces” by Bret Victor. If you haven’t watched it and\\nyou’ve got access to the WWDC videos – stop right here and watch the video!","https://synyx.de/blog/ui-prototyping-iphone-apps/",{},"/blog/ui-prototyping-iphone-apps",{"title":1127,"description":1386},"Before flying off to WWDC last month, I watched a whole bunch of sessions\nfrom 2009. Among others a session on “Prototyping iPhone User Interfaces” by Bret Victor. If you haven’t watched it and\nyou’ve got access to the WWDC videos – stop right here and watch the video!","blog/ui-prototyping-iphone-apps",[131,1389,132,483,1390],"design","prototyping","Before flying off to WWDC last month, I watched a whole bunch of sessions from 2009. Among others a session on “Prototyping iPhone User Interfaces” by Bret Victor. If you…","hEZiAfMXrZSp1Im2rsk88x4HQuKpzIhV5W2xo11faBA",{"id":1394,"title":545,"author":1395,"body":1396,"category":1509,"date":1510,"description":1511,"extension":16,"link":1512,"meta":1513,"navigation":23,"path":1514,"seo":1515,"slug":1517,"stem":1518,"tags":1519,"teaser":1520,"__hash__":1521},"blog/blog/mobile-solutions-summary-3.md",[26],{"type":8,"value":1397,"toc":1507},[1398,1400,1420,1434,1474,1492,1499],[37,1399,545],{"id":551},[41,1401,1402,1403,1408,1409,1414,1415,1419],{},"In my ",[45,1404,1407],{"href":1405,"rel":1406},"http://blog.synyx.de/2010/05/mobile-solutions-%E2%80%93-summary/",[49],"last summary"," I forgot to mention, that I will be\nat ",[45,1410,1413],{"href":1411,"rel":1412},"http://developer.apple.com/wwdc",[49],"WWDC"," this year. Now WWDC is over, I just got back and if you want to know more,\ncheckout my blog post ",[45,1416,948],{"href":1417,"rel":1418},"http://dlinsin.blogspot.com/2010/06/wwdc10.html",[49],". While I was gone, our team was busy\npublishing all sorts of good stuff!",[41,1421,1422,1423,1428,1429,1433],{},"Let’s start with the release of Android’s FroYo last\nmonth! ",[45,1424,1427],{"href":1425,"rel":1426},"http://mobile.synyx.de/2010/05/in-my-humble-opinion-froyo-rocks/",[49],"Achim"," wrote\na ",[45,1430,1432],{"href":1425,"rel":1431},[49],"nice blog post"," highlighting the noteworthy\nfeatures:",[576,1435,1436,1439,1442,1452,1455,1463,1466],{},[41,1437,1438],{},"*FroYo is like each previous version a mixture between API Changes, new Userfeatures and some new cool Apps….",[41,1440,1441],{},"New API-Features:*",[1443,1444,1445,1449],"ul",{},[1446,1447,1448],"li",{},"Data Backup API",[1446,1450,1451],{},"Possibility to save passwords secure",[41,1453,1454],{},"New User Features:",[1443,1456,1457,1460],{},[1446,1458,1459],{},"updated Exchange Features",[1446,1461,1462],{},"Remote Wipe",[41,1464,1465],{},"New Apps:",[1443,1467,1468,1471],{},[1446,1469,1470],{},"Camera and Camcorder updated (possible to enable manually the leds for usage within camcorder)",[1446,1472,1473],{},"Android Tethering and Usage as Hotspot",[41,1475,1476,1480,1481,1486,1487,574],{},[45,1477,609],{"href":1478,"rel":1479},"http://mobile.synyx.de/authors/?uid=6",[49],", our ",[45,1482,1485],{"href":1483,"rel":1484},"http://mobile.synyx.de/tag/maemo-5/",[49],"Maemo"," guy, followed our\nGoogle Maps theme and published the first part of a nice introduction\nof ",[45,1488,1491],{"href":1489,"rel":1490},"http://mobile.synyx.de/2010/06/google-maps-on-maemo-5-part-1/",[49],"Google Maps on Maemo 5",[576,1493,1494],{},[41,1495,1496],{},[404,1497,1498],{},"The idea is quite simple. Webkit will render a webpage insider your app. That webpage consists of javascript methods\nwhich use the Google Maps-API. The javascript methods can be triggered from the app. The map class acts as proxy for\nthe communication between your app and the website. Quite simple hm?",[41,1500,1501,1502,1506],{},"This is only a small sneak peak of what’s going on over at the mobile solutions blog. I suggest\nyou ",[45,1503,1505],{"href":563,"rel":1504},[49],"add it"," to your favorite feed reader and check it out regularly.",{"title":11,"searchDepth":12,"depth":12,"links":1508},[],[620],"2010-06-18T08:57:09","In my last summary I forgot to mention, that I will be\\nat WWDC this year. Now WWDC is over, I just got back and if you want to know more,\\ncheckout my blog post here. While I was gone, our team was busy\\npublishing all sorts of good stuff!","https://synyx.de/blog/mobile-solutions-summary-3/",{},"/blog/mobile-solutions-summary-3",{"title":545,"description":1516},"In my last summary I forgot to mention, that I will be\nat WWDC this year. Now WWDC is over, I just got back and if you want to know more,\ncheckout my blog post here. While I was gone, our team was busy\npublishing all sorts of good stuff!","mobile-solutions-summary-3","blog/mobile-solutions-summary-3",[131,132,98],"In my last summary I forgot to mention, that I will be at WWDC this year. Now WWDC is over, I just got back and if you want to know…","Vt3IIuwgnXxkVeplkiSoihd83Xam9gAc_bmG2yhTjts",{"id":1523,"title":152,"author":1524,"body":1525,"category":1559,"date":1560,"description":1561,"extension":16,"link":1562,"meta":1563,"navigation":23,"path":1564,"seo":1565,"slug":1529,"stem":1567,"tags":1568,"teaser":1570,"__hash__":1571},"blog/blog/wwdc-2010.md",[26],{"type":8,"value":1526,"toc":1557},[1527,1530,1539,1554],[37,1528,152],{"id":1529},"wwdc-2010",[41,1531,1532,1533,1538],{},"I’m going to ",[45,1534,1537],{"href":1535,"rel":1536},"http://developer.apple.com/wwdc/",[49],"Apple’s WWDC"," this year and I’m pretty excited to fully dive into iPhone\ndevelopment for the whole next week. That it takes place in San Francisco is a nice bonus, as well.",[41,1540,1541,1542,1547,1548,1553],{},"The conference is ",[45,1543,1546],{"href":1544,"rel":1545},"http://developer.apple.com/wwdc/sessions/",[49],"mostly covering iPhone"," related topics. There\nare ",[45,1549,1552],{"href":1550,"rel":1551},"http://www.fscklog.com/2010/05/apple-best%C3%A4tigt-wwdc-keynote-mit-steve-jobs-am-7-juni.html",[49],"rumors"," that Steven Jobs\nwill present the new iPhone on Monday’s keynote. I’ll make sure I won’t miss that. My schedule for the week is already\nplanned with topics like game development, multitasking and user interface design.",[41,1555,1556],{},"If you are going to WWDC as well and would like to meet up, let me know.",{"title":11,"searchDepth":12,"depth":12,"links":1558},[],[121],"2010-06-03T15:12:08","I’m going to Apple’s WWDC this year and I’m pretty excited to fully dive into iPhone\\ndevelopment for the whole next week. That it takes place in San Francisco is a nice bonus, as well.","https://synyx.de/blog/wwdc-2010/",{},"/blog/wwdc-2010",{"title":152,"description":1566},"I’m going to Apple’s WWDC this year and I’m pretty excited to fully dive into iPhone\ndevelopment for the whole next week. That it takes place in San Francisco is a nice bonus, as well.","blog/wwdc-2010",[131,1569,132],"conference","I’m going to Apple’s WWDC this year and I’m pretty excited to fully dive into iPhone development for the whole next week. That it takes place in San Francisco is…","0PlPIuqAd36_OiWhK21AO20tc4c6Y1ucyQYMRpnc0aQ",{"id":1573,"title":545,"author":1574,"body":1575,"category":1675,"date":1676,"description":1677,"extension":16,"link":1678,"meta":1679,"navigation":23,"path":1680,"seo":1681,"slug":1683,"stem":1684,"tags":1685,"teaser":1686,"__hash__":1687},"blog/blog/mobile-solutions-summary-2.md",[26],{"type":8,"value":1576,"toc":1673},[1577,1579,1593,1612,1623,1629,1638,1662],[37,1578,545],{"id":551},[41,1580,1581,1582,1587,1588,1592],{},"It has been quite a while since ",[45,1583,1586],{"href":1584,"rel":1585},"http://blog.synyx.de/2010/04/30/mobile-solutions-summary/",[49],"my last update"," on what’s\nhappening over at our ",[45,1589,1591],{"href":66,"rel":1590},[49],"Mobile Solutions Blog",", so let’s get right into it.",[41,1594,1595,1596,419,1601,1605,1606,1611],{},"One of the most interesting posts\nwas ",[45,1597,1600],{"href":1598,"rel":1599},"http://mobile.synyx.de/2010/05/10/user-statistics-from-synyxsudoku/",[49],"“User statistics from SynyxSudoku”",[45,1602,1604],{"href":954,"rel":1603},[49],"Tobias",". It shows the distribution of Android devices, which are running our\nvery own Sudoku App, which by the\nway ",[45,1607,1610],{"href":1608,"rel":1609},"http://mobile.synyx.de/2010/05/10/synyxsudoku-update-to-version-1-02/",[49],"got updated"," a couple of weeks ago:",[576,1613,1614,1617,1620],{},[41,1615,1616],{},"*First of all, I was quite surprised as i saw that 70% of the SynyxSudoku users that uploaded their highscores have\nalso agreed to send us their device specific data, because I really didn’t expect more than 10-20%.",[41,1618,1619],{},"…",[41,1621,1622],{},"The devices came mostly with the latest Android versions available. … The smaller devices (240×320) aren’t that\npopular as it seems (maybe because there’s only the HTC Tattoo that uses this resolution), but the others are quite\nevenly matched.*",[41,1624,1625,1626,158],{},"If you are into Android and need some hard facts, go and checkout the numbers on\nour ",[45,1627,1591],{"href":1598,"rel":1628},[49],[41,1630,1631,1632,1637],{},"We were looking for a consistent example to show how to solve a problem over the 3 major platforms iPhone, Android and\nMaemo and ",[45,1633,1636],{"href":1634,"rel":1635},"http://maps.google.com",[49],"Google Maps"," seemed to be a nice show case.",[41,1639,1640,1641,1646,1647,1652,1653,1656,1657,158],{},"We decided to start a little ",[45,1642,1645],{"href":1643,"rel":1644},"http://mobile.synyx.de/tag/google-maps/",[49],"tutorial series",", which results in three\nhands-on examples of how to integrate Google Maps in your application. There\nare ",[45,1648,1651],{"href":1649,"rel":1650},"http://mobile.synyx.de/2010/05/07/google-maps-on-android-part-2-overlays/",[49],"code samples for Android"," and you can\nalready download a ",[404,1654,1655],{},"UIViewController",", which\nshows ",[45,1658,1661],{"href":1659,"rel":1660},"http://mobile.synyx.de/2010/05/19/how-to-add-a-%E2%80%9Cfind-your-company%E2%80%9D-feature-to-your-iphone-app-%E2%80%93-part-ii/",[49],"“How to add a ‘Find Your Company’ feature to your iPhone App”",[41,1663,1664,1665,1668,1669,158],{},"There’s a lot happening in the mobile world and on our ",[45,1666,1591],{"href":66,"rel":1667},[49],", so you better\nhead over and subscribe to ",[45,1670,1672],{"href":946,"rel":1671},[49],"our feed",{"title":11,"searchDepth":12,"depth":12,"links":1674},[],[620],"2010-05-21T13:52:57","It has been quite a while since my last update on what’s\\nhappening over at our Mobile Solutions Blog, so let’s get right into it.","https://synyx.de/blog/mobile-solutions-summary-2/",{},"/blog/mobile-solutions-summary-2",{"title":545,"description":1682},"It has been quite a while since my last update on what’s\nhappening over at our Mobile Solutions Blog, so let’s get right into it.","mobile-solutions-summary-2","blog/mobile-solutions-summary-2",[98],"It has been quite a while since my last update on what’s happening over at our Mobile Solutions Blog, so let’s get right into it. One of the most interesting…","1p6YXeszwV5TrMg-KutpsDhtSaWLSU9xOSsSsDGZ9Qo",{"id":1689,"title":1690,"author":1691,"body":1692,"category":1989,"date":1990,"description":1991,"extension":16,"link":1992,"meta":1993,"navigation":23,"path":1994,"seo":1995,"slug":1696,"stem":1997,"tags":1998,"teaser":2000,"__hash__":2001},"blog/blog/how-to-add-a-find-your-company-feature-to-your-iphone-app-part-ii.md","How to add a “Find Your Company” feature to your iPhone App – Part II",[26],{"type":8,"value":1693,"toc":1987},[1694,1697,1710,1713,1719,1722,1737,1912,1915,1921,1945,1952,1966,1973,1978,1985],[37,1695,1690],{"id":1696},"how-to-add-a-find-your-company-feature-to-your-iphone-app-part-ii",[41,1698,1699,1700,1705,1706,158],{},"In\nmy ",[45,1701,1704],{"href":1702,"rel":1703},"http://mobile.synyx.de/2010/05/06/how-to-add-a-find-your-company-feature-to-your-iphone-app-part-i/",[49],"first installment",",\nwe laid the foundation for todays blog post. So don’t hesitate to head back for a recap, if you need to. You can\ndownload the code for this tutorial on ",[45,1707,1374],{"href":1708,"rel":1709},"http://gist.github.com/388323/ea35c6d31270babb73ec052f1442c43afd6b5510",[49],[41,1711,1712],{},"If you start the App where we left off, you get the two pins, but it won’t be properly zoomed. In fact, it would look\nsomething like this:",[41,1714,1715],{},[114,1716],{"alt":1717,"src":1718},"\"screen_synyx_map\"","https://media.synyx.de/uploads//2010/05/maps-3.png",[41,1720,1721],{},"As you can see, the pins are not really helpful at this zoom level and it’s definitely not user friendly, if you have to\nzoom in by yourself. What we need is a way to zoom in, so that the pin and the current location nicely fit on the\nscreen.",[41,1723,1724,1725,1728,1729,1733,1734,1736],{},"That’s exactly what the method ",[404,1726,1727],{},"centerMapAroundAnnotations"," at\nline ",[45,1730,1732],{"href":1708,"rel":1731},[49],"108"," of our ",[404,1735,1655],{}," does:",[181,1738,1740],{"className":672,"code":1739,"language":674,"meta":11,"style":11},"\nif ( [[self.mapView annotations] count] \u003C 2 )\n return;\nCLLocationCoordinate2D min;\nCLLocationCoordinate2D max;\nBOOL minMaxInitialized = NO;\nfor ( id\u003CMKAnnotation> a in [self.mapView annotations] ) {\n if ( !minMaxInitialized ) {\n min = a.coordinate;\n max = a.coordinate;\n minMaxInitialized = YES;\n } else {\n min.latitude = MIN( min.latitude, a.coordinate.latitude );\n min.longitude = MIN( min.longitude, a.coordinate.longitude );\n max.latitude = MAX( max.latitude, a.coordinate.latitude );\n max.longitude = MAX( max.longitude, a.coordinate.longitude );\n }\n}\u003Cbr/>\nCLLocation* locSouthWest = [[CLLocation alloc] initWithLatitude: min.latitude longitude: min.longitude];\nCLLocation* locSouthEast = [[CLLocation alloc] initWithLatitude: min.latitude longitude: max.longitude];\nCLLocation* locNorthEast = [[CLLocation alloc] initWithLatitude: max.latitude longitude: max.longitude];\nCLLocationCoordinate2D regionCenter;\nregionCenter.latitude = (min.latitude + max.latitude) / 2.0;\nregionCenter.longitude = (min.longitude + max.longitude) / 2.0;\u003Cbr/>\nCLLocationDistance latMeters = [locSouthEast getDistanceFrom: locNorthEast];\nCLLocationDistance lonMeters = [locSouthEast getDistanceFrom: locSouthWest];\nMKCoordinateRegion region;\nregion = MKCoordinateRegionMakeWithDistance( regionCenter, latMeters, lonMeters );\nMKCoordinateRegion fitRegion = [self.mapView regionThatFits: region];\n[self.mapView setRegion: fitRegion animated: YES];\n[locSouthWest release];\n[locSouthEast release];\n[locNorthEast release];\n\n",[187,1741,1742,1746,1751,1755,1760,1765,1770,1775,1780,1785,1790,1795,1800,1805,1810,1815,1820,1824,1829,1834,1839,1844,1849,1854,1859,1864,1870,1876,1882,1888,1894,1900,1906],{"__ignoreMap":11},[190,1743,1744],{"class":192,"line":193},[190,1745,766],{"emptyLinePlaceholder":23},[190,1747,1748],{"class":192,"line":12},[190,1749,1750],{},"if ( [[self.mapView annotations] count] \u003C 2 )\n",[190,1752,1753],{"class":192,"line":223},[190,1754,1305],{},[190,1756,1757],{"class":192,"line":247},[190,1758,1759],{},"CLLocationCoordinate2D min;\n",[190,1761,1762],{"class":192,"line":260},[190,1763,1764],{},"CLLocationCoordinate2D max;\n",[190,1766,1767],{"class":192,"line":266},[190,1768,1769],{},"BOOL minMaxInitialized = NO;\n",[190,1771,1772],{"class":192,"line":283},[190,1773,1774],{},"for ( id\u003CMKAnnotation> a in [self.mapView annotations] ) {\n",[190,1776,1777],{"class":192,"line":295},[190,1778,1779],{}," if ( !minMaxInitialized ) {\n",[190,1781,1782],{"class":192,"line":312},[190,1783,1784],{}," min = a.coordinate;\n",[190,1786,1787],{"class":192,"line":339},[190,1788,1789],{}," max = a.coordinate;\n",[190,1791,1792],{"class":192,"line":363},[190,1793,1794],{}," minMaxInitialized = YES;\n",[190,1796,1797],{"class":192,"line":374},[190,1798,1799],{}," } else {\n",[190,1801,1802],{"class":192,"line":386},[190,1803,1804],{}," min.latitude = MIN( min.latitude, a.coordinate.latitude );\n",[190,1806,1807],{"class":192,"line":396},[190,1808,1809],{}," min.longitude = MIN( min.longitude, a.coordinate.longitude );\n",[190,1811,1812],{"class":192,"line":1302},[190,1813,1814],{}," max.latitude = MAX( max.latitude, a.coordinate.latitude );\n",[190,1816,1817],{"class":192,"line":1308},[190,1818,1819],{}," max.longitude = MAX( max.longitude, a.coordinate.longitude );\n",[190,1821,1822],{"class":192,"line":1313},[190,1823,1261],{},[190,1825,1826],{"class":192,"line":1319},[190,1827,1828],{},"}\u003Cbr/>\n",[190,1830,1831],{"class":192,"line":1325},[190,1832,1833],{},"CLLocation* locSouthWest = [[CLLocation alloc] initWithLatitude: min.latitude longitude: min.longitude];\n",[190,1835,1836],{"class":192,"line":1331},[190,1837,1838],{},"CLLocation* locSouthEast = [[CLLocation alloc] initWithLatitude: min.latitude longitude: max.longitude];\n",[190,1840,1841],{"class":192,"line":1337},[190,1842,1843],{},"CLLocation* locNorthEast = [[CLLocation alloc] initWithLatitude: max.latitude longitude: max.longitude];\n",[190,1845,1846],{"class":192,"line":1342},[190,1847,1848],{},"CLLocationCoordinate2D regionCenter;\n",[190,1850,1851],{"class":192,"line":1347},[190,1852,1853],{},"regionCenter.latitude = (min.latitude + max.latitude) / 2.0;\n",[190,1855,1856],{"class":192,"line":1353},[190,1857,1858],{},"regionCenter.longitude = (min.longitude + max.longitude) / 2.0;\u003Cbr/>\n",[190,1860,1861],{"class":192,"line":1359},[190,1862,1863],{},"CLLocationDistance latMeters = [locSouthEast getDistanceFrom: locNorthEast];\n",[190,1865,1867],{"class":192,"line":1866},26,[190,1868,1869],{},"CLLocationDistance lonMeters = [locSouthEast getDistanceFrom: locSouthWest];\n",[190,1871,1873],{"class":192,"line":1872},27,[190,1874,1875],{},"MKCoordinateRegion region;\n",[190,1877,1879],{"class":192,"line":1878},28,[190,1880,1881],{},"region = MKCoordinateRegionMakeWithDistance( regionCenter, latMeters, lonMeters );\n",[190,1883,1885],{"class":192,"line":1884},29,[190,1886,1887],{},"MKCoordinateRegion fitRegion = [self.mapView regionThatFits: region];\n",[190,1889,1891],{"class":192,"line":1890},30,[190,1892,1893],{},"[self.mapView setRegion: fitRegion animated: YES];\n",[190,1895,1897],{"class":192,"line":1896},31,[190,1898,1899],{},"[locSouthWest release];\n",[190,1901,1903],{"class":192,"line":1902},32,[190,1904,1905],{},"[locSouthEast release];\n",[190,1907,1909],{"class":192,"line":1908},33,[190,1910,1911],{},"[locNorthEast release];\n",[41,1913,1914],{},"The code might look complicated, but we can break it down into 3 steps:",[1916,1917,1918],"ol",{},[1446,1919,1920],{},"Iterate over all our custom annotations (we only have one) to determine the max/min latitude and longitude",[1443,1922,1923,1938],{},[1446,1924,1925,1926,1929,1930,1933,1934,1937],{},"This results in a triangle ",[404,1927,1928],{},"locSouthWest",", ",[404,1931,1932],{},"locSouthEast"," and ",[404,1935,1936],{},"locNorthEast",", that we can use to determine the center\nfor our zoom",[1446,1939,1940,1941,1944],{},"Using the distance between the triangle points and the center, we can fit the map into a ",[404,1942,1943],{},"MKCoordinateRegion",", that\nwill zoom it so that everything fits on the screen.",[41,1946,1947,1948,1951],{},"One thing this algorithm doesn’t include, is the ",[404,1949,1950],{},"AnnotationView"," that display the name and location of the red pin. It\nsometimes happens, that it’s displayed outside of the screen, once you tap on the pin. However, if you add the code\nabove and hook it into the following method:",[181,1953,1955],{"className":672,"code":1954,"language":674,"meta":11,"style":11},"\n- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views\n\n",[187,1956,1957,1961],{"__ignoreMap":11},[190,1958,1959],{"class":192,"line":193},[190,1960,766],{"emptyLinePlaceholder":23},[190,1962,1963],{"class":192,"line":12},[190,1964,1965],{},"- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views\n",[41,1967,1968,1969,1972],{},"You still need to add the code, which handles the annotation, but you can feel free to steal it\nfrom ",[45,1970,1374],{"href":1708,"rel":1971},[49],". The result should look something\nlike this:",[41,1974,1975],{},[114,1976],{"alt":1717,"src":1977},"https://media.synyx.de/uploads//2010/05/screen_synyx_map.png",[41,1979,1980,1981,1984],{},"This concludes our little tutorial on Google Maps and ",[404,1982,1983],{},"MapKit",". I hope it was helpful! If you need any assistance, just\nleave a comment or drop me an email, I’ll be happy to help you out.",[438,1986,727],{},{"title":11,"searchDepth":12,"depth":12,"links":1988},[],[121,444],"2010-05-19T06:44:08","In\\nmy first installment,\\nwe laid the foundation for todays blog post. So don’t hesitate to head back for a recap, if you need to. You can\\ndownload the code for this tutorial on github.","https://synyx.de/blog/how-to-add-a-find-your-company-feature-to-your-iphone-app-part-ii/",{},"/blog/how-to-add-a-find-your-company-feature-to-your-iphone-app-part-ii",{"title":1690,"description":1996},"In\nmy first installment,\nwe laid the foundation for todays blog post. So don’t hesitate to head back for a recap, if you need to. You can\ndownload the code for this tutorial on github.","blog/how-to-add-a-find-your-company-feature-to-your-iphone-app-part-ii",[1999,132],"google-maps","In my first installment, we laid the foundation for todays blog post. So don’t hesitate to head back for a recap, if you need to. You can download the code…","Hpc7jZiUS-9fX42oCKNm3kaFp-aPqLQkR6HNXUf1bUU",{"id":2003,"title":2004,"author":2005,"body":2006,"category":2081,"date":2082,"description":2083,"extension":16,"link":2084,"meta":2085,"navigation":23,"path":2086,"seo":2087,"slug":2010,"stem":2089,"tags":2090,"teaser":2091,"__hash__":2092},"blog/blog/lessons-learned-iphone-review.md","Lessons learned – iPhone Review",[26],{"type":8,"value":2007,"toc":2079},[2008,2011,2031,2076],[37,2009,2004],{"id":2010},"lessons-learned-iphone-review",[41,2012,2013,2014,2019,2020,2019,2025,2030],{},"When you submit an App to the Apple App Store it has to go through a “rigorous quality check”, conducted by Apple.\nAlthough ",[45,2015,2018],{"href":2016,"rel":2017},"http://apprejections.com/index.php/post/171",[49],"there are"," ",[45,2021,2024],{"href":2022,"rel":2023},"http://www.mobileorchard.com/avoiding-iphone-app-rejection-from-apple/",[49],"plenty of resources",[45,2026,2029],{"href":2027,"rel":2028},"https://web.archive.org/web/20100809102557/http://iphone.derheckser.com:80/2009/07/10/suffering-from-modus-operandi-of-reviewer-team/",[49],"out there",",\nhere’s a short rundown of what we’ve learned ourselves so far:",[1443,2032,2033,2040,2046,2052,2064],{},[1446,2034,2035,2039],{},[2036,2037,2038],"strong",{},"Marketing Apps are not allowed","\nIf the sole purpose of your App is marketing, you’ll have a hard time getting your App through. You need to add what\nApple calls “user functionality”. That could be something simple like a photo gallery or a feature to reserve a room\nor table.",[1446,2041,2042,2045],{},[2036,2043,2044],{},"You cannot tease your users with features that they have to pay for","\nIf you are offering a lite version of your App, you cannot add disabled functionality, which would be enabled in the\npaid version. A lite version usually is offered separately from a paid version, which means the user will constantly\nsee disabled menu items or buttons, since the App will never be updated. Instead add a info section about the paid\nversion in your App, which describes what the paid version offers.",[1446,2047,2048,2051],{},[2036,2049,2050],{},"Don’t ask your users to upgrade","\nYou cannot add an alert in a free/lite version of your App, which asks users to upgrade or buy the paid version.\nInstead you should add a “buy me” button or a section in your App further describing what your paid version offers.",[1446,2053,2054,2057,2058,2063],{},[2036,2055,2056],{},"Build a working App","\nYou are definitely rejected if your App is buggy! If the reviewer thinks he found a bug, he’ll reject your App. A\ncrash is the worst case scenario,\nbut ",[45,2059,2062],{"href":2060,"rel":2061},"http://dlinsin.blogspot.com/2010/05/don-forget-your-linker-flags.html",[49],"it happens",". However, don’t depend on\nApple as your QA, because the review times are too long to go back and forth this way.",[1446,2065,2066,2069,2070,2075],{},[2036,2067,2068],{},"Don’t infringe Trademarks or Copyrights","\nDon’t mention\nApple, ",[45,2071,2074],{"href":2072,"rel":2073},"http://www.geek.com/articles/mobile/apple-demands-a-developer-removes-android-references-from-iphone-app-2010024/",[49],"Android","\nor any other Trademark therefore – as long as you don’t own it. You should also resist to use iPhone like icons or\nimages.",[41,2077,2078],{},"If you respect all of these restrictions and gotchas, you should be save to get your App through the review process. I\nsay “should”, because it all appears to depend on the person who reviews your App. Let us know what you experienced,\nsubmitting your Apps, I bet there are a lot more of these gotchas.",{"title":11,"searchDepth":12,"depth":12,"links":2080},[],[121,444],"2010-05-13T12:37:53","When you submit an App to the Apple App Store it has to go through a “rigorous quality check”, conducted by Apple.\\nAlthough there are plenty of resources out there,\\nhere’s a short rundown of what we’ve learned ourselves so far:","https://synyx.de/blog/lessons-learned-iphone-review/",{},"/blog/lessons-learned-iphone-review",{"title":2004,"description":2088},"When you submit an App to the Apple App Store it has to go through a “rigorous quality check”, conducted by Apple.\nAlthough there are plenty of resources out there,\nhere’s a short rundown of what we’ve learned ourselves so far:","blog/lessons-learned-iphone-review",[131,132],"When you submit an App to the Apple App Store it has to go through a “rigorous quality check”, conducted by Apple. Although there are plenty of resources out there,…","T4mUZEpPLjFmQlCw35HyM72gG1M41S4jYsCCinauV0A",{"id":2094,"title":2095,"author":2096,"body":2097,"category":2299,"date":2300,"description":2301,"extension":16,"link":2302,"meta":2303,"navigation":23,"path":2304,"seo":2305,"slug":2101,"stem":2307,"tags":2308,"teaser":2309,"__hash__":2310},"blog/blog/how-to-add-a-find-your-company-feature-to-your-iphone-app-part-i.md","How to add a 'Find Your Company' feature to your iPhone App – Part I",[26],{"type":8,"value":2098,"toc":2297},[2099,2103,2115,2122,2131,2134,2142,2158,2170,2223,2238,2272,2292,2295],[37,2100,2102],{"id":2101},"how-to-add-a-find-your-company-feature-to-your-iphone-app-part-i","How to add a \"Find Your Company\" feature to your iPhone App – Part I",[41,2104,2105,2106,2108,2109,2114],{},"We wanted to give our users the possibility to find our office. On the iPhone, the simplest way to do it, is to use\nGoogle Maps and the ",[404,2107,1983],{}," framework. I won’t go into the details of MapKit here, since Apple’s documentation is\nawesome and they provide a lot\nof ",[45,2110,2113],{"href":2111,"rel":2112},"http://developer.apple.com/iphone/library/samplecode/CurrentAddress/Introduction/Intro.html#//apple_ref/doc/uid/DTS40009469",[49],"sample code",",\nwhich gets you up and running in no time.",[41,2116,2117,2118,2121],{},"What I’d like to show you today, is some code, which nicely zooms the Map to your office and current location of the App\nuser, once the ",[404,2119,2120],{},"MapView"," is loaded. Here are a couple of screenshots to give you an idea of what I’m talking about:",[41,2123,2124,2019,2126,2130],{},[114,2125],{"alt":1717,"src":1977},[114,2127],{"alt":2128,"src":2129},"\"Synyx Routing\"","https://media.synyx.de/uploads//2010/05/screen_synyx_map_1.png","\nAs you can see, Synyx moved their offices to San Francisco. The iPhone App user, with the blue dot, is currently in\ncupertino. If he taps on the white/blue arrow in the annotation of the red dot, he is asked whether he’d really want to\nleave the App and start Google Maps to route from his current location to the Synyx Offices in San Francisco.",[41,2132,2133],{},"Now, the main focus on this blog post is how to get you using this in your App. I’m gonna split this little tutorial in\n2 parts:",[1916,2135,2136,2139],{},[1446,2137,2138],{},"Showing the Synyx Offices on the Map",[1446,2140,2141],{},"Zooming in, so that everything fits on the screen",[41,2143,2144,2145,2147,2148,2151,2152,2157],{},"If you feel like going off on your own, the code for the ",[404,2146,1655],{}," used, is available for download\non ",[45,2149,1374],{"href":1708,"rel":2150},[49],". The zooming algorithm is borrowed\nfrom ",[45,2153,2156],{"href":2154,"rel":2155},"http://stackoverflow.com/questions/1303265/algorithm-for-determining-minimum-bounding-rectangle-for-collection-of-lat-lon-co/1413264#1413264",[49],"stackoverflow",".\nHowever, the code is one of my first iPhone projects and not polished, so don’t use it blindly. There are a couple of\nissue, e.g. I’m pretty sure it won’t survive a memory warning. It’s meant for demonstration solely!",[41,2159,2160,2161,2163,2164,2166,2167,2169],{},"So let’s get into it. We first need a ",[404,2162,1655],{}," with a ",[404,2165,2120],{}," associated. It is pretty straightforward and\nyou should have no problems doing that in Interface Builder. The next thing you need and that is missing from the code\non github is a custom ",[404,2168,1983],{}," annotation:",[181,2171,2173],{"className":672,"code":2172,"language":674,"meta":11,"style":11},"\n@interface AddressAnnotation : NSObject\u003CMKAnnotation> {\n CLLocationCoordinate2D coordinate;\n NSString *title;\n NSString *subtitle;\n}\n- (id)initWith:(CLLocationCoordinate2D)_coords;\n@property(retain,nonatomic) NSString *title;\n@property(retain,nonatomic) NSString *subtitle;\n@end\n\n",[187,2174,2175,2179,2184,2189,2194,2199,2203,2208,2213,2218],{"__ignoreMap":11},[190,2176,2177],{"class":192,"line":193},[190,2178,766],{"emptyLinePlaceholder":23},[190,2180,2181],{"class":192,"line":12},[190,2182,2183],{},"@interface AddressAnnotation : NSObject\u003CMKAnnotation> {\n",[190,2185,2186],{"class":192,"line":223},[190,2187,2188],{}," CLLocationCoordinate2D coordinate;\n",[190,2190,2191],{"class":192,"line":247},[190,2192,2193],{}," NSString *title;\n",[190,2195,2196],{"class":192,"line":260},[190,2197,2198],{}," NSString *subtitle;\n",[190,2200,2201],{"class":192,"line":266},[190,2202,399],{},[190,2204,2205],{"class":192,"line":283},[190,2206,2207],{},"- (id)initWith:(CLLocationCoordinate2D)_coords;\n",[190,2209,2210],{"class":192,"line":295},[190,2211,2212],{},"@property(retain,nonatomic) NSString *title;\n",[190,2214,2215],{"class":192,"line":312},[190,2216,2217],{},"@property(retain,nonatomic) NSString *subtitle;\n",[190,2219,2220],{"class":192,"line":339},[190,2221,2222],{},"@end\n",[41,2224,2225,2226,2230,2231,2234,2235,158],{},"This will be responsible for displaying the name and city of the Synyx Offices above the red pin on the map. But it’s\nonly responsible for displaying the information, it doesn’t know where yet. In order to find the location of our offices\nusing the Google Maps API, I came up with a little helper method\ncalled ",[45,2227,2229],{"href":1708,"rel":2228},[49],"synyxLocation (line 175)",". It simply\nreturns the ",[404,2232,2233],{},"CLLocationCoordinate2D"," struct, which is needed in our ",[404,2236,2237],{},"AddressAnnotation",[181,2239,2241],{"className":672,"code":2240,"language":674,"meta":11,"style":11},"\nCLLocationCoordinate2D location = [self synyxLocation];\nself.synyx = [[AddressAnnotation alloc] initWith:location];\n[self.synyx setTitle:@\"Synyx GmbH & Co. KG\"];\n[self.synyx setSubtitle:synyxLoc];\n[mapView addAnnotation:synyx];\n\n",[187,2242,2243,2247,2252,2257,2262,2267],{"__ignoreMap":11},[190,2244,2245],{"class":192,"line":193},[190,2246,766],{"emptyLinePlaceholder":23},[190,2248,2249],{"class":192,"line":12},[190,2250,2251],{},"CLLocationCoordinate2D location = [self synyxLocation];\n",[190,2253,2254],{"class":192,"line":223},[190,2255,2256],{},"self.synyx = [[AddressAnnotation alloc] initWith:location];\n",[190,2258,2259],{"class":192,"line":247},[190,2260,2261],{},"[self.synyx setTitle:@\"Synyx GmbH & Co. KG\"];\n",[190,2263,2264],{"class":192,"line":260},[190,2265,2266],{},"[self.synyx setSubtitle:synyxLoc];\n",[190,2268,2269],{"class":192,"line":266},[190,2270,2271],{},"[mapView addAnnotation:synyx];\n",[41,2273,2274,2275,2277,2278,2280,2281,2284,2285,2287,2288,2291],{},"Instantiating the ",[404,2276,2237],{}," with the previously determined location and adding it to the ",[404,2279,2120],{}," will to the\nrest. I did this in the ",[404,2282,2283],{},"viewDidLoad"," of the ",[404,2286,1655],{},", which is not be the best place. Maybe the\n",[404,2289,2290],{},"viewWillAppear"," method would have been better.",[41,2293,2294],{},"After adding those parts discussed above, you can fire up the Simulator and get the location of our offices with a red\npin and your current location (in the Simulator it’s always Cupertino). The map doesn’t zoom yet and is not properly\nlocated, we leave that to our next installment.",[438,2296,727],{},{"title":11,"searchDepth":12,"depth":12,"links":2298},[],[121,444],"2010-05-06T09:19:07","We wanted to give our users the possibility to find our office. On the iPhone, the simplest way to do it, is to use\\nGoogle Maps and the MapKit framework. I won’t go into the details of MapKit here, since Apple’s documentation is\\nawesome and they provide a lot\\nof sample code,\\nwhich gets you up and running in no time.","https://synyx.de/blog/how-to-add-a-find-your-company-feature-to-your-iphone-app-part-i/",{},"/blog/how-to-add-a-find-your-company-feature-to-your-iphone-app-part-i",{"title":2095,"description":2306},"We wanted to give our users the possibility to find our office. On the iPhone, the simplest way to do it, is to use\nGoogle Maps and the MapKit framework. I won’t go into the details of MapKit here, since Apple’s documentation is\nawesome and they provide a lot\nof sample code,\nwhich gets you up and running in no time.","blog/how-to-add-a-find-your-company-feature-to-your-iphone-app-part-i",[1999,132],"We wanted to give our users the possibility to find our office. On the iPhone, the simplest way to do it, is to use Google Maps and the MapKit framework.…","xf7CAeTBsMxG4WUKphnA4aL0RIh0fwQNjjYZpLpVrbw",{"id":2312,"title":545,"author":2313,"body":2314,"category":2379,"date":2380,"description":2381,"extension":16,"link":2382,"meta":2383,"navigation":23,"path":2384,"seo":2385,"slug":551,"stem":2387,"tags":2388,"teaser":2389,"__hash__":2390},"blog/blog/mobile-solutions-summary.md",[26],{"type":8,"value":2315,"toc":2377},[2316,2318,2325,2338,2345,2351,2363,2370],[37,2317,545],{"id":551},[41,2319,2320,2321,2324],{},"Since the inception of our mobile blog last month a lot has happened over at ",[45,2322,66],{"href":66,"rel":2323},[49],". I’m going to\nhighlight some of the stuff for you here.",[41,2326,2327,2328,2333,2334,2337],{},"The ",[45,2329,2332],{"href":2330,"rel":2331},"http://mobile.synyx.de/2010/04/22/release-of-synyxsudoku/",[49],"biggest news"," is that our\ntrainee ",[45,2335,1604],{"href":954,"rel":2336},[49]," released our very own Sudoku game for Android handsets:",[576,2339,2340],{},[41,2341,2342],{},[404,2343,2344],{},"It’s completely free of charge! …. SynyxSudoku offers 3 difficulty levels, containing nearly unlimited puzzling fun\ndue to new created sudokus each time you launch! And even if none of these difficulty levels fits your needs –\nSynyxSudoku has the option to let you create a difficulty level of your own.",[41,2346,2347,2348,158],{},"Our Synyx Sudoku was very well received and downloaded more than 300 times in less than a week. Congratulations to\nTobias and if you haven’t checked it out, head over to our ",[45,2349,1004],{"href":586,"rel":2350},[49],[41,2352,2353,2354,2357,2358,574],{},"If you are into the hard stuff, be sure to check out ",[45,2355,609],{"href":1478,"rel":2356},[49],"\n‘s ",[45,2359,2362],{"href":2360,"rel":2361},"http://mobile.synyx.de/2010/04/22/howto-startup-with-maemo-and-qt-4-6/",[49],"tutorial on how to get started programing for the N900",[576,2364,2365],{},[41,2366,2367],{},[404,2368,2369],{},"As a Java developer it was not easy for me to find the right entry point for developing c++, using the\ntrend-setting Qt 4.6 environment and having a cute ide with rapid prototyping capabilities. After a little bit of\nreading and lots of trials and errors i found a way for me that worked.",[41,2371,2372,2373,158],{},"It’ll make things less tough and get you started with your development environment. Don’t miss Florian’s next\ninstallment and subscribe to the ",[45,2374,2376],{"href":946,"rel":2375},[49],"mobile solutions blog’s feed",{"title":11,"searchDepth":12,"depth":12,"links":2378},[],[620],"2010-04-30T06:46:25","Since the inception of our mobile blog last month a lot has happened over at http://mobile.synyx.de. I’m going to\\nhighlight some of the stuff for you here.","https://synyx.de/blog/mobile-solutions-summary/",{},"/blog/mobile-solutions-summary",{"title":545,"description":2386},"Since the inception of our mobile blog last month a lot has happened over at http://mobile.synyx.de. I’m going to\nhighlight some of the stuff for you here.","blog/mobile-solutions-summary",[98],"Since the inception of our mobile blog last month a lot has happened over at http://mobile.synyx.de. I’m going to highlight some of the stuff for you here. The biggest news…","5Tr_PJe_pLL4p-X-PYcVotPpC2D6CuNgaiXYPG0-eKc",{"id":2392,"title":2393,"author":2394,"body":2395,"category":2430,"date":2431,"description":2432,"extension":16,"link":2433,"meta":2434,"navigation":23,"path":2435,"seo":2436,"slug":2399,"stem":2438,"tags":2439,"teaser":2441,"__hash__":2442},"blog/blog/welcome.md","Welcome",[26],{"type":8,"value":2396,"toc":2428},[2397,2400,2420],[37,2398,2393],{"id":2399},"welcome",[41,2401,2402,2403,1929,2408,2413,2414,2419],{},"This is the inception of Synyx Mobile Solutions. In the near future we’ll blog here about a wide range of topics in the\nmobile space. No matter if it’s ",[45,2404,2407],{"href":2405,"rel":2406},"http://android.org",[49],"Google’s Android",[45,2409,2412],{"href":2410,"rel":2411},"http://apple.com/iphone",[49],"Apple’s iPhone","\nor ",[45,2415,2418],{"href":2416,"rel":2417},"http://www.meego.com/",[49],"MeeGo"," we have something to say about it!",[41,2421,2422,2423,158],{},"Stay tuned and subscribe to our ",[45,2424,2427],{"href":2425,"rel":2426},"http://mobile.synyx.de/?feed=rss2",[49],"RSS feed",{"title":11,"searchDepth":12,"depth":12,"links":2429},[],[121],"2010-03-26T17:24:38","This is the inception of Synyx Mobile Solutions. In the near future we’ll blog here about a wide range of topics in the\\nmobile space. No matter if it’s Google’s Android, Apple’s iPhone\\nor MeeGo we have something to say about it!","https://synyx.de/blog/welcome/",{},"/blog/welcome",{"title":2393,"description":2437},"This is the inception of Synyx Mobile Solutions. In the near future we’ll blog here about a wide range of topics in the\nmobile space. No matter if it’s Google’s Android, Apple’s iPhone\nor MeeGo we have something to say about it!","blog/welcome",[538,132,2440,99],"meego","This is the inception of Synyx Mobile Solutions. In the near future we’ll blog here about a wide range of topics in the mobile space. No matter if it’s Google’s…","fxYe2l28A3Tr4AN4j9XfZ6v3dxy5234kvArmmK3JoB4",["Reactive",2444],{"$scookieConsent":2445,"$ssite-config":2447},{"functional":2446,"analytics":2446},false,{"_priority":2448,"env":2452,"name":2453,"url":2454},{"name":2449,"env":2450,"url":2451},-10,-15,0,"production","nuxt-app","https://synyx.de",["Set"],["ShallowReactive",2457],{"author-linsin":-1,"roughlyFilteredArticles":-1},"/blog/author/linsin"]